Subversion Repositories cheapmusic

Rev

Rev 70 | Rev 77 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 - 1
<?php
65 - 2
include_once ('php/clsLibGTIN.php');
3
include_once ('php/exchangeRates.php');
4
include_once ('php/countryCodes.php');
5
include_once ('php/constants.php');
6
include_once ('php/ebay.php');
7
include_once ('php/discogs.php');
8
include_once ('php/linkshare.php');
9
include_once ('php/cjaffiliate.php');
10
include_once ('php/walmart.php');
11
include_once ('php/itunes.php');
1 - 12
 
20 - 13
error_reporting(E_ALL);
14
 
65 - 15
// search
5 - 16
function performSearch() {
14 - 17
    $currentMd5SearchTerm = md5SearchTerm();
18
    if ($currentMd5SearchTerm == $_SESSION['md5LastSearch']) {
19
        return;
20
    }
21
    $_SESSION['md5LastSearch'] = $currentMd5SearchTerm;
22
 
22 - 23
    updatePbFile(true);
24
 
65 - 25
    $_SESSION["currentView"] = 'All';
26
    $_SESSION["currentLayout"] = 'TableView';
27
    $_SESSION["barcode"]["Type"] = clsLibGTIN::GTINCheck($_SESSION["searchTerm"], false, 1);
28
    $_SESSION["barcode"]["Value"] = clsLibGTIN::GTINCheck($_SESSION["searchTerm"]);
29
    $_SESSION["resultArr"] = [];
30
    $_SESSION["resultArr"] = searchAll($_SESSION["searchTerm"]);
22 - 31
    updatePbFile();
23 - 32
 
65 - 33
    $_SESSION["resultArr"] = applySearchFilter($_SESSION["resultArr"]);
22 - 34
    updatePbFile();
5 - 35
 
65 - 36
    //echo "<pre>";print_r($_SESSION["resultArr"]);echo "</pre>";
66 - 37
    $_SESSION["lowestPrice"]["Used"] = findLowestCondition("Used");
38
    $_SESSION["lowestPrice"]["New"] = findLowestCondition("New");
39
    $_SESSION["lowestPrice"]["CD"] = findLowestMediaType("CD");
40
    $_SESSION["lowestPrice"]["Record"] = findLowestMediaType("Record");
41
    $_SESSION["lowestPrice"]["Digital"] = findLowestMediaType("Digital");
42
    $_SESSION["lowestPrice"]["Book"] = findLowestMediaType("Book");
65 - 43
    $_SESSION["lowestPrice"]["All"] = 0.00;
44
    if (array_sum($_SESSION["lowestPrice"]) > 0) {
45
        $_SESSION["lowestPrice"]["All"] = minNotNull($_SESSION["lowestPrice"]);
46
    }
22 - 47
    updatePbFile();
13 - 48
 
65 - 49
    saveSearchResult();
22 - 50
    updatePbFile();
12 - 51
 
45 - 52
    findDiscogsMaster($_SESSION["searchTerm"], !empty($_SESSION['sessData']['userLoggedIn']));
22 - 53
    updatePbFile();
5 - 54
}
55
 
9 - 56
function resetSessionVars() {
57
    $_SESSION["searchTerm"] = '';
46 - 58
    $_SESSION["discogsTitle"] = '';
59
    $_SESSION["discogsArtist"] = '';
14 - 60
    $_SESSION['md5LastSearch'] = '';
65 - 61
    $_SESSION["currentView"] = 'All';
62
    $_SESSION["currentLayout"] = 'TableView';
63
    $_SESSION["barcode"]["Type"] = '';
64
    $_SESSION["barcode"]["Value"] = '';
9 - 65
 
65 - 66
    $_SESSION["resultArr"] = [];
9 - 67
 
65 - 68
    $_SESSION["lowestPrice"]["Used"] = 0.00;
69
    $_SESSION["lowestPrice"]["New"] = 0.00;
70
    $_SESSION["lowestPrice"]["CD"] = 0.00;
71
    $_SESSION["lowestPrice"]["Record"] = 0.00;
72
    $_SESSION["lowestPrice"]["Digital"] = 0.00;
73
    $_SESSION["lowestPrice"]["Book"] = 0.00;
74
    $_SESSION["lowestPrice"]["All"] = 0.00;
9 - 75
}
76
 
65 - 77
// search for items on all sites
72 - 78
function searchAll($searchKey, $batchFlag = false) {
65 - 79
    $arr = [];
80
    if ($_SESSION["filterCondition"]["New"]) {
81
        $arr = get_vendor($arr, 'get_ebay', $searchKey, constant("NEW"));
82
    }
72 - 83
    if (!$batchFlag) { updatePbFile(); }
65 - 84
    if ($_SESSION["filterCondition"]["New"]) {
85
        $arr = get_vendor($arr, 'get_linkshare', $searchKey, constant("NEW"));
86
    }
72 - 87
    if (!$batchFlag) { updatePbFile(); }
65 - 88
    if ($_SESSION["filterCondition"]["New"]) {
89
        $arr = get_vendor($arr, 'get_cjaffiliate', $searchKey, constant("NEW"));
90
    }
72 - 91
    if (!$batchFlag) { updatePbFile(); }
65 - 92
    if ($_SESSION["filterCondition"]["New"]) {
93
        $arr = get_vendor($arr, 'get_walmart', $searchKey, constant("NEW"));
94
    }
72 - 95
    if (!$batchFlag) { updatePbFile(); }
65 - 96
    if ($_SESSION["filterCondition"]["New"]) {
97
        $arr = get_vendor($arr, 'get_itunes', $searchKey, constant("NEW"));
98
    }
72 - 99
    if (!$batchFlag) { updatePbFile(); }
17 - 100
 
65 - 101
    if ($_SESSION["filterCondition"]["Used"]) {
102
        $arr = get_vendor($arr, 'get_ebay', $searchKey, constant("USED"));
103
    }
72 - 104
    if (!$batchFlag) { updatePbFile(); }
17 - 105
 
66 - 106
//echo "<pre>";print_r($arr);echo "</pre";
24 - 107
 
65 - 108
    $arr = applyExchangeRates($arr);
109
    usort($arr, 'compare_price');
72 - 110
    if (!$batchFlag) { updatePbFile(); }
5 - 111
 
65 - 112
    return $arr;
5 - 113
}
114
 
20 - 115
// Search and merge
116
function get_vendor($arr, $func, $searchKey, $condition) {
65 - 117
    $arrTemp = $func($searchKey, $condition);
20 - 118
    return array_merge($arrTemp, $arr);
119
}
120
 
65 - 121
// check search filters
13 - 122
function checkSearchFilters() {
5 - 123
    $_SESSION["filterWarnings"] = "";
124
    $filterOk = true;
125
 
65 - 126
    if (!$_SESSION["filterCondition"]["New"] && !$_SESSION["filterCondition"]["Used"]) {
127
        $_SESSION["filterWarnings"] .= '<div class="alert alert-danger"><i class="fas fa-filter mr-1"></i> Please select at least one Condition (New or Used)</div>';
128
        $filterOk = false;
129
    }
5 - 130
 
65 - 131
    if (!$_SESSION["filterMediaType"]["CD"] && !$_SESSION["filterMediaType"]["Record"] && !$_SESSION["filterMediaType"]["Digital"] && !$_SESSION["filterMediaType"]["Book"]) {
132
        $_SESSION["filterWarnings"] .= '<div class="alert alert-danger"><i class="fas fa-filter mr-1"></i> Please select at least one Media Type (CD, Record, Digital or Book)</div>';
133
        $filterOk = false;
134
    }
13 - 135
 
65 - 136
    return ($filterOk);
5 - 137
}
138
 
