Subversion Repositories cheapmusic

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 - 1
<?php
5 - 2
include_once('php/exchangeRates.php');
3
include_once('php/countryCodes.php');
4
include_once('php/constants.php');
5
include_once('php/ebay.php');
1 - 6
 
5 - 7
  // search
8
function performSearch() {
9
	$_SESSION["currentView"] = 'All';
10
	$_SESSION["barcode"]["Type"] = clsLibGTIN::GTINCheck($_SESSION["searchTerm"], false, 1);
11
	$_SESSION["barcode"]["Value"] = clsLibGTIN::GTINCheck($_SESSION["searchTerm"]);
1 - 12
 
5 - 13
	$_SESSION["resultArr"] = [];
14
	$_SESSION["resultArr"] = searchAll($_SESSION["searchTerm"]);
15
 
16
	$_SESSION["lowestPrice"]["Used"] = findLowest("Used");
17
	$_SESSION["lowestPrice"]["New"] = findLowest("New");
18
	$_SESSION["lowestPrice"]["Digital"] = findLowest("Digital");
19
	$_SESSION["lowestPrice"]["All"] = 0.00;
20
	if (array_sum($_SESSION["lowestPrice"]) > 0) {
21
		$_SESSION["lowestPrice"]["All"] = minNotNull($_SESSION["lowestPrice"]);
22
	}
23
}
24
 
25
  // search for items on all sites
26
function searchAll($searchKey)
27
{
28
	$arr = [];
29
	$newArr = [];
30
	if ($_SESSION["filterCondition"]["New"]) {
31
		$arr = get_ebay($searchKey, constant("NEW"));
32
	}
33
	if ($_SESSION["filterCondition"]["Used"]) {
34
		$newArr = get_ebay($searchKey, constant("USED"));
35
	}
36
	$arr = array_merge($arr, $newArr);
37
 
38
	$arr = applyExchangeRates($arr);
39
	usort($arr, 'compare_price');
40
 
41
	return $arr;
42
}
43
 
44
  // check search filters
45
function checkSearchFilters() {
46
    $_SESSION["filterWarnings"] = "";
47
    $filterOk = true;
48
 
49
	if (!$_SESSION["filterCondition"]["New"] && !$_SESSION["filterCondition"]["Used"]) {
50
		$_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>';
51
		$filterOk = false;
52
	}
53
 
54
	if (!$_SESSION["filterMediaType"]["CD"] && !$_SESSION["filterMediaType"]["Record"] && !$_SESSION["filterMediaType"]["Digital"]) {
55
		$_SESSION["filterWarnings"] .= '<div class="alert alert-danger"><i class="fas fa-filter mr-1"></i> Please select at least one Media Type (CD, Record or Digital)</div>';
56
		$filterOk = false;
57
	}
58
 
59
	return($filterOk);
60
}
61
 
62
  // filter results for types All, New, Used or Digital
63
function filterResults()
64
{
65
	foreach ($_SESSION["resultArr"] as &$value) {
66
		if ($_SESSION["currentView"] == 'All') {
67
			$value["Show"] = true;
68
		} else {
69
			$value["Show"] = ($_SESSION["currentView"] == $value["Type"]);
70
		}
71
	}
72
}
1 - 73
 
74
  // build HTML table from array
