Subversion Repositories cheapmusic

Rev

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