Subversion Repositories munaweb

Rev

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

Rev Author Line No. Line
2 - 1
<!DOCTYPE html>
2
<html lang="en">
3
 
4
<head>
5
    <title>Order Reports</title>
6
    <meta charset="UTF-8">
7
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
8
    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
9
    <link rel="icon" href="favicon.ico" type="image/x-icon">
10
 
11
    <link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
12
    <link href="https://fonts.googleapis.com/css?family=Lato" rel="stylesheet">
13
    <link rel="stylesheet" href="css/style.css">
14
    <script src="js/XMLWriter.js"></script>
15
    <script src="js/lodash.min.js"></script>
16
    <script src="js/XMLparse.js"></script>
17
    <script src="js/datetimepicker_css.js"></script>
18
    <script src="js/moment.js"></script>
19
    <script src="js/moment-timezone.js"></script>
20
    <script src="js/muna-tools.js"></script>
21
</head>
22
 
23
<body onload="return initConfig();">
24
    <div class="w3-main">
25
        <div class="w3-container w3-padding w3-margin w3-card-4">
26
            <div class="w3-container w3-gray" style="height:100px">
27
                <img class="w3-image" src="images/MUNA%20-%20Logo%20100x100.png" alt="MUNA Trading Logo" style="height:100px">
28
                <p id="connected" class="w3-xxlarge w3-right">Order Reports
29
                    <input id="login" type="button" class="w3-btn w3-large w3-green w3-margin w3-round-large w3-ripple w3-right w3-hide" onclick="eBayLogin();" value="Login" />
30
                </p>
31
            </div>
32
 
33
            <div class="w3-row">
34
                <div>
35
                    <form id="searchForm" class="w3-container w3-light-grey w3-padding w3-small" onsubmit="return getOrders();">
36
                        <div class="w3-container w3-card-2 w3-cell w3-padding">
37
                            <h4>Report Range</h4>
38
                            <div class="w3-row">
39
                                <div class="w3-half w3-padding">
40
                                    <label for="startDate" class="w3-small">On or After <img src="images2/cal.gif" alt="Calendar Picker" onclick="javascript:NewCssCal('startDate','yyyyMMdd','arrow',false,'24',false,'past')" style="cursor:pointer" /></label>
41
                                    <input id="startDate" name="startDate" class="w3-input w3-border-0" style="height:3em" type="text" required>
42
                                </div>
43
                                <div class="w3-half w3-padding">
44
                                    <label for="endDate" class="w3-small">On or Before <img src="images2/cal.gif" alt="Calendar Picker" onclick="javascript:NewCssCal('endDate','yyyyMMdd','arrow',false,'24',false,'past')" style="cursor:pointer" /></label>
45
                                    <input id="endDate" name="endDate" class="w3-input w3-border-0" style="height:3em" type="text" required>
46
                                </div>
47
                            </div>
48
                        </div>
49
                        <div class="w3-container w3-card-2 w3-cell w3-padding">
50
                            <p>
51
                                <input id="shippingList" class="w3-radio" type="radio" style="height:1em" name="rptType" value="shippingList" checked>
52
                                <label for="shippingList">Awaiting Shipment</label></p>
53
                            <p>
54
                                <input id="orderList" class="w3-radio" type="radio" style="height:1em" name="rptType" value="orderList">
55
                                <label for="orderList">Orders</label></p>
56
                            <p>
57
                                <input id="feeList" class="w3-radio" type="radio" style="height:1em" name="rptType" value="feeList">
58
                                <label for="feeList">eBay Fees and Credits</label></p>
59
                            <p>
60
	                            <input id="trackingList" class="w3-radio" type="radio" style="height:1em" name="rptType" value="trackingList">
61
    	                        <label for="trackingList">Tracking Status</label></p>
62
                            <p>
63
	                            <input id="customerList" class="w3-radio" type="radio" style="height:1em" name="rptType" value="customerList">
64
    	                        <label for="customerList">eBay Customer Export</label></p>
65
                            <input id="printButton" type="button" class="w3-btn w3-large w3-black w3-margin w3-round-large w3-ripple w3-right w3-hide" onclick="printData();" value="Print" />
66
                            <input id="dlOrderListButton" type="button" class="w3-btn w3-large w3-black w3-margin w3-round-large w3-ripple w3-right w3-hide" onclick="exportTableToCSV('orderTable', 'orders.csv');" value="CSV" />
67
                            <input id="dlFeeListButton" type="button" class="w3-btn w3-large w3-black w3-margin w3-round-large w3-ripple w3-right w3-hide" onclick="exportTableToCSV('feeTable', 'fees.csv');" value="CSV" />
68
                            <input id="dlCustomerListButton" type="button" class="w3-btn w3-large w3-black w3-margin w3-round-large w3-ripple w3-right w3-hide" onclick="exportTableToCSV('customerTable', 'customers.csv');" value="CSV" />
69
                            <input id="startButton" type="button" class="w3-btn w3-large w3-red w3-margin w3-round-large w3-ripple w3-right" onclick="getOrders();" value="Start" />
70
                        </div>
71
                        <div id="summary" class="w3-container w3-card-2 w3-cell w3-padding">
72
                        </div>
73
                    </form>
74
                </div>
75
                <div id="results" class="w3-container w3-padding w3-card-4 w3-hide"></div>
76
                <div id="printTable">
77
                    <div id="logging" class="w3-container w3-padding"></div>
78
                </div>
79
                <div id="modals">
80
                </div>
81
            </div>
82
        </div>
83
 
84
        <footer class="w3-container w3-center w3-border-top w3-margin">
85
            Copyright &#169; 2018 MUNA Trading. All rights reserved.
86
        </footer>
87
 
88
    </div>
89
 
90
    <script>
91
 
92
// Globals
93
var pagesToProcess = 0;
94
var shippingsToProcess = 0;
95
var thumbnailsToProcess = 0;
96
var trackingNumbersToProcess = 0;
97
var html = [];
98
var url;
99
var trackingList = [];
100
var trackingListDedupe = [];
101
 
102
var itemsSold;
103
var grossSales;
104
var shippingRcvd;
105
var returnCost;
106
var shippingCost;
107
var eBayFees;
108
var PayPalFees;
109
var VATaxGross;
110
var VATaxExempt;
111
var VATaxAmount;
112
var totalAmount;
113
 
114
// Initialize Configuration Variables
115
function initConfig() {
116
	eBayAuthToken = readCookie();
117
	if (eBayAuthToken.length > 0) {
118
		connected();
119
	}
120
 
121
	if (eBayAuthTokenFlag === false) {
122
		var x = document.getElementById("login");
123
		if (x.className.indexOf("w3-show") == -1) {
124
			x.className += " w3-show";
125
		}
126
	}
127
 
128
	var currentDate = moment();
129
	var yesterday = moment().subtract(1, "days");
130
 
131
	if (document.getElementById("startDate").value.length < 1) {
132
		document.getElementById("startDate").value = yesterday.format('YYYY-MM-DD');
133
	}
134
	if (document.getElementById("endDate").value.length < 1) {
135
		document.getElementById("endDate").value = currentDate.format('YYYY-MM-DD');
136
	}
137
}
138
 
139
function requireNewLogin() {
140
	// dummy
141
}
142
 
143
function getOrders() {
144
	var x;
145
 
146
	itemsSold = 0;
147
	grossSales = 0.0;
148
	shippingRcvd = 0.0;
149
	returnCost = 0.0;
150
	shippingCost = 0.0;
151
	eBayFees = 0.0;
152
	PayPalFees = 0.0;
153
	VATaxGross = 0.0;
154
	VATaxExempt = 0.0;
155
	VATaxAmount = 0.0;
156
 
157
	document.getElementById("summary").innerHTML = '';
158
	document.getElementById("results").innerHTML = '';
159
	document.getElementById("logging").innerHTML = '';
160
 
161
	var sDate = moment(document.getElementById("startDate").value, 'YYYY-MM-DD', true);
162
	var eDate = moment(document.getElementById("endDate").value, 'YYYY-MM-DD', true);
163
 
164
	if (!sDate.isValid()) {
165
		document.getElementById("startDate").value = '';
166
		return;
167
	}
168
 
169
	if (!eDate.isValid()) {
170
		document.getElementById("endDate").value = '';
171
		return;
172
	}
173
 
174
	if (moment(document.getElementById("startDate").value).isAfter(document.getElementById("endDate").value, 'day')) {
175
		document.getElementById("endDate").value = '';
176
		return;
177
	}
178
 
179
	x = document.getElementById("printButton");
180
	x.className = x.className.replace(" w3-show", "");
181
	x = document.getElementById("dlOrderListButton");
182
	x.className = x.className.replace(" w3-show", "");
183
	x = document.getElementById("dlFeeListButton");
184
	x.className = x.className.replace(" w3-show", "");
185
	x = document.getElementById("dlCustomerListButton");
186
	x.className = x.className.replace(" w3-show", "");
187
 
188
	x = document.getElementById("results");
189
	if (x.className.indexOf("w3-show") == -1) {
190
		x.className += " w3-show";
191
	}
192
 
193
	pagesToProcess = 1;
194
 
195
	if (getRadioValue('rptType') == 'feeList') {
196
		document.getElementById("results").innerHTML = '<p><strong>Retrieving Fees and Credits...</strong></p>';
197
 
198
		retrieveFees(1);
199
	} else {
200
		document.getElementById("results").innerHTML = '<p><strong>Retrieving Orders...</strong></p>';
201
		document.getElementById("modals").innerHTML = '';
202
 
203
		retrieveeBayOrders(1);
204
 
205
		function checkpagesToProcess() {
206
			if (pagesToProcess > 0) {
207
				window.setTimeout(checkpagesToProcess, 100); // wait 100 milliseconds
208
			} else {
209
				if (getRadioValue('rptType') == 'shippingList') {
210
					retrieveShopifyShippings(1);
211
				} else if (getRadioValue('rptType') == 'trackingList') {
212
					retrieveShopifyTrackings(1);
213
				} else if (getRadioValue('rptType') == 'customerList') {
214
					sortTable("customerTable", 1);
215
					x = document.getElementById("results");
216
					x.innerHTML = '<p><strong>Report Finished!</strong></p>';
217
					setTimeout(function() {
218
						x.className = x.className.replace(" w3-show", "");
219
					}, 3000);
220
				} else {
221
					retrieveShopifyOrders(1);
222
				}
223
			}
224
		}
225
 
226
		checkpagesToProcess();
227
 
228
		if (getRadioValue('rptType') == 'shippingList') {
229
			x = document.getElementById("printButton");
230
			if (x.className.indexOf("w3-show") == -1) {
231
				x.className += " w3-show";
232
			}
233
		} else if (getRadioValue('rptType') == 'orderList') {
234
			x = document.getElementById("dlOrderListButton");
235
			if (x.className.indexOf("w3-show") == -1) {
236
				x.className += " w3-show";
237
			}
238
		} else if (getRadioValue('rptType') == 'customerList') {
239
			x = document.getElementById("dlCustomerListButton");
240
			if (x.className.indexOf("w3-show") == -1) {
241
				x.className += " w3-show";
242
			}
243
		}
244
	}
245
}
246
 