5 - 75
function buildTable()
76
{
77
	$str = "<div>";
78
	$str .= "<table class=\"table table-striped table-condensed small\">";
79
	$str .= "<thead class=\"thead-dark sticky-top\"><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>";
80
	$str .= "<tbody>";
1 - 81
 
5 - 82
	foreach ($_SESSION["resultArr"] as $value) {
83
		if (!$value["Show"]) {
84
			continue;
85
		}
1 - 86
 
5 - 87
		$url = base64_encode($value["URL"]);
88
 
89
		$str .= "<tr>";
1 - 90
 
91
        // Image
5 - 92
		$str .= "<td><a href=\"/redirect.php?target=" . $url . "\" target=\"_blank\"><img class=\"img-fluid\" src=\"" . $value["Image"] . "\" alt=\"Item Image\"></a></td>";
1 - 93
 
94
        // Title / Merchant
5 - 95
		$str .= "<td class=\"text-left\"><span class=\"font-weight-bold\"><a href=\"/redirect.php?target=" . $url . "\" target=\"_blank\">" . $value["Title"] . "</a></span><br/><br/>";
96
		$str .= "<span class=\"font-weight-bold\">" . $value["Merchant"] . "</span>";
97
		$str .= "<span class=\"hide-extra-small\"><br/>" . $value["SellerName"] . " (" . number_format($value["FeedbackScore"], 0, "", ",") . " / " . $value["FeedbackPercent"] . "%)</span></td>";
1 - 98
 
99
        // Condition
5 - 100
		$str .= "<td>";
101
		$categoryIcon = "";
102
		$categoryStyle = "";
103
		$tooltip = "";
104
		switch ($value["Category"]) {
105
			case "CD":
106
				$categoryIcon = "fas fa-compact-disc";
107
				$categoryStyle = "color:silver;";
108
				$tooltip = "Compact Disc";
109
				break;
1 - 110
 
5 - 111
			case "Record":
112
				$categoryIcon = "fas fa-dot-circle";
113
				$tooltip = "Vinyl Record";
114
				break;
115
 
116
			case "Digital":
117
				$categoryIcon = "digital";
118
				$tooltip = "Digital Download";
119
				break;
120
		}
121
		$str .= "<span class=\"font-weight-bold\">" . $value["Condition"] . "</span>";
122
		$str .= "<br/><br/>";
123
		$str .= "<i class=\"" . $categoryIcon . "\" style=\"font-size:32px;text-shadow:2px 2px 4px #000000;" . $categoryStyle . "\" title=\"" . $tooltip . "\" data-toggle=\"tooltip\" data-placement=\"right\" data-delay=\"200\"></i>";
124
		$str .= "</td>";
125
 
1 - 126
        // Price
5 - 127
		$str .= "<td class=\"hide-small\">" . print_monetary($value["Price"], $value["Currency"]);
128
		if ($value["Currency"] != $_SESSION["buyer"]["Currency"]) {
129
			$str .= "<br/>&asymp; " . print_monetary($value["ConvertedPrice"], $_SESSION["buyer"]["Currency"]);
130
		}
131
		$str .= "</td>";
1 - 132
 
133
        // Shipping and Handling Cost
5 - 134
		$str .= "<td class=\"hide-small\">";
135
		if ($value["ShippingCost"] == 0.00) {
136
			$str .= "Free Shipping";
137
		} else {
138
			$str .= print_monetary($value["ShippingCost"], $value["ShippingCurrency"]);
139
		}
140
		if ($value["ShippingCost"] > 0.00 && $value["ShippingCurrency"] != $_SESSION["buyer"]["Currency"]) {
141
			$str .= "<br/>&asymp; " . print_monetary($value["ConvertedShippingCost"], $_SESSION["buyer"]["Currency"]);
142
		}
143
		$str .= "<br/><img class=\"img-fluid\" title=\"Ships from " . getCountry($value["Country"]) . "\" data-toggle=\"tooltip\" data-placement=\"right\" data-delay=\"200\" src=\"/images/flags/" . $value["Country"] . ".png\" alt=\"" . getCountry($value["Country"]) . " Flag\"></td>";
1 - 144
 
145
        // Total Price
5 - 146
		$str .= "<td class=\"font-weight-bolder\">" . print_monetary($value["ConvertedTotalPrice"], $_SESSION["buyer"]["Currency"]) . "</td>";
1 - 147
 
148
        // Link
5 - 149
		$str .= "<td class=\"hide-extra-small\"><a class=\"btn btn-danger\" role=\"button\" href=\"/redirect.php?target=" . $url . "\" target=\"_blank\"><i class=\"fas fa-shopping-cart\" style=\"font-size:20px\"></i><span class=\"hide-small\"><br>Buy It Now</span></a></td>";
1 - 150
 
5 - 151
		$str .= "</tr>";
152
	}
1 - 153
 
5 - 154
	$str .= "</tbody>";
155
	$str .= "<tfoot class=\"text-right\"><tr><td colspan=\"7\">Prices retrieved on " . gmdate("Y-m-d H:i") . " UTC<br>Daily exchange rates update</td></tr></tfoot>";
156
	$str .= "</table>";
157
	$str .= "</div>";
1 - 158
 
5 - 159
	return ($str);
160
}
161
 
1 - 162
  // print summary/header on top of listing table
