Subversion Repositories munaweb

Rev

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

<!DOCTYPE html>
<html lang="en">

<head>
    <title>Order Reports</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
    <link rel="icon" href="favicon.ico" type="image/x-icon">

    <link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
    <link href="https://fonts.googleapis.com/css?family=Lato" rel="stylesheet">
    <link rel="stylesheet" href="css/style.css">
    <script src="js/XMLWriter.js"></script>
    <script src="js/vkbeautify.js"></script>
    <script src="js/lodash.min.js"></script>
    <script src="js/XMLparse.js"></script>
    <script src="js/datetimepicker_css.js"></script>
    <script src="js/moment.js"></script>
    <script src="js/moment-timezone.js"></script>
    <script src="js/muna-tools.js"></script>
</head>

<body onload="return initConfig();">
    <div class="w3-main">
        <div class="w3-container w3-padding w3-margin w3-card-4">
            <div class="w3-container w3-gray" style="height:100px">
                <img class="w3-image" src="images/MUNA%20-%20Logo%20100x100.png" alt="MUNA Trading Logo" style="height:100px">
                <p id="connected" class="w3-xxlarge w3-right">Order Reports
                    <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" />
                </p>
            </div>

            <div class="w3-row">
                <div>
                    <form id="searchForm" class="w3-container w3-light-grey w3-padding w3-small" onsubmit="return getOrders();">
                        <div class="w3-container w3-card-2 w3-cell w3-padding">
                            <h4>Report Range</h4>
                            <div class="w3-row">
                                <div class="w3-half w3-padding">
                                    <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>
                                    <input id="startDate" name="startDate" class="w3-input w3-border-0" style="height:3em" type="text" required>
                                </div>
                                <div class="w3-half w3-padding">
                                    <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>
                                    <input id="endDate" name="endDate" class="w3-input w3-border-0" style="height:3em" type="text" required>
                                </div>
                            </div>
                        </div>
                        <div class="w3-container w3-card-2 w3-cell w3-padding">
                            <p>
                                <input id="shippingList" class="w3-radio" type="radio" style="height:1em" name="rptType" value="shippingList" checked>
                                <label for="shippingList">Awaiting Shipment</label></p>
                            <p>
                                <input id="orderList" class="w3-radio" type="radio" style="height:1em" name="rptType" value="orderList">
                                <label for="orderList">Orders</label></p>
                            <p>
                                <input id="feeList" class="w3-radio" type="radio" style="height:1em" name="rptType" value="feeList">
                                <label for="feeList">eBay Fees and Credits</label></p>
                            <p>
                                    <input id="trackingList" class="w3-radio" type="radio" style="height:1em" name="rptType" value="trackingList">
                                <label for="trackingList">Tracking Status</label></p>
                            <p>
                                    <input id="customerList" class="w3-radio" type="radio" style="height:1em" name="rptType" value="customerList">
                                <label for="customerList">eBay Customer Export</label></p>
                            <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" />
                            <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" />
                            <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" />
                            <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" />
                            <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" />
                        </div>
                        <div id="summary" class="w3-container w3-card-2 w3-cell w3-padding">
                        </div>
                    </form>
                </div>
                <div id="results" class="w3-container w3-padding w3-card-4 w3-hide"></div>
                <div id="printTable">
                    <div id="logging" class="w3-container w3-padding"></div>
                </div>
                <div id="modals">
                </div>
            </div>
        </div>

        <footer class="w3-container w3-center w3-border-top w3-margin">
            Copyright &#169; 2018 MUNA Trading. All rights reserved.
        </footer>

    </div>

    <script>

// Globals
var pagesToProcess = 0;
var shippingsToProcess = 0;
var thumbnailsToProcess = 0;
var trackingNumbersToProcess = 0;
var html = [];
var url;
var trackingList = [];
var trackingListDedupe = [];

var itemsSold;
var grossSales;
var shippingRcvd;
var returnCost;
var shippingCost;
var eBayFees;
var PayPalFees;
var VATaxGross;
var VATaxExempt;
var VATaxAmount;
var totalAmount;

// Initialize Configuration Variables
function initConfig() {
        eBayAuthToken = readCookie();
        if (eBayAuthToken.length > 0) {
                connected();
        }

        if (eBayAuthTokenFlag === false) {
                var x = document.getElementById("login");
                if (x.className.indexOf("w3-show") == -1) {
                        x.className += " w3-show";
                }
        }

        var currentDate = moment();
        var yesterday = moment().subtract(1, "days");

        if (document.getElementById("startDate").value.length < 1) {
                document.getElementById("startDate").value = yesterday.format('YYYY-MM-DD');
        }
        if (document.getElementById("endDate").value.length < 1) {
                document.getElementById("endDate").value = currentDate.format('YYYY-MM-DD');
        }
}

function requireNewLogin() {
        // dummy
}

function getOrders() {
        var x;

        itemsSold = 0;
        grossSales = 0.0;
        shippingRcvd = 0.0;
        returnCost = 0.0;
        shippingCost = 0.0;
        eBayFees = 0.0;
        PayPalFees = 0.0;
        VATaxGross = 0.0;
        VATaxExempt = 0.0;
        VATaxAmount = 0.0;

        document.getElementById("summary").innerHTML = '';
        document.getElementById("results").innerHTML = '';
        document.getElementById("logging").innerHTML = '';

        var sDate = moment(document.getElementById("startDate").value, 'YYYY-MM-DD', true);
        var eDate = moment(document.getElementById("endDate").value, 'YYYY-MM-DD', true);

        if (!sDate.isValid()) {
                document.getElementById("startDate").value = '';
                return;
        }

        if (!eDate.isValid()) {
                document.getElementById("endDate").value = '';
                return;
        }

        if (moment(document.getElementById("startDate").value).isAfter(document.getElementById("endDate").value, 'day')) {
                document.getElementById("endDate").value = '';
                return;
        }

        x = document.getElementById("printButton");
        x.className = x.className.replace(" w3-show", "");
        x = document.getElementById("dlOrderListButton");
        x.className = x.className.replace(" w3-show", "");
        x = document.getElementById("dlFeeListButton");
        x.className = x.className.replace(" w3-show", "");
        x = document.getElementById("dlCustomerListButton");
        x.className = x.className.replace(" w3-show", "");

        x = document.getElementById("results");
        if (x.className.indexOf("w3-show") == -1) {
                x.className += " w3-show";
        }

        pagesToProcess = 1;

        if (getRadioValue('rptType') == 'feeList') {
                document.getElementById("results").innerHTML = '<p><strong>Retrieving Fees and Credits...</strong></p>';

                retrieveFees(1);
        } else {
                document.getElementById("results").innerHTML = '<p><strong>Retrieving Orders...</strong></p>';
                document.getElementById("modals").innerHTML = '';

                retrieveeBayOrders(1);

                function checkpagesToProcess() {
                        if (pagesToProcess > 0) {
                                window.setTimeout(checkpagesToProcess, 100); // wait 100 milliseconds
                        } else {
                                if (getRadioValue('rptType') == 'shippingList') {
                                        retrieveShopifyShippings(1);
                                } else if (getRadioValue('rptType') == 'trackingList') {
                                        retrieveShopifyTrackings(1);
                                } else if (getRadioValue('rptType') == 'customerList') {
                                        sortTable("customerTable", 1);
                                        x = document.getElementById("results");
                                        x.innerHTML = '<p><strong>Report Finished!</strong></p>';
                                        setTimeout(function() {
                                                x.className = x.className.replace(" w3-show", "");
                                        }, 3000);
                                } else {
                                        retrieveShopifyOrders(1);
                                }
                        }
                }

                checkpagesToProcess();

                if (getRadioValue('rptType') == 'shippingList') {
                        x = document.getElementById("printButton");
                        if (x.className.indexOf("w3-show") == -1) {
                                x.className += " w3-show";
                        }
                } else if (getRadioValue('rptType') == 'orderList') {
                        x = document.getElementById("dlOrderListButton");
                        if (x.className.indexOf("w3-show") == -1) {
                                x.className += " w3-show";
                        }
                } else if (getRadioValue('rptType') == 'customerList') {
                        x = document.getElementById("dlCustomerListButton");
                        if (x.className.indexOf("w3-show") == -1) {
                                x.className += " w3-show";
                        }
                }
        }
}

function retrieveeBayOrders(pageNumber) {
        var i;
        var xml;
        var authErrorFlag = false;

        if (eBayAuthTokenFlag === false) {
                return;
        }

        var valueStartDate = moment(document.getElementById('startDate').value + " 00:00:00", "YYYY-MM-DD HH:mm:ss").tz("UTC").toISOString();
        var valueEndDate = moment(document.getElementById('endDate').value + " 23:59:59", "YYYY-MM-DD HH:mm:ss").tz("UTC").toISOString();

        var xw = new XMLWriter('UTF-8', '1.0');
        var xhr = new XMLHttpRequest();

        xw.writeStartDocument();
        xw.writeStartElement("GetOrdersRequest");
        xw.writeAttributeString('xmlns', 'urn:ebay:apis:eBLBaseComponents');

        xw.writeStartElement('RequesterCredentials');
        xw.writeElementString('eBayAuthToken', eBayAuthToken);
        xw.writeEndElement(); /* RequesterCredentials */

        xw.writeElementString('CreateTimeFrom', valueStartDate);
        xw.writeElementString('CreateTimeTo', valueEndDate);

        xw.writeElementString('IncludeFinalValueFee', 'true');
        xw.writeElementString('OrderRole', 'Seller');
        xw.writeElementString('OrderStatus', 'All');

        xw.writeStartElement('Pagination');
        xw.writeElementString('EntriesPerPage', configXmlRequestEntriesPerPage);
        xw.writeElementString('PageNumber', pageNumber.toString());
        xw.writeEndElement(); /* Pagination */

        xw.writeElementString('DetailLevel', 'ReturnAll');

        xw.writeElementString('ErrorLanguage', 'en_US');
        xw.writeElementString('Version', configeBayTradingVersion);
        xw.writeElementString('WarningLevel', configWarningLevel);

        xw.writeEndElement(); /* GetOrdersRequest */
        xw.writeEndDocument();

        xhr.open('POST', configProxyUrl, true);
        xhr.setRequestHeader('Content-Type', 'text/xml');
        xhr.setRequestHeader('X-EBAY-API-APP-NAME', configAppid);
        xhr.setRequestHeader('X-EBAY-API-COMPATIBILITY-LEVEL', configeBayTradingVersion);
        xhr.setRequestHeader('X-EBAY-API-CALL-NAME', 'GetOrders');
        xhr.setRequestHeader('X-EBAY-API-SITEID', '0');
        xhr.setRequestHeader('X-EBAY-API-DEV-NAME', '');
        xhr.setRequestHeader('X-EBAY-API-CERT-NAME', '');
        xhr.setRequestHeader('X-Proxy-URL', configServiceEndpoint);

        xml = xw.flush();
        xw.close();
        //window.alert(vkbeautify.xml(xml));

        xhr.onload = () => {
                var obj = XMLparse(xhr.responseXML);
                //document.getElementById("logging").innerHTML = JSON.stringify(obj);
                //window.alert(JSON.stringify(obj));
                //window.alert(vkbeautify.xml(xhr.responseText));

                var returnCode = obj.Ack;

                var x = document.getElementById("results");
                if (x.className.indexOf("w3-show") == -1) {
                        x.className += " w3-show";
                }

                if (obj.Message) {
                        x.innerHTML += obj.Message;
                }

                if (returnCode == 'Success' || (returnCode == 'Warning' && obj.Errors.ErrorCode == '21917182')) {
                        if (getRadioValue('rptType') == 'shippingList') {
                                createShipmentTable(obj, pageNumber);
                        } else if (getRadioValue('rptType') == 'trackingList') {
                                createTrackingTable(obj, pageNumber);
                        } else if (getRadioValue('rptType') == 'customerList') {
                                createCustomerTable(obj, pageNumber);
                        } else {
                                createOrderTable(obj, pageNumber);
                        }

                        x.innerHTML = '<p><strong>' + returnCode + ' (Orders ' + pageNumber + ' / ' + obj.PaginationResult.TotalNumberOfPages + ')</strong></p>';

                        if (getRadioValue('rptType') == 'orderList') {
                                printSummary();
                        }

                        if (obj.HasMoreOrders == 'true') {
                                ++pagesToProcess;
                                shippingsToProcess = 0;
                                retrieveeBayOrders(pageNumber + 1);
                        }

                        document.getElementById("logging").innerHTML = html.join('');
                        --pagesToProcess;
                } else {
                        x.innerHTML = "<p><strong>" + returnCode + ":</strong></p>";

                        var errors = obj.Errors;
                        x.innerHTML += "<p>";
                        if (errors.length > 0) {
                                for (i = 0; i < errors.length; i++) {
                                        x.innerHTML += errors[i].SeverityCode + " (" + errors[i].ErrorCode + "): " + escapeHtml(errors[i].LongMessage) + "<br/>";
                                        if (errors[i].LongMessage.includes('Auth')) {
                                                authErrorFlag = true;
                                        }
                                }
                        } else {
                                x.innerHTML += obj.Errors.SeverityCode + " (" + obj.Errors.ErrorCode + "): " + escapeHtml(obj.Errors.LongMessage) + "<br/>";
                                if (errors.LongMessage.includes('Auth')) {
                                        authErrorFlag = true;
                                }
                        }
                        x.innerHTML += "</p>";

                        if (authErrorFlag === true) {
                                eBayAuthTokenFlag = false;
                                x = document.getElementById("login");
                                if (x.className.indexOf("w3-show") == -1) {
                                        x.className += " w3-show";
                                }
                        }
                }
        };

        xhr.send(xml);
}

