Subversion Repositories cheapmusic

Rev

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