5 - 163
function printTableHeader()
164
{
7 - 165
    global $handler;
166
 
5 - 167
	$str = '<form method="post" action="/index.php">';
7 - 168
    $str .= '<input type="hidden" name="sessionTab" value="' . $handler->getSessionTab() . '">';
169
    $str .= '<div class="d-flex flex-wrap justify-content-center p-2">';
5 - 170
	$str .= '    <button name="submit" value="All" type="' . getButtonType("All") . '" class="btn mx-2 ' . getBackgroundColor("All") . '"';
171
	if ($_SESSION["lowestPrice"]["All"] <= 0) {
172
		$str .= ' disabled';
173
	}
6 - 174
	$str .= '><span class="display-5 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>';
5 - 175
	$str .= '    </button>';
176
	$str .= '    <button name="submit" value="New" type="' . getButtonType("New") . '" class="btn mx-2 ' . getBackgroundColor("New") . '"';
177
	if ($_SESSION["lowestPrice"]["New"] <= 0) {
178
		$str .= ' disabled';
179
	}
6 - 180
	$str .= '><span class="display-5 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>';
5 - 181
	$str .= '    </button>';
182
	$str .= '    <button name="submit" value="Used" type="' . getButtonType("Used") . '" class="btn mx-2 ' . getBackgroundColor("Used") . '"';
183
	if ($_SESSION["lowestPrice"]["Used"] <= 0) {
184
		$str .= ' disabled';
185
	}
6 - 186
	$str .= '><span class="display-5 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>';
5 - 187
	$str .= '    </button>';
188
	/*
189
    $str .= '    <button name="submit" value="Digital" type="' . getButtonType("Digital") . '" class="btn mx-2 ' . getBackgroundColor("Digital"). '"';
190
    if ($_SESSION["lowestPrice"]["Digital"] <= 0) {
191
        $str .= ' disabled';
1 - 192
    }
6 - 193
    $str .= '><span class="display-5 font-weight-bolder">Digital</span><span class="display-7"> from</span><br><span class="display-6 font-weight-bolder">' . print_monetary($_SESSION["lowestPrice"]["Digital"], $_SESSION["buyer"]["Currency"]) . '</span>';
5 - 194
    $str .= '    </button>';
195
*/
196
					$str .= '</div>';
197
	$str .= '</form>';
1 - 198
 
5 - 199
	return $str;
200
}
1 - 201
 
5 - 202
  // get top button background color
203
function getBackgroundColor($sel)
204
{
205
	if ($_SESSION["currentView"] == $sel) {
206
		return ("btn-primary active");
207
	}
208
 
209
	return ("btn-primary text-dark");
210
}
211
 
212
  // get top button type
213
function getButtonType($sel)
214
{
215
	if ($_SESSION["currentView"] == $sel) {
216
		return ("button");
217
	}
218
 
219
	return ("submit");
220
}
221
 
1 - 222
  // compare price for sort low to high
5 - 223
function compare_price($a, $b)
224
{
225
	return strnatcmp($a['ConvertedTotalPrice'], $b['ConvertedTotalPrice']);
226
}
1 - 227
 
228
  // print monetary values with correct symbol and thousands/decimal delimiters
5 - 229
function print_monetary($num, $curr)
230
{
231
	if ($curr == "USD") {
232
		return ("$" . number_format($num, 2, '.', ','));
233
	} else if ($curr == "CAD") {
234
		return ("C $" . number_format($num, 2, '.', ','));
235
	} else if ($curr == "EUR") {
236
		return (number_format($num, 2, ',', '.') . "&euro;");
237
	} else if ($curr == "GBP") {
238
		return ("&pound;" . number_format($num, 2, '.', ','));
239
	} else if ($curr == "AUD") {
240
		return ("AU $" . number_format($num, 2, '.', ','));
241
	}
1 - 242
 
5 - 243
	return ($curr . " " . number_format($num, 2, '.', ','));
244
}
1 - 245
 
246
  // find lowest used / new prices and return their array index
5 - 247
function findLowest($type)
248
{
249
	foreach ($_SESSION["resultArr"] as $value) {
250
		if (!$value["Show"]) {
251
			continue;
252
		}
1 - 253
 
5 - 254
		if ($type == $value["Type"]) {
255
			return ($value["ConvertedTotalPrice"]);
256
		}
257
	}
258
 
259
	return (0);
260
}
261
 
262
  // find lowest non-zero double value in array
263
function minNotNull(Array $values)
264
{
265
	return min(array_diff(array_map('doubleval', $values), array(0)));
266
}
1 - 267
  // apply exchange rates