247
function retrieveeBayOrders(pageNumber) {
248
	var i;
249
	var xml;
250
	var authErrorFlag = false;
251
 
252
	if (eBayAuthTokenFlag === false) {
253
		return;
254
	}
255
 
256
	var valueStartDate = moment(document.getElementById('startDate').value + " 00:00:00", "YYYY-MM-DD HH:mm:ss").tz("UTC").toISOString();
257
	var valueEndDate = moment(document.getElementById('endDate').value + " 23:59:59", "YYYY-MM-DD HH:mm:ss").tz("UTC").toISOString();
258
 
259
	var xw = new XMLWriter('UTF-8', '1.0');
260
	var xhr = new XMLHttpRequest();
261
 
262
	xw.writeStartDocument();
263
	xw.writeStartElement("GetOrdersRequest");
264
	xw.writeAttributeString('xmlns', 'urn:ebay:apis:eBLBaseComponents');
265
 
266
	xw.writeStartElement('RequesterCredentials');
267
	xw.writeElementString('eBayAuthToken', eBayAuthToken);
268
	xw.writeEndElement(); /* RequesterCredentials */
269
 
270
	xw.writeElementString('CreateTimeFrom', valueStartDate);
271
	xw.writeElementString('CreateTimeTo', valueEndDate);
272
 
273
	xw.writeElementString('IncludeFinalValueFee', 'true');
274
	xw.writeElementString('OrderRole', 'Seller');
275
	xw.writeElementString('OrderStatus', 'All');
276
 
277
	xw.writeStartElement('Pagination');
278
	xw.writeElementString('EntriesPerPage', configXmlRequestEntriesPerPage);
279
	xw.writeElementString('PageNumber', pageNumber.toString());
280
	xw.writeEndElement(); /* Pagination */
281
 
282
	xw.writeElementString('DetailLevel', 'ReturnAll');
283
 
284
	xw.writeElementString('ErrorLanguage', 'en_US');
285
	xw.writeElementString('Version', configeBayTradingVersion);
286
	xw.writeElementString('WarningLevel', configWarningLevel);
287
 
288
	xw.writeEndElement(); /* GetOrdersRequest */
289
	xw.writeEndDocument();
290
 
291
	xhr.open('POST', configProxyUrl, true);
292
	xhr.setRequestHeader('Content-Type', 'text/xml');
293
	xhr.setRequestHeader('X-EBAY-API-APP-NAME', configAppid);
294
	xhr.setRequestHeader('X-EBAY-API-COMPATIBILITY-LEVEL', configeBayTradingVersion);
295
	xhr.setRequestHeader('X-EBAY-API-CALL-NAME', 'GetOrders');
296
	xhr.setRequestHeader('X-EBAY-API-SITEID', '0');
297
	xhr.setRequestHeader('X-EBAY-API-DEV-NAME', '');
298
	xhr.setRequestHeader('X-EBAY-API-CERT-NAME', '');
299
	xhr.setRequestHeader('X-Proxy-URL', configServiceEndpoint);
300
 
301
	xml = xw.flush();
302
	xw.close();
303
 
304
	xhr.onload = () => {
305
		var obj = XMLparse(xhr.responseXML);
306
 
307
		var returnCode = obj.Ack;
308
 
309
		var x = document.getElementById("results");
310
		if (x.className.indexOf("w3-show") == -1) {
311
			x.className += " w3-show";
312
		}
313
 
314
		if (obj.Message) {
315
			x.innerHTML += obj.Message;
316
		}
317
 
318
		if (returnCode == 'Success' || (returnCode == 'Warning' && obj.Errors.ErrorCode == '21917182')) {
319
			if (getRadioValue('rptType') == 'shippingList') {
320
				createShipmentTable(obj, pageNumber);
321
			} else if (getRadioValue('rptType') == 'trackingList') {
322
				createTrackingTable(obj, pageNumber);
323
			} else if (getRadioValue('rptType') == 'customerList') {
324
				createCustomerTable(obj, pageNumber);
325
			} else {
326
				createOrderTable(obj, pageNumber);
327
			}
328
 
329
			x.innerHTML = '<p><strong>' + returnCode + ' (Orders ' + pageNumber + ' / ' + obj.PaginationResult.TotalNumberOfPages + ')</strong></p>';
330
 
331
			if (getRadioValue('rptType') == 'orderList') {
332
				printSummary();
333
			}
334
 
335
			if (obj.HasMoreOrders == 'true') {
336
				++pagesToProcess;
337
				shippingsToProcess = 0;
338
				retrieveeBayOrders(pageNumber + 1);
339
			}
340
 
341
			document.getElementById("logging").innerHTML = html.join('');
342
			--pagesToProcess;
343
		} else {
344
			x.innerHTML = "<p><strong>" + returnCode + ":</strong></p>";
345
 
346
			var errors = obj.Errors;
347
			x.innerHTML += "<p>";
348
			if (errors.length > 0) {
349
				for (i = 0; i < errors.length; i++) {
350
					x.innerHTML += errors[i].SeverityCode + " (" + errors[i].ErrorCode + "): " + escapeHtml(errors[i].LongMessage) + "<br/>";
351
					if (errors[i].LongMessage.includes('Auth')) {
352
						authErrorFlag = true;
353
					}
354
				}
355
			} else {
356
				x.innerHTML += obj.Errors.SeverityCode + " (" + obj.Errors.ErrorCode + "): " + escapeHtml(obj.Errors.LongMessage) + "<br/>";
357
				if (errors.LongMessage.includes('Auth')) {
358
					authErrorFlag = true;
359
				}
360
			}
361
			x.innerHTML += "</p>";
362
 
363
			if (authErrorFlag === true) {
364
				eBayAuthTokenFlag = false;
365
				x = document.getElementById("login");
366
				if (x.className.indexOf("w3-show") == -1) {
367
					x.className += " w3-show";
368
				}
369
			}
370
		}
371
	};
372
 
373
	xhr.send(xml);
374
}
375
 
376
function retrieveShopifyOrders(page) {
377
	var sDate = moment(document.getElementById("startDate").value + " 00:00:00").format("YYYY-MM-DDTHH:mm:ssZ");
378
	var eDate = moment(document.getElementById("endDate").value + " 23:59:59").format("YYYY-MM-DDTHH:mm:ssZ");
379
 
380
	var xhttp = new XMLHttpRequest();
381
	xhttp.onreadystatechange = function() {
382
		if (this.readyState == 4 && this.status == 200) {
383
			//window.alert(this.responseText);
384
			var json = JSON.parse(this.responseText);
385
			if (json.orders[0] !== undefined) {
386
				retrieveShopifyOrder(json);
387
			}
388
		}
389
	};
390
 
391
	xhttp.open("GET", configProxyUrl, true);
392
	xhttp.setRequestHeader("X-Proxy-Url", encodeURI(configShopifyUrl + configShopifyOrdersUrl + '?page=' + ((page - 1) * configShopifyOrderLimit) + '&limit=' + configShopifyOrderLimit + '&status=any&created_at_min=' + sDate + '&created_at_max=' + eDate));
393
	xhttp.send();
394
}
395
 
396
function retrieveShopifyOrder(json) {
397
	var i, j;
398
	var title;
399
	var quantity;
400
	var itemId;
401
	var trackingNumber;
402
	var trackingStatus;
403
	var shipmentState;
404
	var shipmentDate;
405
 
406
	for (i = 0; i < json.orders.length; i++) {
407
		html.push('<tr>');
408
		html.push(tableCell(json.orders[i].created_at.substr(0, 10)));
409
		if (json.orders[i].fulfillment_status !== null) {
410
			html.push(tableCell(json.orders[i].fulfillment_status));
411
		} else {
412
			html.push(tableCell('created'));
413
		}
414
		html.push(tableCell(json.orders[i].id + ' (' + json.orders[i].name + ')'));
415
 
416
		title = '';
417
		quantity = '';
418
		itemId = '';
419
		for (j = 0; j < json.orders[i].line_items.length; j++) {
420
			itemsSold++;
421
			if (j > 0) {
422
				title += '<br/>';
423
				quantity += '<br/>';
424
				itemId += '<br/>';
425
			}
426
			title += json.orders[i].line_items[j].title;
427
			quantity += json.orders[i].line_items[j].quantity;
428
			itemId += json.orders[i].line_items[j].product_id === null ? '' : json.orders[i].line_items[j].product_id;
429
		}
430
 
431
		html.push(tableCell(title));
432
		html.push(tableCell(itemId));
433
		html.push(tableCell('Shopify'));
434
		html.push(tableCell(quantity));
435
		html.push(tableCell('$' + json.orders[i].total_price_usd));
436
		html.push(tableCell('$0.00'));
437
		html.push(tableCell('N/A'));
438
		html.push(tableCell('$0.00'));
439
		html.push(tableCellLabel('Fee' + json.orders[i].id));
440
		html.push(tableCell(json.orders[i].total_tax));
441
 
442
		if (json.orders[i].shipping_address !== undefined) {
443
			shipmentState = json.orders[i].shipping_address.province_code;
444
		} else {
445
			shipmentState = configTaxStateId;
446
		}
447
		html.push(tableCell(shipmentState));
448
		html.push(tableCellLabel('PaidDate' + json.orders[i].id));
449
		html.push(tableCell(json.orders[i].payment_gateway_names !== undefined ? json.orders[i].payment_gateway_names.join(', ') : ''));
450
		html.push(tableCellLabel('TransactionId' + json.orders[i].id));
451
 
452
		shipmentDate = '';
453
		trackingNumber = '';
454
		trackingStatus = '';
455
		for (j = 0; j < json.orders[i].fulfillments.length; j++) {
456
			if (j > 0) {
457
				trackingNumber += '<br/>';
458
				trackingStatus += '<br/>';
459
				shipmentDate += '<br/>';
460
			}
461
 
462
			if (json.orders[i].fulfillments[j].tracking_number !== null) {
463
				trackingNumber = json.orders[i].fulfillments[j].tracking_company + ' ' + json.orders[i].fulfillments[j].tracking_number;
464
				trackingStatus = json.orders[i].fulfillments[j].shipment_status;
465
				shipmentDate += json.orders[i].fulfillments[j].created_at.substr(0, 10);
466
			}
467
		}
468
 
469
		html.push(tableCell(shipmentDate));
470
		html.push(tableCell(trackingNumber));
471
		html.push(tableCell(trackingStatus));
472
		html.push('</tr>');
473
 
474
		grossSales += Number(json.orders[i].total_price_usd);
475
		VATaxAmount += Number(json.orders[i].total_tax);
476
	}
477
 
478
	// xxxxx last steps in the chain
479
	printOrderTotals();
480
	document.getElementById("logging").innerHTML = html.join('');
481
 
482
	sortTable("orderTable", 1);
483
	document.getElementById("results").innerHTML = '<p><strong>Retrieving Shipping Costs...</strong></p>';
484
	findShippingCosts();
485
}
486
 
487
function retrieveShopifyShippings(page) {
488
	var xhttp = new XMLHttpRequest();
489
	xhttp.onreadystatechange = function() {
490
		if (this.readyState == 4 && this.status == 200) {
491
			//window.alert(this.responseText);
492
			var json = JSON.parse(this.responseText);
493
			if (json.orders[0] !== undefined) {
494
				retrieveShopifyShipping(json);
495
			}
496
 
497
			// xxxxx last steps in the chain
498
			printShipmentTotals();
499
			document.getElementById("logging").innerHTML = html.join('');
500
 
501
			sortTable("shippingTable", 1);
502
			findThumbNails();
503
		}
504
	};
505
 
506
	xhttp.open("GET", configProxyUrl, true);
507
	xhttp.setRequestHeader("X-Proxy-Url", encodeURI(configShopifyUrl + configShopifyOrdersUrl + '?page=' + ((page - 1) * configShopifyOrderLimit) + '&limit=' + configShopifyOrderLimit + '&fulfillment_status=unshipped'));
508
	xhttp.send();
509
}
510
 
511
function retrieveShopifyShipping(json) {
512
	var i;
513
 
514
	for (i = 0; i < json.orders.length; i++) {
515
		totalAmount += parseFloat(json.orders[i].total_price);
516
 
517
		for (j = 0; j < json.orders[i].line_items.length; j++) {
518
			html.push('<tr>');
519
 
520
			html.push(tableCellSKU(json.orders[i].line_items[j].sku, json.orders[i].line_items[j].title));
521
			html.push(tableCell(json.orders[i].line_items[j].quantity));
522
			if (json.orders[i].line_items[j].product_id !== null) {
523
				html.push(tableCellAndLabel(json.orders[i].line_items[j].product_id, 'PictureURL' + json.orders[i].line_items[j].product_id));
524
			} else {
525
				html.push(tableCell(''));
526
			}
527
			html.push(tableCell(json.orders[i].line_items[j].title));
528
			html.push(tableCell(json.orders[i].name));
529
			html.push(tableCellDate(json.orders[i].created_at.substr(0, 10)));
530
			html.push(tableCell('$' + parseFloat(json.orders[i].line_items[j].price).toFixed(2)));
531
			html.push(tableCellHidden('Shopify'));
532
 
533
			itemsSold += Number(json.orders[i].line_items[j].quantity);
534
 
535
			html.push('</tr>');
536
		}
537
	}
538
}
539
 
540
function retrieveShopifyTrackings(page) {
541
	var sDate = moment(document.getElementById("startDate").value + " 00:00:00").format("YYYY-MM-DDTHH:mm:ssZ");
542
	var eDate = moment(document.getElementById("endDate").value + " 23:59:59").format("YYYY-MM-DDTHH:mm:ssZ");
543
 
544
	var xhttp = new XMLHttpRequest();
545
	xhttp.onreadystatechange = function() {
546
		if (this.readyState == 4 && this.status == 200) {
547
			//window.alert(this.responseText);
548
			var json = JSON.parse(this.responseText);
549
			if (json.orders[0] !== undefined) {
550
				retrieveShopifyTracking(json);
551
			}
552
 
553
			// xxxxx last in the chain
554
			printTrackingTotals();
555
			document.getElementById("logging").innerHTML = html.join('');
556
			sortTable("trackingTable", 1);
557
			document.getElementById("results").innerHTML = '<p><strong>Retrieving Shipping Costs...</strong></p>';
558
			findShippingCosts();
559
		}
560
	};
561
 
562
	xhttp.open("GET", configProxyUrl, true);
563
	xhttp.setRequestHeader("X-Proxy-Url", encodeURI(configShopifyUrl + configShopifyOrdersUrl + '?page=' + ((page - 1) * configShopifyOrderLimit) + '&limit=' + configShopifyOrderLimit + '&fulfillment_status=shipped&status=closed&created_at_min=' + sDate + '&created_at_max=' + eDate));
564
	xhttp.send();
565
}
566
 