function retrieveShopifyOrders(page) {
        var sDate = moment(document.getElementById("startDate").value + " 00:00:00").format("YYYY-MM-DDTHH:mm:ssZ");
        var eDate = moment(document.getElementById("endDate").value + " 23:59:59").format("YYYY-MM-DDTHH:mm:ssZ");

        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
                if (this.readyState == 4 && this.status == 200) {
                        //window.alert(this.responseText);
                        var json = JSON.parse(this.responseText);
                        if (json.orders[0] !== undefined) {
                                retrieveShopifyOrder(json);
                        }
                }
        };

        xhttp.open("GET", configProxyUrl, true);
        xhttp.setRequestHeader("X-Proxy-Url", encodeURI(configShopifyUrl + configShopifyOrdersUrl + '?page=' + ((page - 1) * configShopifyOrderLimit) + '&limit=' + configShopifyOrderLimit + '&status=any&created_at_min=' + sDate + '&created_at_max=' + eDate));
        xhttp.send();
}

function retrieveShopifyOrder(json) {
        var i, j;
        var title;
        var quantity;
        var itemId;
        var trackingNumber;
        var trackingStatus;
        var shipmentState;
        var shipmentDate;

        for (i = 0; i < json.orders.length; i++) {
                html.push('<tr>');
                html.push(tableCell(json.orders[i].created_at.substr(0, 10)));
                if (json.orders[i].fulfillment_status !== null) {
                        html.push(tableCell(json.orders[i].fulfillment_status));
                } else {
                        html.push(tableCell('created'));
                }
                html.push(tableCell(json.orders[i].id + ' (' + json.orders[i].name + ')'));

                title = '';
                quantity = '';
                itemId = '';
                for (j = 0; j < json.orders[i].line_items.length; j++) {
                        itemsSold++;
                        if (j > 0) {
                                title += '<br/>';
                                quantity += '<br/>';
                                itemId += '<br/>';
                        }
                        title += json.orders[i].line_items[j].title;
                        quantity += json.orders[i].line_items[j].quantity;
                        itemId += json.orders[i].line_items[j].product_id === null ? '' : json.orders[i].line_items[j].product_id;
                }

                html.push(tableCell(title));
                html.push(tableCell(itemId));
                html.push(tableCell('Shopify'));
                html.push(tableCell(quantity));
                html.push(tableCell('$' + json.orders[i].total_price_usd));
                html.push(tableCell('$0.00'));
                html.push(tableCell('N/A'));
                html.push(tableCell('$0.00'));
                html.push(tableCellLabel('Fee' + json.orders[i].id));
                html.push(tableCell(json.orders[i].total_tax));

                if (json.orders[i].shipping_address !== undefined) {
                        shipmentState = json.orders[i].shipping_address.province_code;
                } else {
                        shipmentState = configTaxStateId;
                }
                html.push(tableCell(shipmentState));
                html.push(tableCellLabel('PaidDate' + json.orders[i].id));
                html.push(tableCell(json.orders[i].payment_gateway_names !== undefined ? json.orders[i].payment_gateway_names.join(', ') : ''));
                html.push(tableCellLabel('TransactionId' + json.orders[i].id));

                shipmentDate = '';
                trackingNumber = '';
                trackingStatus = '';
                for (j = 0; j < json.orders[i].fulfillments.length; j++) {
                        if (j > 0) {
                                trackingNumber += '<br/>';
                                trackingStatus += '<br/>';
                                shipmentDate += '<br/>';
                        }

                        if (json.orders[i].fulfillments[j].tracking_number !== null) {
                                trackingNumber = json.orders[i].fulfillments[j].tracking_company + ' ' + json.orders[i].fulfillments[j].tracking_number;
                                trackingStatus = json.orders[i].fulfillments[j].shipment_status;
                                shipmentDate += json.orders[i].fulfillments[j].created_at.substr(0, 10);
                        }
                }

                html.push(tableCell(shipmentDate));
                html.push(tableCell(trackingNumber));
                html.push(tableCell(trackingStatus));
                html.push('</tr>');

                grossSales += Number(json.orders[i].total_price_usd);
                VATaxAmount += Number(json.orders[i].total_tax);
        }

        // xxxxx last steps in the chain
        printOrderTotals();
        document.getElementById("logging").innerHTML = html.join('');

        sortTable("orderTable", 1);
        document.getElementById("results").innerHTML = '<p><strong>Retrieving Shipping Costs...</strong></p>';
        findShippingCosts();
}

function retrieveShopifyShippings(page) {
        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
                if (this.readyState == 4 && this.status == 200) {
                        //window.alert(this.responseText);
                        var json = JSON.parse(this.responseText);
                        if (json.orders[0] !== undefined) {
                                retrieveShopifyShipping(json);
                        }

                        // xxxxx last steps in the chain
                        printShipmentTotals();
                        document.getElementById("logging").innerHTML = html.join('');

                        sortTable("shippingTable", 1);
                        findThumbNails();
                }
        };

        xhttp.open("GET", configProxyUrl, true);
        xhttp.setRequestHeader("X-Proxy-Url", encodeURI(configShopifyUrl + configShopifyOrdersUrl + '?page=' + ((page - 1) * configShopifyOrderLimit) + '&limit=' + configShopifyOrderLimit + '&fulfillment_status=unshipped'));
        xhttp.send();
}

function retrieveShopifyShipping(json) {
        var i;

        for (i = 0; i < json.orders.length; i++) {
                totalAmount += parseFloat(json.orders[i].total_price);

                for (j = 0; j < json.orders[i].line_items.length; j++) {
                        html.push('<tr>');

                        html.push(tableCellSKU(json.orders[i].line_items[j].sku, json.orders[i].line_items[j].title));
                        html.push(tableCell(json.orders[i].line_items[j].quantity));
                        if (json.orders[i].line_items[j].product_id !== null) {
                                html.push(tableCellAndLabel(json.orders[i].line_items[j].product_id, 'PictureURL' + json.orders[i].line_items[j].product_id));
                        } else {
                                html.push(tableCell(''));
                        }
                        html.push(tableCell(json.orders[i].line_items[j].title));
                        html.push(tableCell(json.orders[i].name));
                        html.push(tableCellDate(json.orders[i].created_at.substr(0, 10)));
                        html.push(tableCell('$' + parseFloat(json.orders[i].line_items[j].price).toFixed(2)));
                        html.push(tableCellHidden('Shopify'));

                        itemsSold += Number(json.orders[i].line_items[j].quantity);

                        html.push('</tr>');
                }
        }
}

function retrieveShopifyTrackings(page) {
        var sDate = moment(document.getElementById("startDate").value + " 00:00:00").format("YYYY-MM-DDTHH:mm:ssZ");
        var eDate = moment(document.getElementById("endDate").value + " 23:59:59").format("YYYY-MM-DDTHH:mm:ssZ");

        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
                if (this.readyState == 4 && this.status == 200) {
                        //window.alert(this.responseText);
                        var json = JSON.parse(this.responseText);
                        if (json.orders[0] !== undefined) {
                                retrieveShopifyTracking(json);
                        }

                        // xxxxx last in the chain
                        printTrackingTotals();
                        document.getElementById("logging").innerHTML = html.join('');
                        sortTable("trackingTable", 1);
                        document.getElementById("results").innerHTML = '<p><strong>Retrieving Shipping Costs...</strong></p>';
                        findShippingCosts();
                }
        };

        xhttp.open("GET", configProxyUrl, true);
        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));
        xhttp.send();
}

function retrieveShopifyTracking(json) {
        var i, j;
        var title;

        for (i = 0; i < json.orders.length; i++) {
                if (json.orders[i].shipping_lines[0] === undefined) {
                        continue;
                }

                html.push('<tr>');
                html.push(tableCell(json.orders[i].created_at.substr(0, 10)));

                title = '';
                for (j = 0; j < json.orders[i].line_items.length; j++) {
                        if (j > 0) {
                                title += '<br/>';
                        }
                        title += json.orders[i].line_items[j].title;
                }

                html.push(tableCell(title));
                html.push(tableCell('N/A'));
                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));
                html.push(tableCell(json.orders[i].fulfillments[0].created_at.substr(0, 10))); // best guess
                html.push(tableCell(json.orders[i].fulfillments[0].created_at.substr(0, 10)));
                html.push(tableCellAndLabel(json.orders[i].fulfillments[0].tracking_company + ' ' + json.orders[i].fulfillments[0].tracking_number, json.orders[i].fulfillments[0].tracking_number));
                html.push(tableCell(getCarrierService(json.orders[i].fulfillments[0].tracking_company, json.orders[i].fulfillments[0].tracking_number, true)));
                html.push(tableCellLabel('DeliveryDate' + json.orders[i].fulfillments[0].tracking_number));
                html.push(tableCellLabel('DeliveryDays' + json.orders[i].fulfillments[0].tracking_number));
                html.push(tableCellLabel('DeliveryStatus' + json.orders[i].fulfillments[0].tracking_number));

                html.push('</tr>');
        }
}