21 - 139
// delete results from array that do not match the search filters
140
function applySearchFilter($arr) {
66 - 141
    unset($_SESSION['AdditionalFilterCounters']);
142
    unset($_SESSION['AdditionalFilters']);
65 - 143
    foreach ($arr as $key => $row) {
66 - 144
        if (!$_SESSION["filterMediaType"][$row["MediaType"]] || !$_SESSION["filterCondition"][$row["Condition"]]) {
21 - 145
            unset($arr[$key]);
66 - 146
        } else {
147
            if (isset($_SESSION['AdditionalFilterCounters']['Condition']['All'])) {
148
                $_SESSION['AdditionalFilterCounters']['Condition']['All']++;
149
            } else {
150
                $_SESSION['AdditionalFilterCounters']['Condition']['All'] = 1;
151
            }
152
 
153
            if (isset($_SESSION['AdditionalFilterCounters']['Merchant'][$row['Merchant']])) {
154
                $_SESSION['AdditionalFilterCounters']['Merchant'][$row['Merchant']]++;
155
            } else {
156
                $_SESSION['AdditionalFilterCounters']['Merchant'][$row['Merchant']] = 1;
157
                $_SESSION['AdditionalFilters']['Merchant'][$row['Merchant']] = true;
158
            }
159
 
160
            if (!empty($row['SellerName'])) {
161
                if (isset($_SESSION['AdditionalFilterCounters']['Seller'][$row['SellerName']])) {
162
                    $_SESSION['AdditionalFilterCounters']['Seller'][$row['SellerName']]++;
163
                } else {
164
                    $_SESSION['AdditionalFilterCounters']['Seller'][$row['SellerName']] = 1;
165
                    $_SESSION['AdditionalFilters']['Seller'][$row['SellerName']] = true;
166
                }
167
            }
168
 
169
            if (isset($_SESSION['AdditionalFilterCounters']['Condition'][$row['Condition']])) {
170
                $_SESSION['AdditionalFilterCounters']['Condition'][$row['Condition']]++;
171
            } else {
172
                $_SESSION['AdditionalFilterCounters']['Condition'][$row['Condition']] = 1;
173
                $_SESSION['AdditionalFilters']['Condition'][$row['Condition']] = true;
174
            }
175
 
176
            if (isset($_SESSION['AdditionalFilterCounters']['MediaType'][$row['MediaType']])) {
177
                $_SESSION['AdditionalFilterCounters']['MediaType'][$row['MediaType']]++;
178
            } else {
179
                $_SESSION['AdditionalFilterCounters']['MediaType'][$row['MediaType']] = 1;
180
                $_SESSION['AdditionalFilters']['MediaType'][$row['MediaType']] = true;
181
            }
182
 
183
            if (isset($_SESSION['AdditionalFilterCounters']['DetailCondition'][$row['DetailCondition']])) {
184
                $_SESSION['AdditionalFilterCounters']['DetailCondition'][$row['DetailCondition']]++;
185
            } else {
186
                $_SESSION['AdditionalFilterCounters']['DetailCondition'][$row['DetailCondition']] = 1;
187
                $_SESSION['AdditionalFilters']['DetailCondition'][$row['DetailCondition']] = true;
188
            }
189
 
190
            if (isset($_SESSION['AdditionalFilterCounters']['ShippingFrom'][$row['Country']])) {
191
                $_SESSION['AdditionalFilterCounters']['ShippingFrom'][$row['Country']]++;
192
            } else {
193
                $_SESSION['AdditionalFilterCounters']['ShippingFrom'][$row['Country']] = 1;
194
                $_SESSION['AdditionalFilters']['ShippingFrom'][$row['Country']] = true;
195
            }
65 - 196
        }
197
    }
23 - 198
 
66 - 199
    if (isset($_SESSION['AdditionalFilters']['Merchant'])) {
200
        ksort($_SESSION['AdditionalFilters']['Merchant'], SORT_NATURAL | SORT_FLAG_CASE);
201
    }
202
 
203
    if (isset($_SESSION['AdditionalFilters']['Seller'])) {
204
        ksort($_SESSION['AdditionalFilters']['Seller'], SORT_NATURAL | SORT_FLAG_CASE);
205
    }
206
 
207
    if (isset($_SESSION['AdditionalFilters']['Condition'])) {
208
        ksort($_SESSION['AdditionalFilters']['Condition'], SORT_NATURAL | SORT_FLAG_CASE);
209
    }
210
 
211
    if (isset($_SESSION['AdditionalFilters']['DetailCondition'])) {
212
        ksort($_SESSION['AdditionalFilters']['DetailCondition'], SORT_NATURAL | SORT_FLAG_CASE);
213
    }
214
 
215
    if (isset($_SESSION['AdditionalFilters']['ShippingFrom'])) {
216
        ksort($_SESSION['AdditionalFilters']['ShippingFrom'], SORT_NATURAL | SORT_FLAG_CASE);
217
    }
218
 
219
    if (isset($_SESSION['AdditionalFilters']['MediaType'])) {
220
        ksort($_SESSION['AdditionalFilters']['MediaType'], SORT_NATURAL | SORT_FLAG_CASE);
221
    }
222
 
21 - 223
    return $arr;
224
}
225
 
65 - 226
// filter view result table $_SESSION["resultArr"] for All, New, Used, Digital, or Book
227
function filterResults() {
228
    foreach ($_SESSION["resultArr"] as & $row) {
229
        if ($_SESSION["currentView"] == 'All') {
230
            $row["Show"] = true;
231
        }
232
        else {
66 - 233
            $row["Show"] = ($_SESSION["currentView"] == $row["Condition"] || $_SESSION["currentView"] == $row["MediaType"]);
65 - 234
        }
235
    }
5 - 236
}
13 - 237
 
66 - 238
// filter view result table $_SESSION["resultArr"] for detailed filter selection
239
function detailFilterResults($selArr) {
67 - 240
    if (!empty($selArr['filterCondition'])) {
241
        foreach($_SESSION['AdditionalFilters']['Condition'] as $key => $value) {
242
            $_SESSION['AdditionalFilters']['Condition'][$key] = false;
243
        }
244
        if (!is_array($selArr['filterCondition'])) { $selArr['filterCondition'] = [ $selArr['filterCondition'] ];}
245
        foreach($selArr['filterCondition'] as $value) {
246
            $_SESSION['AdditionalFilters']['Condition'][$value] = true;
247
        }
248
    } else {
68 - 249
        $selArr['filterCondition'] = [];
250
        foreach($_SESSION['AdditionalFilters']['Condition'] as $key => $value) {
251
            if ($value) {
252
                $selArr['filterCondition'][] = $key;
253
            }
254
        }
66 - 255
    }
256
 
67 - 257
    if (!empty($selArr['filterMediaType'])) {
258
        foreach($_SESSION['AdditionalFilters']['MediaType'] as $key => $value) {
259
            $_SESSION['AdditionalFilters']['MediaType'][$key] = false;
260
        }
261
        if (!is_array($selArr['filterMediaType'])) { $selArr['filterMediaType'] = [ $selArr['filterMediaType'] ];}
262
        foreach($selArr['filterMediaType'] as $value) {
263
            $_SESSION['AdditionalFilters']['MediaType'][$value] = true;
264
        }
265
    } else {
68 - 266
        $selArr['filterMediaType'] = [];
267
        foreach($_SESSION['AdditionalFilters']['MediaType'] as $key => $value) {
268
            if ($value) {
269
                $selArr['filterMediaType'][] = $key;
270
            }
271
        }
66 - 272
    }
273
 
67 - 274
    if (!empty($selArr['filterShipFrom'])) {
275
        foreach($_SESSION['AdditionalFilters']['ShippingFrom'] as $key => $value) {
276
            $_SESSION['AdditionalFilters']['ShippingFrom'][$key] = false;
277
        }
278
        if (!is_array($selArr['filterShipFrom'])) { $selArr['filterShipFrom'] = [ $selArr['filterShipFrom'] ];}
279
        foreach($selArr['filterShipFrom'] as $value) {
280
            $_SESSION['AdditionalFilters']['ShippingFrom'][$value] = true;
281
        }
282
    } else {
68 - 283
        $selArr['filterShipFrom'] = [];
284
        foreach($_SESSION['AdditionalFilters']['ShippingFrom'] as $key => $value) {
285
            if ($value) {
286
                $selArr['filterShipFrom'][] = $key;
287
            }
288
        }
66 - 289
    }
290
 
67 - 291
    if (!empty($selArr['filterMerchant'])) {
292
        foreach($_SESSION['AdditionalFilters']['Merchant'] as $key => $value) {
293
            $_SESSION['AdditionalFilters']['Merchant'][$key] = false;
294
        }
295
        if (!is_array($selArr['filterMerchant'])) { $selArr['filterMerchant'] = [ $selArr['filterMerchant'] ];}
296
        foreach($selArr['filterMerchant'] as $value) {
297
            $_SESSION['AdditionalFilters']['Merchant'][$value] = true;
298
        }
299
    } else {
68 - 300
        $selArr['filterMerchant'] = [];
301
        foreach($_SESSION['AdditionalFilters']['Merchant'] as $key => $value) {
302
            if ($value) {
303
                $selArr['filterMerchant'][] = $key;
304
            }
305
        }
66 - 306
    }
307
 
308
    foreach ($_SESSION["resultArr"] as & $row) {
309
        $row["Show"] = true;
310
 
311
        if (!in_array($row["Condition"], $selArr['filterCondition']) ||
312
            !in_array($row["MediaType"], $selArr['filterMediaType']) ||
313
            !in_array($row["Merchant"], $selArr['filterMerchant']) ||
314
            !in_array($row["Country"], $selArr['filterShipFrom'])) {
315
            $row["Show"] = false;
316
        }
317
    }
318
}
319
 
320
function resetDetailFilter() {
321
    if (isset($_SESSION['AdditionalFilters']['Merchant'])) {
322
        foreach($_SESSION['AdditionalFilters']['Merchant'] as $key => $field) {
323
            $_SESSION['AdditionalFilters']['Merchant'][$key] = true;
324
        }
325
    }
326
 
327
    if (isset($_SESSION['AdditionalFilters']['Seller'])) {
328
        foreach($_SESSION['AdditionalFilters']['Seller'] as $key => $field) {
329
            $_SESSION['AdditionalFilters']['Seller'][$key] = true;
330
        }
331
    }
332
 
333
    if (isset($_SESSION['AdditionalFilters']['Condition'])) {
334
        foreach($_SESSION['AdditionalFilters']['Condition'] as $key => $field) {
335
            $_SESSION['AdditionalFilters']['Condition'][$key] = true;
336
        }
337
    }
338
 
339
    if (isset($_SESSION['AdditionalFilters']['DetailCondition'])) {
340
        foreach($_SESSION['AdditionalFilters']['DetailCondition'] as $key => $field) {
341
            $_SESSION['AdditionalFilters']['DetailCondition'][$key] = true;
342
        }
343
    }
344
 
345
    if (isset($_SESSION['AdditionalFilters']['ShippingFrom'])) {
346
        foreach($_SESSION['AdditionalFilters']['ShippingFrom'] as $key => $field) {
347
            $_SESSION['AdditionalFilters']['ShippingFrom'][$key] = true;
348
        }
349
    }
350
 
351
    if (isset($_SESSION['AdditionalFilters']['MediaType'])) {
352
        foreach($_SESSION['AdditionalFilters']['MediaType'] as $key => $field) {
353
            $_SESSION['AdditionalFilters']['MediaType'][$key] = true;
354
        }
355
    }
356
 
357
    foreach ($_SESSION["resultArr"] as & $row) {
358
        $row["Show"] = true;
359
    }
360
}
361
 