567
function retrieveShopifyTracking(json) {
568
	var i, j;
569
	var title;
570
 
571
	for (i = 0; i < json.orders.length; i++) {
572
		if (json.orders[i].shipping_lines[0] === undefined) {
573
			continue;
574
		}
575
 
576
		html.push('<tr>');
577
		html.push(tableCell(json.orders[i].created_at.substr(0, 10)));
578
 
579
		title = '';
580
		for (j = 0; j < json.orders[i].line_items.length; j++) {
581
			if (j > 0) {
582
				title += '<br/>';
583
			}
584
			title += json.orders[i].line_items[j].title;
585
		}
586
 
587
		html.push(tableCell(title));
588
		html.push(tableCell('N/A'));
589
		html.push(tableCellAndLabel(json.orders[i].shipping_address.city + ', ' + json.orders[i].shipping_address.province_code + ' ' + json.orders[i].shipping_address.zip, 'DeliveryAddress' + json.orders[i].fulfillments[0].tracking_number));
590
		html.push(tableCell(json.orders[i].fulfillments[0].created_at.substr(0, 10))); // best guess
591
		html.push(tableCell(json.orders[i].fulfillments[0].created_at.substr(0, 10)));
592
		html.push(tableCellAndLabel(json.orders[i].fulfillments[0].tracking_company + ' ' + json.orders[i].fulfillments[0].tracking_number, json.orders[i].fulfillments[0].tracking_number));
593
		html.push(tableCell(getCarrierService(json.orders[i].fulfillments[0].tracking_company, json.orders[i].fulfillments[0].tracking_number, true)));
594
		html.push(tableCellLabel('DeliveryDate' + json.orders[i].fulfillments[0].tracking_number));
595
		html.push(tableCellLabel('DeliveryDays' + json.orders[i].fulfillments[0].tracking_number));
596
		html.push(tableCellLabel('DeliveryStatus' + json.orders[i].fulfillments[0].tracking_number));
597
 
598
		html.push('</tr>');
599
	}
600
}
601
 
602
function createOrderTable(obj, pageNumber) {
603
	var i;
604
	var title;
605
	var trackingNumber;
606
	var quantity;
607
	var finalValueFee;
608
	var finalValueFeeAmount;
609
	var itemId;
610
	var taxAmount;
611
	var payAmount;
612
 
613
	if (pageNumber == 1) {
614
		document.getElementById("logging").innerHTML = '';
615
		html = [];
616
 
617
		html.push('<h3>Order List from ' + document.getElementById("startDate").value + ' to ' + document.getElementById("endDate").value + '</h3>');
618
		html.push('<div class="w3-responsive">');
619
		html.push('<table id="orderTable" class="w3-table-all w3-tiny w3-hoverable">');
620
		html.push('<thead>');
621
		html.push('<tr>');
622
 
623
		html.push(tableHeader('Order Date'));
624
		html.push(tableHeader('Order Status'));
625
		html.push(tableHeader('Order Id'));
626
		html.push(tableHeader('Ttitle'));
627
		html.push(tableHeader('Item Id'));
628
		html.push(tableHeader('Sales Channel'));
629
		html.push(tableHeader('Quantity Purchased'));
630
		html.push(tableHeader('Payment Amount'));
631
		html.push(tableHeader('Shipping Received'));
632
		html.push(tableHeader('Shipping Cost'));
633
		html.push(tableHeader('eBay Final Value Fee'));
634
		html.push(tableHeader('Payment Processor Fee'));
635
		html.push(tableHeader('Sales Tax Amount'));
636
		html.push(tableHeader('Ship To State'));
637
		html.push(tableHeader('Paid Date'));
638
		html.push(tableHeader('Payment Methods'));
639
 
640
		html.push(tableHeader('Payment Transaction ID'));
641
		html.push(tableHeader('Shipped Date'));
642
		html.push(tableHeader('Shipping Tracking Number'));
643
		html.push(tableHeader('Delivery Status'));
644
 
645
		html.push('</tr>');
646
		html.push('</thead>');
647
		html.push('<tbody>');
648
	}
649
 
650
	for (var entry = 0; entry < obj.OrderArray.length; entry++) {
651
		html.push('<tr>');
652
 
653
		html.push(tableCellDate(obj.OrderArray[entry].CreatedTime));
654
		html.push(tableCell(obj.OrderArray[entry].OrderStatus));
655
		html.push(tableCell(obj.OrderArray[entry].OrderID));
656
 
657
		title = '';
658
		trackingNumber = '';
659
		quantity = '';
660
		finalValueFee = '';
661
		finalValueFeeAmount = 0.0;
662
		itemId = '';
663
 
664
		if (obj.OrderArray[entry].TransactionArray.length > 0) {
665
			for (title = '', i = 0; i < obj.OrderArray[entry].TransactionArray.length; i++) {
666
				itemsSold++;
667
				if (i > 0) {
668
					title += '<br/>';
669
					quantity += '<br/>';
670
					itemId += '<br/>';
671
				}
672
				title += obj.OrderArray[entry].TransactionArray[i].Item.Title;
673
				quantity += obj.OrderArray[entry].TransactionArray[i].QuantityPurchased;
674
				finalValueFeeAmount += parseFloat(obj.OrderArray[entry].TransactionArray[i].FinalValueFee.text);
675
				eBayFees += parseFloat(obj.OrderArray[entry].TransactionArray[i].FinalValueFee.text);
676
				itemId += obj.OrderArray[entry].TransactionArray[i].Item.ItemID;
677
			}
678
			html.push(tableCell(title));
679
			html.push(tableCell(itemId));
680
			finalValueFee = '$' + finalValueFeeAmount.toFixed(2);
681
			if (obj.OrderArray[entry].TransactionArray[0].ShippingDetails === undefined || obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails === undefined) {} else {
682
				if (obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails[0] !== undefined) {
683
					for (i = 0; i < obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails.length; i++) {
684
						trackingNumber += (i > 0 ? '<br/>' : '') + obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails[i].ShippingCarrierUsed + ' ' + obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails[i].ShipmentTrackingNumber;
685
					}
686
				} else {
687
					trackingNumber = obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails.ShippingCarrierUsed + ' ' + obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails.ShipmentTrackingNumber;
688
				}
689
			}
690
		} else {
691
			itemsSold++;
692
			html.push(tableCell(obj.OrderArray[entry].TransactionArray.Item.Title));
693
			html.push(tableCell(obj.OrderArray[entry].TransactionArray.Item.ItemID));
694
			if (obj.OrderArray[entry].TransactionArray.ShippingDetails === undefined || obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails === undefined) {} else {
695
				if (obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails[0] !== undefined) {
696
					for (i = 0; i < obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.length; i++) {
697
						trackingNumber += (i > 0 ? '<br/>' : '') + obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails[i].ShippingCarrierUsed + ' ' + obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails[i].ShipmentTrackingNumber;
698
					}
699
				} else {
700
					trackingNumber = obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.ShippingCarrierUsed + ' ' + obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.ShipmentTrackingNumber;
701
				}
702
			}
703
			//			if (obj.OrderArray[entry].TransactionArray.ShippingDetails === undefined || obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails === undefined) {
704
			//				trackingNumber = '';
705
			//			} else {
706
			//				trackingNumber = obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.ShippingCarrierUsed + ' ' + obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.ShipmentTrackingNumber;
707
			//			}
708
			quantity = obj.OrderArray[entry].TransactionArray.QuantityPurchased;
709
			finalValueFee = '$' + parseFloat(obj.OrderArray[entry].TransactionArray.FinalValueFee.text).toFixed(2);
710
			eBayFees += parseFloat(obj.OrderArray[entry].TransactionArray.FinalValueFee.text);
711
		}
712
 
713
		html.push(tableCell('eBay'));
714
		html.push(tableCell(quantity));
715
		html.push(tableCell('$' + parseFloat(obj.OrderArray[entry].AmountPaid.text).toFixed(2)));
716
		grossSales += parseFloat(obj.OrderArray[entry].AmountPaid.text);
717
 
718
		html.push(tableCell('$' + parseFloat(obj.OrderArray[entry].ShippingServiceSelected.ShippingServiceCost.text).toFixed(2)));
719
		shippingRcvd += parseFloat(obj.OrderArray[entry].ShippingServiceSelected.ShippingServiceCost.text);
720
 
721
		html.push(tableCellLabel('ShippingCost' + obj.OrderArray[entry].OrderID));
722
		html.push(tableCell(finalValueFee));
723
 
724
		if (obj.OrderArray[entry].ExternalTransaction !== undefined && obj.OrderArray[entry].ExternalTransaction.FeeOrCreditAmount !== undefined) {
725
			html.push(tableCell('$' + parseFloat(obj.OrderArray[entry].ExternalTransaction.FeeOrCreditAmount.text).toFixed(2)));
726
			PayPalFees += parseFloat(obj.OrderArray[entry].ExternalTransaction.FeeOrCreditAmount.text);
727
		} else {
728
			html.push(tableCell(''));
729
		}
730
 
731
		if (obj.OrderArray[entry].ShippingAddress.StateOrProvince == configTaxStateId && obj.OrderArray[entry].ShippingDetails.SalesTax.SalesTaxAmount.text == "0.0") {
732
			payAmount = parseFloat(obj.OrderArray[entry].AmountPaid.text);
733
			taxAmount = payAmount - (payAmount / (1.00 + (configTaxRate / 100)));
734
			html.push(tableCell('$' + taxAmount.toFixed(2)));
735
			VATaxAmount += taxAmount;
736
		} else {
737
			html.push(tableCell('$' + parseFloat(obj.OrderArray[entry].ShippingDetails.SalesTax.SalesTaxAmount.text).toFixed(2)));
738
			VATaxAmount += parseFloat(obj.OrderArray[entry].ShippingDetails.SalesTax.SalesTaxAmount.text);
739
		}
740
		html.push(tableCell(obj.OrderArray[entry].ShippingAddress.StateOrProvince));
741
		VATaxGross += (parseFloat(obj.OrderArray[entry].AmountPaid.text) - parseFloat(obj.OrderArray[entry].ShippingDetails.SalesTax.SalesTaxAmount.text));
742
		if (obj.OrderArray[entry].ShippingAddress.StateOrProvince != configTaxStateId) {
743
			VATaxExempt += parseFloat(obj.OrderArray[entry].AmountPaid.text);
744
		}
745
 
746
		if (obj.OrderArray[entry].PaidTime !== undefined) {
747
			html.push(tableCellDate(obj.OrderArray[entry].PaidTime));
748
		} else {
749
			html.push(tableCell(''));
750
		}
751
		html.push(tableCell(obj.OrderArray[entry].PaymentMethods));
752
 
753
		if (obj.OrderArray[entry].ExternalTransaction !== undefined && obj.OrderArray[entry].ExternalTransaction.ExternalTransactionID !== undefined) {
754
			html.push(tableCell(obj.OrderArray[entry].ExternalTransaction.ExternalTransactionID));
755
		} else {
756
			html.push(tableCell(''));
757
		}
758
 
759
		if (obj.OrderArray[entry].ShippedTime === undefined) {
760
			html.push(tableCell(''));
761
		} else {
762
			html.push(tableCellDate(obj.OrderArray[entry].ShippedTime));
763
		}
764
		html.push(tableCell(trackingNumber));
765
		html.push(tableCellLabel('Delivery' + obj.OrderArray[entry].OrderID));
766
 
767
		html.push('</tr>');
768
	}
769
}
770
 
771
function printOrderTotals() {
772
	html.push('</tbody>');
773
	html.push('<tfoot>');
774
	html.push('<tr>');
775
	html.push(tableCell('<strong>Totals</strong>'));
776
	html.push(tableCell(''));
777
	html.push(tableCell(''));
778
	html.push(tableCell(''));
779
	html.push(tableCell(''));
780
	html.push(tableCell(''));
781
	html.push(tableCell('<strong>' + itemsSold + '</strong>'));
782
	html.push(tableCell('<strong>$' + grossSales.toFixed(2) + '</strong>'));
783
	html.push(tableCell('<strong>$' + shippingRcvd.toFixed(2) + '</strong>'));
784
	html.push(tableCellLabel('ShippingTotal'));
785
	html.push(tableCell('<strong>$' + eBayFees.toFixed(2) + '</strong>'));
786
	html.push(tableCell('<strong>$' + PayPalFees.toFixed(2) + '</strong>'));
787
	html.push(tableCell('<strong>$' + VATaxAmount.toFixed(2) + '</strong>'));
788
	html.push(tableCell(''));
789
	html.push(tableCell(''));
790
	html.push(tableCell(''));
791
	html.push(tableCell(''));
792
	html.push(tableCell(''));
793
	html.push(tableCell(''));
794
	html.push(tableCell(''));
795
	html.push('</tr>');
796
	html.push('</tfoot>');
797
	html.push('</table>');
798
	html.push('</div>');
799
}
800
 