function createOrderTable(obj, pageNumber) {
        var i;
        var title;
        var trackingNumber;
        var quantity;
        var finalValueFee;
        var finalValueFeeAmount;
        var itemId;
        var taxAmount;
        var payAmount;

        if (pageNumber == 1) {
                document.getElementById("logging").innerHTML = '';
                html = [];

                html.push('<h3>Order List from ' + document.getElementById("startDate").value + ' to ' + document.getElementById("endDate").value + '</h3>');
                html.push('<div class="w3-responsive">');
                html.push('<table id="orderTable" class="w3-table-all w3-tiny w3-hoverable">');
                html.push('<thead>');
                html.push('<tr>');

                html.push(tableHeader('Order Date'));
                html.push(tableHeader('Order Status'));
                html.push(tableHeader('Order Id'));
                html.push(tableHeader('Ttitle'));
                html.push(tableHeader('Item Id'));
                html.push(tableHeader('Sales Channel'));
                html.push(tableHeader('Quantity Purchased'));
                html.push(tableHeader('Payment Amount'));
                html.push(tableHeader('Shipping Received'));
                html.push(tableHeader('Shipping Cost'));
                html.push(tableHeader('eBay Final Value Fee'));
                html.push(tableHeader('Payment Processor Fee'));
                html.push(tableHeader('Sales Tax Amount'));
                html.push(tableHeader('Ship To State'));
                html.push(tableHeader('Paid Date'));
                html.push(tableHeader('Payment Methods'));

                html.push(tableHeader('Payment Transaction ID'));
                html.push(tableHeader('Shipped Date'));
                html.push(tableHeader('Shipping Tracking Number'));
                html.push(tableHeader('Delivery Status'));

                html.push('</tr>');
                html.push('</thead>');
                html.push('<tbody>');
        }

        for (var entry = 0; entry < obj.OrderArray.length; entry++) {
                html.push('<tr>');

                html.push(tableCellDate(obj.OrderArray[entry].CreatedTime));
                html.push(tableCell(obj.OrderArray[entry].OrderStatus));
                html.push(tableCell(obj.OrderArray[entry].OrderID));

                title = '';
                trackingNumber = '';
                quantity = '';
                finalValueFee = '';
                finalValueFeeAmount = 0.0;
                itemId = '';

                if (obj.OrderArray[entry].TransactionArray.length > 0) {
                        for (title = '', i = 0; i < obj.OrderArray[entry].TransactionArray.length; i++) {
                                itemsSold++;
                                if (i > 0) {
                                        title += '<br/>';
                                        quantity += '<br/>';
                                        itemId += '<br/>';
                                }
                                title += obj.OrderArray[entry].TransactionArray[i].Item.Title;
                                quantity += obj.OrderArray[entry].TransactionArray[i].QuantityPurchased;
                                finalValueFeeAmount += parseFloat(obj.OrderArray[entry].TransactionArray[i].FinalValueFee.text);
                                eBayFees += parseFloat(obj.OrderArray[entry].TransactionArray[i].FinalValueFee.text);
                                itemId += obj.OrderArray[entry].TransactionArray[i].Item.ItemID;
                        }
                        html.push(tableCell(title));
                        html.push(tableCell(itemId));
                        finalValueFee = '$' + finalValueFeeAmount.toFixed(2);
                        if (obj.OrderArray[entry].TransactionArray[0].ShippingDetails === undefined || obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails === undefined) {} else {
                                if (obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails[0] !== undefined) {
                                        for (i = 0; i < obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails.length; i++) {
                                                trackingNumber += (i > 0 ? '<br/>' : '') + obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails[i].ShippingCarrierUsed + ' ' + obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails[i].ShipmentTrackingNumber;
                                        }
                                } else {
                                        trackingNumber = obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails.ShippingCarrierUsed + ' ' + obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails.ShipmentTrackingNumber;
                                }
                        }
                } else {
                        itemsSold++;
                        html.push(tableCell(obj.OrderArray[entry].TransactionArray.Item.Title));
                        html.push(tableCell(obj.OrderArray[entry].TransactionArray.Item.ItemID));
                        if (obj.OrderArray[entry].TransactionArray.ShippingDetails === undefined || obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails === undefined) {} else {
                                if (obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails[0] !== undefined) {
                                        for (i = 0; i < obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.length; i++) {
                                                trackingNumber += (i > 0 ? '<br/>' : '') + obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails[i].ShippingCarrierUsed + ' ' + obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails[i].ShipmentTrackingNumber;
                                        }
                                } else {
                                        trackingNumber = obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.ShippingCarrierUsed + ' ' + obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.ShipmentTrackingNumber;
                                }
                        }
                        //                      if (obj.OrderArray[entry].TransactionArray.ShippingDetails === undefined || obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails === undefined) {
                        //                              trackingNumber = '';
                        //                      } else {
                        //                              trackingNumber = obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.ShippingCarrierUsed + ' ' + obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.ShipmentTrackingNumber;
                        //                      }
                        quantity = obj.OrderArray[entry].TransactionArray.QuantityPurchased;
                        finalValueFee = '$' + parseFloat(obj.OrderArray[entry].TransactionArray.FinalValueFee.text).toFixed(2);
                        eBayFees += parseFloat(obj.OrderArray[entry].TransactionArray.FinalValueFee.text);
                }

                html.push(tableCell('eBay'));
                html.push(tableCell(quantity));
                html.push(tableCell('$' + parseFloat(obj.OrderArray[entry].AmountPaid.text).toFixed(2)));
                grossSales += parseFloat(obj.OrderArray[entry].AmountPaid.text);

                html.push(tableCell('$' + parseFloat(obj.OrderArray[entry].ShippingServiceSelected.ShippingServiceCost.text).toFixed(2)));
                shippingRcvd += parseFloat(obj.OrderArray[entry].ShippingServiceSelected.ShippingServiceCost.text);

                html.push(tableCellLabel('ShippingCost' + obj.OrderArray[entry].OrderID));
                html.push(tableCell(finalValueFee));

                if (obj.OrderArray[entry].ExternalTransaction !== undefined && obj.OrderArray[entry].ExternalTransaction.FeeOrCreditAmount !== undefined) {
                        html.push(tableCell('$' + parseFloat(obj.OrderArray[entry].ExternalTransaction.FeeOrCreditAmount.text).toFixed(2)));
                        PayPalFees += parseFloat(obj.OrderArray[entry].ExternalTransaction.FeeOrCreditAmount.text);
                } else {
                        html.push(tableCell(''));
                }

                if (obj.OrderArray[entry].ShippingAddress.StateOrProvince == configTaxStateId && obj.OrderArray[entry].ShippingDetails.SalesTax.SalesTaxAmount.text == "0.0") {
                        payAmount = parseFloat(obj.OrderArray[entry].AmountPaid.text);
                        taxAmount = payAmount - (payAmount / (1.00 + (configTaxRate / 100)));
                        html.push(tableCell('$' + taxAmount.toFixed(2)));
                        VATaxAmount += taxAmount;
                } else {
                        html.push(tableCell('$' + parseFloat(obj.OrderArray[entry].ShippingDetails.SalesTax.SalesTaxAmount.text).toFixed(2)));
                        VATaxAmount += parseFloat(obj.OrderArray[entry].ShippingDetails.SalesTax.SalesTaxAmount.text);
                }
                html.push(tableCell(obj.OrderArray[entry].ShippingAddress.StateOrProvince));
                VATaxGross += (parseFloat(obj.OrderArray[entry].AmountPaid.text) - parseFloat(obj.OrderArray[entry].ShippingDetails.SalesTax.SalesTaxAmount.text));
                if (obj.OrderArray[entry].ShippingAddress.StateOrProvince != configTaxStateId) {
                        VATaxExempt += parseFloat(obj.OrderArray[entry].AmountPaid.text);
                }

                if (obj.OrderArray[entry].PaidTime !== undefined) {
                        html.push(tableCellDate(obj.OrderArray[entry].PaidTime));
                } else {
                        html.push(tableCell(''));
                }
                html.push(tableCell(obj.OrderArray[entry].PaymentMethods));

                if (obj.OrderArray[entry].ExternalTransaction !== undefined && obj.OrderArray[entry].ExternalTransaction.ExternalTransactionID !== undefined) {
                        html.push(tableCell(obj.OrderArray[entry].ExternalTransaction.ExternalTransactionID));
                } else {
                        html.push(tableCell(''));
                }

                if (obj.OrderArray[entry].ShippedTime === undefined) {
                        html.push(tableCell(''));
                } else {
                        html.push(tableCellDate(obj.OrderArray[entry].ShippedTime));
                }
                html.push(tableCell(trackingNumber));
                html.push(tableCellLabel('Delivery' + obj.OrderArray[entry].OrderID));

                html.push('</tr>');
        }
}

function printOrderTotals() {
        html.push('</tbody>');
        html.push('<tfoot>');
        html.push('<tr>');
        html.push(tableCell('<strong>Totals</strong>'));
        html.push(tableCell(''));
        html.push(tableCell(''));
        html.push(tableCell(''));
        html.push(tableCell(''));
        html.push(tableCell(''));
        html.push(tableCell('<strong>' + itemsSold + '</strong>'));
        html.push(tableCell('<strong>$' + grossSales.toFixed(2) + '</strong>'));
        html.push(tableCell('<strong>$' + shippingRcvd.toFixed(2) + '</strong>'));
        html.push(tableCellLabel('ShippingTotal'));
        html.push(tableCell('<strong>$' + eBayFees.toFixed(2) + '</strong>'));
        html.push(tableCell('<strong>$' + PayPalFees.toFixed(2) + '</strong>'));
        html.push(tableCell('<strong>$' + VATaxAmount.toFixed(2) + '</strong>'));
        html.push(tableCell(''));
        html.push(tableCell(''));
        html.push(tableCell(''));
        html.push(tableCell(''));
        html.push(tableCell(''));
        html.push(tableCell(''));
        html.push(tableCell(''));
        html.push('</tr>');
        html.push('</tfoot>');
        html.push('</table>');
        html.push('</div>');
}

