Subversion Repositories cheapmusic

Rev

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