801
function createCustomerTable(obj, pageNumber) {
802
	var i;
803
	var firstName;
804
	var lastName;
805
	var emailAddress;
806
 
807
	if (pageNumber == 1) {
808
		document.getElementById("logging").innerHTML = '';
809
		html = [];
810
 
811
		html.push('<h3>Customer List from ' + document.getElementById("startDate").value + ' to ' + document.getElementById("endDate").value + '</h3>');
812
		html.push('<div class="w3-responsive">');
813
		html.push('<table id="customerTable" class="w3-table-all w3-tiny w3-hoverable">');
814
		html.push('<thead>');
815
		html.push('<tr>');
816
 
817
		html.push(tableHeader('First Name'));
818
		html.push(tableHeader('Last Name'));
819
		html.push(tableHeader('Email'));
820
		html.push(tableHeader('Company'));
821
		html.push(tableHeader('Address1'));
822
		html.push(tableHeader('Address2'));
823
		html.push(tableHeader('City'));
824
		html.push(tableHeader('Province'));
825
		html.push(tableHeader('Province Code'));
826
		html.push(tableHeader('Country'));
827
		html.push(tableHeader('Country Code'));
828
		html.push(tableHeader('Zip'));
829
		html.push(tableHeader('Phone'));
830
		html.push(tableHeader('Accepts Marketing'));
831
		html.push(tableHeader('Total Spent'));
832
		html.push(tableHeader('Total Orders'));
833
		html.push(tableHeader('Tags'));
834
		html.push(tableHeader('Note'));
835
		html.push(tableHeader('Tax Exempt'));
836
 
837
		html.push('</tr>');
838
		html.push('</thead>');
839
		html.push('<tbody>');
840
	}
841
 
842
	for (var entry = 0; entry < obj.OrderArray.length; entry++) {
843
		html.push('<tr>');
844
 
845
		firstName = '';
846
		lastName = '';
847
		emailAddress = '';
848
 
849
		if (obj.OrderArray[entry].TransactionArray.length > 0) {
850
			for (title = '', i = 0; i < obj.OrderArray[entry].TransactionArray.length; i++) {
851
				firstName = obj.OrderArray[entry].TransactionArray[i].Buyer.UserFirstName;
852
				lastName = obj.OrderArray[entry].TransactionArray[i].Buyer.UserLastName;
853
				emailAddress = obj.OrderArray[entry].TransactionArray[i].Buyer.Email;
854
			}
855
			if (obj.OrderArray[entry].TransactionArray[0].ShippingDetails === undefined || obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails === undefined) {} else {
856
				if (obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails[0] !== undefined) {
857
					for (i = 0; i < obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails.length; i++) {
858
 
859
					}
860
				} else {
861
 
862
				}
863
			}
864
		} else {
865
			if (obj.OrderArray[entry].TransactionArray.ShippingDetails === undefined || obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails === undefined) {} else {
866
				if (obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails[0] !== undefined) {
867
					for (i = 0; i < obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.length; i++) {
868
						trackingNumber += (i > 0 ? '<br/>' : '') + obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails[i].ShippingCarrierUsed + ' ' + obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails[i].ShipmentTrackingNumber;
869
					}
870
				} else {
871
					trackingNumber = obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.ShippingCarrierUsed + ' ' + obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.ShipmentTrackingNumber;
872
				}
873
			}
874
			firstName = obj.OrderArray[entry].TransactionArray.Buyer.UserFirstName;
875
			lastName = obj.OrderArray[entry].TransactionArray.Buyer.UserLastName;
876
			emailAddress = obj.OrderArray[entry].TransactionArray.Buyer.Email;
877
		}
878
 
879
		html.push(tableCell(firstName.toProperCase()));
880
		html.push(tableCell(lastName.toProperCase()));
881
		html.push(tableCell(emailAddress != 'Invalid Request' ? emailAddress : ""));
882
		html.push(tableCell(''));
883
		html.push(tableCell(obj.OrderArray[entry].ShippingAddress.Street1.toProperCase()));
884
		html.push(tableCell(obj.OrderArray[entry].ShippingAddress.Street2.toProperCase()));
885
		html.push(tableCell(obj.OrderArray[entry].ShippingAddress.CityName.toProperCase()));
886
		html.push(tableCell(''));
887
		html.push(tableCell(obj.OrderArray[entry].ShippingAddress.StateOrProvince));
888
		html.push(tableCell(obj.OrderArray[entry].ShippingAddress.CountryName.toProperCase()));
889
		html.push(tableCell(obj.OrderArray[entry].ShippingAddress.Country));
890
		html.push(tableCell(obj.OrderArray[entry].ShippingAddress.PostalCode));
891
		html.push(tableCell(obj.OrderArray[entry].ShippingAddress.Phone));
892
		html.push(tableCell('no'));
893
		html.push(tableCell(''));
894
		html.push(tableCell(''));
895
		html.push(tableCell('ebay'));
896
		html.push(tableCell(obj.OrderArray[entry].BuyerUserID));
897
		html.push(tableCell('no'));
898
 
899
		html.push('</tr>');
900
	}
901
 
902
 
903
	if (obj.HasMoreOrders != 'true') {
904
		html.push('</tbody>');
905
		html.push('<tfoot>');
906
		html.push('<tr>');
907
		html.push(tableCell(''));
908
		html.push('</tr>');
909
		html.push('</tfoot>');
910
		html.push('</table>');
911
		html.push('</div>');
912
	}
913
}
914
 
915
function createShipmentTable(obj, pageNumber) {
916
	var i;
917
 
918
	if (pageNumber == 1) {
919
		totalAmount = 0.00;
920
		itemsSold = 0;
921
 
922
		document.getElementById("logging").innerHTML = '';
923
		html = [];
924
 
925
		html.push('<h3>Awaiting Shipment List</h3>');
926
		html.push('<table id="shippingTable" class="w3-table-all w3-small">');
927
		html.push('<thead>');
928
		html.push('<tr>');
929
 
930
		html.push(tableHeader('SKU'));
931
		html.push(tableHeader('Quantity'));
932
		html.push(tableHeader('Thumbnail'));
933
		html.push(tableHeader('Ttitle'));
934
		html.push(tableHeader('Item Id'));
935
		html.push(tableHeader('Date'));
936
		html.push(tableHeader('Payment Amount'));
937
		html.push(tableHeaderHidden('Sales Channel'));
938
 
939
		html.push('</tr>');
940
		html.push('</thead>');
941
		html.push('<tbody>');
942
	}
943
 
944
	for (var entry = 0; entry < obj.OrderArray.length; entry++) {
945
		if (obj.OrderArray[entry].OrderStatus == 'Completed' && obj.OrderArray[entry].ShippedTime === undefined && obj.OrderArray[entry].PaidTime !== undefined) {
946
			if (obj.OrderArray[entry].TransactionArray.length > 0) {
947
				for (i = 0; i < obj.OrderArray[entry].TransactionArray.length; i++) {
948
					itemsSold++;
949
 
950
					html.push('<tr>');
951
 
952
					html.push(tableCellSKU(obj.OrderArray[entry].TransactionArray[i].Item.SKU, obj.OrderArray[entry].TransactionArray[i].Item.Title));
953
					html.push(tableCell(obj.OrderArray[entry].TransactionArray[i].QuantityPurchased));
954
					html.push(tableCellLabel('PictureURL' + obj.OrderArray[entry].TransactionArray[i].Item.ItemID));
955
					html.push(tableCell(obj.OrderArray[entry].TransactionArray[i].Item.Title));
956
					html.push(tableCell(obj.OrderArray[entry].TransactionArray[i].Item.ItemID));
957
					html.push(tableCellDate(obj.OrderArray[entry].CreatedTime));
958
					html.push(tableCell('$' + parseFloat(obj.OrderArray[entry].AmountPaid.text).toFixed(2) + '*'));
959
					if (i === 0) {
960
						totalAmount += parseFloat(obj.OrderArray[entry].AmountPaid.text);
961
					}
962
					html.push(tableCellHidden('eBay'));
963
 
964
					html.push('</tr>');
965
				}
966
			} else {
967
				html.push('<tr>');
968
 
969
				html.push(tableCellSKU(obj.OrderArray[entry].TransactionArray.Item.SKU, obj.OrderArray[entry].TransactionArray.Item.Title));
970
				html.push(tableCell(obj.OrderArray[entry].TransactionArray.QuantityPurchased));
971
				html.push(tableCellLabel('PictureURL' + obj.OrderArray[entry].TransactionArray.Item.ItemID));
972
				html.push(tableCell(obj.OrderArray[entry].TransactionArray.Item.Title));
973
				html.push(tableCell(obj.OrderArray[entry].TransactionArray.Item.ItemID));
974
				html.push(tableCellDate(obj.OrderArray[entry].CreatedTime));
975
				html.push(tableCell('$' + parseFloat(obj.OrderArray[entry].AmountPaid.text).toFixed(2)));
976
				html.push(tableCellHidden('eBay'));
977
 
978
				itemsSold += Number(obj.OrderArray[entry].TransactionArray.QuantityPurchased);
979
				totalAmount += parseFloat(obj.OrderArray[entry].AmountPaid.text);
980
 
981
				html.push('</tr>');
982
			}
983
		}
984
	}
985
}
986
 
987
function printShipmentTotals() {
988
	html.push('</tbody>');
989
	html.push('<tfoot>');
990
	html.push('<tr>');
991
	html.push(tableCell('<strong>Totals</strong>'));
992
	html.push(tableCell(''));
993
	html.push(tableCell(''));
994
	html.push(tableCell(''));
995
	html.push(tableCell(''));
996
	html.push(tableCell('<strong>' + itemsSold + '</strong>'));
997
	html.push(tableCell('<strong>$' + totalAmount.toFixed(2) + '</strong>'));
998
	html.push(tableCellHidden(''));
999
	html.push('</tr>');
1000
	html.push('</tfoot>');
1001
	html.push('</table>');
1002
}
1003
 