function createCustomerTable(obj, pageNumber) {
        var i;
        var firstName;
        var lastName;
        var emailAddress;

        if (pageNumber == 1) {
                document.getElementById("logging").innerHTML = '';
                html = [];

                html.push('<h3>Customer List from ' + document.getElementById("startDate").value + ' to ' + document.getElementById("endDate").value + '</h3>');
                html.push('<div class="w3-responsive">');
                html.push('<table id="customerTable" class="w3-table-all w3-tiny w3-hoverable">');
                html.push('<thead>');
                html.push('<tr>');

                html.push(tableHeader('First Name'));
                html.push(tableHeader('Last Name'));
                html.push(tableHeader('Email'));
                html.push(tableHeader('Company'));
                html.push(tableHeader('Address1'));
                html.push(tableHeader('Address2'));
                html.push(tableHeader('City'));
                html.push(tableHeader('Province'));
                html.push(tableHeader('Province Code'));
                html.push(tableHeader('Country'));
                html.push(tableHeader('Country Code'));
                html.push(tableHeader('Zip'));
                html.push(tableHeader('Phone'));
                html.push(tableHeader('Accepts Marketing'));
                html.push(tableHeader('Total Spent'));
                html.push(tableHeader('Total Orders'));
                html.push(tableHeader('Tags'));
                html.push(tableHeader('Note'));
                html.push(tableHeader('Tax Exempt'));

                html.push('</tr>');
                html.push('</thead>');
                html.push('<tbody>');
        }

        for (var entry = 0; entry < obj.OrderArray.length; entry++) {
                html.push('<tr>');

                firstName = '';
                lastName = '';
                emailAddress = '';

                if (obj.OrderArray[entry].TransactionArray.length > 0) {
                        for (title = '', i = 0; i < obj.OrderArray[entry].TransactionArray.length; i++) {
                                firstName = obj.OrderArray[entry].TransactionArray[i].Buyer.UserFirstName;
                                lastName = obj.OrderArray[entry].TransactionArray[i].Buyer.UserLastName;
                                emailAddress = obj.OrderArray[entry].TransactionArray[i].Buyer.Email;
                        }
                        if (obj.OrderArray[entry].TransactionArray[0].ShippingDetails === undefined || obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails === undefined) {} else {
                                if (obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails[0] !== undefined) {
                                        for (i = 0; i < obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails.length; i++) {

                                        }
                                } else {

                                }
                        }
                } else {
                        if (obj.OrderArray[entry].TransactionArray.ShippingDetails === undefined || obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails === undefined) {} else {
                                if (obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails[0] !== undefined) {
                                        for (i = 0; i < obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.length; i++) {
                                                trackingNumber += (i > 0 ? '<br/>' : '') + obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails[i].ShippingCarrierUsed + ' ' + obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails[i].ShipmentTrackingNumber;
                                        }
                                } else {
                                        trackingNumber = obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.ShippingCarrierUsed + ' ' + obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.ShipmentTrackingNumber;
                                }
                        }
                        firstName = obj.OrderArray[entry].TransactionArray.Buyer.UserFirstName;
                        lastName = obj.OrderArray[entry].TransactionArray.Buyer.UserLastName;
                        emailAddress = obj.OrderArray[entry].TransactionArray.Buyer.Email;
                }

                html.push(tableCell(firstName.toProperCase()));
                html.push(tableCell(lastName.toProperCase()));
                html.push(tableCell(emailAddress != 'Invalid Request' ? emailAddress : ""));
                html.push(tableCell(''));
                html.push(tableCell(obj.OrderArray[entry].ShippingAddress.Street1.toProperCase()));
                html.push(tableCell(obj.OrderArray[entry].ShippingAddress.Street2.toProperCase()));
                html.push(tableCell(obj.OrderArray[entry].ShippingAddress.CityName.toProperCase()));
                html.push(tableCell(''));
                html.push(tableCell(obj.OrderArray[entry].ShippingAddress.StateOrProvince));
                html.push(tableCell(obj.OrderArray[entry].ShippingAddress.CountryName.toProperCase()));
                html.push(tableCell(obj.OrderArray[entry].ShippingAddress.Country));
                html.push(tableCell(obj.OrderArray[entry].ShippingAddress.PostalCode));
                html.push(tableCell(obj.OrderArray[entry].ShippingAddress.Phone));
                html.push(tableCell('no'));
                html.push(tableCell(''));
                html.push(tableCell(''));
                html.push(tableCell('ebay'));
                html.push(tableCell(obj.OrderArray[entry].BuyerUserID));
                html.push(tableCell('no'));

                html.push('</tr>');
        }


        if (obj.HasMoreOrders != 'true') {
                html.push('</tbody>');
                html.push('<tfoot>');
                html.push('<tr>');
                html.push(tableCell(''));
                html.push('</tr>');
                html.push('</tfoot>');
                html.push('</table>');
                html.push('</div>');
        }
}

function createShipmentTable(obj, pageNumber) {
        var i;

        if (pageNumber == 1) {
                totalAmount = 0.00;
                itemsSold = 0;

                document.getElementById("logging").innerHTML = '';
                html = [];

                html.push('<h3>Awaiting Shipment List</h3>');
                html.push('<table id="shippingTable" class="w3-table-all w3-small">');
                html.push('<thead>');
                html.push('<tr>');

                html.push(tableHeader('SKU'));
                html.push(tableHeader('Quantity'));
                html.push(tableHeader('Thumbnail'));
                html.push(tableHeader('Ttitle'));
                html.push(tableHeader('Item Id'));
                html.push(tableHeader('Date'));
                html.push(tableHeader('Payment Amount'));
                html.push(tableHeaderHidden('Sales Channel'));

                html.push('</tr>');
                html.push('</thead>');
                html.push('<tbody>');
        }

        for (var entry = 0; entry < obj.OrderArray.length; entry++) {
                if (obj.OrderArray[entry].OrderStatus == 'Completed' && obj.OrderArray[entry].ShippedTime === undefined && obj.OrderArray[entry].PaidTime !== undefined) {
                        if (obj.OrderArray[entry].TransactionArray.length > 0) {
                                for (i = 0; i < obj.OrderArray[entry].TransactionArray.length; i++) {
                                        itemsSold++;

                                        html.push('<tr>');

                                        html.push(tableCellSKU(obj.OrderArray[entry].TransactionArray[i].Item.SKU, obj.OrderArray[entry].TransactionArray[i].Item.Title));
                                        html.push(tableCell(obj.OrderArray[entry].TransactionArray[i].QuantityPurchased));
                                        html.push(tableCellLabel('PictureURL' + obj.OrderArray[entry].TransactionArray[i].Item.ItemID));
                                        html.push(tableCell(obj.OrderArray[entry].TransactionArray[i].Item.Title));
                                        html.push(tableCell(obj.OrderArray[entry].TransactionArray[i].Item.ItemID));
                                        html.push(tableCellDate(obj.OrderArray[entry].CreatedTime));
                                        html.push(tableCell('$' + parseFloat(obj.OrderArray[entry].AmountPaid.text).toFixed(2) + '*'));
                                        if (i === 0) {
                                                totalAmount += parseFloat(obj.OrderArray[entry].AmountPaid.text);
                                        }
                                        html.push(tableCellHidden('eBay'));

                                        html.push('</tr>');
                                }
                        } else {
                                html.push('<tr>');

                                html.push(tableCellSKU(obj.OrderArray[entry].TransactionArray.Item.SKU, obj.OrderArray[entry].TransactionArray.Item.Title));
                                html.push(tableCell(obj.OrderArray[entry].TransactionArray.QuantityPurchased));
                                html.push(tableCellLabel('PictureURL' + obj.OrderArray[entry].TransactionArray.Item.ItemID));
                                html.push(tableCell(obj.OrderArray[entry].TransactionArray.Item.Title));
                                html.push(tableCell(obj.OrderArray[entry].TransactionArray.Item.ItemID));
                                html.push(tableCellDate(obj.OrderArray[entry].CreatedTime));
                                html.push(tableCell('$' + parseFloat(obj.OrderArray[entry].AmountPaid.text).toFixed(2)));
                                html.push(tableCellHidden('eBay'));

                                itemsSold += Number(obj.OrderArray[entry].TransactionArray.QuantityPurchased);
                                totalAmount += parseFloat(obj.OrderArray[entry].AmountPaid.text);

                                html.push('</tr>');
                        }
                }
        }
}

function printShipmentTotals() {
        html.push('</tbody>');
        html.push('<tfoot>');
        html.push('<tr>');
        html.push(tableCell('<strong>Totals</strong>'));
        html.push(tableCell(''));
        html.push(tableCell(''));
        html.push(tableCell(''));
        html.push(tableCell(''));
        html.push(tableCell('<strong>' + itemsSold + '</strong>'));
        html.push(tableCell('<strong>$' + totalAmount.toFixed(2) + '</strong>'));
        html.push(tableCellHidden(''));
        html.push('</tr>');
        html.push('</tfoot>');
        html.push('</table>');
}

