Subversion Repositories cheapmusic

Rev

Rev 96 | Rev 99 | 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']);
96 - 1182
    $ip = inet_pton($_SERVER['REMOTE_ADDR']);
8 - 1183
 
65 - 1184
    $sql = "INSERT
20 - 1185
                INTO searches
96 - 1186
                (sessId, access, ip, zip, condNew, condUsed, mediaCD, mediaRecord, mediaDigital, mediaBook, data, lowNew, lowUsed, lowDigital, lowBook, count, userId)
1187
                VALUES ('" . session_id() . "', '$access', '$ip', '$zip', '$condNew', '$condUsed', '$mediaCD', '$mediaRecord', '$mediaDigital', '$mediaBook', '$data', $lowNew, $lowUsed, $lowDigital, $lowBook, $count, $userId)";
8 - 1188
 
65 - 1189
    if (!($result = mysqli_query($conn, $sql))) {
1190
        error_log("MySQL Write Searches Error: " . mysqli_error($conn) . " (" . mysqli_errno($conn) . ")");
1191
    }
13 - 1192
 
65 - 1193
    return $result;
1194
}
13 - 1195
 
17 - 1196
function getUrl($url, $userAgent = null) {
1197
    $ch = curl_init();
1198
 
1199
    // Set request header with language and charset
1200
    $header = array(
1201
        "Accept-Language: en-US,en;q=0.5",
1202
        "Accept-Charset: UTF-8,*;q=0.5"
1203
    );
1204
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
1205
 
1206
    // Set optional user-agent
1207
    if ($userAgent) {
1208
        curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
1209
    }
1210
 
1211
    curl_setopt($ch, CURLOPT_ENCODING, "gzip,deflate");
1212
    curl_setopt($ch, CURLOPT_AUTOREFERER, true);
1213
    curl_setopt($ch, CURLOPT_HEADER, 0);
84 - 1214
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
1215
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
17 - 1216
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
1217
    curl_setopt($ch, CURLOPT_URL, $url);
1218
    $response = curl_exec($ch);
1219
    if ($response === false) {
20 - 1220
        error_log('Curl Request Error: ' . curl_error($ch) . ' (' . curl_errno($ch) . ')');
1221
        error_log('Url: ' . $url);
17 - 1222
        $response = '';
1223
    }
23 - 1224
 
17 - 1225
    curl_close($ch);
1226
 
1227
    return $response;
1228
}
1229
 
20 - 1230
// Retrieve search history for current session id
14 - 1231
function getSearchHistory() {
1232
    $str = "";
38 - 1233
    $sql = "select data, max(access) from searches where sessId = '" . session_id() . "'";
1234
    if (!empty($_SESSION['sessData']['userID'])) {
1235
        $sql .= " or userID = '" . $_SESSION['sessData']['userID'] . "'";
1236
    }
1237
    $sql .= " group by data order by max(access) desc, data limit 0,30;";
14 - 1238
    $conn = MySessionHandler::getDBSessionId();
1239
 
20 - 1240
    if ($result = mysqli_query($conn, $sql)) {
1241
        if (mysqli_num_rows($result) > 0) {
65 - 1242
            while ($row = mysqli_fetch_assoc($result)) {
20 - 1243
                $str .= "<option>" . $row["data"] . "</option>";
1244
            }
14 - 1245
        }
1246
    }
65 - 1247
    else if (mysqli_errno($conn)) {
1248
        error_log("MySQL Read Searches SQL: " . $sql);
1249
        error_log("MySQL Read Searches Error: " . mysqli_error($conn) . " (" . mysqli_errno($conn) . ")");
1250
    }
14 - 1251
 
1252
    return $str;
1253
}
1254
 