1004
function createTrackingTable(obj, pageNumber) {
1005
	var i;
1006
	var title;
1007
	var trackingNumber;
1008
	var service;
1009
	var quantity;
1010
	var html_temp;
1011
	var finalValueFee;
1012
	var finalValueFeeAmount;
1013
	var itemId;
1014
 
1015
	if (pageNumber == 1) {
1016
		document.getElementById("logging").innerHTML = '';
1017
		html = [];
1018
		trackingList = [];
1019
		trackingListDedupe = [];
1020
 
1021
		html.push('<h3>Tracking Number Status from ' + document.getElementById("startDate").value + ' to ' + document.getElementById("endDate").value + '</h3>');
1022
		html.push('<div class="w3-responsive">');
1023
		html.push('<table id="trackingTable" class="w3-table-all w3-tiny w3-hoverable">');
1024
		html.push('<thead>');
1025
		html.push('<tr>');
1026
 
1027
		html.push(tableHeader('Order Date'));
1028
		html.push(tableHeader('Ttitle'));
1029
		html.push(tableHeaderHidden('Order Id'));
1030
		html.push(tableHeader('Shipping Cost'));
1031
		html.push(tableHeader('Shipping Address'));
1032
		html.push(tableHeader('Paid Date'));
1033
		html.push(tableHeader('Shipped Date'));
1034
		html.push(tableHeader('Shipping Tracking Number'));
1035
		html.push(tableHeader('Service'));
1036
		html.push(tableHeader('Delivery Date'));
1037
		html.push(tableHeader('Duration (Days)'));
1038
		html.push(tableHeader('Delivery Status'));
1039
 
1040
		html.push('</tr>');
1041
		html.push('</thead>');
1042
		html.push('<tbody>');
1043
	}
1044
 
1045
	for (var entry = 0; entry < obj.OrderArray.length; entry++) {
1046
		html_temp = [];
1047
 
1048
		html_temp.push('<tr>');
1049
 
1050
		html_temp.push(tableCellDate(obj.OrderArray[entry].CreatedTime));
1051
 
1052
		title = '';
1053
		trackingNumber = '';
1054
		service = '';
1055
		quantity = '';
1056
		finalValueFee = '';
1057
		finalValueFeeAmount = 0.0;
1058
		itemId = '';
1059
 
1060
		if (obj.OrderArray[entry].TransactionArray.length > 0) {
1061
			for (title = '', i = 0; i < obj.OrderArray[entry].TransactionArray.length; i++) {
1062
				if (i > 0) {
1063
					title += '<br/>';
1064
					quantity += '<br/>';
1065
					itemId += '<br/>';
1066
				}
1067
				title += obj.OrderArray[entry].TransactionArray[i].Item.Title;
1068
			}
1069
			html_temp.push(tableCell(title));
1070
			if (obj.OrderArray[entry].TransactionArray[0].ShippingDetails === undefined || obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails === undefined) {} else {
1071
				if (obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails[0] !== undefined) {
1072
					// only last 1
1073
					for (i = 0; i < obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails.length; i++) {
1074
						trackingNumber = obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails[i].ShippingCarrierUsed + ' ' + obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails[i].ShipmentTrackingNumber;
1075
						service = getCarrierService(obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails[i].ShippingCarrierUsed, obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails[i].ShipmentTrackingNumber, true);
1076
					}
1077
				} else {
1078
					trackingNumber = obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails.ShippingCarrierUsed + ' ' + obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails.ShipmentTrackingNumber;
1079
					service = getCarrierService(obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails.ShippingCarrierUsed, obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails.ShipmentTrackingNumber, true);
1080
				}
1081
			}
1082
		} else {
1083
			html_temp.push(tableCell(obj.OrderArray[entry].TransactionArray.Item.Title));
1084
			if (obj.OrderArray[entry].TransactionArray.ShippingDetails === undefined || obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails === undefined) {} else {
1085
				if (obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails[0] !== undefined) {
1086
					// only last 1
1087
					for (i = 0; i < obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.length; i++) {
1088
						trackingNumber = obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails[i].ShippingCarrierUsed + ' ' + obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails[i].ShipmentTrackingNumber;
1089
						service = getCarrierService(obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails[i].ShippingCarrierUsed, obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails[i].ShipmentTrackingNumber, true);
1090
					}
1091
				} else {
1092
					trackingNumber = obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.ShippingCarrierUsed + ' ' + obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.ShipmentTrackingNumber;
1093
					service = getCarrierService(obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.ShippingCarrierUsed, obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.ShipmentTrackingNumber, true);
1094
				}
1095
			}
1096
		}
1097
 
1098
		html_temp.push(tableCellHidden(obj.OrderArray[entry].OrderID));
1099
		html_temp.push(tableCellLabel('ShippingCost' + obj.OrderArray[entry].OrderID));
1100
		html_temp.push(tableCellAndLabel(obj.OrderArray[entry].ShippingAddress.CityName + ', ' + obj.OrderArray[entry].ShippingAddress.StateOrProvince + ' ' + obj.OrderArray[entry].ShippingAddress.PostalCode, 'DeliveryAddress' + trackingNumber.substr(trackingNumber.indexOf(' ')+1)));
1101
 
1102
		if (obj.OrderArray[entry].PaidTime !== undefined) {
1103
			html_temp.push(tableCellDate(obj.OrderArray[entry].PaidTime));
1104
		} else {
1105
			html_temp.push(tableCell(''));
1106
		}
1107
 
1108
		if (obj.OrderArray[entry].ShippedTime === undefined) {
1109
			html_temp.push(tableCellLabel('ShippedDate' + trackingNumber.substr(trackingNumber.indexOf(' ')+1)));
1110
		} else {
1111
			html_temp.push(tableCellDate(obj.OrderArray[entry].ShippedTime));
1112
		}
1113
 
1114
		html_temp.push(tableCellAndLabel(trackingNumber, trackingNumber.substr(trackingNumber.indexOf(' ')+1)));
1115
		html_temp.push(tableCell(service));
1116
		html_temp.push(tableCellLabel('DeliveryDate' + trackingNumber.substr(trackingNumber.indexOf(' ')+1)));
1117
		html_temp.push(tableCellLabel('DeliveryDays' + trackingNumber.substr(trackingNumber.indexOf(' ')+1)));
1118
		html_temp.push(tableCellLabel('DeliveryStatus' + trackingNumber.substr(trackingNumber.indexOf(' ')+1)));
1119
 
1120
		html_temp.push('</tr>');
1121
 
1122
		if (trackingListDedupe.indexOf(trackingNumber.substr(trackingNumber.indexOf(' ')+1)) == -1) {
1123
			html.push(html_temp.join(''));
1124
			trackingListDedupe.push(trackingNumber.substr(trackingNumber.indexOf(' ')+1));
1125
		}
1126
	}
1127
}
1128
 
1129
function printTrackingTotals() {
1130
	html.push('</tbody>');
1131
	html.push('<tfoot class="w3-hide">');
1132
	html.push('<tr>');
1133
	html.push(tableCell(''));
1134
	html.push('</tr>');
1135
	html.push('</tfoot>');
1136
	html.push('</table>');
1137
	html.push('</div>');
1138
}
1139
 
1140
function getCarrierService(carrier, trackingNumber, flag) {
1141
	if (flag && trackingList.indexOf(trackingNumber) == -1) {
1142
		trackingList.push(trackingNumber);
1143
	}
1144
 
1145
	if (carrier == "USPS") {
1146
		if (trackingNumber.startsWith("9449")) {
1147
			return ("Media Mail");
1148
		} else if (trackingNumber.startsWith("9450")) {
1149
			return ("Media Mail, Insured");
1150
		} else if (trackingNumber.startsWith("94001")) {
1151
			return ("First Class");
1152
		} else if (trackingNumber.startsWith("9416")) {
1153
			return ("First Class, Insured");
1154
		} else if (trackingNumber.startsWith("92055")) {
1155
			return ("Priority Mail");
1156
		} else if (trackingNumber.startsWith("94073")) {
1157
			return ("Certified Mail");
1158
		} else if (trackingNumber.startsWith("93033")) {
1159
			return ("Collect on Delivery");
1160
		} else if (trackingNumber.startsWith("82")) {
1161
			return ("Global Express");
1162
		} else if (trackingNumber.startsWith("EC")) {
1163
			return ("Priority Mail Express International");
1164
		} else if (trackingNumber.startsWith("92701") || trackingNumber.startsWith("EA")) {
1165
			return ("Priority Mail Express");
1166
		} else if (trackingNumber.startsWith("CP")) {
1167
			return ("Priority Mail  International");
1168
		} else if (trackingNumber.startsWith("92088")) {
1169
			return ("Registered Mail");
1170
		} else if (trackingNumber.startsWith("92021")) {
1171
			return ("Signature Confirmation");
1172
		} else if (trackingNumber.startsWith("9461") || trackingNumber.startsWith("9462")) {
1173
			return ("Parcel Select Ground");
1174
		} else if (trackingNumber.startsWith("92021")) {
1175
			return ("Signature Confirmation");
1176
		}
1177
	} else if (carrier == "UPS") {
1178
		if (trackingNumber.startsWith("1Z")) {
1179
			var service = trackingNumber.substr(8, 2);
1180
 
1181
			if (service == '01') {
1182
			    return ('Next Day Air ("Red")');
1183
			} else if (service == '02') {
1184
			    return ('UPS United States Second Day Air ("Blue")');
1185
			} else if (service == '03') {
1186
			    return ('Ground');
1187
			} else if (service == '12') {
1188
			    return ('Third Day Select');
1189
			} else if (service == '13') {
1190
			    return ('Next Day Air Saver ("Red Saver")');
1191
			} else if (service == '15') {
1192
			    return ('Next Day Air Early A.M.');
1193
			} else if (service == '22') {
1194
			    return ('Ground - Returns Plus - Three Pickup Attempts');
1195
			} else if (service == '32') {
1196
			    return ('Next Day Air Early A.M. - COD');
1197
			} else if (service == '33') {
1198
			    return ('Next Day Air Early A.M. - Saturday Delivery, COD');
1199
			} else if (service == '41') {
1200
			    return ('Next Day Air Early A.M. - Saturday Delivery');
1201
			} else if (service == '42') {
1202
			    return ('Ground - Signature Required');
1203
			} else if (service == '44') {
1204
			    return ('Next Day Air - Saturday Delivery');
1205
			} else if (service == '66') {
1206
			    return ('Worldwide Express');
1207
			} else if (service == '72') {
1208
			    return ('Ground - Collect on Delivery');
1209
			} else if (service == '78') {
1210
			    return ('Ground - Returns Plus - One Pickup Attempt');
1211
			} else if (service == '90') {
1212
			    return ('Ground - Returns - UPS Prints and Mails Label');
1213
			} else if (service == 'A0') {
1214
			    return ('Next Day Air Early A.M. - Adult Signature Required');
1215
			} else if (service == 'A1') {
1216
			    return ('Next Day Air Early A.M. - Saturday Delivery, Adult Signature Required');
1217
			} else if (service == 'A2') {
1218
			    return ('Next Day Air - Adult Signature Required');
1219
			} else if (service == 'A8') {
1220
			    return ('Ground - Adult Signature Required');
1221
			} else if (service == 'A9') {
1222
			    return ('Next Day Air Early A.M. - Adult Signature Required, COD');
1223
			} else if (service == 'AA') {
1224
			    return ('Next Day Air Early A.M. - Saturday Delivery, Adult Signature Required, COD');
1225
			}
1226
		}
1227
	}
1228
 
1229
	return ("");
1230
}
1231
 
1232
function retrieveFees(pageNumber) {
1233
	var i;
1234
	var xml;
1235
	var authErrorFlag = false;
1236
 
1237
	if (eBayAuthTokenFlag === false) {
1238
		return;
1239
	}
1240
 
1241
	var valueStartDate = document.getElementById('startDate').value + "T00:00:00.000Z";
1242
	var valueEndDate = document.getElementById('endDate').value + "T23:59:59.999Z";
1243
 
1244
	var xw = new XMLWriter('UTF-8', '1.0');
1245
	var xhr = new XMLHttpRequest();
1246
 
1247
	xw.writeStartDocument();
1248
	xw.writeStartElement("GetAccountRequest");
1249
	xw.writeAttributeString('xmlns', 'urn:ebay:apis:eBLBaseComponents');
1250
 
1251
	xw.writeStartElement('RequesterCredentials');
1252
	xw.writeElementString('eBayAuthToken', eBayAuthToken);
1253
	xw.writeEndElement(); /* RequesterCredentials */
1254
 
1255
	xw.writeElementString('AccountEntrySortType', 'AccountEntryCreatedTimeAscending');
1256
	xw.writeElementString('AccountHistorySelection', 'BetweenSpecifiedDates');
1257
	xw.writeElementString('BeginDate', valueStartDate);
1258
	xw.writeElementString('EndDate', valueEndDate);
1259
	xw.writeElementString('ExcludeBalance', 'true');
1260
	xw.writeElementString('ExcludeSummary', 'true');
1261
 
1262
	xw.writeStartElement('Pagination');
1263
	xw.writeElementString('EntriesPerPage', configXmlRequestEntriesPerPage);
1264
	xw.writeElementString('PageNumber', pageNumber.toString());
1265
	xw.writeEndElement(); /* Pagination */
1266
 
1267
	xw.writeElementString('ErrorLanguage', 'en_US');
1268
	xw.writeElementString('Version', configeBayTradingVersion);
1269
	xw.writeElementString('WarningLevel', configWarningLevel);
1270
 
1271
	xw.writeEndElement(); /* GetAccountRequest */
1272
	xw.writeEndDocument();
1273
 
1274
	xhr.open('POST', configProxyUrl, true);
1275
	xhr.setRequestHeader('Content-Type', 'text/xml');
1276
	xhr.setRequestHeader('X-EBAY-API-APP-NAME', configAppid);
1277
	xhr.setRequestHeader('X-EBAY-API-COMPATIBILITY-LEVEL', configeBayTradingVersion);
1278
	xhr.setRequestHeader('X-EBAY-API-CALL-NAME', 'GetAccount');
1279
	xhr.setRequestHeader('X-EBAY-API-SITEID', '0');
1280
	xhr.setRequestHeader('X-EBAY-API-DEV-NAME', '');
1281
	xhr.setRequestHeader('X-EBAY-API-CERT-NAME', '');
1282
	xhr.setRequestHeader('X-Proxy-URL', configServiceEndpoint);
1283
 
1284
	xml = xw.flush();
1285
	xw.close();
1286
 
1287
	xhr.onload = () => {
1288
		var obj = XMLparse(xhr.responseXML);
1289
 
1290
		var returnCode = obj.Ack;
1291
 
1292
		var x = document.getElementById("results");
1293
		if (x.className.indexOf("w3-show") == -1) {
1294
			x.className += " w3-show";
1295
		}
1296
 
1297
		if (obj.Message) {
1298
			x.innerHTML += obj.Message;
1299
		}
1300
 
1301
		if (returnCode == 'Success' || (returnCode == 'Warning' && obj.Errors.ErrorCode == '21917182')) {
1302
			createFeeTable(obj, pageNumber);
1303
 
1304
			x.innerHTML = '<p><strong>' + returnCode + ' (Fees/Credits ' + pageNumber + ' / ' + obj.PaginationResult + ')</strong></p>';
1305
 
1306
			if (obj.HasMoreEntries == 'true') {
1307
				++pagesToProcess;
1308
				retrieveFees(pageNumber + 1);
1309
			}
1310
 
1311
			document.getElementById("logging").innerHTML = html.join('');
1312
			--pagesToProcess;
1313
 
1314
			function checkpagesToProcess() {
1315
				if (pagesToProcess > 0) {
1316
					window.setTimeout(checkpagesToProcess, 100); // wait 100 milliseconds
1317
				} else {
1318
					sortTable("feeTable", 1);
1319
					x.innerHTML = '<p><strong>Report Finished!</strong></p>';
1320
 
1321
    			var y = document.getElementById("dlFeeListButton");
1322
		    	if (y.className.indexOf("w3-show") == -1) {
1323
				    y.className += " w3-show";
1324
				  }
1325
 
1326
					setTimeout(function() {
1327
						x.className = x.className.replace(" w3-show", "");
1328
					}, 3000);
1329
				}
1330
			}
1331
 
1332
			checkpagesToProcess();
1333
		} else {
1334
			x.innerHTML = "<p><strong>" + returnCode + ":</strong></p>";
1335
 
1336
			var errors = obj.Errors;
1337
			x.innerHTML += "<p>";
1338
			if (errors.length > 0) {
1339
				for (i = 0; i < errors.length; i++) {
1340
					x.innerHTML += errors[i].SeverityCode + " (" + errors[i].ErrorCode + "): " + escapeHtml(errors[i].LongMessage) + "<br/>";
1341
					if (errors[i].LongMessage.includes('Auth')) {
1342
						authErrorFlag = true;
1343
					}
1344
				}
1345
			} else {
1346
				x.innerHTML += obj.Errors.SeverityCode + " (" + obj.Errors.ErrorCode + "): " + escapeHtml(obj.Errors.LongMessage) + "<br/>";
1347
				if (errors.LongMessage.includes('Auth')) {
1348
					authErrorFlag = true;
1349
				}
1350
			}
1351
			x.innerHTML += "</p>";
1352
 
1353
			if (authErrorFlag === true) {
1354
				eBayAuthTokenFlag = false;
1355
				x = document.getElementById("login");
1356
				if (x.className.indexOf("w3-show") == -1) {
1357
					x.className += " w3-show";
1358
				}
1359
			}
1360
		}
1361
	};
1362
 
1363
	xhr.send(xml);
1364
}
1365
 