function createTrackingTable(obj, pageNumber) {
        var i;
        var title;
        var trackingNumber;
        var service;
        var quantity;
        var html_temp;
        var finalValueFee;
        var finalValueFeeAmount;
        var itemId;

        if (pageNumber == 1) {
                document.getElementById("logging").innerHTML = '';
                html = [];
                trackingList = [];
                trackingListDedupe = [];

                html.push('<h3>Tracking Number Status from ' + document.getElementById("startDate").value + ' to ' + document.getElementById("endDate").value + '</h3>');
                html.push('<div class="w3-responsive">');
                html.push('<table id="trackingTable" class="w3-table-all w3-tiny w3-hoverable">');
                html.push('<thead>');
                html.push('<tr>');

                html.push(tableHeader('Order Date'));
                html.push(tableHeader('Ttitle'));
                html.push(tableHeaderHidden('Order Id'));
                html.push(tableHeader('Shipping Cost'));
                html.push(tableHeader('Shipping Address'));
                html.push(tableHeader('Paid Date'));
                html.push(tableHeader('Shipped Date'));
                html.push(tableHeader('Shipping Tracking Number'));
                html.push(tableHeader('Service'));
                html.push(tableHeader('Delivery Date'));
                html.push(tableHeader('Duration (Days)'));
                html.push(tableHeader('Delivery Status'));

                html.push('</tr>');
                html.push('</thead>');
                html.push('<tbody>');
        }

        for (var entry = 0; entry < obj.OrderArray.length; entry++) {
                html_temp = [];

                html_temp.push('<tr>');

                html_temp.push(tableCellDate(obj.OrderArray[entry].CreatedTime));

                title = '';
                trackingNumber = '';
                service = '';
                quantity = '';
                finalValueFee = '';
                finalValueFeeAmount = 0.0;
                itemId = '';

                if (obj.OrderArray[entry].TransactionArray.length > 0) {
                        for (title = '', i = 0; i < obj.OrderArray[entry].TransactionArray.length; i++) {
                                if (i > 0) {
                                        title += '<br/>';
                                        quantity += '<br/>';
                                        itemId += '<br/>';
                                }
                                title += obj.OrderArray[entry].TransactionArray[i].Item.Title;
                        }
                        html_temp.push(tableCell(title));
                        if (obj.OrderArray[entry].TransactionArray[0].ShippingDetails === undefined || obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails === undefined) {} else {
                                if (obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails[0] !== undefined) {
                                        // only last 1
                                        for (i = 0; i < obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails.length; i++) {
                                                trackingNumber = obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails[i].ShippingCarrierUsed + ' ' + obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails[i].ShipmentTrackingNumber;
                                                service = getCarrierService(obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails[i].ShippingCarrierUsed, obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails[i].ShipmentTrackingNumber, true);
                                        }
                                } else {
                                        trackingNumber = obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails.ShippingCarrierUsed + ' ' + obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails.ShipmentTrackingNumber;
                                        service = getCarrierService(obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails.ShippingCarrierUsed, obj.OrderArray[entry].TransactionArray[0].ShippingDetails.ShipmentTrackingDetails.ShipmentTrackingNumber, true);
                                }
                        }
                } else {
                        html_temp.push(tableCell(obj.OrderArray[entry].TransactionArray.Item.Title));
                        if (obj.OrderArray[entry].TransactionArray.ShippingDetails === undefined || obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails === undefined) {} else {
                                if (obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails[0] !== undefined) {
                                        // only last 1
                                        for (i = 0; i < obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.length; i++) {
                                                trackingNumber = obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails[i].ShippingCarrierUsed + ' ' + obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails[i].ShipmentTrackingNumber;
                                                service = getCarrierService(obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails[i].ShippingCarrierUsed, obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails[i].ShipmentTrackingNumber, true);
                                        }
                                } else {
                                        trackingNumber = obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.ShippingCarrierUsed + ' ' + obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.ShipmentTrackingNumber;
                                        service = getCarrierService(obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.ShippingCarrierUsed, obj.OrderArray[entry].TransactionArray.ShippingDetails.ShipmentTrackingDetails.ShipmentTrackingNumber, true);
                                }
                        }
                }

                html_temp.push(tableCellHidden(obj.OrderArray[entry].OrderID));
                html_temp.push(tableCellLabel('ShippingCost' + obj.OrderArray[entry].OrderID));
                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)));

                if (obj.OrderArray[entry].PaidTime !== undefined) {
                        html_temp.push(tableCellDate(obj.OrderArray[entry].PaidTime));
                } else {
                        html_temp.push(tableCell(''));
                }

                if (obj.OrderArray[entry].ShippedTime === undefined) {
                        html_temp.push(tableCellLabel('ShippedDate' + trackingNumber.substr(trackingNumber.indexOf(' ')+1)));
                } else {
                        html_temp.push(tableCellDate(obj.OrderArray[entry].ShippedTime));
                }

                html_temp.push(tableCellAndLabel(trackingNumber, trackingNumber.substr(trackingNumber.indexOf(' ')+1)));
                html_temp.push(tableCell(service));
                html_temp.push(tableCellLabel('DeliveryDate' + trackingNumber.substr(trackingNumber.indexOf(' ')+1)));
                html_temp.push(tableCellLabel('DeliveryDays' + trackingNumber.substr(trackingNumber.indexOf(' ')+1)));
                html_temp.push(tableCellLabel('DeliveryStatus' + trackingNumber.substr(trackingNumber.indexOf(' ')+1)));

                html_temp.push('</tr>');

                if (trackingListDedupe.indexOf(trackingNumber.substr(trackingNumber.indexOf(' ')+1)) == -1) {
                        html.push(html_temp.join(''));
                        trackingListDedupe.push(trackingNumber.substr(trackingNumber.indexOf(' ')+1));
                }
        }
}

function printTrackingTotals() {
        html.push('</tbody>');
        html.push('<tfoot class="w3-hide">');
        html.push('<tr>');
        html.push(tableCell(''));
        html.push('</tr>');
        html.push('</tfoot>');
        html.push('</table>');
        html.push('</div>');
}

function getCarrierService(carrier, trackingNumber, flag) {
        if (flag && trackingList.indexOf(trackingNumber) == -1) {
                trackingList.push(trackingNumber);
        }

        if (carrier == "USPS") {
                if (trackingNumber.startsWith("9449")) {
                        return ("Media Mail");
                } else if (trackingNumber.startsWith("9450")) {
                        return ("Media Mail, Insured");
                } else if (trackingNumber.startsWith("94001")) {
                        return ("First Class");
                } else if (trackingNumber.startsWith("9416")) {
                        return ("First Class, Insured");
                } else if (trackingNumber.startsWith("92055")) {
                        return ("Priority Mail");
                } else if (trackingNumber.startsWith("94073")) {
                        return ("Certified Mail");
                } else if (trackingNumber.startsWith("93033")) {
                        return ("Collect on Delivery");
                } else if (trackingNumber.startsWith("82")) {
                        return ("Global Express");
                } else if (trackingNumber.startsWith("EC")) {
                        return ("Priority Mail Express International");
                } else if (trackingNumber.startsWith("92701") || trackingNumber.startsWith("EA")) {
                        return ("Priority Mail Express");
                } else if (trackingNumber.startsWith("CP")) {
                        return ("Priority Mail  International");
                } else if (trackingNumber.startsWith("92088")) {
                        return ("Registered Mail");
                } else if (trackingNumber.startsWith("92021")) {
                        return ("Signature Confirmation");
                } else if (trackingNumber.startsWith("9461") || trackingNumber.startsWith("9462")) {
                        return ("Parcel Select Ground");
                } else if (trackingNumber.startsWith("92021")) {
                        return ("Signature Confirmation");
                }
        } else if (carrier == "UPS") {
                if (trackingNumber.startsWith("1Z")) {
                        var service = trackingNumber.substr(8, 2);

                        if (service == '01') {
                            return ('Next Day Air ("Red")');
                        } else if (service == '02') {
                            return ('UPS United States Second Day Air ("Blue")');
                        } else if (service == '03') {
                            return ('Ground');
                        } else if (service == '12') {
                            return ('Third Day Select');
                        } else if (service == '13') {
                            return ('Next Day Air Saver ("Red Saver")');
                        } else if (service == '15') {
                            return ('Next Day Air Early A.M.');
                        } else if (service == '22') {
                            return ('Ground - Returns Plus - Three Pickup Attempts');
                        } else if (service == '32') {
                            return ('Next Day Air Early A.M. - COD');
                        } else if (service == '33') {
                            return ('Next Day Air Early A.M. - Saturday Delivery, COD');
                        } else if (service == '41') {
                            return ('Next Day Air Early A.M. - Saturday Delivery');
                        } else if (service == '42') {
                            return ('Ground - Signature Required');
                        } else if (service == '44') {
                            return ('Next Day Air - Saturday Delivery');
                        } else if (service == '66') {
                            return ('Worldwide Express');
                        } else if (service == '72') {
                            return ('Ground - Collect on Delivery');
                        } else if (service == '78') {
                            return ('Ground - Returns Plus - One Pickup Attempt');
                        } else if (service == '90') {
                            return ('Ground - Returns - UPS Prints and Mails Label');
                        } else if (service == 'A0') {
                            return ('Next Day Air Early A.M. - Adult Signature Required');
                        } else if (service == 'A1') {
                            return ('Next Day Air Early A.M. - Saturday Delivery, Adult Signature Required');
                        } else if (service == 'A2') {
                            return ('Next Day Air - Adult Signature Required');
                        } else if (service == 'A8') {
                            return ('Ground - Adult Signature Required');
                        } else if (service == 'A9') {
                            return ('Next Day Air Early A.M. - Adult Signature Required, COD');
                        } else if (service == 'AA') {
                            return ('Next Day Air Early A.M. - Saturday Delivery, Adult Signature Required, COD');
                        }
                }
        }

        return ("");
}

function retrieveFees(pageNumber) {
        var i;
        var xml;
        var authErrorFlag = false;

        if (eBayAuthTokenFlag === false) {
                return;
        }

        var valueStartDate = document.getElementById('startDate').value + "T00:00:00.000Z";
        var valueEndDate = document.getElementById('endDate').value + "T23:59:59.999Z";

        var xw = new XMLWriter('UTF-8', '1.0');
        var xhr = new XMLHttpRequest();

        xw.writeStartDocument();
        xw.writeStartElement("GetAccountRequest");
        xw.writeAttributeString('xmlns', 'urn:ebay:apis:eBLBaseComponents');

        xw.writeStartElement('RequesterCredentials');
        xw.writeElementString('eBayAuthToken', eBayAuthToken);
        xw.writeEndElement(); /* RequesterCredentials */

        xw.writeElementString('AccountEntrySortType', 'AccountEntryCreatedTimeAscending');
        xw.writeElementString('AccountHistorySelection', 'BetweenSpecifiedDates');
        xw.writeElementString('BeginDate', valueStartDate);
        xw.writeElementString('EndDate', valueEndDate);
        xw.writeElementString('ExcludeBalance', 'true');
        xw.writeElementString('ExcludeSummary', 'true');

        xw.writeStartElement('Pagination');
        xw.writeElementString('EntriesPerPage', configXmlRequestEntriesPerPage);
        xw.writeElementString('PageNumber', pageNumber.toString());
        xw.writeEndElement(); /* Pagination */

        xw.writeElementString('ErrorLanguage', 'en_US');
        xw.writeElementString('Version', configeBayTradingVersion);
        xw.writeElementString('WarningLevel', configWarningLevel);

        xw.writeEndElement(); /* GetAccountRequest */
        xw.writeEndDocument();

        xhr.open('POST', configProxyUrl, true);
        xhr.setRequestHeader('Content-Type', 'text/xml');
        xhr.setRequestHeader('X-EBAY-API-APP-NAME', configAppid);
        xhr.setRequestHeader('X-EBAY-API-COMPATIBILITY-LEVEL', configeBayTradingVersion);
        xhr.setRequestHeader('X-EBAY-API-CALL-NAME', 'GetAccount');
        xhr.setRequestHeader('X-EBAY-API-SITEID', '0');
        xhr.setRequestHeader('X-EBAY-API-DEV-NAME', '');
        xhr.setRequestHeader('X-EBAY-API-CERT-NAME', '');
        xhr.setRequestHeader('X-Proxy-URL', configServiceEndpoint);

        xml = xw.flush();
        xw.close();
        //window.alert(vkbeautify.xml(xml));

        xhr.onload = () => {
                var obj = XMLparse(xhr.responseXML);
                //document.getElementById("logging").innerHTML = JSON.stringify(obj);
                //window.alert(JSON.stringify(obj));
                //window.alert(vkbeautify.xml(xhr.responseText));

                var returnCode = obj.Ack;

                var x = document.getElementById("results");
                if (x.className.indexOf("w3-show") == -1) {
                        x.className += " w3-show";
                }

                if (obj.Message) {
                        x.innerHTML += obj.Message;
                }

                if (returnCode == 'Success' || (returnCode == 'Warning' && obj.Errors.ErrorCode == '21917182')) {
                        createFeeTable(obj, pageNumber);

                        x.innerHTML = '<p><strong>' + returnCode + ' (Fees/Credits ' + pageNumber + ' / ' + obj.PaginationResult + ')</strong></p>';

                        if (obj.HasMoreEntries == 'true') {
                                ++pagesToProcess;
                                retrieveFees(pageNumber + 1);
                        }

                        document.getElementById("logging").innerHTML = html.join('');
                        --pagesToProcess;

                        function checkpagesToProcess() {
                                if (pagesToProcess > 0) {
                                        window.setTimeout(checkpagesToProcess, 100); // wait 100 milliseconds
                                } else {
                                        sortTable("feeTable", 1);
                                        x.innerHTML = '<p><strong>Report Finished!</strong></p>';

                        var y = document.getElementById("dlFeeListButton");
                        if (y.className.indexOf("w3-show") == -1) {
                                    y.className += " w3-show";
                                  }

                                        setTimeout(function() {
                                                x.className = x.className.replace(" w3-show", "");
                                        }, 3000);
                                }
                        }

                        checkpagesToProcess();
                } else {
                        x.innerHTML = "<p><strong>" + returnCode + ":</strong></p>";

                        var errors = obj.Errors;
                        x.innerHTML += "<p>";
                        if (errors.length > 0) {
                                for (i = 0; i < errors.length; i++) {
                                        x.innerHTML += errors[i].SeverityCode + " (" + errors[i].ErrorCode + "): " + escapeHtml(errors[i].LongMessage) + "<br/>";
                                        if (errors[i].LongMessage.includes('Auth')) {
                                                authErrorFlag = true;
                                        }
                                }
                        } else {
                                x.innerHTML += obj.Errors.SeverityCode + " (" + obj.Errors.ErrorCode + "): " + escapeHtml(obj.Errors.LongMessage) + "<br/>";
                                if (errors.LongMessage.includes('Auth')) {
                                        authErrorFlag = true;
                                }
                        }
                        x.innerHTML += "</p>";

                        if (authErrorFlag === true) {
                                eBayAuthTokenFlag = false;
                                x = document.getElementById("login");
                                if (x.className.indexOf("w3-show") == -1) {
                                        x.className += " w3-show";
                                }
                        }
                }
        };

        xhr.send(xml);
}