65 - 362
// print result table or card deck
59 - 363
function printResult() {
364
    if ($_SESSION["currentLayout"] == 'TableView') {
365
        return buildTable();
65 - 366
    }
367
    else /* CardView */ {
59 - 368
        return buildCardDeck();
369
    }
370
}
371
 
65 - 372
// build HTML table from array
373
function buildTable() {
66 - 374
    global $mediaTypeTextArr;
375
    global $mediaTypeIconArr;
376
 
59 - 377
    $str = "";
1 - 378
 
9 - 379
    if (count($_SESSION["resultArr"]) > 0) {
58 - 380
        $str .= "<div class=\"table-responsive\">";
68 - 381
        $str .= "<table class=\"table table-striped table-condensed table-hover small bg-info\">";
65 - 382
        $str .= "<thead class=\"thead-dark sticky-top\"><tr><th>Image</th><th class=\"text-left\">Title / Merchant</th><th>Condition</th><th class=\"hide-small\">Price</th><th class=\"hide-small\">S/H</th><th>Total</th><th class=\"hide-extra-small\"></th></tr></thead>";
383
        $str .= "<tbody>";
17 - 384
 
65 - 385
        foreach ($_SESSION["resultArr"] as $row) {
386
            if (!$row["Show"]) {
387
                continue;
388
            }
1 - 389
 
54 - 390
            $href = "href=\"" . $row["URL"] . "\" target=\"_blank\" onclick=\"saveTransfer('" . $row["URL"] . "'); return true;\"";
59 - 391
            $title = $row["Title"];
392
            if (mb_strlen($row["Title"], 'UTF-8') > MAXTITLELENGTH) {
65 - 393
                $title = mb_substr($row["Title"], 0, MAXTITLELENGTH, 'UTF-8') . '...';
59 - 394
            }
5 - 395
 
65 - 396
            $str .= "<tr>";
13 - 397
 
9 - 398
            // Image
72 - 399
            $str .= "<td><a " . $href . " data-toggle=\"tooltip\" title=\"Buy It Now\"><img class=\"responsive-image\" src=\"" . $row["Image"] . "\" alt=\"Item Image\"></a></td>";
1 - 400
 
9 - 401
            // Title / Merchant
65 - 402
            $str .= "<td class=\"text-left\"><span class=\"font-weight-bold\"><a class=\"bg-info\" " . $href . " data-toggle=\"tooltip\" title=\"Buy It Now\">" . $title . "</a></span>";
58 - 403
            $str .= "<br/><br/>";
65 - 404
            $str .= "<span class=\"font-weight-bold\">" . $row["Merchant"] . "</span>";
405
            if ($row["FeedbackScore"] != - 1) {
406
                $str .= "<span class=\"hide-extra-small\"><br/>" . $row["SellerName"] . " (" . number_format($row["FeedbackScore"], 0, "", ",") . " / " . $row["FeedbackPercent"] . "%)</span>";
407
            }
408
            else if (!empty($row["SellerName"])) {
409
                $str .= "<span class=\"hide-extra-small\"><br/>" . $row["SellerName"] . "</span>";
410
            }
411
            if (!empty($row["TimeLeft"])) {
24 - 412
                $str .= "<br>" . $row["TimeLeft"];
65 - 413
            }
414
            $str .= "</td>";
1 - 415
 
9 - 416
            // Condition
65 - 417
            $str .= "<td>";
66 - 418
            $mediaTypeIcon = 'media-icon ' . $mediaTypeIconArr[$row["MediaType"]];
419
            $tooltip = $mediaTypeTextArr[$row["MediaType"]];
420
            $str .= "<span class=\"font-weight-bold\">" . $row["DetailCondition"] . "</span>";
65 - 421
            $str .= "<br/><br/>";
66 - 422
            $str .= "<i class=\"" . $mediaTypeIcon . "\" title=\"" . $tooltip . "\" data-toggle=\"tooltip\" data-placement=\"right\" data-delay=\"200\"></i>";
65 - 423
            $str .= "</td>";
5 - 424
 
9 - 425
            // Price
65 - 426
            $str .= "<td class=\"hide-small\">" . print_monetary($row["Price"], $row["Currency"]);
427
            if ($row["Currency"] != $_SESSION["buyer"]["Currency"]) {
428
                $str .= "<br/>&asymp; " . print_monetary($row["ConvertedPrice"], $_SESSION["buyer"]["Currency"]);
429
            }
430
            if ($row["BestOffer"] == "true") {
431
                $str .= "<br>Best Offer Accepted";
432
            }
433
            $str .= "</td>";
1 - 434
 
9 - 435
            // Shipping and Handling Cost
65 - 436
            $str .= "<td class=\"hide-small\">";
437
            if ($row["ShippingCost"] == 0.00) {
438
                $str .= "Free Shipping";
439
            }
440
            else {
441
                $str .= print_monetary($row["ShippingCost"], $row["ShippingCurrency"]);
442
            }
443
            if ($row["ShippingCost"] > 0.00 && $row["ShippingCurrency"] != $_SESSION["buyer"]["Currency"]) {
444
                $str .= "<br/>&asymp; " . print_monetary($row["ConvertedShippingCost"], $_SESSION["buyer"]["Currency"]);
445
            }
24 - 446
            if ($row["HandlingTime"] > 0) {
447
                $str .= "<br>Handling Time " . $row["HandlingTime"] . " day" . ($row["HandlingTime"] > 1 ? "s" : "");
448
            }
449
            if ($row["ShippingCost"] > 0.00 && $row["FreeShippingCap"] > 0) {
450
                $str .= "<br>Free Shipping over " . print_monetary($row["FreeShippingCap"], $_SESSION["buyer"]["Currency"]);
451
            }
65 - 452
            $str .= "<br/><img class=\"img-fluid\" title=\"Ships from " . getCountry($row["Country"]) . "\" data-toggle=\"tooltip\" data-placement=\"right\" data-delay=\"200\" src=\"/images/flags/" . $row["Country"] . ".png\" alt=\"" . getCountry($row["Country"]) . " Flag\"></td>";
1 - 453
 
9 - 454
            // Total Price
65 - 455
            $str .= "<td class=\"font-weight-bolder\">" . print_monetary($row["ConvertedTotalPrice"], $_SESSION["buyer"]["Currency"]) . "</td>";
1 - 456
 
9 - 457
            // Link
54 - 458
            if ($row["Merchant"] == "iTunes") {
66 - 459
                if ($row["MediaType"] == "Digital") {
54 - 460
                    $badge = "images/US-UK_Apple_Music_Badge_RGB.svg";
65 - 461
                }
462
                else {
54 - 463
                    $badge = "images/US_UK_Apple_Books_Badge_Get_RGB_071818.svg";
464
                }
60 - 465
                $linkImage = "<a class=\"btn\" role=\"button\" " . $href . "><img class=\"img-fluid\" src=\"" . $badge . "\" alt=\"iTunes Badge\"></a>";
65 - 466
            }
467
            else {
54 - 468
                $linkImage = "<a class=\"btn btn-danger\" role=\"button\" " . $href . "><i class=\"fas fa-shopping-cart btn-shop\"></i><span class=\"hide-small\"><br>Buy It Now</span></a>";
469
            }
65 - 470
            $str .= "<td class=\"hide-extra-small text-center\">" . $linkImage . "</td>";
1 - 471
 
65 - 472
            $str .= "</tr>";
9 - 473
        }
17 - 474
 
65 - 475
        $str .= "</tbody>";
476
        $str .= "<tfoot class=\"text-right\"><tr><td class=\"font-italic\" colspan=\"7\">Prices retrieved on " . gmdate("Y-m-d H:i") . " UTC<br>Daily exchange rates update</td></tr></tfoot>";
477
        $str .= "</table>";
478
        $str .= "</div>";
479
    }
480
    else {
59 - 481
        $str = printNoResultsWarning();
9 - 482
    }
1 - 483
 
65 - 484
    return ($str);
59 - 485
}
1 - 486
 