1366
function createFeeTable(obj, pageNumber) {
1367
	var i;
1368
 
1369
	if (pageNumber == 1) {
1370
		totalAmount = 0;
1371
 
1372
		document.getElementById("logging").innerHTML = '';
1373
		html = [];
1374
 
1375
		html.push('<h3>Fees and Credits List from ' + document.getElementById("startDate").value + ' to ' + document.getElementById("endDate").value + '</h3>');
1376
		html.push('<table id="feeTable" class="w3-table-all w3-small">');
1377
		html.push('<thead>');
1378
		html.push('<tr>');
1379
 
1380
		html.push(tableHeader('Item ID'));
1381
		html.push(tableHeader('Title'));
1382
		html.push(tableHeader('Date'));
1383
		html.push(tableHeader('Fee Type'));
1384
		html.push(tableHeader('Amount'));
1385
 
1386
		html.push('</tr>');
1387
		html.push('</thead>');
1388
		html.push('<tbody>');
1389
	}
1390
 
1391
	for (i = 0; i < obj.AccountEntries.length; i++) {
1392
		if ((!obj.AccountEntries[i].Description.includes('Payment') && !obj.AccountEntries[i].Description.includes('Final Value Fee') && obj.AccountEntries[i].GrossDetailAmount.text != '0.0' && obj.AccountEntries[i].NetDetailAmount.text != '0.0') ||
1393
			(obj.AccountEntries[i].Description.includes('Final Value Fee') && obj.AccountEntries[i].NetDetailAmount.text.substr(0, 1) == '-')) {
1394
			html.push('<tr>');
1395
 
1396
			html.push(tableCell(obj.AccountEntries[i].ItemID));
1397
			html.push(tableCell(obj.AccountEntries[i].Title));
1398
			html.push(tableCellDate(obj.AccountEntries[i].Date));
1399
			html.push(tableCell(obj.AccountEntries[i].Description));
1400
			html.push(tableCell('$' + parseFloat(obj.AccountEntries[i].GrossDetailAmount.text).toFixed(2)));
1401
			totalAmount += parseFloat(obj.AccountEntries[i].GrossDetailAmount.text);
1402
 
1403
			html.push('</tr>');
1404
		}
1405
	}
1406
 
1407
	if (obj.HasMoreEntries != 'true') {
1408
		html.push('</tbody>');
1409
		html.push('<tfoot>');
1410
		html.push('<tr>');
1411
		html.push(tableCell('<strong>Totals</strong>'));
1412
		html.push(tableCell(''));
1413
		html.push(tableCell(''));
1414
		html.push(tableCell(''));
1415
		html.push(tableCell('<strong>$' + totalAmount.toFixed(2) + '</strong>'));
1416
		html.push('</tr>');
1417
		html.push('</tfoot>');
1418
		html.push('</table>');
1419
	}
1420
}
1421
 
1422
 
1423
function tableCellDate(utcDate) {
1424
	var localDate = new Date(utcDate);
1425
	return ('<td>' + localDate.yyyymmdd() + '</td>');
1426
}
1427
 
1428
function tableCellSKU(str, title) {
1429
	if (str === undefined) {
1430
		str = '';
1431
	}
1432
 
1433
	if (str.indexOf(" - ") > 0) {
1434
		str = str.substr(0, str.indexOf(" - "));
1435
	}
1436
 
1437
	if (str.startsWith("Batch")) {
1438
		var batchNo = Number(str.substr(6));
1439
		str = "Batch " + pad(batchNo, 2);
1440
	}
1441
 
1442
	if (title.includes('(DVD') || title.includes('(HD') || title.includes('(Blu')) {
1443
		str = 'DVD ' + str;
1444
	} else if (title.includes('(CD')) {
1445
		str = 'CD ' + str;
1446
	} else if (title.includes('Hardcover') || title.includes('Paperback')) {
1447
		str = 'Book ' + str;
1448
	}
1449
 
1450
	return ('<td>' + str + '</td>');
1451
}
1452
 
1453
function sortTable(tableName, column) {
1454
	var table, rows, switching, i, x, y, shouldSwitch;
1455
	--column; // column parameter starts with 1
1456
	table = document.getElementById(tableName);
1457
	switching = true;
1458
	/*Make a loop that will continue until
1459
	no switching has been done:*/
1460
	while (switching) {
1461
		//start by saying: no switching is done:
1462
		switching = false;
1463
		rows = table.getElementsByTagName("TR");
1464
		/*Loop through all table rows (except the
1465
		first, which contains table headers, and the last
1466
		which contains the table footers):*/
1467
		for (i = 1; i < (rows.length - 2); i++) {
1468
			//start by saying there should be no switching:
1469
			shouldSwitch = false;
1470
			/*Get the two elements you want to compare,
1471
			one from current row and one from the next:*/
1472
			x = rows[i].getElementsByTagName("TD")[column];
1473
			y = rows[i + 1].getElementsByTagName("TD")[column];
1474
			//check if the two rows should switch place:
1475
			if (x !== undefined && x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) {
1476
				//if so, mark as a switch and break the loop:
1477
				shouldSwitch = true;
1478
				break;
1479
			}
1480
		}
1481
		if (shouldSwitch) {
1482
			/*If a switch has been marked, make the switch
1483
			and mark that a switch has been done:*/
1484
			rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
1485
			switching = true;
1486
		}
1487
	}
1488
}
1489
 
1490
function printData() {
1491
	var printContent = document.getElementById("printTable");
1492
 
1493
	var num;
1494
	var cssReference = [];
1495
	var uniqueName = new Date();
1496
 
1497
	var windowName = 'Print' + uniqueName.getTime();
1498
	var printWindow = window.open(num, windowName, 'left=50000,top=50000,width=0,height=0');
1499
	cssReference[0] = printWindow.document.createElement("link");
1500
	cssReference[0].href = "https://www.w3schools.com/w3css/4/w3.css";
1501
	cssReference[0].rel = "stylesheet";
1502
	cssReference[0].type = "text/css";
1503
	cssReference[1] = printWindow.document.createElement("link");
1504
	cssReference[1].href = "css/style.css";
1505
	cssReference[1].rel = "stylesheet";
1506
	cssReference[1].type = "text/css";
1507
 
1508
	printWindow.document.write(printContent.outerHTML);
1509
	printWindow.document.getElementsByTagName('head')[0].appendChild(cssReference[0]);
1510
	printWindow.document.getElementsByTagName('head')[0].appendChild(cssReference[1]);
1511
 
1512
	printWindow.document.close();
1513
	printWindow.focus();
1514
	printWindow.print();
1515
	printWindow.close();
1516
}
1517
 
1518
function printSummary() {
1519
	var profit = grossSales + shippingRcvd - shippingCost - eBayFees - PayPalFees - VATaxAmount;
1520
 
1521
	document.getElementById("summary").innerHTML = '<h2>Profit: ' + profit.toFixed(2) + '</h3>';
1522
}
1523
 
1524
function findThumbNails() {
1525
	var i;
1526
	var x = document.getElementById("shippingTable");
1527
 
1528
	thumbnailsToProcess = 0;
1529
 
1530
	for (i = 1; i < (x.rows.length - 1); i++) {
1531
		if (x.rows[i].cells[7].innerHTML == 'eBay' && x.rows[i].cells[2] !== undefined && x.rows[i].cells[2].innerHTML.length < 1) {
1532
			++thumbnailsToProcess;
1533
			getThumbNail(x.rows[i].cells[4].innerHTML);
1534
		} else if (x.rows[i].cells[7].innerHTML == 'Shopify' && x.rows[i].cells[2] !== undefined && x.rows[i].cells[2].innerHTML.length > 0) {
1535
			++thumbnailsToProcess;
1536
			getShopifyThumbNail(x.rows[i].cells[2].innerHTML);
1537
		}
1538
	}
1539
 
1540
	function checkthumbnailsToProcess() {
1541
		if (thumbnailsToProcess > 0) {
1542
			window.setTimeout(checkthumbnailsToProcess, 100); // wait 100 milliseconds
1543
		} else {
1544
			x = document.getElementById("results");
1545
			x.innerHTML = '<p><strong>Report Finished!</strong></p>';
1546
			setTimeout(function() {
1547
				x.className = x.className.replace(" w3-show", "");
1548
			}, 3000);
1549
		}
1550
	}
1551
 
1552
	checkthumbnailsToProcess();
1553
}
1554
 
1555
function getThumbNail(itemId) {
1556
	// Construct the getSingleItem request
1557
	url = configeBayShopping + "?";
1558
	url += "callname=GetSingleItem";
1559
	url += "&responseencoding=JSON";
1560
	url += "&appid=" + configAppid;
1561
	url += "&version=" + configeBayShoppingVersion;
1562
	url += "&ItemID=";
1563
	url += itemId;
1564
 
1565
	var xhttp = new XMLHttpRequest();
1566
 
1567
	xhttp.onreadystatechange = function() {
1568
		if (this.readyState == 4) {
1569
			_cb_getThumbNail(JSON.parse(this.responseText));
1570
		}
1571
	};
1572
 
1573
	xhttp.open("GET", configProxyUrl, true);
1574
	xhttp.setRequestHeader("X-Proxy-Url", encodeURI(url));
1575
	xhttp.send();
1576
}
1577
 
1578
function _cb_getThumbNail(root) {
1579
	var ack = root.Ack;
1580
 
1581
	if (ack == 'Failure' || ack == 'PartialFailure') {
1582
		return;
1583
	}
1584
 
1585
	var JsonObj = typeof root.Item != 'object' ? JSON.parse(root.Item) : root.Item;
1586
	var ItemID = JsonObj.ItemID;
1587
	var PictureURL;
1588
 
1589
	if (Array.isArray(JsonObj.PictureURL)) {
1590
		PictureURL = JsonObj.PictureURL[0];
1591
	} else {
1592
		PictureURL = JsonObj.PictureURL;
1593
	}
1594
 
1595
	document.getElementById('PictureURL' + ItemID).innerHTML = '<img src="' + PictureURL + '" style="max-height:100px">';
1596
	--thumbnailsToProcess;
1597
}
1598
 
1599
function getShopifyThumbNail(productId) {
1600
	var xhttp = new XMLHttpRequest();
1601
	xhttp.onreadystatechange = function() {
1602
		if (this.readyState == 4 && this.status == 200) {
1603
			//window.alert(this.responseText);
1604
			var json = JSON.parse(this.responseText);
1605
			if (json.product !== undefined) {
1606
				document.getElementById('PictureURL' + productId).innerHTML = '<img src="' + json.product.image.src + '" style="max-height:100px">';
1607
			}
1608
			--thumbnailsToProcess;
1609
		}
1610
	};
1611
 
1612
	xhttp.open("GET", configProxyUrl, true);
1613
	xhttp.setRequestHeader("X-Proxy-Url", encodeURI(configShopifyUrl + 'products/' + productId + '.json?fields=image'));
1614
	xhttp.send();
1615
}
1616
 