41 - 1255
// Retrieve coupons codes
1256
function getCouponCodes() {
1257
    $str = "";
1258
    $lastAdvertiser = "";
1259
 
1260
    if (!isLoggedIn()) {
1261
        return ("<h2>Please login to your Find Cheap Music account in order to see the coupons.</h2>");
1262
    }
1263
 
65 - 1264
    $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 - 1265
    $conn = MySessionHandler::getDBSessionId();
1266
 
1267
    if ($result = mysqli_query($conn, $sql)) {
1268
        if (mysqli_num_rows($result) > 0) {
68 - 1269
            $str .= "<div class=\"container py-4 bg-secondary border\">";
65 - 1270
            while ($row = mysqli_fetch_assoc($result)) {
1271
                if ($row["advertiser"] != $lastAdvertiser) {
41 - 1272
                    if (!empty($lastAdvertiser)) {
68 - 1273
                        $str .= "</ul>";
41 - 1274
                    }
43 - 1275
                    $str .= "<h3 class=\"bg-primary text-center mt-3 mb-1\">" . $row["advertiser"] . "</h3>";
68 - 1276
                    $str .= "<ul class=\"list-group\">";
41 - 1277
                    $lastAdvertiser = $row["advertiser"];
1278
                }
51 - 1279
                if (!empty($row["url"])) {
68 - 1280
                    $str .= "<li class=\"list-group-item\"><a class=\"btn btn-link text-left\" target=\"_blank\" href=\"";
51 - 1281
                    $str .= $row["url"];
1282
                    $str .= "\">";
68 - 1283
                    $str .= "<strong>" . $row["description"] . "</strong> until " . $row["enddate"];
51 - 1284
                    if (!empty($row["couponcode"])) {
1285
                        $str .= " (Use Coupon Code \"" . $row["couponcode"] . "\")";
1286
                    }
1287
                    $str .= "</a>";
1288
                    if (!empty($row["pixel"])) {
61 - 1289
                        $str .= "<img src=\"" . $row["pixel"] . "\" width=\"1\" height=\"1\" class=\"border-0\" alt=\"" . $row["advertiser"] . " Coupon\"/>";
51 - 1290
                    }
68 - 1291
                    $str .= "</li>";
41 - 1292
                }
1293
            }
68 - 1294
            $str .= "</ul>";
41 - 1295
            $str .= "</div>";
1296
        }
65 - 1297
    }
1298
    else if (mysqli_errno($conn)) {
41 - 1299
        $str .= "<h2>No Coupons available at the moment...</h2>";
1300
    }
1301
 
1302
    return $str;
1303
}
1304
 
14 - 1305
// Delete left over progressbar files older than 2 days
1306
function cleanupPbFiles() {
84 - 1307
    $files = glob("../MyFiles/tmp/pb*.txt");
65 - 1308
    $now = time();
14 - 1309
    foreach ($files as $file) {
1310
        if (is_file($file)) {
1311
            if ($now - filemtime($file) >= 60 * 60 * 24 * 2) { // 2 days and older
1312
                unlink($file);
1313
            }
65 - 1314
        }
14 - 1315
    }
1316
}
1317
 
1318
// Update progressbar file for a session
22 - 1319
function updatePbFile($flag = false) {
83 - 1320
    static $max_pb = 14; // max progressbar steps
22 - 1321
    static $current = 0;
23 - 1322
 
22 - 1323
    if ($flag) {
1324
        $current = 0;
65 - 1325
    }
1326
    else {
22 - 1327
        ++$current;
1328
    }
1329
 
1330
    if ($current > $max_pb) {
1331
        error_log("max_pb $max_pb is too small, current step is $current. Adjust tools.php (updatePbFile).");
1332
        $max_pb = $current;
1333
    }
65 - 1334
    $filename = session_id() . "_" . MySessionHandler::getSessionTab();
14 - 1335
    $arr_content = array();
1336
 
20 - 1337
    $percent = intval($current / $max_pb * 100);
14 - 1338
 
1339
    $arr_content['percent'] = $percent;
1340
    $arr_content['message'] = $current . " search(es) processed.";
84 - 1341
    $file = "../MyFiles/tmp/pb_" . $filename . ".txt";
14 - 1342
 
77 - 1343
    if ($percent >= 100) {
1344
        @unlink($file);
1345
    } else {
1346
        file_put_contents($file, json_encode($arr_content));
1347
    }
14 - 1348
}
20 - 1349
 
