Subversion Repositories munaweb

Rev

Rev 19 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
<!DOCTYPE html>
2
<html lang="en">
3
 
4
<head>
5
    <title>eBay Listing Upload</title>
6
    <meta charset="UTF-8">
7
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
8
    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
9
    <link rel="icon" href="favicon.ico" type="image/x-icon">
10
 
30 - 11
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
12
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
13
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
14
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
15
    <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
16
    <script src="js/XMLWriter.js"></script>
17
    <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>
18
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>
19
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.23/moment-timezone-with-data-2012-2022.min.js"></script>
2 - 20
    <link rel="stylesheet" href="css/style.css">
21
    <script src="js/muna-tools.js"></script>
22
</head>
23
 
24
<body onload="return initConfig();">
30 - 25
    <div">
26
        <div>
27
            <div class="container-fluid bg-secondary">
28
                <div class="clearfix">
29
                    <img class="img-fluid float-right" src="images/MUNA%20-%20Logo%20100x100.png" alt="MUNA Trading Logo" />
30
                    <h1 id="connected">eBay Listing Upload
31
                    <input id="login" type="button" class="btn bg-success mb-2 w3-hide" onclick="eBayLogin();" value="Login" /></h1>
32
                </div>
2 - 33
            </div>
34
 
30 - 35
            <div class="border col">
2 - 36
                <div>
30 - 37
                    <form id="searchForm" class="container-fluid bg-light">
38
                        <div class="clearfix">
39
                            <input id="startButton" type="button" class="btn btn-danger float-left" onclick="uploadListings();" value="Start" />
40
                            <p id="numberOfListings" class="float-right"></p>
2 - 41
                        </div>
42
                    </form>
43
                </div>
30 - 44
                <div class="modal" id="progressBarDiv">
45
                    <div class="modal-dialog">
46
                        <div class="modal-content">
47
                            <div class="modal-header">
48
                                <h4 id="progressBarHeader"></h4>
49
                            </div>
50
                            <div class="modal-body">
51
                                <div class="progress">
52
                                    <div id="progressBar" class="progress-bar" style="width:0%">0%</div>
53
                                </div>
54
                            </div>
55
                        </div>
2 - 56
                    </div>
57
                </div>
30 - 58
                <div id="results" class="border bg-info w3-hide"></div>
59
                <div id="logging"></div>
2 - 60
            </div>
61
        </div>
62
 
30 - 63
        <footer class="container-fluid text-center border border-bottom-0 border-left-0 border-right-0">
17 - 64
            <div w3-include-html="php/footer.php"></div>
2 - 65
        </footer>
66
 
67
    </div>
68
 
69
    <script>
70
 
71
// Globals
72
var configGetRecommendations = true;
73
var xml = '';
74
var listItems = [];
75
 
76
// Initialize Configuration Variables
77
function initConfig() {
6 - 78
    var i;
79
    var j;
2 - 80
 
6 - 81
    eBayAuthToken = readCookie();
82
    if (eBayAuthToken.length > 0) {
83
        connected();
84
    }
2 - 85
 
6 - 86
    if (eBayAuthTokenFlag === false) {
87
        var x = document.getElementById("login");
88
        if (x.className.indexOf("w3-show") == -1) {
89
            x.className += " w3-show";
90
        }
91
    }
2 - 92
 
6 - 93
    var xhttp = new XMLHttpRequest();
94
    xhttp.onreadystatechange = function() {
95
        if (this.readyState == 4 && this.status == 200) {
96
            //window.alert(this.responseText);
2 - 97
 
6 - 98
            var parser = new DOMParser();
99
            var htmlDoc = parser.parseFromString(this.responseText, "text/html");
100
            var x = htmlDoc.getElementsByTagName("a");
2 - 101
 
6 - 102
            listItems = [];
2 - 103
 
6 - 104
            for (i = 0, j = 0; i < x.length; i++) {
105
                if (htmlDoc.getElementsByTagName("a")[i].innerHTML.endsWith(".xml")) {
106
                    var n = htmlDoc.getElementsByTagName("a")[i].innerHTML.lastIndexOf(".xml");
107
                    listItems[j] = htmlDoc.getElementsByTagName("a")[i].innerHTML.substr(0, n);
108
                    j++;
109
                }
110
            }
2 - 111
 
6 - 112
            document.getElementById('numberOfListings').innerHTML = j + ' Listing(s) Ready for eBay Upload';
113
        }
114
    };
2 - 115
 
6 - 116
    xhttp.open("GET", configListingUrl + '?t=' + Math.random(), true);
117
    xhttp.send();
2 - 118
}
119
 