function createFeeTable(obj, pageNumber) {
        var i;

        if (pageNumber == 1) {
                totalAmount = 0;

                document.getElementById("logging").innerHTML = '';
                html = [];

                html.push('<h3>Fees and Credits List from ' + document.getElementById("startDate").value + ' to ' + document.getElementById("endDate").value + '</h3>');
                html.push('<table id="feeTable" class="w3-table-all w3-small">');
                html.push('<thead>');
                html.push('<tr>');

                html.push(tableHeader('Item ID'));
                html.push(tableHeader('Title'));
                html.push(tableHeader('Date'));
                html.push(tableHeader('Fee Type'));
                html.push(tableHeader('Amount'));

                html.push('</tr>');
                html.push('</thead>');
                html.push('<tbody>');
        }

        for (i = 0; i < obj.AccountEntries.length; i++) {
                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') ||
                        (obj.AccountEntries[i].Description.includes('Final Value Fee') && obj.AccountEntries[i].NetDetailAmount.text.substr(0, 1) == '-')) {
                        html.push('<tr>');

                        html.push(tableCell(obj.AccountEntries[i].ItemID));
                        html.push(tableCell(obj.AccountEntries[i].Title));
                        html.push(tableCellDate(obj.AccountEntries[i].Date));
                        html.push(tableCell(obj.AccountEntries[i].Description));
                        html.push(tableCell('$' + parseFloat(obj.AccountEntries[i].GrossDetailAmount.text).toFixed(2)));
                        totalAmount += parseFloat(obj.AccountEntries[i].GrossDetailAmount.text);

                        html.push('</tr>');
                }
        }

        if (obj.HasMoreEntries != 'true') {
                html.push('</tbody>');
                html.push('<tfoot>');
                html.push('<tr>');
                html.push(tableCell('<strong>Totals</strong>'));
                html.push(tableCell(''));
                html.push(tableCell(''));
                html.push(tableCell(''));
                html.push(tableCell('<strong>$' + totalAmount.toFixed(2) + '</strong>'));
                html.push('</tr>');
                html.push('</tfoot>');
                html.push('</table>');
        }
}


function tableCellDate(utcDate) {
        var localDate = new Date(utcDate);
        return ('<td>' + localDate.yyyymmdd() + '</td>');
}

function tableCellSKU(str, title) {
        if (str === undefined) {
                str = '';
        }

        if (str.indexOf(" - ") > 0) {
                str = str.substr(0, str.indexOf(" - "));
        }

        if (str.startsWith("Batch")) {
                var batchNo = Number(str.substr(6));
                str = "Batch " + pad(batchNo, 2);
        }

        if (title.includes('(DVD') || title.includes('(HD') || title.includes('(Blu')) {
                str = 'DVD ' + str;
        } else if (title.includes('(CD')) {
                str = 'CD ' + str;
        } else if (title.includes('Hardcover') || title.includes('Paperback')) {
                str = 'Book ' + str;
        }

        return ('<td>' + str + '</td>');
}

function sortTable(tableName, column) {
        var table, rows, switching, i, x, y, shouldSwitch;
        --column; // column parameter starts with 1
        table = document.getElementById(tableName);
        switching = true;
        /*Make a loop that will continue until
        no switching has been done:*/
        while (switching) {
                //start by saying: no switching is done:
                switching = false;
                rows = table.getElementsByTagName("TR");
                /*Loop through all table rows (except the
                first, which contains table headers, and the last
                which contains the table footers):*/
                for (i = 1; i < (rows.length - 2); i++) {
                        //start by saying there should be no switching:
                        shouldSwitch = false;
                        /*Get the two elements you want to compare,
                        one from current row and one from the next:*/
                        x = rows[i].getElementsByTagName("TD")[column];
                        y = rows[i + 1].getElementsByTagName("TD")[column];
                        //check if the two rows should switch place:
                        if (x !== undefined && x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) {
                                //if so, mark as a switch and break the loop:
                                shouldSwitch = true;
                                break;
                        }
                }
                if (shouldSwitch) {
                        /*If a switch has been marked, make the switch
                        and mark that a switch has been done:*/
                        rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
                        switching = true;
                }
        }
}

function printData() {
        var printContent = document.getElementById("printTable");

        var num;
        var cssReference = [];
        var uniqueName = new Date();

        var windowName = 'Print' + uniqueName.getTime();
        var printWindow = window.open(num, windowName, 'left=50000,top=50000,width=0,height=0');
        cssReference[0] = printWindow.document.createElement("link");
        cssReference[0].href = "https://www.w3schools.com/w3css/4/w3.css";
        cssReference[0].rel = "stylesheet";
        cssReference[0].type = "text/css";
        cssReference[1] = printWindow.document.createElement("link");
        cssReference[1].href = "css/style.css";
        cssReference[1].rel = "stylesheet";
        cssReference[1].type = "text/css";

        printWindow.document.write(printContent.outerHTML);
        printWindow.document.getElementsByTagName('head')[0].appendChild(cssReference[0]);
        printWindow.document.getElementsByTagName('head')[0].appendChild(cssReference[1]);

        printWindow.document.close();
        printWindow.focus();
        printWindow.print();
        printWindow.close();
}

function printSummary() {
        var profit = grossSales + shippingRcvd - shippingCost - eBayFees - PayPalFees - VATaxAmount;

        document.getElementById("summary").innerHTML = '<h2>Profit: ' + profit.toFixed(2) + '</h3>';
}

function findThumbNails() {
        var i;
        var x = document.getElementById("shippingTable");

        thumbnailsToProcess = 0;

        for (i = 1; i < (x.rows.length - 1); i++) {
                if (x.rows[i].cells[7].innerHTML == 'eBay' && x.rows[i].cells[2] !== undefined && x.rows[i].cells[2].innerHTML.length < 1) {
                        ++thumbnailsToProcess;
                        getThumbNail(x.rows[i].cells[4].innerHTML);
                } else if (x.rows[i].cells[7].innerHTML == 'Shopify' && x.rows[i].cells[2] !== undefined && x.rows[i].cells[2].innerHTML.length > 0) {
                        ++thumbnailsToProcess;
                        getShopifyThumbNail(x.rows[i].cells[2].innerHTML);
                }
        }

        function checkthumbnailsToProcess() {
                if (thumbnailsToProcess > 0) {
                        window.setTimeout(checkthumbnailsToProcess, 100); // wait 100 milliseconds
                } else {
                        x = document.getElementById("results");
                        x.innerHTML = '<p><strong>Report Finished!</strong></p>';
                        setTimeout(function() {
                                x.className = x.className.replace(" w3-show", "");
                        }, 3000);
                }
        }

        checkthumbnailsToProcess();
}

function getThumbNail(itemId) {
        // Construct the getSingleItem request
        url = configeBayShopping + "?";
        url += "callname=GetSingleItem";
        url += "&responseencoding=JSON";
        url += "&appid=" + configAppid;
        url += "&version=" + configeBayShoppingVersion;
        url += "&ItemID=";
        url += itemId;

        var xhttp = new XMLHttpRequest();

        xhttp.onreadystatechange = function() {
                if (this.readyState == 4) {
                        _cb_getThumbNail(JSON.parse(this.responseText));
                }
        };

        xhttp.open("GET", configProxyUrl, true);
        xhttp.setRequestHeader("X-Proxy-Url", encodeURI(url));
        xhttp.send();
}

function _cb_getThumbNail(root) {
        var ack = root.Ack;

        if (ack == 'Failure' || ack == 'PartialFailure') {
                return;
        }

        var JsonObj = typeof root.Item != 'object' ? JSON.parse(root.Item) : root.Item;
        var ItemID = JsonObj.ItemID;
        var PictureURL;

        if (Array.isArray(JsonObj.PictureURL)) {
                PictureURL = JsonObj.PictureURL[0];
        } else {
                PictureURL = JsonObj.PictureURL;
        }

        document.getElementById('PictureURL' + ItemID).innerHTML = '<img src="' + PictureURL + '" style="max-height:100px">';
        --thumbnailsToProcess;
}

function getShopifyThumbNail(productId) {
        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
                if (this.readyState == 4 && this.status == 200) {
                        //window.alert(this.responseText);
                        var json = JSON.parse(this.responseText);
                        if (json.product !== undefined) {
                                document.getElementById('PictureURL' + productId).innerHTML = '<img src="' + json.product.image.src + '" style="max-height:100px">';
                        }
                        --thumbnailsToProcess;
                }
        };

        xhttp.open("GET", configProxyUrl, true);
        xhttp.setRequestHeader("X-Proxy-Url", encodeURI(configShopifyUrl + 'products/' + productId + '.json?fields=image'));
        xhttp.send();
}