65 - 487
// build HTML card deck from array
488
function buildCardDeck() {
66 - 489
    global $mediaTypeTextArr;
490
    global $mediaTypeIconArr;
491
 
65 - 492
    $str = "";
59 - 493
 
494
    if (count($_SESSION["resultArr"]) > 0) {
61 - 495
        $str .= "<div class=\"card-deck small\">";
59 - 496
 
65 - 497
        foreach ($_SESSION["resultArr"] as $row) {
498
            if (!$row["Show"]) {
499
                continue;
500
            }
59 - 501
 
502
            $href = "href=\"" . $row["URL"] . "\" target=\"_blank\" onclick=\"saveTransfer('" . $row["URL"] . "'); return true;\"";
503
            $title = $row["Title"];
504
            if (mb_strlen($row["Title"], 'UTF-8') > MAXTITLELENGTH) {
65 - 505
                $title = mb_substr($row["Title"], 0, MAXTITLELENGTH, 'UTF-8') . '...';
59 - 506
            }
507
 
65 - 508
            $str .= "<div class=\"card m-2 shadow mx-auto result-card\">";
59 - 509
 
510
            // Image
68 - 511
            $str .= "<a class=\"p-0 m-0 bg-light text-center result-image\" " . $href . " data-toggle=\"tooltip\" title=\"Buy It Now\"><img class=\"p-0 m-0 responsive-image\" src=\"" . $row["Image"] . "\" alt=\"Item Image\"></a>";
59 - 512
 
65 - 513
            $str .= "<div class=\"card-body bg-light d-flex flex-column\">";
59 - 514
            // Title / Merchant
65 - 515
            $str .= "<p class=\"card-title font-weight-bold\"><a " . $href . " data-toggle=\"tooltip\" title=\"Buy It Now\">" . $title . "</a></p>";
516
            $str .= "<div class=\"card-text mt-auto\"><span class=\"font-weight-bold\">" . $row["Merchant"] . "</span>";
517
            $str .= "<br>";
59 - 518
 
66 - 519
            // Condition / MediaType
520
            $mediaTypeIcon = 'media-icon ' . $mediaTypeIconArr[$row["MediaType"]];
521
            $tooltip = $mediaTypeTextArr[$row["MediaType"]];
522
            $str .= $row["DetailCondition"];
523
            $str .= "<i class=\"float-right " . $mediaTypeIcon . "\" title=\"" . $tooltip . "\" data-toggle=\"tooltip\" data-placement=\"right\" data-delay=\"200\"></i>";
65 - 524
            $str .= "<br>";
59 - 525
 
526
            // Total Price
65 - 527
            $str .= "<span class=\"font-weight-bolder\">" . print_monetary($row["ConvertedTotalPrice"], $_SESSION["buyer"]["Currency"]) . "</span>";
60 - 528
            $str .= "</div>";
59 - 529
 
530
            $str .= "</div>";
531
 
532
            // Link / Ships from Flag
64 - 533
            $str .= "<div class=\"card-footer bg-dark\">";
60 - 534
            $str .= "<div class=\"row\">";
65 - 535
            $str .= "<div class=\"col-9\">";
59 - 536
            if ($row["Merchant"] == "iTunes") {
66 - 537
                if ($row["MediaType"] == "Digital") {
59 - 538
                    $badge = "images/US-UK_Apple_Music_Badge_RGB.svg";
65 - 539
                }
540
                else {
59 - 541
                    $badge = "images/US_UK_Apple_Books_Badge_Get_RGB_071818.svg";
542
                }
61 - 543
                $linkImage = "<a class=\"btn p-0 m-0\" role=\"button\" " . $href . "><img class=\"img-fluid p-0 m-0\" src=\"" . $badge . "\" alt=\"iTunes Badge\"></a>";
65 - 544
            }
545
            else {
61 - 546
                $linkImage = "<a class=\"btn btn-danger m-0\" role=\"button\" " . $href . "><i class=\"fas fa-shopping-cart\"></i></a>";
59 - 547
            }
65 - 548
            $str .= $linkImage;
59 - 549
            $str .= "</div>";
65 - 550
            $str .= "<div class=\"col-3\">";
551
            $str .= "<img class=\"float-right\" title=\"Ships from " . getCountry($row["Country"]) . "\" data-toggle=\"tooltip\" data-placement=\"right\" data-delay=\"200\" src=\"/images/flags/" . $row["Country"] . ".png\" alt=\"" . getCountry($row["Country"]) . " Flag\">";
60 - 552
            $str .= "</div>";
65 - 553
            $str .= "</div>";
554
            $str .= "</div>";
59 - 555
 
65 - 556
            $str .= "</div>";
59 - 557
        }
558
 
65 - 559
        $str .= "</div>";
560
        $str .= "<div class=\"py-2 text-right\"><p class=\"font-italic\">Prices retrieved on " . gmdate("Y-m-d H:i") . " UTC<br>Daily exchange rates update</p></div>";
561
    }
562
    else {
59 - 563
        $str = printNoResultsWarning();
564
    }
565
 
65 - 566
    return ($str);
5 - 567
}
568
 
65 - 569
// print directions when no results are found
59 - 570
function printNoResultsWarning() {
571
    $str = "<div class=\"text-center bg-warning p-3 rounded\">";
572
    $str .= "<p class=\"display-5 font-weight-bold\">Your search returned no results</p>";
573
    $str .= "<p>You may want to try the following:</p>";
70 - 574
    $str .= "<ul><li>Check the spelling</li><li>Try using fewer words</li><li>Check the search filter (<i class=\"fas fa-filter\"></i>) if you used one</li><li>Try using artist and title if you used a barcode; some albums have been released under various barcodes</li></ul>";
59 - 575
    $str .= "</div>";
576
 
577
    return $str;
578
}
579
 
66 - 580
function printResultHeader() {
581
    $str = '';
582
    $str .= '<nav class="navbar bg-black mt-2 pb-0">';
583
    $str .= '<ul class="nav nav-tabs">';
584
    $str .= '  <li class="nav-item border-0">';
585
    $str .= '    <a id="quickTab" class="nav-link';
68 - 586
    $str .= ($_SESSION["currentView"] == 'Apply' ? ' bg-white invert' : ' active bg-white') . '" href="#quickFilter">Quick</a>';
66 - 587
    $str .= '  </li>';
588
    $str .= '  <li class="nav-item border-0">';
589
    $str .= '    <a id="detailTab" class="nav-link';
68 - 590
    $str .= ($_SESSION["currentView"] == 'Apply' ? ' active bg-white' : ' bg-white invert') . '" href="#detailFilter">Detailed</a>';
66 - 591
    $str .= '  </li>';
592
    $str .= '</ul>';
593
    $str .= '<span class="ml-auto">';
594
    $str .= '    <button name="submit" value="TableView" type="' . getButtonType("TableView") . '" class="btn btn-sm filterButtonSmall ' . getBackgroundColor("TableView") . '"';
595
    $str .= ' data-toggle="tooltip" title="Table View" onclick="$(this).tooltip(\'hide\');"><span class="display-6 font-weight-bolder"><i class="fas fa-th-list"></i></span></button>';
596
    $str .= '    <button name="submit" value="CardView" type="' . getButtonType("CardView") . '" class="btn btn-sm filterButtonSmall ' . getBackgroundColor("CardView") . '"';
597
    $str .= ' data-toggle="tooltip" title="Card View" onclick="$(this).tooltip(\'hide\');"><span class="display-6 font-weight-bolder"><i class="fas fa-th-large"></i></span></button>';
598
    $str .= '</span>';
599
    $str .= '<span class="navbar-text text-white float-right ml-3">Showing ' . count(array_filter($_SESSION["resultArr"], function ($entry) { return ($entry['Show'] === true); })) . ' of ' . count($_SESSION["resultArr"]) . '</span>';
600
    $str .= '</nav>';
68 - 601
    $str .= '<div class="tab-content mb-3 bg-white">';
66 - 602
    $str .= '  <div id="quickFilter" class="tab-pane';
603
    $str .= ($_SESSION["currentView"] == 'Apply' ? '' : ' active') . '"><br>';
604
    $str .= resultHeader();
605
    $str .= '  </div>';
606
    $str .= '  <div id="detailFilter" class="container tab-pane';
607
    $str .= ($_SESSION["currentView"] == 'Apply' ? ' active' : ' bg-white') . '"><br>';
608
    $str .= detailResultHeader();
609
    $str .= '  </div>';
610
    $str .= '</div>';
611
 
612
  return $str;
613
}
614
 
65 - 615
// print summary/header on top of listing table
66 - 616
function resultHeader() {
11 - 617
    $str = '<div class="d-flex flex-wrap justify-content-center p-2">';
65 - 618
    $str .= '    <button name="submit" value="All" type="' . getButtonType("All") . '" class="btn mx-2 filterButton ' . getBackgroundColor("All") . '"';
619
    if ($_SESSION["lowestPrice"]["All"] <= 0) {
620
        $str .= ' disabled';
621
    }
622
    $str .= '><span class="display-6 font-weight-bolder">All</span><span class="display-7"> from</span><br><span class="display-6 font-weight-bolder">' . print_monetary($_SESSION["lowestPrice"]["All"], $_SESSION["buyer"]["Currency"]) . '</span>';
66 - 623
    $str .= '    <span class="badge">' . (isset($_SESSION['AdditionalFilterCounters']['Condition']['All']) ? $_SESSION['AdditionalFilterCounters']['Condition']['All'] : '') . '</span></button>';
62 - 624
    $str .= '    <button name="submit" value="New" type="' . getButtonType("New") . '" class="btn mx-2 filterButton ' . getBackgroundColor("New") . '"';
65 - 625
    if ($_SESSION["lowestPrice"]["New"] <= 0) {
626
        $str .= ' disabled';
627
    }
628
    $str .= '><span class="display-6 font-weight-bolder">New</span><span class="display-7"> from</span><br><span class="display-6 font-weight-bolder">' . print_monetary($_SESSION["lowestPrice"]["New"], $_SESSION["buyer"]["Currency"]) . '</span>';
66 - 629
    $str .= '    <span class="badge">' . (isset($_SESSION['AdditionalFilterCounters']['Condition']['New']) ? $_SESSION['AdditionalFilterCounters']['Condition']['New'] : '') . '</span></button>';
62 - 630
    $str .= '    <button name="submit" value="Used" type="' . getButtonType("Used") . '" class="btn mx-2 filterButton ' . getBackgroundColor("Used") . '"';
65 - 631
    if ($_SESSION["lowestPrice"]["Used"] <= 0) {
632
        $str .= ' disabled';
633
    }
20 - 634
    $str .= '><span class="display-6 font-weight-bolder">Used</span><span class="display-7"> from</span><br><span class="display-6 font-weight-bolder">' . print_monetary($_SESSION["lowestPrice"]["Used"], $_SESSION["buyer"]["Currency"]) . '</span>';
66 - 635
    $str .= '    <span class="badge">' . (isset($_SESSION['AdditionalFilterCounters']['Condition']['Used']) ? $_SESSION['AdditionalFilterCounters']['Condition']['Used'] : '') . '</span></button>';
636
 
637
    $str .= '</div>';
638
 
639
    return $str;
640
}
641
 