120
function requireNewLogin() {
6 - 121
    // dummy
2 - 122
}
123
 
124
function uploadListings() {
6 - 125
    var i = 0;
2 - 126
 
6 - 127
    document.getElementById("logging").innerHTML = '';
128
    document.getElementById("results").innerHTML = '';
2 - 129
 
6 - 130
    initProgressBar('Uploading Listings');
2 - 131
 
6 - 132
    function for1() {
133
        updateProgressBar(listItems.length, i);
134
        uploadListing(listItems[i]);
135
        for2();
136
    }
2 - 137
 
6 - 138
    function for2() {
139
        if (i == listItems.length) {
140
            endProgressBar();
141
            return false;
142
        }
2 - 143
 
6 - 144
        setTimeout(function() {
145
            i++;
146
            document.getElementById("logging").innerHTML = 'Uploading No. ' + i + '/' + listItems.length;
147
            for1();
148
        }, 500);
149
    }
2 - 150
 
6 - 151
    for1();
2 - 152
}
153
 
154
function uploadListing(name) {
6 - 155
    var xhttp;
2 - 156
 
6 - 157
    xhttp = new XMLHttpRequest();
2 - 158
 
6 - 159
    xhttp.onreadystatechange = function() {
160
        if (this.readyState == 4 && this.status == 200) {
161
            //			verifyListing(name, xhttp.responseText);
162
            submitListing(name, xhttp.responseText);
163
        }
164
    };
2 - 165
 
6 - 166
    xhttp.open("GET", configListingUrl + name + '.xml', true);
167
    xhttp.send();
2 - 168
}
169
 
170
function verifyListing(name, itemXML) {
6 - 171
    var i;
172
    var authErrorFlag = false;
2 - 173
 
6 - 174
    if (eBayAuthTokenFlag === false) {
175
        return;
176
    }
2 - 177
 
6 - 178
    var xw = new XMLWriter('UTF-8', '1.0');
179
    var xhr = new XMLHttpRequest();
2 - 180
 
6 - 181
    createAddXML(xw, xhr, 'VerifyAddItemRequest', 'VerifyAddItem', itemXML);
2 - 182
 
6 - 183
    xml = xw.flush();
184
    xw.close();
2 - 185
 
6 - 186
    xhr.onload = function() {
12 - 187
        var jsonObj = XMLparse(xhr.responseXML, false);
188
        var obj = jsonObj.VerifyAddItemResponse;
6 - 189
        var returnCode = obj.Ack;
19 - 190
        var str;
2 - 191
 
6 - 192
        var x = document.getElementById("results");
193
        if (x.className.indexOf("w3-show") == -1) {
194
            x.className += " w3-show";
195
        }
2 - 196
 
6 - 197
        if (returnCode == 'Success' || (returnCode == 'Warning' && obj.Errors.ErrorCode == '21917108')) {
19 - 198
            str = '<p><strong>' + returnCode + ' (' + name + ')</strong></p>';
2 - 199
 
6 - 200
            if (returnCode == 'Warning') {
19 - 201
                str += "<p>" + obj.Errors.SeverityCode + " (" + obj.Errors.ErrorCode + "): " + escapeHtml(obj.Errors.LongMessage) + "</p>";
6 - 202
            }
12 - 203
            var fees = getJsonArray(obj.Fees.Fee);
19 - 204
            str += "<p>";
6 - 205
            for (i = 0; i < fees.length; i++) {
206
                if (fees[i].Fee.text !== "0.0") {
19 - 207
                    str += fees[i].Name + ": $" + Number(fees[i].Fee.text).toFixed(2) + "<br/>";
6 - 208
                }
209
            }
19 - 210
            str += "</p>";
2 - 211
 
6 - 212
            if (obj.DiscountReason) {
19 - 213
                str += "<p>Discount Reason: " + obj.DiscountReason + "</p>";
6 - 214
            }
2 - 215
 
6 - 216
            var recommendations = getJsonArray(obj.ListingRecommendations);
217
            for (i = 0; i < recommendations.length; i++) {
19 - 218
                str += decode(recommendations[i]);
6 - 219
            }
19 - 220
 
221
            x.innerHTML += str;
6 - 222
        } else {
30 - 223
            str = '<p class="text-danger"><strong>' + returnCode + ' (' + name + ')</strong></p>';
2 - 224
 
6 - 225
            var errors = getJsonArray(obj.Errors);
19 - 226
            str += "<p>";
6 - 227
            for (i = 0; i < errors.length; i++) {
19 - 228
                str += errors[i].SeverityCode + " (" + errors[i].ErrorCode + "): " + escapeHtml(errors[i].LongMessage) + "<br/>";
6 - 229
                if (errors[i].LongMessage.includes('Auth')) {
230
                    authErrorFlag = true;
231
                }
232
            }
19 - 233
            str += "</p>";
2 - 234
 
6 - 235
            if (obj.DuplicateInvocationDetails) {
19 - 236
                str += '<p>Duplicate Invocation Id ' + obj.DuplicateInvocationDetails.DuplicateInvocationID + ' Tracking Id' + obj.DuplicateInvocationDetails.InvocationTrackingID + ' Status ' + obj.DuplicateInvocationDetails.Status + '</p>';
6 - 237
            }
2 - 238
 
19 - 239
            x.innerHTML += str;
240
 
6 - 241
            if (authErrorFlag === true) {
242
                eBayAuthTokenFlag = false;
243
                x = document.getElementById("login");
244
                if (x.className.indexOf("w3-show") == -1) {
245
                    x.className += " w3-show";
246
                }
247
            }
248
        }
2 - 249
 
6 - 250
        if (obj.Message) {
251
            x.innerHTML += obj.Message;
252
        }
253
    };
2 - 254
 
6 - 255
    xhr.send(xml);
2 - 256
}
257
 