function findShippingCosts() {
        var i;
        var x;

        if (getRadioValue('rptType') == 'trackingList') {
                x = document.getElementById("trackingTable");
        } else {
                x = document.getElementById("orderTable");
        }

        for (i = (x.rows.length - 1); i > 0; i--) {
                if (getRadioValue('rptType') == 'trackingList') {
                        if (x.rows[i].cells[3] !== undefined && x.rows[i].cells[3].innerHTML.length < 1) {
                                if (x.rows[i].cells[7] !== undefined && x.rows[i].cells[7].innerHTML.length < 1) {
                                        document.getElementById("trackingTable").deleteRow(i);
                                } else {
                                        ++shippingsToProcess;
                                        getShippingCost(x.rows[i].cells[2].innerHTML);
                                }
                        }
                } else {
                        if (x.rows[i].cells[5].innerHTML == 'eBay' && x.rows[i].cells[9] !== undefined && x.rows[i].cells[9].innerHTML.length < 1) {
                                ++shippingsToProcess;
                                getShippingCost(x.rows[i].cells[2].innerHTML);
                        } else if (x.rows[i].cells[5].innerHTML == 'Shopify') {
                                ++shippingsToProcess;
                                getPaymentTransaction(x.rows[i].cells[2].innerHTML);
                        }
                }
        }

        function checkshippingsToProcess() {
                if (shippingsToProcess > 0) {
                        window.setTimeout(checkshippingsToProcess, 100); // wait 100 milliseconds
                } else {
                        if (getRadioValue('rptType') != 'trackingList') {
                                document.getElementById("ShippingTotal").innerHTML = '<strong>$' + shippingCost.toFixed(2) + '</strong>';
                                x = document.getElementById("results");
                                x.innerHTML = '<p><strong>Report Finished!</strong></p>';
                                setTimeout(function() {
                                        x.className = x.className.replace(" w3-show", "");
                                }, 3000);
                        } else {
                                x = document.getElementById("results");
                                x.innerHTML = '<p><strong>Retrieving Carrier Tracking...</strong></p>';
                                getTrackingDetails();
                        }
                }
        }

        checkshippingsToProcess();
}

function getShippingCost(OrderId) {
        var i;
        var xml;
        var correlationId;
        var shippingCostStr;
        var deliveryStatus;
        var authErrorFlag = false;

        var xw = new XMLWriter('UTF-8', '1.0');
        var xhr = new XMLHttpRequest();

        xw.writeStartDocument();
        xw.writeStartElement("GetSellingManagerSaleRecordRequest");
        xw.writeAttributeString('xmlns', 'urn:ebay:apis:eBLBaseComponents');

        xw.writeStartElement('RequesterCredentials');
        xw.writeElementString('eBayAuthToken', eBayAuthToken);
        xw.writeEndElement(); /* RequesterCredentials */

        xw.writeElementString('OrderID', OrderId);
        xw.writeElementString('MessageID', OrderId);

        xw.writeElementString('ErrorLanguage', 'en_US');
        xw.writeElementString('Version', configeBayTradingVersion);
        xw.writeElementString('WarningLevel', configWarningLevel);

        xw.writeEndElement(); /* GetSellingManagerSaleRecordRequest */
        xw.writeEndDocument();

        xhr.open('POST', configProxyUrl, true);
        xhr.setRequestHeader('Content-Type', 'text/xml');
        xhr.setRequestHeader('X-EBAY-API-APP-NAME', configAppid);
        xhr.setRequestHeader('X-EBAY-API-COMPATIBILITY-LEVEL', configeBayTradingVersion);
        xhr.setRequestHeader('X-EBAY-API-CALL-NAME', 'GetSellingManagerSaleRecord');
        xhr.setRequestHeader('X-EBAY-API-SITEID', '0');
        xhr.setRequestHeader('X-EBAY-API-DEV-NAME', '');
        xhr.setRequestHeader('X-EBAY-API-CERT-NAME', '');
        xhr.setRequestHeader('X-Proxy-URL', configServiceEndpoint);

        xml = xw.flush();
        xw.close();
        //window.alert(vkbeautify.xml(xml));

        xhr.onload = () => {
                var obj = XMLparse(xhr.responseXML);
                //document.getElementById("logging").innerHTML += JSON.stringify(obj);
                //window.alert(JSON.stringify(obj));
                //window.alert(vkbeautify.xml(xhr.responseText));

                var returnCode = obj.Ack;

                var x = document.getElementById("results");
                if (x.className.indexOf("w3-show") == -1) {
                        x.className += " w3-show";
                }

                if (obj.Message) {
                        x.innerHTML += obj.Message;
                }

                if (returnCode == 'Success' || (returnCode == 'Warning' && obj.Errors.ErrorCode == '21917182')) {
                        correlationId = obj.CorrelationID;
                        deliveryStatus = '';
                        shippingCostStr = '';

                        if (obj.SellingManagerSoldOrder.ActualShippingCost !== undefined &&
                                obj.SellingManagerSoldOrder.ActualShippingCost.text != '0.0' &&
                                document.getElementById('ShippingCost' + correlationId).innerHTML.length < 1) {
                                shippingCostStr = '$' + parseFloat(obj.SellingManagerSoldOrder.ActualShippingCost.text).toFixed(2);
                                shippingCost += parseFloat(obj.SellingManagerSoldOrder.ActualShippingCost.text);
                                document.getElementById('ShippingCost' + correlationId).innerHTML = shippingCostStr;
                                if (getRadioValue('rptType') == 'orderList') {
                                        printSummary();
                                }
                        }

                        if (getRadioValue('rptType') != 'trackingList') {
                                if (Array.isArray(obj.SellingManagerSoldOrder.SellingManagerSoldTransaction)) {
                                        for (i = 0; i < obj.SellingManagerSoldOrder.SellingManagerSoldTransaction.length; i++) {
                                                if (obj.SellingManagerSoldOrder.SellingManagerSoldTransaction[i].Shipment.DeliveryStatus !== undefined) {
                                                        deliveryStatus += (i > 0 ? '<br/>' : '') + obj.SellingManagerSoldOrder.SellingManagerSoldTransaction[i].Shipment.DeliveryStatus;
                                                }
                                        }
                                } else {
                                        if (obj.SellingManagerSoldOrder.SellingManagerSoldTransaction.Shipment.DeliveryStatus !== undefined) {
                                                deliveryStatus = obj.SellingManagerSoldOrder.SellingManagerSoldTransaction.Shipment.DeliveryStatus;
                                        }
                                }
                                document.getElementById('Delivery' + correlationId).innerHTML = deliveryStatus;
                        }
                } else {
                        x.innerHTML = "<p><strong>" + returnCode + ":</strong></p>";

                        var errors = obj.Errors;
                        x.innerHTML += "<p>";
                        if (errors.length > 0) {
                                for (i = 0; i < errors.length; i++) {
                                        x.innerHTML += errors[i].SeverityCode + " (" + errors[i].ErrorCode + "): " + escapeHtml(errors[i].LongMessage) + "<br/>";
                                        if (errors[i].LongMessage.includes('Auth')) {
                                                authErrorFlag = true;
                                        }
                                }
                        } else {
                                x.innerHTML += obj.Errors.SeverityCode + " (" + obj.Errors.ErrorCode + "): " + escapeHtml(obj.Errors.LongMessage) + "<br/>";
                                if (errors.LongMessage.includes('Auth')) {
                                        authErrorFlag = true;
                                }
                        }
                        x.innerHTML += "</p>";

                        if (authErrorFlag === true) {
                                eBayAuthTokenFlag = false;
                                x = document.getElementById("login");
                                if (x.className.indexOf("w3-show") == -1) {
                                        x.className += " w3-show";
                                }
                        }
                }

                --shippingsToProcess;
        };

        xhr.send(xml);
}

function getPaymentTransaction(fullId) {
        var id = fullId.substr(0, fullId.indexOf(' '));
        var i;
        var transFee = 0.00;
        var transFeeStr = '';
        var transDate = '';
        var transId = '';

        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
                if (this.readyState == 4 && this.status == 200) {
                        //window.alert(this.responseText);
                        var json = JSON.parse(this.responseText);
                        if (json.transactions[0] !== undefined) {
                                for (i = 0; i < json.transactions.length; i++) {
                                        transDate = json.transactions[i].created_at.substr(0, 10);
                                        document.getElementById('PaidDate' + id).innerHTML = transDate;

                                        if (json.transactions[i].gateway == 'shopify_payments') {
                                                transId = json.transactions[i].id;
                                                transFee = Number(json.transactions[0].receipt.balance_transaction.fee) / 100;
                                        } else if (json.transactions[i].gateway == 'paypal') {
                                                transId = json.transactions[i].authorization;
                                                transFee = Number(json.transactions[0].receipt.balance_transaction.fee);
                                        } else if (json.transactions[i].gateway == 'manual') {
                                                transId = json.transactions[i].id;
                                        }

                                        document.getElementById('TransactionId' + id).innerHTML = transId;

                                        transFeeStr = '$' + parseFloat(transFee).toFixed(2);
                                        PayPalFees += transFee;
                                        document.getElementById('Fee' + id).innerHTML = transFeeStr;
                                }
                        }

                        --shippingsToProcess;
                }
        };

        xhttp.open("GET", configProxyUrl, true);
        xhttp.setRequestHeader("X-Proxy-Url", encodeURI(configShopifyUrl + configShopifyTransactionsUrl1 + id + configShopifyTransactionsUrl2));
        xhttp.send();
}

function getTrackingDetails() {
        var i;
        var x;

        trackingNumbersToProcess = 0;

        for (i = 0; i < trackingList.length; i++) {
                ++trackingNumbersToProcess;
                if (trackingList[i].substr(0,2) == '1Z') {
                        getUPSTracking(trackingList[i]);
                } else {
                        getUSPSTracking(trackingList[i]);
                }
        }

        function checkTrackingsToProcess() {
                if (trackingNumbersToProcess > 0) {
                        window.setTimeout(checkTrackingsToProcess, 100); // wait 100 milliseconds
                } else {
                        x = document.getElementById("results");
                        x.innerHTML = '<p><strong>Report Finished!</strong></p>';
                        setTimeout(function() {
                                x.className = x.className.replace(" w3-show", "");
                        }, 3000);
                }
        }

        checkTrackingsToProcess();
}