1350
// Linkshare / CJ Affiliate csv dump
1351
function ls_cj_csv($fields) {
1352
    static $fh = null;
1353
    $delimiter = ',';
1354
    $enclosure = '"';
1355
    $mysql_null = false;
1356
 
1357
    if (!$fh) {
1358
        $fh = fopen("ls_cj.csv", "a+");
1359
    }
1360
 
1361
    $delimiter_esc = preg_quote($delimiter, '/');
1362
    $enclosure_esc = preg_quote($enclosure, '/');
1363
 
1364
    $output = array();
1365
    foreach ($fields as $field) {
1366
        if ($field === null && $mysql_null) {
1367
            $output[] = 'NULL';
1368
            continue;
1369
        }
1370
 
65 - 1371
        $output[] = preg_match("/(?:${delimiter_esc}|${enclosure_esc}|\s)/", $field) ? ($enclosure . str_replace($enclosure, $enclosure . $enclosure, $field) . $enclosure) : $field;
20 - 1372
    }
1373
 
1374
    fwrite($fh, join($delimiter, $output) . "\n");
1375
}
35 - 1376
 
1377
// Login in check
1378
function isLoggedIn() {
65 - 1379
    return (!empty($_SESSION['sessData']['userLoggedIn']) && !empty($_SESSION['sessData']['userID'])) ? true : false;
35 - 1380
}
1381
 
1382
// unset all login system session data
1383
function unsetSessData() {
1384
    unset($_SESSION['sessData']['userLoggedIn']);
1385
    unset($_SESSION['sessData']['userID']);
1386
    unset($_SESSION['sessData']['loginType']);
36 - 1387
}
1388
 
1389
// get user image name
1390
function getUserImage($userData) {
1391
    if (empty($userData) || empty($userData['picture'])) {
57 - 1392
        return 'login/assets/images/default.png';
36 - 1393
    }
38 - 1394
 
36 - 1395
    $httpPos = strpos($userData['picture'], 'http');
1396
    if ($httpPos === false) {
65 - 1397
        return 'login/' . UPLOAD_PATH . 'profile_picture/' . $userData['picture'];
36 - 1398
    }
1399
 
1400
    return $userData['picture'];
38 - 1401
}
39 - 1402
 
1403
function startsWith($haystack, $needle) {
1404
    return substr_compare($haystack, $needle, 0, strlen($needle)) === 0;
1405
}
1406
 
1407
function endsWith($haystack, $needle) {
1408
    return substr_compare($haystack, $needle, -strlen($needle)) === 0;
45 - 1409
}
50 - 1410
 
1411
function displayBarcode($barcode) {
1412
    $barcode = trim(preg_replace("/[^0-9]/", "", $barcode));
1413
    $barcodeType = clsLibGTIN::GTINCheck($barcode, false, 1);
1414
 
1415
    if ($barcodeType == "UPC" && strlen($barcode) == 12) {
1416
        return substr($barcode, 0, 1) . "-" . substr($barcode, 1, 5) . "-" . substr($barcode, 6, 5) . "-" . substr($barcode, 11, 1);
65 - 1417
    }
1418
    else if (($barcodeType == "EAN" || $barcodeType == "ISBN") && strlen($barcode) == 13) {
50 - 1419
        return substr($barcode, 0, 1) . "-" . substr($barcode, 1, 6) . "-" . substr($barcode, 7, 6);
65 - 1420
    }
1421
    else if ($barcodeType == "EAN" && strlen($barcode) == 14) {
50 - 1422
        return substr($barcode, 0, 1) . "-" . substr($barcode, 1, 2) . "-" . substr($barcode, 3, 5) . "-" . substr($barcode, 8, 5) . "-" . substr($barcode, 13, 1);
65 - 1423
    }
1424
    else {
50 - 1425
        return $barcode;
1426
    }
52 - 1427
}
93 - 1428
 