258
function decode(recommendation) {
6 - 259
    var str = "<p>";
260
    var i;
2 - 261
 
6 - 262
    str += recommendation.Code + " (" + recommendation.Type + "/" + recommendation.Group + ") for '" + recommendation.FieldName;
263
    if (recommendation.Value) {
264
        str += "': " + recommendation.Value;
265
    }
2 - 266
 
6 - 267
    if (recommendation.Message) {
268
        str += "<br/>" + recommendation.Message;
269
    }
2 - 270
 
6 - 271
    var metadata = recommendation.Metadata;
272
    if (metadata) {
273
        if (metadata.length > 0) {
274
            for (i = 0; i < metadata.length; i++) {
275
                if (metadata[i].Name != "correlationId" &&
276
                    metadata[i].Name != "currency" &&
277
                    metadata[i].Name != "similarItems") {
278
                    str += "<br/>" + metadata[i].Name + " = " + metadata[i].Value;
279
                }
280
            }
281
        } else {
282
            if (metadata.Name != "correlationId" &&
283
                metadata.Name != "currency" &&
284
                metadata.Name != "similarItems") {
285
                str += "<br/>" + metadata.Name + " = " + metadata.Value;
286
            }
287
        }
288
    }
2 - 289
 
6 - 290
    str += "</p>";
2 - 291
 
6 - 292
    return str;
2 - 293
}
294
 
295
function submitListing(name, itemXML) {
6 - 296
    var i;
297
    var authErrorFlag = false;
2 - 298
 
30 - 299
    if (document.getElementById("startButton").className.indexOf("btn-dark") == -1) {
6 - 300
        return;
301
    }
2 - 302
 
6 - 303
    var xw = new XMLWriter('UTF-8', '1.0');
304
    var xhr = new XMLHttpRequest();
2 - 305
 
6 - 306
    createAddXML(xw, xhr, 'AddItemRequest', 'AddItem', itemXML);
2 - 307
 
6 - 308
    xml = xw.flush();
309
    xw.close();
2 - 310
 
6 - 311
    xhr.onload = function() {
12 - 312
        var jsonObj = XMLparse(xhr.responseXML, false);
313
        var obj = jsonObj.AddItemResponse;
6 - 314
        var returnCode = obj.Ack;
19 - 315
        var str;
2 - 316
 
6 - 317
        var x = document.getElementById("results");
318
        if (x.className.indexOf("w3-show") == -1) {
319
            x.className += " w3-show";
320
        }
2 - 321
 
6 - 322
        if (returnCode == 'Success' || (returnCode == 'Warning' && obj.Errors.ErrorCode == '21917108')) {
19 - 323
            str = '<p><strong>' + returnCode + '</strong>, Item Id <a href="https://www.ebay.com/itm/' + obj.ItemID + '" target="_blank">' + obj.ItemID + '</a> (' + name + ')</p>';
6 - 324
            if (returnCode == 'Warning') {
19 - 325
                str += "<p>" + obj.Errors.SeverityCode + " (" + obj.Errors.ErrorCode + "): " + escapeHtml(obj.Errors.LongMessage) + "</p>";
6 - 326
            }
2 - 327
 
12 - 328
            var fees = getJsonArray(obj.Fees.Fee);
19 - 329
            str += "<p>";
6 - 330
            for (i = 0; i < fees.length; i++) {
331
                if (fees[i].Fee.text !== "0.0") {
19 - 332
                    str += fees[i].Name + ": $" + Number(fees[i].Fee.text).toFixed(2) + "<br/>";
6 - 333
                }
334
            }
19 - 335
            str += "</p>";
2 - 336
 
6 - 337
            if (obj.DiscountReason) {
19 - 338
                str += "<p>Discount Reason: " + obj.DiscountReason + "</p>";
6 - 339
            }
19 - 340
 
341
            x.innerHTML += str;
6 - 342
        } else {
30 - 343
            str = '<p class="text-danger"><strong>' + returnCode + ' (' + name + ')</strong></p>';
2 - 344
 
6 - 345
            var errors = getJsonArray(obj.Errors);
19 - 346
            str += "<p>";
6 - 347
            for (i = 0; i < errors.length; i++) {
19 - 348
                str += errors[i].SeverityCode + " (" + errors[i].ErrorCode + "): " + escapeHtml(errors[i].LongMessage) + "<br/>";
6 - 349
                if (errors[i].LongMessage.includes('Auth')) {
350
                    authErrorFlag = true;
351
                }
352
            }
19 - 353
            str += "</p>";
2 - 354
 
6 - 355
            if (obj.DuplicateInvocationDetails) {
19 - 356
                str += '<p>Duplicate Invocation Id ' + obj.DuplicateInvocationDetails.DuplicateInvocationID + ' Tracking Id' + obj.DuplicateInvocationDetails.InvocationTrackingID + ' Status ' + obj.DuplicateInvocationDetails.Status + '</p>';
6 - 357
            }
2 - 358
 
19 - 359
            x.innerHTML += str;
360
 
6 - 361
            if (authErrorFlag === true) {
362
                eBayAuthTokenFlag = false;
363
                x = document.getElementById("login");
364
                if (x.className.indexOf("w3-show") == -1) {
365
                    x.className += " w3-show";
366
                }
367
            }
368
        }
369
    };
2 - 370
 
6 - 371
    xhr.send(xml);
2 - 372
}
373
 