function getUSPSTracking(searchNumber) {
        var j;
        var str;
        var url;
        var trackingNumber;
        var summary;
        var detail;
        var deliveryDate;
        var createDate;
        var duration;
        var lastUpdate;
        var lastEvent;
        var footer;

        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
                if (this.readyState == 4 && this.status == 200) {
                        var obj = XMLparse(this.responseXML);

                        if (obj.TrackSummary === undefined) {
                                --trackingNumbersToProcess;
                                return;
                        }

                        trackingNumber = obj.ID;
                        summary = formatUSPSTrackingLine(obj.TrackSummary);
                        detail = '';
                        footer = '';
                        deliveryDate = '';
                        duration = '';
                        lastUpdate = summary.substr(8, 10);
                        lastEvent = obj.TrackSummary.Event;

                        if (document.getElementById('DeliveryStatus' + trackingNumber) === null) {
                                --trackingNumbersToProcess;
                                return;
                        }

                        if (obj.TrackDetail !== undefined && obj.TrackDetail.length > 0) {
                                for (j = 0; j < obj.TrackDetail.length; j++) {
                                        detail += formatUSPSTrackingLine(obj.TrackDetail[j]);
                                }

                                createDate = moment(obj.TrackDetail[(obj.TrackDetail.length - 1)].EventDate, "MMMM DD, YYYY").format('YYYY-MM-DD');
                                footer = 'Enroute since ' + createDate + ' (' + moment().diff(createDate, 'days') + ' days)';

                                if (summary.includes("Delivered")) {
                                        deliveryDate = summary.substr(8, 10);
                                        duration = moment(deliveryDate).diff(createDate, 'days');
                                        document.getElementById('DeliveryStatus' + trackingNumber).style.color = "green";
                                        footer = 'Delivered in ' + moment(deliveryDate).to(createDate, 'days');
                                } else if (moment().diff(lastUpdate, 'days') > 3) {
                                        document.getElementById('DeliveryStatus' + trackingNumber).style.color = "red";
                                }
                        }

                        document.getElementById('DeliveryStatus' + trackingNumber).innerHTML = lastEvent;
                        document.getElementById('DeliveryDays' + trackingNumber).innerHTML = duration;
                        document.getElementById('DeliveryDate' + trackingNumber).innerHTML = deliveryDate;

                        str = document.getElementById(trackingNumber).innerHTML;
                        if (!str.startsWith('<button')) {
                                document.getElementById(trackingNumber).innerHTML = '<button onclick="document.getElementById(\'mod' + trackingNumber + '\').style.display=\'block\'" class="w3-button w3-black">' + str + '</button>';

                                str = '  <div id="mod' + trackingNumber + '" class="w3-modal">';
                                str += '    <div class="w3-modal-content w3-card-4">';
                                str += '      <header class="w3-container w3-black"> ';
                                str += '        <span onclick="document.getElementById(\'mod' + trackingNumber + '\').style.display=\'none\'"';
                                str += '        class="w3-button w3-display-topright">&times;</span>';
                                str += '        <h3>' + trackingNumber + ' (USPS ' + getCarrierService("USPS", trackingNumber, false) + ')</h3>';
                                str += '      </header>';
                                str += '      <div class="w3-container">';
                                str += '         <table class="w3-table-all w3-small">';
                                str += '                        <tr>';
                                str += '                        <th>DATE</th>';
                                str += '                        <th>TIME</th>';
                                str += '                        <th>STATUS</th>';
                                str += '                        <th>LOCATION</th>';
                                str += '                        </tr>';
                                str += summary;
                                str += detail;
                                str += '         </table>';
                                str += '      </div>';
                                str += '      <footer class="w3-container w3-black">';
                                str += '        <p>' + document.getElementById('DeliveryAddress' + trackingNumber).innerHTML + ' - ' + footer + '</p>';
                                str += '      </footer>';
                                str += '    </div>';
                                str += '  </div>';

                                document.getElementById("modals").innerHTML += str;
                        }

                        --trackingNumbersToProcess;
                }
        };

        url = configUSPSUrl + '?API=TrackV2&XML=';
        url += '<TrackFieldRequest USERID="';
        url += configUSPSUserId;
        url += '">';
        url += '<TrackID ID="' + searchNumber + '"></TrackID>';
        url += '</TrackFieldRequest>';
        url = url.replace(/ /g, '%20');

        xhttp.open("GET", configProxyUrl, true);
        xhttp.setRequestHeader("X-Proxy-Url", encodeURI(url));
        xhttp.send();
}

function formatUSPSTrackingLine(t) {
        var str = '';

        if (t !== undefined) {
                str = '<tr>';

                str += '<td>' + moment(t.EventDate, "MMMM DD, YYYY").format('YYYY-MM-DD') + '</td>';

                str += '<td>';
                if (t.EventTime.length > 0) {
                        str += ' ' + moment(t.EventTime, "hh:mm a").format('HH:mm');
                }
                str += '</td>';

                str += '<td>' + t.Event + '</td>';

                str += '<td>';
                if (t.EventCity.length > 0) {
                        str += t.EventCity;
                        if (t.EventState.length > 0) {
                                str += ", " + t.EventState + ' ' + t.EventZIPCode;
                        }
                }
                str += '</td>';

                str += '</tr>';
        }

        return (str);
}

function getUPSTracking(trackingNumber) {
        var xhr = new XMLHttpRequest();

        var xml = '<?xml version="1.0"?>';
        xml += '<AccessRequest xml:lang="en-US">';
        xml += '<AccessLicenseNumber>' + configUPSAccessKey + '</AccessLicenseNumber>';
        xml += '<UserId>' + configUPSUsername + '</UserId>';
        xml += '<Password>' + configUPSPassword + '</Password>';
        xml += '</AccessRequest>';
        xml += '<?xml version="1.0"?>';
        xml += '<TrackRequest xml:lang="en-US">';
        xml += '<Request>';
        xml += '<TransactionReference>';
        xml += '<CustomerContext>' + 'MUNA Trading' + '</CustomerContext>';
        xml += '</TransactionReference>';
        xml += '<RequestAction>Track</RequestAction>';
        xml += '<RequestOption>1</RequestOption>';
        xml += '</Request>';
        xml += '<TrackingNumber>' + trackingNumber + '</TrackingNumber>';
        xml += '</TrackRequest>';

        xhr.onload = () => {
                var obj = XMLparse(xhr.responseXML);
                //document.getElementById("logging").innerHTML = JSON.stringify(obj);
                //window.alert(JSON.stringify(obj));
                //window.alert(vkbeautify.xml(xhr.responseText));

                        if (obj.Response.ResponseStatusDescription != 'Success') {
                                --trackingNumbersToProcess;
                                return;
                        }

                        trackingNumber = obj.Shipment.ShipmentIdentificationNumber;
                        summary = formatUPSTrackingLine(obj.Shipment.Package.Activity[0]);
                        detail = '';
                        footer = '';
                        deliveryDate = '';
                        duration = '';
                        lastUpdate = moment(obj.Shipment.Package.Activity[0].Status.Date, "YYYYMMDD").format('YYYY-MM-DD');
                        lastEvent = obj.Shipment.Package.Activity[0].Status.StatusType.Description;

                        if (document.getElementById('DeliveryStatus' + trackingNumber) === null) {
                                --trackingNumbersToProcess;
                                return;
                        }

                        if (obj.Shipment.Package.Activity !== undefined && obj.Shipment.Package.Activity.length > 0) {
                                for (j = 0; j < obj.Shipment.Package.Activity.length; j++) {
                                        detail += formatUPSTrackingLine(obj.Shipment.Package.Activity[j]);
                                }

                                createDate = moment(obj.Shipment.PickupDate, "YYYYMMDD").format('YYYY-MM-DD');
                                footer = 'Enroute since ' + createDate + ' (' + moment().diff(createDate, 'days') + ' days)';

                                if (obj.Shipment.Package.DeliveryIndicator == 'Y') {
                                        deliveryDate = moment(obj.Shipment.Package.DeliveryDate, "YYYYMMDD").format('YYYY-MM-DD');
                                        duration = moment(deliveryDate).diff(createDate, 'days');
                                        document.getElementById('DeliveryStatus' + trackingNumber).style.color = "green";
                                        footer = 'Delivered in ' + moment(deliveryDate).to(createDate, 'days');
                                } else if (moment().diff(lastUpdate, 'days') > 3) {
                                        document.getElementById('DeliveryStatus' + trackingNumber).style.color = "red";
                                }
                        }

                        document.getElementById('ShippedDate' + trackingNumber).innerHTML = createDate;
                        document.getElementById('DeliveryStatus' + trackingNumber).innerHTML = lastEvent;
                        document.getElementById('DeliveryDays' + trackingNumber).innerHTML = duration;
                        document.getElementById('DeliveryDate' + trackingNumber).innerHTML = deliveryDate;

                        str = document.getElementById(trackingNumber).innerHTML;
                        if (!str.startsWith('<button')) {
                                document.getElementById(trackingNumber).innerHTML = '<button onclick="document.getElementById(\'mod' + trackingNumber + '\').style.display=\'block\'" class="w3-button w3-black">' + str + '</button>';

                                str = '  <div id="mod' + trackingNumber + '" class="w3-modal">';
                                str += '    <div class="w3-modal-content w3-card-4">';
                                str += '      <header class="w3-container w3-black"> ';
                                str += '        <span onclick="document.getElementById(\'mod' + trackingNumber + '\').style.display=\'none\'"';
                                str += '        class="w3-button w3-display-topright">&times;</span>';
                                str += '        <h3>' + trackingNumber + ' (UPS ' + getCarrierService("UPS", trackingNumber, false) + ')</h3>';
                                str += '      </header>';
                                str += '      <div class="w3-container">';
                                str += '         <table class="w3-table-all w3-small">';
                                str += '                        <tr>';
                                str += '                        <th>DATE</th>';
                                str += '                        <th>TIME</th>';
                                str += '                        <th>STATUS</th>';
                                str += '                        <th>LOCATION</th>';
                                str += '                        </tr>';
                                str += summary;
                                str += detail;
                                str += '         </table>';
                                str += '      </div>';
                                str += '      <footer class="w3-container w3-black">';
                                str += '        <p>' + document.getElementById('DeliveryAddress' + trackingNumber).innerHTML + ' - ' + footer + '</p>';
                                str += '      </footer>';
                                str += '    </div>';
                                str += '  </div>';

                                document.getElementById("modals").innerHTML += str;
                        }

                        --trackingNumbersToProcess;
        };

        xhr.open('POST', configProxyUrl, true);
        xhr.setRequestHeader('Content-Type', 'text/xml');
        xhr.setRequestHeader('X-Proxy-URL', configUPSUrl);
        xhr.send(xml);
}

function formatUPSTrackingLine(t) {
        var str = '';

        if (t !== undefined) {
                str = '<tr>';

                str += '<td>' + moment(t.Date, "YYYYMMDD").format('YYYY-MM-DD') + '</td>';

                str += '<td>';
                if (t.Time.length > 0) {
                        str += ' ' + moment(t.Time, "HHmmss").format('HH:mm');
                }
                str += '</td>';

                str += '<td>' + t.Status.StatusType.Description + '</td>';

                str += '<td>';
                if (t.ActivityLocation.Address.City !== undefined) {
                        str += t.ActivityLocation.Address.City;
                        if (t.ActivityLocation.Address.StateProvinceCode !== undefined) {
                                str += ", " + t.ActivityLocation.Address.StateProvinceCode;
                        }
                }
                str += '</td>';

                str += '</tr>';
        }

        return (str);
}


function connected() {
        var x;

        eBayAuthTokenFlag = true;
        document.getElementById("connected").innerHTML += " (Connected)";

        x = document.getElementById("startButton");
        x.className = x.className.replace(" w3-red", " w3-black");

        x = document.getElementById("login");
        x.className = x.className.replace(" w3-show", "");

        x = document.getElementById("results");
        x.innerHTML = "";
        x.className = x.className.replace(" w3-show", "");
}

    </script>

</body>
</html>