1617
function findShippingCosts() {
1618
	var i;
1619
	var x;
1620
 
1621
	if (getRadioValue('rptType') == 'trackingList') {
1622
		x = document.getElementById("trackingTable");
1623
	} else {
1624
		x = document.getElementById("orderTable");
1625
	}
1626
 
1627
	for (i = (x.rows.length - 1); i > 0; i--) {
1628
		if (getRadioValue('rptType') == 'trackingList') {
1629
			if (x.rows[i].cells[3] !== undefined && x.rows[i].cells[3].innerHTML.length < 1) {
1630
				if (x.rows[i].cells[7] !== undefined && x.rows[i].cells[7].innerHTML.length < 1) {
1631
					document.getElementById("trackingTable").deleteRow(i);
1632
				} else {
1633
					++shippingsToProcess;
1634
					getShippingCost(x.rows[i].cells[2].innerHTML);
1635
				}
1636
			}
1637
		} else {
1638
			if (x.rows[i].cells[5].innerHTML == 'eBay' && x.rows[i].cells[9] !== undefined && x.rows[i].cells[9].innerHTML.length < 1) {
1639
				++shippingsToProcess;
1640
				getShippingCost(x.rows[i].cells[2].innerHTML);
1641
			} else if (x.rows[i].cells[5].innerHTML == 'Shopify') {
1642
				++shippingsToProcess;
1643
				getPaymentTransaction(x.rows[i].cells[2].innerHTML);
1644
			}
1645
		}
1646
	}
1647
 
1648
	function checkshippingsToProcess() {
1649
		if (shippingsToProcess > 0) {
1650
			window.setTimeout(checkshippingsToProcess, 100); // wait 100 milliseconds
1651
		} else {
1652
			if (getRadioValue('rptType') != 'trackingList') {
1653
				document.getElementById("ShippingTotal").innerHTML = '<strong>$' + shippingCost.toFixed(2) + '</strong>';
1654
				x = document.getElementById("results");
1655
				x.innerHTML = '<p><strong>Report Finished!</strong></p>';
1656
				setTimeout(function() {
1657
					x.className = x.className.replace(" w3-show", "");
1658
				}, 3000);
1659
			} else {
1660
				x = document.getElementById("results");
1661
				x.innerHTML = '<p><strong>Retrieving Carrier Tracking...</strong></p>';
1662
				getTrackingDetails();
1663
			}
1664
		}
1665
	}
1666
 
1667
	checkshippingsToProcess();
1668
}
1669
 
1670
function getShippingCost(OrderId) {
1671
	var i;
1672
	var xml;
1673
	var correlationId;
1674
	var shippingCostStr;
1675
	var deliveryStatus;
1676
	var authErrorFlag = false;
1677
 
1678
	var xw = new XMLWriter('UTF-8', '1.0');
1679
	var xhr = new XMLHttpRequest();
1680
 
1681
	xw.writeStartDocument();
1682
	xw.writeStartElement("GetSellingManagerSaleRecordRequest");
1683
	xw.writeAttributeString('xmlns', 'urn:ebay:apis:eBLBaseComponents');
1684
 
1685
	xw.writeStartElement('RequesterCredentials');
1686
	xw.writeElementString('eBayAuthToken', eBayAuthToken);
1687
	xw.writeEndElement(); /* RequesterCredentials */
1688
 
1689
	xw.writeElementString('OrderID', OrderId);
1690
	xw.writeElementString('MessageID', OrderId);
1691
 
1692
	xw.writeElementString('ErrorLanguage', 'en_US');
1693
	xw.writeElementString('Version', configeBayTradingVersion);
1694
	xw.writeElementString('WarningLevel', configWarningLevel);
1695
 
1696
	xw.writeEndElement(); /* GetSellingManagerSaleRecordRequest */
1697
	xw.writeEndDocument();
1698
 
1699
	xhr.open('POST', configProxyUrl, true);
1700
	xhr.setRequestHeader('Content-Type', 'text/xml');
1701
	xhr.setRequestHeader('X-EBAY-API-APP-NAME', configAppid);
1702
	xhr.setRequestHeader('X-EBAY-API-COMPATIBILITY-LEVEL', configeBayTradingVersion);
1703
	xhr.setRequestHeader('X-EBAY-API-CALL-NAME', 'GetSellingManagerSaleRecord');
1704
	xhr.setRequestHeader('X-EBAY-API-SITEID', '0');
1705
	xhr.setRequestHeader('X-EBAY-API-DEV-NAME', '');
1706
	xhr.setRequestHeader('X-EBAY-API-CERT-NAME', '');
1707
	xhr.setRequestHeader('X-Proxy-URL', configServiceEndpoint);
1708
 
1709
	xml = xw.flush();
1710
	xw.close();
1711
 
1712
	xhr.onload = () => {
1713
		var obj = XMLparse(xhr.responseXML);
1714
 
1715
		var returnCode = obj.Ack;
1716
 
1717
		var x = document.getElementById("results");
1718
		if (x.className.indexOf("w3-show") == -1) {
1719
			x.className += " w3-show";
1720
		}
1721
 
1722
		if (obj.Message) {
1723
			x.innerHTML += obj.Message;
1724
		}
1725
 
1726
		if (returnCode == 'Success' || (returnCode == 'Warning' && obj.Errors.ErrorCode == '21917182')) {
1727
			correlationId = obj.CorrelationID;
1728
			deliveryStatus = '';
1729
			shippingCostStr = '';
1730
 
1731
			if (obj.SellingManagerSoldOrder.ActualShippingCost !== undefined &&
1732
				obj.SellingManagerSoldOrder.ActualShippingCost.text != '0.0' &&
1733
				document.getElementById('ShippingCost' + correlationId).innerHTML.length < 1) {
1734
				shippingCostStr = '$' + parseFloat(obj.SellingManagerSoldOrder.ActualShippingCost.text).toFixed(2);
1735
				shippingCost += parseFloat(obj.SellingManagerSoldOrder.ActualShippingCost.text);
1736
				document.getElementById('ShippingCost' + correlationId).innerHTML = shippingCostStr;
1737
				if (getRadioValue('rptType') == 'orderList') {
1738
					printSummary();
1739
				}
1740
			}
1741
 
1742
			if (getRadioValue('rptType') != 'trackingList') {
1743
				if (Array.isArray(obj.SellingManagerSoldOrder.SellingManagerSoldTransaction)) {
1744
					for (i = 0; i < obj.SellingManagerSoldOrder.SellingManagerSoldTransaction.length; i++) {
1745
						if (obj.SellingManagerSoldOrder.SellingManagerSoldTransaction[i].Shipment.DeliveryStatus !== undefined) {
1746
							deliveryStatus += (i > 0 ? '<br/>' : '') + obj.SellingManagerSoldOrder.SellingManagerSoldTransaction[i].Shipment.DeliveryStatus;
1747
						}
1748
					}
1749
				} else {
1750
					if (obj.SellingManagerSoldOrder.SellingManagerSoldTransaction.Shipment.DeliveryStatus !== undefined) {
1751
						deliveryStatus = obj.SellingManagerSoldOrder.SellingManagerSoldTransaction.Shipment.DeliveryStatus;
1752
					}
1753
				}
1754
				document.getElementById('Delivery' + correlationId).innerHTML = deliveryStatus;
1755
			}
1756
		} else {
1757
			x.innerHTML = "<p><strong>" + returnCode + ":</strong></p>";
1758
 
1759
			var errors = obj.Errors;
1760
			x.innerHTML += "<p>";
1761
			if (errors.length > 0) {
1762
				for (i = 0; i < errors.length; i++) {
1763
					x.innerHTML += errors[i].SeverityCode + " (" + errors[i].ErrorCode + "): " + escapeHtml(errors[i].LongMessage) + "<br/>";
1764
					if (errors[i].LongMessage.includes('Auth')) {
1765
						authErrorFlag = true;
1766
					}
1767
				}
1768
			} else {
1769
				x.innerHTML += obj.Errors.SeverityCode + " (" + obj.Errors.ErrorCode + "): " + escapeHtml(obj.Errors.LongMessage) + "<br/>";
1770
				if (errors.LongMessage.includes('Auth')) {
1771
					authErrorFlag = true;
1772
				}
1773
			}
1774
			x.innerHTML += "</p>";
1775
 
1776
			if (authErrorFlag === true) {
1777
				eBayAuthTokenFlag = false;
1778
				x = document.getElementById("login");
1779
				if (x.className.indexOf("w3-show") == -1) {
1780
					x.className += " w3-show";
1781
				}
1782
			}
1783
		}
1784
 
1785
		--shippingsToProcess;
1786
	};
1787
 
1788
	xhr.send(xml);
1789
}
1790
 
1791
function getPaymentTransaction(fullId) {
1792
	var id = fullId.substr(0, fullId.indexOf(' '));
1793
	var i;
1794
	var transFee = 0.00;
1795
	var transFeeStr = '';
1796
	var transDate = '';
1797
	var transId = '';
1798
 
1799
	var xhttp = new XMLHttpRequest();
1800
	xhttp.onreadystatechange = function() {
1801
		if (this.readyState == 4 && this.status == 200) {
1802
			//window.alert(this.responseText);
1803
			var json = JSON.parse(this.responseText);
1804
			if (json.transactions[0] !== undefined) {
1805
				for (i = 0; i < json.transactions.length; i++) {
1806
					transDate = json.transactions[i].created_at.substr(0, 10);
1807
					document.getElementById('PaidDate' + id).innerHTML = transDate;
1808
 
1809
					if (json.transactions[i].gateway == 'shopify_payments') {
1810
						transId = json.transactions[i].id;
1811
						transFee = Number(json.transactions[0].receipt.balance_transaction.fee) / 100;
1812
					} else if (json.transactions[i].gateway == 'paypal') {
1813
						transId = json.transactions[i].authorization;
1814
						transFee = Number(json.transactions[0].receipt.balance_transaction.fee);
1815
					} else if (json.transactions[i].gateway == 'manual') {
1816
						transId = json.transactions[i].id;
1817
					}
1818
 
1819
					document.getElementById('TransactionId' + id).innerHTML = transId;
1820
 
1821
					transFeeStr = '$' + parseFloat(transFee).toFixed(2);
1822
					PayPalFees += transFee;
1823
					document.getElementById('Fee' + id).innerHTML = transFeeStr;
1824
				}
1825
			}
1826
 
1827
			--shippingsToProcess;
1828
		}
1829
	};
1830
 
1831
	xhttp.open("GET", configProxyUrl, true);
1832
	xhttp.setRequestHeader("X-Proxy-Url", encodeURI(configShopifyUrl + configShopifyTransactionsUrl1 + id + configShopifyTransactionsUrl2));
1833
	xhttp.send();
1834
}
1835
 
1836
function getTrackingDetails() {
1837
	var i;
1838
	var x;
1839
 
1840
	trackingNumbersToProcess = 0;
1841
 
1842
	for (i = 0; i < trackingList.length; i++) {
1843
		++trackingNumbersToProcess;
1844
		if (trackingList[i].substr(0,2) == '1Z') {
1845
			getUPSTracking(trackingList[i]);
1846
		} else {
1847
			getUSPSTracking(trackingList[i]);
1848
		}
1849
	}
1850
 
1851
	function checkTrackingsToProcess() {
1852
		if (trackingNumbersToProcess > 0) {
1853
			window.setTimeout(checkTrackingsToProcess, 100); // wait 100 milliseconds
1854
		} else {
1855
			x = document.getElementById("results");
1856
			x.innerHTML = '<p><strong>Report Finished!</strong></p>';
1857
			setTimeout(function() {
1858
				x.className = x.className.replace(" w3-show", "");
1859
			}, 3000);
1860
		}
1861
	}
1862
 
1863
	checkTrackingsToProcess();
1864
}
1865
 
