Subversion Repositories cheapmusic

Rev

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

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