Subversion Repositories cheapmusic

Rev

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

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