642
function detailResultHeader() {
643
    global $mediaTypeTextArr;
644
    global $mediaTypeIconArr;
645
 
646
    $str = '';
647
    $str .= '            <form id="detailFilterForm">';
648
    $str .= '                <input type="hidden" name="sessionTab" value="' . MySessionHandler::getSessionTab() . '">';
649
    $str .= '                <div class="">';
650
    $str .= '                    <div class="card-group">';
651
    $str .= '';
652
 
653
    // Condition
654
    if (isset($_SESSION['AdditionalFilterCounters']['Condition'])) {
655
        $str .= '                        <div class="card m-2">';
656
        $str .= '                            <div class="card-header font-weight-bold">Condition</div>';
657
        $str .= '                            <div class="card-body">';
658
        $cnt = count($_SESSION['AdditionalFilterCounters']['Condition']);
659
        foreach($_SESSION['AdditionalFilters']['Condition'] as $key => $value) {
660
            $str .= '                                <div class="form-check">';
661
            $str .= '                                    <label class="form-check-label">';
662
            $str .= '                                        <input name="filterCondition[]" type="checkbox" value="' . $key . '" class="form-check-input"';
663
            $str .= ($value ? " checked" : "");
664
            $str .= ($cnt > 2 ? "" : " disabled");
665
            $str .= '>' . $key . '<span class="badge badge-pill badge-dark ml-2">' . $_SESSION['AdditionalFilterCounters']['Condition'][$key] . '</span>';
666
            $str .= '                                    </label>';
667
            $str .= '                                </div>';
668
        }
669
        $str .= '                            </div>';
670
        $str .= '                        </div>';
13 - 671
    }
66 - 672
 
673
    // Media Type
674
    if (isset($_SESSION['AdditionalFilterCounters']['MediaType'])) {
675
        $str .= '                        <div class="card m-2">';
676
        $str .= '                            <div class="card-header font-weight-bold">Media Type</div>';
677
        $str .= '                            <div class="card-body">';
678
        $cnt = count($_SESSION['AdditionalFilterCounters']['MediaType']);
679
        foreach($_SESSION['AdditionalFilters']['MediaType'] as $key => $value) {
680
            $str .= '                                <div class="form-check">';
681
            $str .= '                                    <label class="form-check-label">';
682
            $str .= '                                        <input name="filterMediaType[]" type="checkbox" value="' . $key . '" class="form-check-input"';
683
            $str .= ($value ? " checked" : "");
684
            $str .= ($cnt > 1 ? "" : " disabled");
685
            $str .= '><i class="' . $mediaTypeIconArr[$key] . '"></i> ' . $mediaTypeTextArr[$key];
686
            $str .= '<span class="badge badge-pill badge-dark ml-2">' . $_SESSION['AdditionalFilterCounters']['MediaType'][$key] . '</span>';
687
            $str .= '                                    </label>';
688
            $str .= '                                </div>';
689
        }
690
        $str .= '                            </div>';
691
        $str .= '                        </div>';
65 - 692
    }
59 - 693
 
66 - 694
    // Merchant
695
    if (isset($_SESSION['AdditionalFilterCounters']['Merchant'])) {
696
        $str .= '                        <div class="card m-2">';
697
        $str .= '                            <div class="card-header font-weight-bold">Merchant</div>';
698
        $str .= '                            <div class="card-body">';
699
        $cnt = count($_SESSION['AdditionalFilterCounters']['Merchant']);
700
        foreach($_SESSION['AdditionalFilters']['Merchant'] as $key => $value) {
701
            $str .= '                                <div class="form-check">';
702
            $str .= '                                    <label class="form-check-label">';
703
            $str .= '                                        <input name="filterMerchant[]" type="checkbox" value="' . $key . '" class="form-check-input"';
704
            $str .= ($value ? " checked" : "");
705
            $str .= ($cnt > 1 ? "" : " disabled");
706
            $str .= '>' . $key . '<span class="badge badge-pill badge-dark ml-2">' . $_SESSION['AdditionalFilterCounters']['Merchant'][$key] . '</span>';
707
            $str .= '                                    </label>';
708
            $str .= '                                </div>';
709
        }
710
        $str .= '                            </div>';
711
        $str .= '                        </div>';
712
    }
1 - 713
 
66 - 714
    // Shipping From
715
    if (isset($_SESSION['AdditionalFilterCounters']['ShippingFrom'])) {
716
        $str .= '                        <div class="card m-2">';
717
        $str .= '                            <div class="card-header font-weight-bold">Shipping From</div>';
718
        $str .= '                            <div class="card-body">';
719
        $cnt = count($_SESSION['AdditionalFilterCounters']['ShippingFrom']);
720
        foreach($_SESSION['AdditionalFilters']['ShippingFrom'] as $key => $value) {
721
            $str .= '                                <div class="form-check">';
722
            $str .= '                                    <label class="form-check-label">';
723
            $str .= '                                        <input name="filterShipFrom[]" type="checkbox" value="' . $key . '" class="form-check-input"';
724
            $str .= ($value ? " checked" : "");
725
            $str .= ($cnt > 1 ? "" : " disabled");
726
            $str .= '><img class="img-fluid" title="Ships from ' . getCountry($key) . '" data-toggle="tooltip" data-delay="200" src="/images/flags/' . $key . '.png" alt="' . getCountry($key) . ' Flag"><span class="badge badge-pill badge-dark ml-2">' . $_SESSION['AdditionalFilterCounters']['ShippingFrom'][$key] . '</span>';
727
            $str .= '                                    </label>';
728
            $str .= '                                </div>';
729
        }
730
        $str .= '                            </div>';
731
        $str .= '                        </div>';
732
    }
733
 
734
    $str .= '                    </div>';
735
    $str .= '                </div>';
736
    $str .= '';
737
    $str .= '                <div class="p-2">';
738
    $str .= '                    <button type="submit" class="btn btn-success detailFilterButton" name="submit" value="Apply">Apply</button>';
739
    $str .= '                    <button type="submit" class="btn btn-danger detailFilterButton" name="submit" value="Reset">Reset</button>';
740
    $str .= '                </div>';
741
    $str .= '            </form>';
742
 
65 - 743
    return $str;
5 - 744
}
1 - 745
 
65 - 746
// get top button background color
747
function getBackgroundColor($sel) {
748
    if ($_SESSION["currentView"] == $sel || $_SESSION["currentLayout"] == $sel) {
749
        return ("btn-primary active");
750
    }
5 - 751
 
65 - 752
    return ("btn-primary invert");
13 - 753
}
5 - 754
 
65 - 755
// get top button type
756
function getButtonType($sel) {
757
    if ($_SESSION["currentView"] == $sel || $_SESSION["currentLayout"] == $sel) {
758
        return ("button");
759
    }
5 - 760
 
65 - 761
    return ("submit");
13 - 762
}
5 - 763
 
65 - 764
// compare price for sort low to high
765
function compare_price($a, $b) {
766
    return strnatcmp($a['ConvertedTotalPrice'], $b['ConvertedTotalPrice']);
5 - 767
}
13 - 768
 
65 - 769
// print monetary values with correct symbol and thousands/decimal delimiters
770
function print_monetary($num, $curr) {
771
    if ($curr == "USD") {
772
        return ("$" . number_format($num, 2, '.', ','));
773
    }
774
    else if ($curr == "CAD") {
775
        return ("C $" . number_format($num, 2, '.', ','));
776
    }
777
    else if ($curr == "EUR") {
778
        return (number_format($num, 2, ',', '.') . "&euro;");
779
    }
780
    else if ($curr == "GBP") {
781
        return ("&pound;" . number_format($num, 2, '.', ','));
782
    }
783
    else if ($curr == "AUD") {
784
        return ("AU $" . number_format($num, 2, '.', ','));
785
    }
1 - 786
 
65 - 787
    return ($curr . " " . number_format($num, 2, '.', ','));
5 - 788
}
1 - 789
 
65 - 790
// find lowest used / new prices
66 - 791
function findLowestCondition($condition) {
65 - 792
    foreach ($_SESSION["resultArr"] as $row) {
793
        if (!$row["Show"]) {
794
            continue;
795
        }
1 - 796
 
66 - 797
        if ($condition == $row["Condition"]) {
65 - 798
            return ($row["ConvertedTotalPrice"]);
799
        }
800
    }
5 - 801
 
65 - 802
    return (0);
5 - 803
}
804
 
65 - 805
// find lowest cd, record, digital and book prices
66 - 806
function findLowestMediaType($mediaType) {
65 - 807
    foreach ($_SESSION["resultArr"] as $row) {
808
        if (!$row["Show"]) {
809
            continue;
810
        }
20 - 811
 
66 - 812
        if ($mediaType == $row["MediaType"]) {
65 - 813
            return ($row["ConvertedTotalPrice"]);
814
        }
815
    }
20 - 816
 
65 - 817
    return (0);
20 - 818
}
819
 
65 - 820
// find lowest non-zero double value in array
821
function minNotNull(Array $values) {
822
    return min(array_diff(array_map('doubleval', $values) , array(
823
 
824
    )));
13 - 825
}
11 - 826
 