1866
function getUSPSTracking(searchNumber) {
1867
	var j;
1868
	var str;
1869
	var url;
1870
	var trackingNumber;
1871
	var summary;
1872
	var detail;
1873
	var deliveryDate;
1874
	var createDate;
1875
	var duration;
1876
	var lastUpdate;
1877
	var lastEvent;
1878
	var footer;
1879
 
1880
	var xhttp = new XMLHttpRequest();
1881
	xhttp.onreadystatechange = function() {
1882
		if (this.readyState == 4 && this.status == 200) {
1883
			var obj = XMLparse(this.responseXML);
1884
 
1885
			if (obj.TrackSummary === undefined) {
1886
				--trackingNumbersToProcess;
1887
				return;
1888
			}
1889
 
1890
			trackingNumber = obj.ID;
1891
			summary = formatUSPSTrackingLine(obj.TrackSummary);
1892
			detail = '';
1893
			footer = '';
1894
			deliveryDate = '';
1895
			duration = '';
1896
			lastUpdate = summary.substr(8, 10);
1897
			lastEvent = obj.TrackSummary.Event;
1898
 
1899
			if (document.getElementById('DeliveryStatus' + trackingNumber) === null) {
1900
				--trackingNumbersToProcess;
1901
				return;
1902
			}
1903
 
1904
			if (obj.TrackDetail !== undefined && obj.TrackDetail.length > 0) {
1905
				for (j = 0; j < obj.TrackDetail.length; j++) {
1906
					detail += formatUSPSTrackingLine(obj.TrackDetail[j]);
1907
				}
1908
 
1909
				createDate = moment(obj.TrackDetail[(obj.TrackDetail.length - 1)].EventDate, "MMMM DD, YYYY").format('YYYY-MM-DD');
1910
				footer = 'Enroute since ' + createDate + ' (' + moment().diff(createDate, 'days') + ' days)';
1911
 
1912
				if (summary.includes("Delivered")) {
1913
					deliveryDate = summary.substr(8, 10);
1914
					duration = moment(deliveryDate).diff(createDate, 'days');
1915
					document.getElementById('DeliveryStatus' + trackingNumber).style.color = "green";
1916
					footer = 'Delivered in ' + moment(deliveryDate).to(createDate, 'days');
1917
				} else if (moment().diff(lastUpdate, 'days') > 3) {
1918
					document.getElementById('DeliveryStatus' + trackingNumber).style.color = "red";
1919
				}
1920
			}
1921
 
1922
			document.getElementById('DeliveryStatus' + trackingNumber).innerHTML = lastEvent;
1923
			document.getElementById('DeliveryDays' + trackingNumber).innerHTML = duration;
1924
			document.getElementById('DeliveryDate' + trackingNumber).innerHTML = deliveryDate;
1925
 
1926
			str = document.getElementById(trackingNumber).innerHTML;
1927
			if (!str.startsWith('<button')) {
1928
				document.getElementById(trackingNumber).innerHTML = '<button onclick="document.getElementById(\'mod' + trackingNumber + '\').style.display=\'block\'" class="w3-button w3-black">' + str + '</button>';
1929
 
1930
				str = '  <div id="mod' + trackingNumber + '" class="w3-modal">';
1931
				str += '    <div class="w3-modal-content w3-card-4">';
1932
				str += '      <header class="w3-container w3-black"> ';
1933
				str += '        <span onclick="document.getElementById(\'mod' + trackingNumber + '\').style.display=\'none\'"';
1934
				str += '        class="w3-button w3-display-topright">&times;</span>';
1935
				str += '        <h3>' + trackingNumber + ' (USPS ' + getCarrierService("USPS", trackingNumber, false) + ')</h3>';
1936
				str += '      </header>';
1937
				str += '      <div class="w3-container">';
1938
				str += '         <table class="w3-table-all w3-small">';
1939
				str += '			<tr>';
1940
				str += '			<th>DATE</th>';
1941
				str += '			<th>TIME</th>';
1942
				str += '			<th>STATUS</th>';
1943
				str += '			<th>LOCATION</th>';
1944
				str += '			</tr>';
1945
				str += summary;
1946
				str += detail;
1947
				str += '         </table>';
1948
				str += '      </div>';
1949
				str += '      <footer class="w3-container w3-black">';
1950
				str += '        <p>' + document.getElementById('DeliveryAddress' + trackingNumber).innerHTML + ' - ' + footer + '</p>';
1951
				str += '      </footer>';
1952
				str += '    </div>';
1953
				str += '  </div>';
1954
 
1955
				document.getElementById("modals").innerHTML += str;
1956
			}
1957
 
1958
			--trackingNumbersToProcess;
1959
		}
1960
	};
1961
 
1962
	url = configUSPSUrl + '?API=TrackV2&XML=';
1963
	url += '<TrackFieldRequest USERID="';
1964
	url += configUSPSUserId;
1965
	url += '">';
1966
	url += '<TrackID ID="' + searchNumber + '"></TrackID>';
1967
	url += '</TrackFieldRequest>';
1968
	url = url.replace(/ /g, '%20');
1969
 
1970
	xhttp.open("GET", configProxyUrl, true);
1971
	xhttp.setRequestHeader("X-Proxy-Url", encodeURI(url));
1972
	xhttp.send();
1973
}
1974
 
1975
function formatUSPSTrackingLine(t) {
1976
	var str = '';
1977
 
1978
	if (t !== undefined) {
1979
		str = '<tr>';
1980
 
1981
		str += '<td>' + moment(t.EventDate, "MMMM DD, YYYY").format('YYYY-MM-DD') + '</td>';
1982
 
1983
		str += '<td>';
1984
		if (t.EventTime.length > 0) {
1985
			str += ' ' + moment(t.EventTime, "hh:mm a").format('HH:mm');
1986
		}
1987
		str += '</td>';
1988
 
1989
		str += '<td>' + t.Event + '</td>';
1990
 
1991
		str += '<td>';
1992
		if (t.EventCity.length > 0) {
1993
			str += t.EventCity;
1994
			if (t.EventState.length > 0) {
1995
				str += ", " + t.EventState + ' ' + t.EventZIPCode;
1996
			}
1997
		}
1998
		str += '</td>';
1999
 
2000
		str += '</tr>';
2001
	}
2002
 
2003
	return (str);
2004
}
2005
 
2006
function getUPSTracking(trackingNumber) {
2007
	var xhr = new XMLHttpRequest();
2008
 
2009
	var xml = '<?xml version="1.0"?>';
2010
	xml += '<AccessRequest xml:lang="en-US">';
2011
	xml += '<AccessLicenseNumber>' + configUPSAccessKey + '</AccessLicenseNumber>';
2012
	xml += '<UserId>' + configUPSUsername + '</UserId>';
2013
	xml += '<Password>' + configUPSPassword + '</Password>';
2014
	xml += '</AccessRequest>';
2015
	xml += '<?xml version="1.0"?>';
2016
	xml += '<TrackRequest xml:lang="en-US">';
2017
	xml += '<Request>';
2018
	xml += '<TransactionReference>';
2019
	xml += '<CustomerContext>' + 'MUNA Trading' + '</CustomerContext>';
2020
	xml += '</TransactionReference>';
2021
	xml += '<RequestAction>Track</RequestAction>';
2022
	xml += '<RequestOption>1</RequestOption>';
2023
	xml += '</Request>';
2024
	xml += '<TrackingNumber>' + trackingNumber + '</TrackingNumber>';
2025
	xml += '</TrackRequest>';
2026
 
2027
	xhr.onload = () => {
2028
		var obj = XMLparse(xhr.responseXML);
2029
 
2030
			if (obj.Response.ResponseStatusDescription != 'Success') {
2031
				--trackingNumbersToProcess;
2032
				return;
2033
			}
2034
 
2035
			trackingNumber = obj.Shipment.ShipmentIdentificationNumber;
2036
			summary = formatUPSTrackingLine(obj.Shipment.Package.Activity[0]);
2037
			detail = '';
2038
			footer = '';
2039
			deliveryDate = '';
2040
			duration = '';
2041
			lastUpdate = moment(obj.Shipment.Package.Activity[0].Status.Date, "YYYYMMDD").format('YYYY-MM-DD');
2042
			lastEvent = obj.Shipment.Package.Activity[0].Status.StatusType.Description;
2043
 
2044
			if (document.getElementById('DeliveryStatus' + trackingNumber) === null) {
2045
				--trackingNumbersToProcess;
2046
				return;
2047
			}
2048
 
2049
			if (obj.Shipment.Package.Activity !== undefined && obj.Shipment.Package.Activity.length > 0) {
2050
				for (j = 0; j < obj.Shipment.Package.Activity.length; j++) {
2051
					detail += formatUPSTrackingLine(obj.Shipment.Package.Activity[j]);
2052
				}
2053
 
2054
				createDate = moment(obj.Shipment.PickupDate, "YYYYMMDD").format('YYYY-MM-DD');
2055
				footer = 'Enroute since ' + createDate + ' (' + moment().diff(createDate, 'days') + ' days)';
2056
 
2057
				if (obj.Shipment.Package.DeliveryIndicator == 'Y') {
2058
					deliveryDate = moment(obj.Shipment.Package.DeliveryDate, "YYYYMMDD").format('YYYY-MM-DD');
2059
					duration = moment(deliveryDate).diff(createDate, 'days');
2060
					document.getElementById('DeliveryStatus' + trackingNumber).style.color = "green";
2061
					footer = 'Delivered in ' + moment(deliveryDate).to(createDate, 'days');
2062
				} else if (moment().diff(lastUpdate, 'days') > 3) {
2063
					document.getElementById('DeliveryStatus' + trackingNumber).style.color = "red";
2064
				}
2065
			}
2066
 
2067
			document.getElementById('ShippedDate' + trackingNumber).innerHTML = createDate;
2068
			document.getElementById('DeliveryStatus' + trackingNumber).innerHTML = lastEvent;
2069
			document.getElementById('DeliveryDays' + trackingNumber).innerHTML = duration;
2070
			document.getElementById('DeliveryDate' + trackingNumber).innerHTML = deliveryDate;
2071
 
2072
			str = document.getElementById(trackingNumber).innerHTML;
2073
			if (!str.startsWith('<button')) {
2074
				document.getElementById(trackingNumber).innerHTML = '<button onclick="document.getElementById(\'mod' + trackingNumber + '\').style.display=\'block\'" class="w3-button w3-black">' + str + '</button>';
2075
 
2076
				str = '  <div id="mod' + trackingNumber + '" class="w3-modal">';
2077
				str += '    <div class="w3-modal-content w3-card-4">';
2078
				str += '      <header class="w3-container w3-black"> ';
2079
				str += '        <span onclick="document.getElementById(\'mod' + trackingNumber + '\').style.display=\'none\'"';
2080
				str += '        class="w3-button w3-display-topright">&times;</span>';
2081
				str += '        <h3>' + trackingNumber + ' (UPS ' + getCarrierService("UPS", trackingNumber, false) + ')</h3>';
2082
				str += '      </header>';
2083
				str += '      <div class="w3-container">';
2084
				str += '         <table class="w3-table-all w3-small">';
2085
				str += '			<tr>';
2086
				str += '			<th>DATE</th>';
2087
				str += '			<th>TIME</th>';
2088
				str += '			<th>STATUS</th>';
2089
				str += '			<th>LOCATION</th>';
2090
				str += '			</tr>';
2091
				str += summary;
2092
				str += detail;
2093
				str += '         </table>';
2094
				str += '      </div>';
2095
				str += '      <footer class="w3-container w3-black">';
2096
				str += '        <p>' + document.getElementById('DeliveryAddress' + trackingNumber).innerHTML + ' - ' + footer + '</p>';
2097
				str += '      </footer>';
2098
				str += '    </div>';
2099
				str += '  </div>';
2100
 
2101
				document.getElementById("modals").innerHTML += str;
2102
			}
2103
 
2104
			--trackingNumbersToProcess;
2105
	};
2106
 
2107
	xhr.open('POST', configProxyUrl, true);
2108
	xhr.setRequestHeader('Content-Type', 'text/xml');
2109
	xhr.setRequestHeader('X-Proxy-URL', configUPSUrl);
2110
	xhr.send(xml);
2111
}
2112
 
2113
function formatUPSTrackingLine(t) {
2114
	var str = '';
2115
 
2116
	if (t !== undefined) {
2117
		str = '<tr>';
2118
 
2119
		str += '<td>' + moment(t.Date, "YYYYMMDD").format('YYYY-MM-DD') + '</td>';
2120
 
2121
		str += '<td>';
2122
		if (t.Time.length > 0) {
2123
			str += ' ' + moment(t.Time, "HHmmss").format('HH:mm');
2124
		}
2125
		str += '</td>';
2126
 
2127
		str += '<td>' + t.Status.StatusType.Description + '</td>';
2128
 
2129
		str += '<td>';
2130
		if (t.ActivityLocation.Address.City !== undefined) {
2131
			str += t.ActivityLocation.Address.City;
2132
			if (t.ActivityLocation.Address.StateProvinceCode !== undefined) {
2133
				str += ", " + t.ActivityLocation.Address.StateProvinceCode;
2134
			}
2135
		}
2136
		str += '</td>';
2137
 
2138
		str += '</tr>';
2139
	}
2140
 
2141
	return (str);
2142
}
2143
 
2144
 
2145
function connected() {
2146
	var x;
2147
 
2148
	eBayAuthTokenFlag = true;
2149
	document.getElementById("connected").innerHTML += " (Connected)";
2150
 
2151
	x = document.getElementById("startButton");
2152
	x.className = x.className.replace(" w3-red", " w3-black");
2153
 
2154
	x = document.getElementById("login");
2155
	x.className = x.className.replace(" w3-show", "");
2156
 
2157
	x = document.getElementById("results");
2158
	x.innerHTML = "";
2159
	x.className = x.className.replace(" w3-show", "");
2160
}
2161
 
2162
    </script>
2163
 
2164
</body>
2165
</html>