Subversion Repositories munaweb

Rev

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