65 - 827
// apply exchange rates
828
function applyExchangeRates($arr) {
829
    foreach ($arr as & $value) {
830
        $value["ConvertedPrice"] = $value["Price"];
831
        $value["ConvertedShippingCost"] = $value["ShippingCost"];
1 - 832
 
65 - 833
        if ($_SESSION["buyer"]["Currency"] != $value["Currency"]) {
834
            $value["ConvertedPrice"] = number_format($value["Price"] / getExchangeRate($_SESSION["buyer"]["Currency"], $value["Currency"]) , 2, '.', '');
835
        }
1 - 836
 
65 - 837
        if ($_SESSION["buyer"]["Currency"] != $value["ShippingCurrency"]) {
838
            $value["ConvertedShippingCost"] = number_format($value["ShippingCost"] / getExchangeRate($_SESSION["buyer"]["Currency"], $value["ShippingCurrency"]) , 2, '.', '');
839
        }
1 - 840
 
65 - 841
        $value["ConvertedTotalPrice"] = number_format($value["ConvertedPrice"] + $value["ConvertedShippingCost"], 2, '.', '');
842
    }
5 - 843
 
65 - 844
    return ($arr);
5 - 845
}
846
 
36 - 847
// sanitize user input
65 - 848
function sanitizeInput($data) {
849
    $data = trim(preg_replace('/[\t\n\r\s]+/', ' ', $data));
850
    $data = stripslashes($data);
851
    $data = htmlspecialchars($data);
852
    return $data;
5 - 853
}
1 - 854
 
52 - 855
// sanitize user input (plus delete apostrophe)
856
function sanitizeInput2($data) {
65 - 857
    $data = trim(preg_replace('/[\t\n\r\s\']+/', ' ', $data));
858
    $data = stripslashes($data);
859
    $data = htmlspecialchars($data, ENT_QUOTES | ENT_HTML5);
860
    return $data;
52 - 861
}
862
 
14 - 863
// convert certain utf-8 characters to ascii
864
function cleanString($str) {
865
    $utf8 = array(
65 - 866
        '/[áàâãªä]/u' => 'a',
867
        '/[ÁÀÂÃÄ]/u' => 'A',
868
        '/[ÍÌÎÏ]/u' => 'I',
869
        '/[íìîï]/u' => 'i',
870
        '/[éèêë]/u' => 'e',
871
        '/[ÉÈÊË]/u' => 'E',
872
        '/[óòôõºö]/u' => 'o',
873
        '/[ÓÒÔÕÖ]/u' => 'O',
874
        '/[úùûü]/u' => 'u',
875
        '/[ÚÙÛÜ]/u' => 'U',
876
        '/ç/' => 'c',
877
        '/Ç/' => 'C',
878
        '/ñ/' => 'n',
879
        '/Ñ/' => 'N',
880
        '/–/' => '-', // UTF-8 hyphen to "normal" hyphen
881
        '/[’‘‹›‚]/u' => ' ', // Literally a single quote
882
        '/[“”«»„]/u' => ' ', // Double quote
883
        '/ /' => ' ', // nonbreaking space (equiv. to 0x160)
66 - 884
 
14 - 885
    );
886
 
65 - 887
    return preg_replace(array_keys($utf8) , array_values($utf8) , $str);
14 - 888
}
889
 
890
// Clean the search string
891
function searchFriendlyString($str) {
892
    $str = strip_tags($str);
893
    $str = stripslashes($str);
894
    $str = cleanString($str);
65 - 895
    $str = str_replace(array(
896
        "[",
897
        "]",
898
        "<",
899
        ">",
900
        "(",
901
        ")",
902
        " - ",
903
        " & ",
904
        " / "
905
    ) , " ", $str); // eliminate single '-', '&', '/' and brackets
906
    $str = trim(preg_replace('/[\t\n\r\s]+/', ' ', $str)); // delete extra whitespaces
14 - 907
    return ucwords($str);
908
}
909
 
65 - 910
// get a SESSION value, return empty string if not set
911
function getSV($var) {
912
    if (!isset($_SESSION[$var])) {
913
        return ('');
914
    }
1 - 915
 
65 - 916
    return ($_SESSION[$var]);
5 - 917
}
918
 
65 - 919
// initialize a SESSION value if not set
920
function initSV($var, $value) {
921
    if (!isset($_SESSION[$var])) {
922
        $_SESSION[$var] = $value;
923
    }
5 - 924
}
1 - 925
 
65 - 926
// initialize sessions variables
927
function initSessionVariables() {
928
    initSV("resultArr", []);
929
    initSV("barcode", array(
930
        "Type" => "",
931
        "Value" => ""
932
    ));
933
    initSV("buyer", array(
934
        "Country" => "United States",
935
        "Currency" => "USD",
936
        "Zip" => ""
937
    ));
938
    initSV("filterCondition", array(
939
        "New" => true,
940
        "Used" => true
941
    ));
942
    initSV("filterMediaType", array(
943
        "CD" => true,
944
        "Record" => true,
945
        "Digital" => true,
946
        "Book" => true
947
    ));
948
    initSV("currentView", "All");
949
    initSV("currentLayout", "TableView");
950
    initSV("lowestPrice", array(
951
        "Used" => 0.00,
952
        "New" => 0.00,
953
        "CD" => 0.00,
954
        "Record" => 0.00,
955
        "Digital" => 0.00,
956
        "Book" => "0.00",
957
        "All" => 0.00
958
    ));
959
    initSV("filterWarnings", "");
960
    initSV("md5LastSearch", "");
5 - 961
}
962
 
14 - 963
function md5SearchTerm() {
964
    $data = array();
965
    $data['cond'] = $_SESSION['filterCondition'];
966
    $data['type'] = $_SESSION['filterMediaType'];
17 - 967
    $data['buyer'] = $_SESSION['buyer'];
65 - 968
    $data['term'] = array(
969
        $_SESSION['searchTerm']
970
    );
14 - 971
 
65 - 972
    return (md5(json_encode($data)));
14 - 973
}
974
 
65 - 975
// check POST value, return true if set and false if not
976
function checkPV($var) {
977
    if (isset($_POST[$var])) {
978
        return (true);
979
    }
1 - 980
 
65 - 981
    return (false);
5 - 982
}
983
 
65 - 984
// get POST or GET value, return empty if not set
985
function getPGV($var) {
986
    if (isset($_POST[$var])) {
987
        return ($_POST[$var]);
988
    }
989
    else if (isset($_GET[$var])) {
990
        return ($_GET[$var]);
991
    }
14 - 992
 
65 - 993
    return ("");
14 - 994
}
995
 
1 - 996
// print search filter modal with current selection
65 - 997
function printSearchFilterModal() {
66 - 998
    global $mediaTypeTextArr;
999
    global $mediaTypeIconArr;
1000
 
65 - 1001
    $str = '';
1002
    $str .= '<div class="modal fade" id="filterModal">';
1003
    $str .= '    <div class="modal-dialog">';
1004
    $str .= '        <div class="modal-content">';
1005
    $str .= '';
1006
    $str .= '            <div class="modal-header bg-primary">';
1007
    $str .= '                <h4 class="modal-title">Search Filters</h4>';
1008
    $str .= '            </div>';
1009
    $str .= '';
1010
    $str .= '            <form method="post" action="/index.php" onsubmit="progressBar(\'Applying Modified Search Filter...\');">';
20 - 1011
    $str .= '                <input type="hidden" name="sessionTab" value="' . MySessionHandler::getSessionTab() . '">';
65 - 1012
    $str .= '                <div class="modal-body">';
1013
    $str .= '                    <div class="card-group">';
1014
    $str .= '';
1015
    $str .= '                        <div class="card m-2">';
1016
    $str .= '                            <div class="card-header font-weight-bold">Condition</div>';
1017
    $str .= '                            <div class="card-body">';
1018
    $str .= '                                <div class="form-check">';
1019
    $str .= '                                    <label class="form-check-label">';
66 - 1020
    $str .= '                                        <input name="filterCondition[]" type="checkbox" class="form-check-input" value="New"' . ($_SESSION["filterCondition"]["New"] ? " checked" : "") . '>New';
65 - 1021
    $str .= '                                    </label>';
1022
    $str .= '                                </div>';
1023
    $str .= '                                <div class="form-check">';
1024
    $str .= '                                    <label class="form-check-label">';
66 - 1025
    $str .= '                                        <input name="filterCondition[]" type="checkbox" class="form-check-input" value="Used"' . ($_SESSION["filterCondition"]["Used"] ? " checked" : "") . '>Used';
65 - 1026
    $str .= '                                    </label>';
1027
    $str .= '                                </div>';
1028
    $str .= '                            </div>';
1029
    $str .= '                        </div>';
1030
    $str .= '';
1031
    $str .= '                        <div class="card m-2">';
1032
    $str .= '                            <div class="card-header font-weight-bold">Media Type</div>';
1033
    $str .= '                            <div class="card-body">';
1034
    $str .= '                                <div class="form-check">';
1035
    $str .= '                                    <label class="form-check-label">';
66 - 1036
    $str .= '                                        <input name="filterMediaType[]" type="checkbox" class="form-check-input" value="CD"' . ($_SESSION["filterMediaType"]["CD"] ? " checked" : "") . '><i class="' . $mediaTypeIconArr["CD"] . '"></i> ' . $mediaTypeTextArr["CD"];
65 - 1037
    $str .= '                                    </label>';
1038
    $str .= '                                </div>';
1039
    $str .= '                                <div class="form-check">';
1040
    $str .= '                                    <label class="form-check-label">';
66 - 1041
    $str .= '                                        <input name="filterMediaType[]" type="checkbox" class="form-check-input" value="Record"' . ($_SESSION["filterMediaType"]["Record"] ? " checked" : "") . '><i class="' . $mediaTypeIconArr["Record"] . '"></i> ' . $mediaTypeTextArr["Record"];
65 - 1042
    $str .= '                                    </label>';
1043
    $str .= '                                </div>';
1044
    $str .= '                                <div class="form-check">';
1045
    $str .= '                                    <label class="form-check-label">';
66 - 1046
    $str .= '                                        <input name="filterMediaType[]" type="checkbox" class="form-check-input" value="Digital"' . ($_SESSION["filterMediaType"]["Digital"] ? " checked" : "") . '><i class="' . $mediaTypeIconArr["Digital"] . '"></i> ' . $mediaTypeTextArr["Digital"];
65 - 1047
    $str .= '                                    </label>';
1048
    $str .= '                                </div>';
1049
    $str .= '                                <div class="form-check">';
1050
    $str .= '                                    <label class="form-check-label">';
66 - 1051
    $str .= '                                        <input name="filterMediaType[]" type="checkbox" class="form-check-input" value="Book"' . ($_SESSION["filterMediaType"]["Book"] ? " checked" : "") . '><i class="' . $mediaTypeIconArr["Book"] . '"></i> ' . $mediaTypeTextArr["Book"];
65 - 1052
    $str .= '                                    </label>';
1053
    $str .= '                                </div>';
1054
    $str .= '                            </div>';
1055
    $str .= '                        </div>';
1056
    $str .= '                    </div>';
1057
    $str .= '                </div>';
1058
    $str .= '';
1059
    $str .= '                <div class="modal-footer bg-primary">';
1060
    $str .= '                  	 <input id="tempSearchTerm" type="hidden" name="searchTerm" value="">';
1061
    $str .= '                    <button type="submit" class="btn btn-success" name="submit" value="Save" onclick="document.getElementById(\'tempSearchTerm\').value = document.getElementById(\'searchTerm\').value;$(\'#filterModal\').modal(\'hide\');">Save</button>';
1062
    $str .= '                    <button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>';
1063
    $str .= '                </div>';
1064
    $str .= '            </form>';
1065
    $str .= '        </div>';
1066
    $str .= '    </div>';
1067
    $str .= '</div>';
1 - 1068
 
65 - 1069
    return ($str);
1 - 1070
}
3 - 1071
 