5 - 268
function applyExchangeRates($arr)
269
{
270
	foreach ($arr as &$value) {
271
		$value["ConvertedPrice"] = $value["Price"];
272
		$value["ConvertedShippingCost"] = $value["ShippingCost"];
1 - 273
 
5 - 274
		if ($_SESSION["buyer"]["Currency"] != $value["Currency"]) {
275
			$value["ConvertedPrice"] = number_format($value["Price"] / getExchangeRate($_SESSION["buyer"]["Currency"], $value["Currency"]), 2, '.', '');
276
		}
1 - 277
 
5 - 278
		if ($_SESSION["buyer"]["Currency"] != $value["ShippingCurrency"]) {
279
			$value["ConvertedShippingCost"] = number_format($value["ShippingCost"] / getExchangeRate($_SESSION["buyer"]["Currency"], $value["ShippingCurrency"]), 2, '.', '');
280
		}
1 - 281
 
5 - 282
		$value["ConvertedTotalPrice"] = number_format($value["ConvertedPrice"] + $value["ConvertedShippingCost"], 2, '.', '');
283
	}
284
 
285
	return ($arr);
286
}
287
 
1 - 288
  // sanitize user input
5 - 289
function sanitizeInput($data)
290
{
291
	$data = trim($data);
292
	$data = stripslashes($data);
293
	$data = htmlspecialchars($data);
294
	return $data;
295
}
1 - 296
 
297
  // get a SESSION value, return empty string if not set
5 - 298
function getSV($var)
299
{
300
	if (!isset($_SESSION[$var])) {
301
		return ('');
302
	}
1 - 303
 
5 - 304
	return ($_SESSION[$var]);
305
}
306
 
1 - 307
  // initialize a SESSION value if not set
5 - 308
function initSV($var, $value)
309
{
310
	if (!isset($_SESSION[$var])) {
311
		$_SESSION[$var] = $value;
312
	}
313
}
1 - 314
 
5 - 315
  // initialize sessions variables
316
function initSessionVariables()
317
{
318
	initSV("resultArr", []);
319
	initSV("barcode", array("Type" => "", "Value" => ""));
320
	initSV("buyer", array("Country" => "United States", "Currency" => "USD", "Zip" => ""));
321
	initSV("filterCondition", array("New" => true, "Used" => true));
322
	initSV("filterMediaType", array("CD" => true, "Record" => false, "Digital" => false));
323
	initSV("currentView", "All");
324
	initSV("lowestPrice", array("Used" => 0.00, "New" => 0.00, "Digital" => 0.00, "All" => 0.00));
325
	initSV("filterWarnings", "");
326
}
327
 
1 - 328
  // check POST value, return true if set and false if not
5 - 329
function checkPV($var)
330
{
331
	if (isset($_POST[$var])) {
332
		return (true);
333
	}
1 - 334
 
5 - 335
	return (false);
336
}
337
 