1429
// fuzzy search to verify titles are relevant
1430
function verifyResultArr() {
1431
    require_once ('php/Fuse/Bitap/Bitap.php');
1432
    require_once ('php/Fuse/Bitap/matched_indices.php');
1433
    require_once ('php/Fuse/Bitap/pattern_alphabet.php');
1434
    require_once ('php/Fuse/Bitap/regex_search.php');
1435
    require_once ('php/Fuse/Bitap/score.php');
1436
    require_once ('php/Fuse/Bitap/search.php');
1437
    require_once ('php/Fuse/Helpers/deep_value.php');
1438
    require_once ('php/Fuse/Helpers/is_list.php');
1439
    require_once ('php/Fuse/Fuse.php');
1440
 
1441
    if (!empty($_SESSION["barcode"]["Value"]) || empty($_SESSION["resultArr"])) {
1442
        return;
1443
    }
1444
 
1445
    $options = [
1446
      'shouldSort' => false,
1447
    //  'tokenize' => true,
1448
    //  'matchAllTokens' => true,
1449
    //  'findAllMatches' => true,
1450
      'includeScore' => true,
1451
      'includeMatches' => true,
1452
      'threshold' => 0.6,
1453
      'location' => 0,
1454
      'distance' => 100,
1455
      'minMatchCharLength' => 5,
1456
      'keys' => [ "Title" ]
1457
    ];
1458
 
1459
    $fuse = new Fuse($_SESSION["resultArr"], $options);
1460
    $result = $fuse->search($_SESSION["searchTerm"]);
1461
 
1462
    $_SESSION["resultArr"] = [];
1463
    foreach($result as $r) {
97 - 1464
        $r['item']['score'] = (!empty($r['score']) ? $r['score'] : 0);
1465
        $r['item']['indices'] = (!empty($r['matches'][0]['indices']) ? $r['matches'][0]['indices'] : []);
93 - 1466
        $_SESSION['resultArr'][] = $r['item'];
1467
    }
1468
 
1469
    /* debug start
1470
    $lines = [];
1471
    foreach($_SESSION['resultArr'] as $r) {
1472
        $p = 0;
1473
        $t = '';
1474
        foreach($r['indices'] as $ind) {
1475
            if ($p < $ind[0]) {
1476
                $t .= substr($r['Title'], $p, $ind[0] - $p);
1477
            }
1478
            $t .= "<b>" . substr($r['Title'], $ind[0], $ind[1] - $ind[0] + 1) . "</b>";
1479
            $p = $ind[1] + 1;
1480
        }
1481
        if ($p < strlen($r['Title'])) {
1482
            $t .= substr($r['Title'], $p);
1483
        }
1484
        $lines[] = array ('score' => $r['score'], 'title' => $t);
1485
    }
1486
 
1487
    usort($lines, 'compare_score');
1488
    echo "<p>";
1489
    foreach($lines as $l) {
1490
        echo $l['score'] . ": " . $l['title'] . "<br/>";
1491
    }
1492
    echo "</p>";
1493
    debug end */
1494
}
1495
 
1496
// compare score for sort low to high
1497
function compare_score($a, $b) {
1498
    return ($a['score'] > $b['score']);
1499
}
96 - 1500
 
1501
function my_error_log($msg) {
1502
    error_log("[" . date("d-M-Y H:m:s") . "] " . $msg . PHP_EOL, 3, $_SERVER['DOCUMENT_ROOT'] . "/../MyFiles/logs/my_php_error.log");
1503
}