1072
// print search info modal
65 - 1073
function printSearchInfoModal() {
66 - 1074
    global $mediaTypeTextArr;
1075
    global $mediaTypeIconArr;
1076
 
65 - 1077
    $str = '';
1078
    $str .= '<div class="modal fade" id="searchInfoModal">';
1079
    $str .= '    <div class="modal-dialog">';
1080
    $str .= '        <div class="modal-content">';
1081
    $str .= '';
1082
    $str .= '            <div class="modal-header bg-primary">';
1083
    $str .= '                <h4 class="modal-title">Search Tips</h4>';
1084
    $str .= '                <button type="button" class="close" data-dismiss="modal"><i class="fas fa-window-close btn-dismiss"></i></button>';
1085
    $str .= '            </div>';
1086
    $str .= '';
1087
    $str .= '            <div class="modal-body bg-light text-dark">';
1088
    $str .= '              <div class="shadow p-4 mb-4 bg-white">';
1089
    $str .= '                <h4><i class="fas fa-filter"></i> Filter</h4>';
1090
    $str .= '                <p><span class="font-weight-bold">Condition:</span>';
1091
    $str .= '                    <br>Select "New" and / or "Used". The standard is to search for both.</p>';
1092
    $str .= '                <p><span class="font-weight-bold">Media Type:</span>';
66 - 1093
    $str .= '                    <br>Select <i class="' . $mediaTypeIconArr["CD"] . '"></i> "' . $mediaTypeTextArr["CD"] . '", <i class="' . $mediaTypeIconArr["Record"] . '"></i> "' . $mediaTypeTextArr["Record"] . '", <i class="' . $mediaTypeIconArr["Digital"] . '"></i> "' . $mediaTypeTextArr["Digital"] . '" and / or <i class="' . $mediaTypeIconArr["Book"] . '"></i> "' . $mediaTypeTextArr["Book"] . '". The standard is to search for all types.</p>';
65 - 1094
    $str .= '              </div>';
1095
    $str .= '              <div class="shadow p-4 mb-4 bg-white">';
1096
    $str .= '                <h4><i class="fas fa-shipping-fast"></i> Shipping To</h4>';
1097
    $str .= '                <p><span class="font-weight-bold">Country / Currency:</span>';
1098
    $str .= '                    <br>At this time only "United States" / "USD" are supported. The exchange rates are updated daily.</p>';
1099
    $str .= '                <p><span class="font-weight-bold">Zip Code:</span>';
1100
    $str .= '                    <br>Enter your postal code to get the accurate shipping cost for items listed using a shipping rate table.</p>';
1101
    $str .= '              </div>';
1102
    $str .= '              <div class="shadow p-4 bg-white">';
1103
    $str .= '                <h4><i class="fas fa-search"></i> Search Keywords</h4>';
1104
    $str .= '                <p><span class="font-weight-bold">Barcode:</span>';
1105
    $str .= '                    <br>The 12 or 13 digit barcode, normally located on the back, offers the best chance to find a specific album.</p>';
1106
    $str .= '                <p><span class="font-weight-bold">Artist and Title:</span>';
1107
    $str .= '                    <br>The full name of the album, including artist and title, will usually lead to a specific album.</p>';
1108
    $str .= '                <p><span class="font-weight-bold">Just Artist or Title:</span>';
1109
    $str .= '                    <br>Searches for artist or title alone will bring up multiple albums. You can later narrow your search further down, if necessary.</p>';
1110
    $str .= '                    <p><span class="font-italic">The search algorithm prefers the barcode number whenever available. Since some albums have been released under various barcodes, try searching again for author and title should the barcode search come up empty.</span></p>';
1111
    $str .= '              </div>';
1112
    $str .= '            </div>';
1113
    $str .= '            <div class="modal-footer bg-primary">';
1114
    $str .= '                <button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>';
1115
    $str .= '            </div>';
1116
    $str .= '        </div>';
1117
    $str .= '    </div>';
1118
    $str .= '</div>';
3 - 1119
 
65 - 1120
    return ($str);
3 - 1121
}
8 - 1122
 
65 - 1123
function saveSearchResult() {
1124
    $conn = MySessionHandler::getDBSessionId();
13 - 1125
 
65 - 1126
    $access = mysqli_real_escape_string($conn, time());
1127
    // BUGBUG
1128
    //  country
1129
    //  currency
1130
    $zip = mysqli_real_escape_string($conn, $_SESSION['buyer']['Zip']);
1131
    $condNew = $_SESSION['filterCondition']['New'] ? 'Y' : 'N';
1132
    $condUsed = $_SESSION['filterCondition']['Used'] ? 'Y' : 'N';
1133
    $mediaCD = $_SESSION['filterMediaType']['CD'] ? 'Y' : 'N';
1134
    $mediaRecord = $_SESSION['filterMediaType']['Record'] ? 'Y' : 'N';
1135
    $mediaDigital = $_SESSION['filterMediaType']['Digital'] ? 'Y' : 'N';
1136
    $mediaBook = $_SESSION['filterMediaType']['Book'] ? 'Y' : 'N';
1137
    $data = mysqli_real_escape_string($conn, $_SESSION['searchTerm']);
1138
    $lowNew = floatval($_SESSION['lowestPrice']['New']);
1139
    $lowUsed = floatval($_SESSION['lowestPrice']['Used']);
1140
    $lowDigital = floatval($_SESSION['lowestPrice']['Digital']);
1141
    $lowBook = floatval($_SESSION['lowestPrice']['Book']);
1142
    $count = count($_SESSION['resultArr']);
1143
    $userId = (empty($_SESSION['sessData']['userID']) ? 'NULL' : $_SESSION['sessData']['userID']);
8 - 1144
 
65 - 1145
    $sql = "INSERT
20 - 1146
                INTO searches
26 - 1147
                (sessId, access, zip, condNew, condUsed, mediaCD, mediaRecord, mediaDigital, mediaBook, data, lowNew, lowUsed, lowDigital, lowBook, count, userId)
35 - 1148
                VALUES ('" . session_id() . "', '$access', '$zip', '$condNew', '$condUsed', '$mediaCD', '$mediaRecord', '$mediaDigital', '$mediaBook', '$data', $lowNew, $lowUsed, $lowDigital, $lowBook, $count, $userId)";
8 - 1149
 
65 - 1150
    if (!($result = mysqli_query($conn, $sql))) {
1151
        error_log("MySQL Write Searches Error: " . mysqli_error($conn) . " (" . mysqli_errno($conn) . ")");
1152
    }
13 - 1153
 
65 - 1154
    return $result;
1155
}
13 - 1156
 
17 - 1157
function getUrl($url, $userAgent = null) {
1158
    $ch = curl_init();
1159
 
1160
    // Set request header with language and charset
1161
    $header = array(
1162
        "Accept-Language: en-US,en;q=0.5",
1163
        "Accept-Charset: UTF-8,*;q=0.5"
1164
    );
1165
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
1166
 
1167
    // Set optional user-agent
1168
    if ($userAgent) {
1169
        curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
1170
    }
1171
 
1172
    curl_setopt($ch, CURLOPT_ENCODING, "gzip,deflate");
1173
    curl_setopt($ch, CURLOPT_AUTOREFERER, true);
1174
    curl_setopt($ch, CURLOPT_HEADER, 0);
1175
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
1176
    curl_setopt($ch, CURLOPT_URL, $url);
1177
    $response = curl_exec($ch);
1178
    if ($response === false) {
20 - 1179
        error_log('Curl Request Error: ' . curl_error($ch) . ' (' . curl_errno($ch) . ')');
1180
        error_log('Url: ' . $url);
17 - 1181
        $response = '';
1182
    }
23 - 1183
 
17 - 1184
    curl_close($ch);
1185
 
1186
    return $response;
1187
}
1188
 