1 - 338
// print search filter modal with current selection
5 - 339
function printSearchFilterModal()
340
{
7 - 341
    global $handler;
342
 
5 - 343
	$str = '';
344
	$str .= '<div class="modal fade" id="filterModal">';
345
	$str .= '    <div class="modal-dialog">';
346
	$str .= '        <div class="modal-content">';
347
	$str .= '';
348
	$str .= '            <div class="modal-header bg-primary">';
349
	$str .= '                <h4 class="modal-title">Search Filters</h4>';
350
	$str .= '            </div>';
351
	$str .= '';
352
	$str .= '            <form method="post" action="/index.php">';
7 - 353
    $str .= '                <input type="hidden" name="sessionTab" value="' . $handler->getSessionTab() . '">';
5 - 354
	$str .= '                <div class="modal-body">';
355
	$str .= '                    <div class="card-group">';
356
	$str .= '';
357
	$str .= '                        <div class="card m-2">';
358
	$str .= '                            <div class="card-header font-weight-bold">Condition</div>';
359
	$str .= '                            <div class="card-body">';
360
	$str .= '                                <div class="form-check">';
361
	$str .= '                                    <label class="form-check-label">';
362
	$str .= '                                        <input name="filterConditionNew" type="checkbox" class="form-check-input" value="New"' . ($_SESSION["filterCondition"]["New"] ? " checked" : "") . '>New';
363
	$str .= '                                    </label>';
364
	$str .= '                                </div>';
365
	$str .= '                                <div class="form-check">';
366
	$str .= '                                    <label class="form-check-label">';
367
	$str .= '                                        <input name="filterConditionUsed" type="checkbox" class="form-check-input" value="Used"' . ($_SESSION["filterCondition"]["Used"] ? " checked" : "") . '>Used';
368
	$str .= '                                    </label>';
369
	$str .= '                                </div>';
370
	$str .= '                            </div>';
371
	$str .= '                        </div>';
372
	$str .= '';
373
	$str .= '                        <div class="card m-2">';
374
	$str .= '                            <div class="card-header font-weight-bold">Media Type</div>';
375
	$str .= '                            <div class="card-body">';
376
	$str .= '                                <div class="form-check">';
377
	$str .= '                                    <label class="form-check-label">';
378
	$str .= '                                        <input name="filterMediaTypeCD" type="checkbox" class="form-check-input" value="CD"' . ($_SESSION["filterMediaType"]["CD"] ? " checked" : "") . '><i class="fas fa-compact-disc" style="color:silver;"></i> Compact Disc';
379
	$str .= '                                    </label>';
380
	$str .= '                                </div>';
381
	$str .= '                                <div class="form-check">';
382
	$str .= '                                    <label class="form-check-label">';
383
	$str .= '                                        <input name="filterMediaTypeRecord" type="checkbox" class="form-check-input" value="Record"' . ($_SESSION["filterMediaType"]["Record"] ? " checked" : "") . '><i class="fas fa-dot-circle"></i> Vinyl Record';
384
	$str .= '                                    </label>';
385
	$str .= '                                </div>';
386
	$str .= '                                <div class="form-check">';
387
	$str .= '                                    <label class="form-check-label">';
388
	$str .= '                                        <input name="filterMediaTypeDigital" type="checkbox" class="form-check-input" value="Digital"' . ($_SESSION["filterMediaType"]["Digital"] ? " checked" : "") . '><i class="fas fa-download"></i> Digital';
389
	$str .= '                                    </label>';
390
	$str .= '                                </div>';
391
	$str .= '                            </div>';
392
	$str .= '                        </div>';
393
	$str .= '                    </div>';
394
	$str .= '                </div>';
395
	$str .= '';
396
	$str .= '                <div class="modal-footer bg-primary">';
397
	$str .= '                    <button id="save" type="submit" class="btn btn-success" name="submit" value="Save">Save</button>';
398
	$str .= '                    <button id="discard" type="button" class="btn btn-danger" data-dismiss="modal">Discard</button>';
399
	$str .= '                </div>';
400
	$str .= '            </form>';
401
	$str .= '        </div>';
402
	$str .= '    </div>';
403
	$str .= '</div>';
1 - 404
 
5 - 405
	return ($str);
1 - 406
}
3 - 407
 
408
// print search info modal
5 - 409
function printSearchInfoModal()
410
{
411
	$str = '';
412
	$str .= '<div class="modal fade" id="searchInfoModal">';
413
	$str .= '    <div class="modal-dialog">';
414
	$str .= '        <div class="modal-content">';
415
	$str .= '';
416
	$str .= '            <div class="modal-header bg-primary">';
417
	$str .= '                <h4 class="modal-title">Search Tips</h4>';
418
	$str .= '                <button type="button" class="close" data-dismiss="modal"><i class="fas fa-window-close" style="font-size:24px"></i></button>';
419
	$str .= '            </div>';
420
	$str .= '';
421
	$str .= '            <div class="modal-body">';
422
	$str .= '                <h4>Search Keywords</h4>';
423
	$str .= '';
424
	$str .= '                <p><span class=font-weight-bold>Barcode:</span>';
425
	$str .= '                    <br>The 12 or 13 digit barcode, normally located on the back, offers the best chance to find a specific album.</p>';
426
	$str .= '';
427
	$str .= '                <p><span class=font-weight-bold>Artist and Title:</span>';
428
	$str .= '                    <br>The full name of the album, including artist and title, will usually lead to a specific album.</p>';
429
	$str .= '';
430
	$str .= '                <p><span class=font-weight-bold>Just Artist or Title:</span>';
431
	$str .= '                    <br>Searches for artist or title alone will bring up random albums.</p>';
432
	$str .= '            </div>';
433
	$str .= '        </div>';
434
	$str .= '    </div>';
435
	$str .= '</div>';
3 - 436
 
5 - 437
	return ($str);
3 - 438
}
5 - 439
?>