374
function createAddXML(xw, xhr, xmlrequest, callname, itemXML) {
6 - 375
    xw.writeStartDocument();
376
    xw.writeStartElement(xmlrequest);
377
    xw.writeAttributeString('xmlns', 'urn:ebay:apis:eBLBaseComponents');
2 - 378
 
6 - 379
    xw.writeStartElement('RequesterCredentials');
380
    xw.writeElementString('eBayAuthToken', eBayAuthToken);
381
    xw.writeEndElement(); /* RequesterCredentials */
2 - 382
 
6 - 383
    xw.writeXML(itemXML);
2 - 384
 
6 - 385
    xw.writeElementString('ErrorLanguage', 'en_US');
386
    xw.writeElementString('Version', configeBayTradingVersion);
387
    xw.writeElementString('WarningLevel', configWarningLevel);
2 - 388
 
6 - 389
    xw.writeEndElement(); /* xmlrequest */
390
    xw.writeEndDocument();
2 - 391
 
6 - 392
    xhr.open('POST', configProxyUrl, true);
393
    xhr.setRequestHeader('Content-Type', 'text/xml');
394
    xhr.setRequestHeader('X-EBAY-API-APP-NAME', configAppid);
395
    xhr.setRequestHeader('X-EBAY-API-COMPATIBILITY-LEVEL', configeBayTradingVersion);
396
    xhr.setRequestHeader('X-EBAY-API-CALL-NAME', callname);
397
    xhr.setRequestHeader('X-EBAY-API-SITEID', '0');
398
    xhr.setRequestHeader('X-EBAY-API-DEV-NAME', '');
399
    xhr.setRequestHeader('X-EBAY-API-CERT-NAME', '');
400
    xhr.setRequestHeader('X-Proxy-URL', configServiceEndpoint);
2 - 401
}
402
 
403
function clearStatusWindows() {
6 - 404
    var x = document.getElementById("results");
405
    x.innerHTML = "";
406
    x.className = x.className.replace(" w3-show", "");
2 - 407
}
408
 
409
function connected() {
6 - 410
    var x;
2 - 411
 
6 - 412
    eBayAuthTokenFlag = true;
413
    document.getElementById("connected").innerHTML += " (Connected)";
2 - 414
 
6 - 415
    x = document.getElementById("startButton");
30 - 416
    x.className = x.className.replace(" btn-danger", " btn-dark");
2 - 417
 
6 - 418
    x = document.getElementById("login");
419
    x.className = x.className.replace(" w3-show", "");
2 - 420
}
421
 
422
    </script>
17 - 423
    <script>includeHTML();</script>
2 - 424
 
425
</body>
426
</html>