20 - 1189
// Retrieve search history for current session id
14 - 1190
function getSearchHistory() {
1191
    $str = "";
38 - 1192
    $sql = "select data, max(access) from searches where sessId = '" . session_id() . "'";
1193
    if (!empty($_SESSION['sessData']['userID'])) {
1194
        $sql .= " or userID = '" . $_SESSION['sessData']['userID'] . "'";
1195
    }
1196
    $sql .= " group by data order by max(access) desc, data limit 0,30;";
14 - 1197
    $conn = MySessionHandler::getDBSessionId();
1198
 
20 - 1199
    if ($result = mysqli_query($conn, $sql)) {
1200
        if (mysqli_num_rows($result) > 0) {
65 - 1201
            while ($row = mysqli_fetch_assoc($result)) {
20 - 1202
                $str .= "<option>" . $row["data"] . "</option>";
1203
            }
14 - 1204
        }
1205
    }
65 - 1206
    else if (mysqli_errno($conn)) {
1207
        error_log("MySQL Read Searches SQL: " . $sql);
1208
        error_log("MySQL Read Searches Error: " . mysqli_error($conn) . " (" . mysqli_errno($conn) . ")");
1209
    }
14 - 1210
 
1211
    return $str;
1212
}
1213
 
41 - 1214
// Retrieve coupons codes
1215
function getCouponCodes() {
1216
    $str = "";
1217
    $lastAdvertiser = "";
1218
 
1219
    if (!isLoggedIn()) {
1220
        return ("<h2>Please login to your Find Cheap Music account in order to see the coupons.</h2>");
1221
    }
1222
 
65 - 1223
    $sql = 'select advertiser, date_format(enddate, "%M %e, %Y") as enddate, description, couponcode, url, pixel from coupons where DATE(NOW()) between startdate and enddate group by advertiser, description order by advertiser, id';
41 - 1224
    $conn = MySessionHandler::getDBSessionId();
1225
 
1226
    if ($result = mysqli_query($conn, $sql)) {
1227
        if (mysqli_num_rows($result) > 0) {
68 - 1228
            $str .= "<div class=\"container py-4 bg-secondary border\">";
65 - 1229
            while ($row = mysqli_fetch_assoc($result)) {
1230
                if ($row["advertiser"] != $lastAdvertiser) {
41 - 1231
                    if (!empty($lastAdvertiser)) {
68 - 1232
                        $str .= "</ul>";
41 - 1233
                    }
43 - 1234
                    $str .= "<h3 class=\"bg-primary text-center mt-3 mb-1\">" . $row["advertiser"] . "</h3>";
68 - 1235
                    $str .= "<ul class=\"list-group\">";
41 - 1236
                    $lastAdvertiser = $row["advertiser"];
1237
                }
51 - 1238
                if (!empty($row["url"])) {
68 - 1239
                    $str .= "<li class=\"list-group-item\"><a class=\"btn btn-link text-left\" target=\"_blank\" href=\"";
51 - 1240
                    $str .= $row["url"];
1241
                    $str .= "\">";
68 - 1242
                    $str .= "<strong>" . $row["description"] . "</strong> until " . $row["enddate"];
51 - 1243
                    if (!empty($row["couponcode"])) {
1244
                        $str .= " (Use Coupon Code \"" . $row["couponcode"] . "\")";
1245
                    }
1246
                    $str .= "</a>";
1247
                    if (!empty($row["pixel"])) {
61 - 1248
                        $str .= "<img src=\"" . $row["pixel"] . "\" width=\"1\" height=\"1\" class=\"border-0\" alt=\"" . $row["advertiser"] . " Coupon\"/>";
51 - 1249
                    }
68 - 1250
                    $str .= "</li>";
41 - 1251
                }
1252
            }
68 - 1253
            $str .= "</ul>";
41 - 1254
            $str .= "</div>";
1255
        }
65 - 1256
    }
1257
    else if (mysqli_errno($conn)) {
41 - 1258
        $str .= "<h2>No Coupons available at the moment...</h2>";
1259
    }
1260
 
1261
    return $str;
1262
}
1263
 
14 - 1264
// Delete left over progressbar files older than 2 days
1265
function cleanupPbFiles() {
1266
    $files = glob("../tmp/pb*.txt");
65 - 1267
    $now = time();
14 - 1268
    foreach ($files as $file) {
1269
        if (is_file($file)) {
1270
            if ($now - filemtime($file) >= 60 * 60 * 24 * 2) { // 2 days and older
1271
                unlink($file);
1272
            }
65 - 1273
        }
14 - 1274
    }
1275
}
1276
 
1277
// Update progressbar file for a session
22 - 1278
function updatePbFile($flag = false) {
54 - 1279
    static $max_pb = 12; // max progressbar steps
22 - 1280
    static $current = 0;
23 - 1281
 
22 - 1282
    if ($flag) {
1283
        $current = 0;
65 - 1284
    }
1285
    else {
22 - 1286
        ++$current;
1287
    }
1288
 
1289
    if ($current > $max_pb) {
1290
        error_log("max_pb $max_pb is too small, current step is $current. Adjust tools.php (updatePbFile).");
1291
        $max_pb = $current;
1292
    }
65 - 1293
    $filename = session_id() . "_" . MySessionHandler::getSessionTab();
14 - 1294
    $arr_content = array();
1295
 
20 - 1296
    $percent = intval($current / $max_pb * 100);
14 - 1297
 
1298
    $arr_content['percent'] = $percent;
1299
    $arr_content['message'] = $current . " search(es) processed.";
1300
 
1301
    file_put_contents("../tmp/pb_" . $filename . ".txt", json_encode($arr_content));
1302
}
20 - 1303
 
1304
// Linkshare / CJ Affiliate csv dump
1305
function ls_cj_csv($fields) {
1306
    static $fh = null;
1307
    $delimiter = ',';
1308
    $enclosure = '"';
1309
    $mysql_null = false;
1310
 
1311
    if (!$fh) {
1312
        $fh = fopen("ls_cj.csv", "a+");
1313
    }
1314
 
1315
    $delimiter_esc = preg_quote($delimiter, '/');
1316
    $enclosure_esc = preg_quote($enclosure, '/');
1317
 
1318
    $output = array();
1319
    foreach ($fields as $field) {
1320
        if ($field === null && $mysql_null) {
1321
            $output[] = 'NULL';
1322
            continue;
1323
        }
1324
 
65 - 1325
        $output[] = preg_match("/(?:${delimiter_esc}|${enclosure_esc}|\s)/", $field) ? ($enclosure . str_replace($enclosure, $enclosure . $enclosure, $field) . $enclosure) : $field;
20 - 1326
    }
1327
 
1328
    fwrite($fh, join($delimiter, $output) . "\n");
1329
}
35 - 1330
 
1331
// Login in check
1332
function isLoggedIn() {
65 - 1333
    return (!empty($_SESSION['sessData']['userLoggedIn']) && !empty($_SESSION['sessData']['userID'])) ? true : false;
35 - 1334
}
1335
 
1336
// unset all login system session data
1337
function unsetSessData() {
1338
    unset($_SESSION['sessData']['userLoggedIn']);
1339
    unset($_SESSION['sessData']['userID']);
1340
    unset($_SESSION['sessData']['loginType']);
36 - 1341
}
1342
 
1343
// get user image name
1344
function getUserImage($userData) {
1345
    if (empty($userData) || empty($userData['picture'])) {
57 - 1346
        return 'login/assets/images/default.png';
36 - 1347
    }
38 - 1348
 
36 - 1349
    $httpPos = strpos($userData['picture'], 'http');
1350
    if ($httpPos === false) {
65 - 1351
        return 'login/' . UPLOAD_PATH . 'profile_picture/' . $userData['picture'];
36 - 1352
    }
1353
 
1354
    return $userData['picture'];
38 - 1355
}
39 - 1356
 
1357
function startsWith($haystack, $needle) {
1358
    return substr_compare($haystack, $needle, 0, strlen($needle)) === 0;
1359
}
1360
 
1361
function endsWith($haystack, $needle) {
1362
    return substr_compare($haystack, $needle, -strlen($needle)) === 0;
45 - 1363
}
50 - 1364
 
1365
function displayBarcode($barcode) {
1366
    $barcode = trim(preg_replace("/[^0-9]/", "", $barcode));
1367
    $barcodeType = clsLibGTIN::GTINCheck($barcode, false, 1);
1368
 
1369
    if ($barcodeType == "UPC" && strlen($barcode) == 12) {
1370
        return substr($barcode, 0, 1) . "-" . substr($barcode, 1, 5) . "-" . substr($barcode, 6, 5) . "-" . substr($barcode, 11, 1);
65 - 1371
    }
1372
    else if (($barcodeType == "EAN" || $barcodeType == "ISBN") && strlen($barcode) == 13) {
50 - 1373
        return substr($barcode, 0, 1) . "-" . substr($barcode, 1, 6) . "-" . substr($barcode, 7, 6);
65 - 1374
    }
1375
    else if ($barcodeType == "EAN" && strlen($barcode) == 14) {
50 - 1376
        return substr($barcode, 0, 1) . "-" . substr($barcode, 1, 2) . "-" . substr($barcode, 3, 5) . "-" . substr($barcode, 8, 5) . "-" . substr($barcode, 13, 1);
65 - 1377
    }
1378
    else {
50 - 1379
        return $barcode;
1380
    }
52 - 1381
}