Subversion Repositories cheapmusic

Rev

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