Subversion Repositories munaweb

Rev

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

Rev Author Line No. Line
2 - 1
<!DOCTYPE html>
2
<html lang="en">
3
 
4
<head>
5
    <title>Relist on eBay</title>
6
    <meta charset="UTF-8">
7
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
8
    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
9
    <link rel="icon" href="favicon.ico" type="image/x-icon">
10
 
11
    <link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
12
    <link href="https://fonts.googleapis.com/css?family=Lato" rel="stylesheet">
13
    <link rel="stylesheet" href="css/style.css">
14
    <link rel="stylesheet" href="css/tablesorter.theme.blue.css">
15
    <script src="js/XMLWriter.js"></script>
16
    <script src="js/lodash.min.js"></script>
17
    <script src="js/XMLparse.js"></script>
18
    <script src="js/muna-tools.js"></script>
19
    <script src="js/jquery.js"></script>
20
    <script src="js/jquery.tablesorter.min.js"></script>
21
    <script src="js/jquery.tablesorter.widgets.js"></script>
22
    <script src="js/jquery.parser-input-select.js"></script>
23
</head>
24
 
25
<body onload="return initConfig();">
26
    <div class="w3-main">
27
        <div class="w3-container w3-padding w3-margin w3-card-4">
28
            <div class="w3-container w3-gray" style="height:100px">
29
                <img class="w3-image" src="images/MUNA%20-%20Logo%20100x100.png" alt="MUNA Trading Logo" style="height:100px">
30
                <p id="connected" class="w3-xxlarge w3-right">Relist on eBay
31
                    <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" />
32
                </p>
33
            </div>
34
 
35
            <div class="w3-row">
36
                <div>
37
                    <form id="searchForm" class="w3-container w3-light-grey w3-padding w3-small" onsubmit="return getListings();">
38
                        <div id="createForm" class="w3-container w3-card-2 w3-cell w3-padding">
39
                            <input id="includeExported" name="includeExported" class="w3-check" style="height:1em;vertical-align:super;" type="checkbox">
40
                            <label for="includeExported">Include Exported Listing</label>
41
                            <p>Listing Type:</p>
42
                            <input type="radio" name="ltype" id="ltFixed" checked /> Fixed Price<br>
43
                            <input type="radio" name="ltype" id="ltAuction" /> Auction<br>
44
                            <input type="radio" name="ltype" id="ltBoth" /> Both<br>
45
                            <input id="startButton" type="button" class="w3-btn w3-large w3-red w3-margin w3-round-large w3-ripple" onclick="getListings();" value="Start" />
46
                        </div>
47
                        <div id="relistForm" class="w3-container w3-card-2 w3-cell w3-padding w3-hide">
48
                            <input id="relistButton" type="button" class="w3-btn w3-large w3-black w3-margin w3-round-large w3-ripple" onclick="putListings();" value="Relist" />
49
                        </div>
50
                    </form>
51
                </div>
52
                <div id="progressBarDiv" class="w3-container w3-padding w3-margin w3-card-4 w3-hide">
53
                    <h2 id="progressBarHeader"></h2>
54
                    <div class="w3-light-grey">
55
                        <div id="progressBar" class="w3-container w3-green w3-center" style="width:0%">0%</div>
56
                    </div>
57
                </div>
58
                <div id="results" class="w3-container w3-padding w3-card-4 w3-hide"></div>
59
                <div id="logging" class="w3-container w3-padding"></div>
60
            </div>
61
        </div>
62
 
63
        <footer class="w3-container w3-center w3-border-top w3-margin">
64
            Copyright &#169; 2018 MUNA Trading. All rights reserved.
65
        </footer>
66
 
67
    </div>
68
 
69
    <script>
70
// Globals
71
var tableName = "unsoldTable";
72
var maxPagesToProcess = 0;
73
var pagesToProcess = 0;
74
var pagesProcessed = 0;
75
var listingsToFill = 0;
76
var maxListingsToFill = 0;
77
var listingsFilled = 0;
78
var listingsToRelist = 0;
79
var maxListingsToRelist = 0;
80
var listingsRelisted = 0;
81
var html = [];
82
 
83
// Initialize Configuration Variables
84
function initConfig() {
85
    eBayAuthToken = readCookie();
86
    if (eBayAuthToken.length > 0) {
87
        connected();
88
    }
89
 
90
    if (eBayAuthTokenFlag === false) {
91
        var x = document.getElementById("login");
92
        if (x.className.indexOf("w3-show") == -1) {
93
            x.className += " w3-show";
94
        }
95
    }
96
}
97
 
98
function connected() {
99
    var x;
100
 
101
    eBayAuthTokenFlag = true;
102
    document.getElementById("connected").innerHTML += " (Connected)";
103
 
104
    x = document.getElementById("startButton");
105
    x.className = x.className.replace(" w3-red", " w3-black");
106
 
107
    x = document.getElementById("login");
108
    x.className = x.className.replace(" w3-show", "");
109
 
110
    x = document.getElementById("results");
111
    x.innerHTML = "";
112
    x.className = x.className.replace(" w3-show", "");
113
    x.className = x.className.replace(" process-errors", "");
114
}
115
 
116
function requireNewLogin() {
117
    var x = document.getElementById("startButton");
118
    x.className = x.className.replace(" w3-black", " w3-red ");
119
}
120
 
121
function getListings() {
122
    var x;
123
 
124
    if (eBayAuthTokenFlag === false) {
125
        return;
126
    }
127
 
128
    document.getElementById("logging").innerHTML = '';
129
 
130
    x = document.getElementById("results");
131
    if (x.className.indexOf("w3-show") == -1) {
132
        x.className += " w3-show";
133
    }
134
    x.className = x.className.replace("process-errors", "");
135
    x.innerHTML = '<p><strong>Retrieving Unsold Listings...</strong></p>';
136
 
137
    initProgressBar('Get Unsold and Not Relisted Items (1/2)');
138
 
139
    tableStart();
140
    maxPagesToProcess = 1;
141
    pagesToProcess = 1;
142
    pagesProcessed = 0;
143
    eBaySearch(1);
144
 
145
    function checkpagesToProcess() {
146
        if (pagesToProcess > 0) {
147
            window.setTimeout(checkpagesToProcess, 100); // wait 100 milliseconds
148
        } else {
149
            tableEnd();
150
            endProgressBar();
151
            // fillListings(); is now in tableEnd()
152
        }
153
    }
154
 
155
    checkpagesToProcess();
156
}
157
 
158
function tableStart() {
159
    document.getElementById("logging").innerHTML = '';
160
    html = [];
161
 
162
    html.push('<h3>Unsold and Not Relisted</h3>');
163
    html.push('<p>Showing <span id="filtered-rows">0</span> of <span id="total-rows">0</span> / <span id="selected-rows">0</span> selected.</p>');
164
    html.push('<div class="w3-responsive">');
165
    html.push('<table id="' + tableName + '" class="tablesorter">');
166
    html.push('<thead>');
167
    html.push('<tr>');
168
 
169
    html.push(tableHeaderCheckbox(tableName));
170
    html.push(tableHeader('Image'));
171
    html.push(tableHeader('Title'));
172
    html.push(tableHeader('Item Id'));
173
    html.push(tableHeader('SKU'));
174
    html.push(tableHeader('Category'));
175
    html.push(tableHeader('Format'));
176
    html.push(tableHeader('Price'));
177
    html.push(tableHeader('Quantity'));
178
    html.push(tableHeader('Views'));
179
    html.push(tableHeader('Watchers'));
180
    html.push(tableHeader('End Date'));
181
    html.push(tableHeader('Note'));
182
 
183
    html.push('</tr>');
184
    html.push('</thead>');
185
    html.push('<tbody>');
186
}
187
 
188
function tableEntry(JsonObj) {
189
    var i;
190
    var image;
191
    var title;
192
    var itemId;
193
    var sku;
194
    var format;
195
    var price;
196
    var quantity;
197
    var views;
198
    var watchers;
199
    var endDate;
200
    var privateNote;
201
    var ebayNote;
202
    var relisted;
203
 
204
    for (i = 0; i < JsonObj.length; i++) {
205
        image = getJsonValue(JsonObj[i].PictureDetails).replace('http:', 'https:');
206
        title = getJsonValue(JsonObj[i].Title);
207
        itemId = getJsonValue(JsonObj[i].ItemID);
208
        sku = getJsonValue(JsonObj[i].SKU);
209
        format = getJsonValue(JsonObj[i].ListingType);
210
        if (format == 'Chinese') {
211
            format = 'Auction';
212
            price = getJsonValue(JsonObj[i].StartPrice.text);
213
        } else {
214
            format = 'Fixed Price';
215
            price = getJsonValue(JsonObj[i].BuyItNowPrice.text);
216
        }
217
        quantity = getJsonValue(JsonObj[i].QuantityAvailable);
218
        views = '';
219
        watchers = getJsonValue(JsonObj[i].WatchCount);
220
        watchers = (watchers.length === 0 ? "0" : watchers);
221
        endDate = getJsonValue(JsonObj[i].ListingDetails).substr(0, 10);
222
        privateNote = getJsonValue(JsonObj[i].PrivateNotes);
223
        ebayNote = getJsonValue(JsonObj[i].eBayNotes);
224
        relisted = getJsonValue(JsonObj[i].Relisted);
225
 
226
        if ((privateNote.startsWith("Exported to ") && !document.getElementById('includeExported').checked) || relisted == 'true' || privateNote.startsWith("Sold via ") || privateNote.startsWith("Relisted As New Item")) {
227
            continue;
228
        }
229
 
230
        if (format == 'Auction' && document.getElementById('ltFixed').checked) {
231
            continue;
232
        } else if (format == 'Fixed Price' && document.getElementById('ltAuction').checked) {
233
            continue;
234
        }
235
 
236
        html.push('<tr>');
237
 
238
        html.push(tableCellCheckbox());
239
        html.push(tableCell('<img class="w3-image" src="' + image + '" alt="Gallery Image" style="max-height:100px;max-width:100px;">'));
240
        html.push(tableCell(title));
241
        html.push(tableCell(itemId));
242
        html.push(tableCell(sku));
243
        html.push(tableCellLabel('Category' + itemId));
244
        html.push(tableCell(format));
245
        html.push(tableCell('$' + price));
246
        html.push(tableCell(quantity));
247
        html.push(tableCellLabel('Views' + itemId));
248
        html.push(tableCell(watchers));
249
        html.push(tableCell(endDate));
250
        html.push(tableCell(privateNote + ' ' + ebayNote));
251
 
252
        html.push('</tr>');
253
    }
254
}
255
 
256
function tableEnd() {
257
    html.push('</tbody>');
258
    html.push('</table>');
259
    html.push('</div>');
260
 
261
    document.getElementById("logging").innerHTML = html.join('');
262
 
263
    $(function() {
264
        $("#" + tableName).on('tablesorter-initialized', function() {
265
 
266
            // class name to add on tr when checkbox is checked
267
            var highlightClass = 'checked',
268
                // resort the table after the checkbox is modified?
269
                resort = true,
270
                $table = $(this),
271
                c = this.config,
272
                wo = c && c.widgetOptions,
273
                // include sticky header checkbox; if installed
274
                $sticky = c && wo.$sticky || '',
275
                doChecky = function(c, col) {
276
                    $table
277
                        .children('tbody')
278
                        .children('tr:visible')
279
                        .children('td:nth-child( ' + (parseInt(col, 10) + 1) + ' )')
280
                        .find('input[type=checkbox]')
281
                        .each(function() {
282
                            this.checked = c;
283
                            $(this).trigger('change');
284
                        });
285
                };
286
 
287
            $table
288
                .children('tbody')
289
                .on('change', 'input[type=checkbox]', function() {
290
                    // ignore change if updating all rows
291
                    if ($table[0].ignoreChange) {
292
                        return;
293
                    }
294
                    var $this = $(this);
295
                    $this.closest('tr').toggleClass(highlightClass, this.checked);
296
                    $this.trigger('updateCell', [$this.closest('td'), resort]);
297
 
298
                    // handle header
299
                    var rowCount = $('#' + tableName + ' tbody tr').length + $('#' + tableName + ' tbody tr:hidden').length;
300
                    var checkedCount = $('#' + tableName + ' tbody .checked').length;
301
                    var ua = window.navigator.userAgent;
302
                    if (checkedCount === 0) {
303
                        $table.add($sticky).find('thead input[type=checkbox]').prop('checked', false);
304
                        $table.add($sticky).find('thead input[type=checkbox]').prop('indeterminate', false);
305
                    } else if (checkedCount === rowCount) {
306
                        $table.add($sticky).find('thead input[type=checkbox]').prop('checked', true);
307
                        $table.add($sticky).find('thead input[type=checkbox]').prop('indeterminate', false);
308
                    } else {
309
                        $table.add($sticky).find('thead input[type=checkbox]').prop('checked', !(ua.indexOf('Trident/') > -1 || ua.indexOf('Edge/') > -1));
310
                        $table.add($sticky).find('thead input[type=checkbox]').prop('indeterminate', true);
311
                    }
312
                    $('#selected-rows').html(checkedCount);
313
                })
314
                .end()
315
                .add($sticky)
316
                .find('thead input[type=checkbox]')
317
                // Click on checkbox in table header to toggle all inputs
318
                .on('change', function() {
319
                    // prevent updateCell for every cell
320
                    $table[0].ignoreChange = true;
321
                    var c = this.checked,
322
                        col = $(this).closest('th').attr('data-column');
323
                    doChecky(c, col);
324
                    // update main & sticky header
325
 
326
                    $table.children('tbody').children('tr:visible').toggleClass(highlightClass, c);
327
                    // update all at once
328
                    $table[0].ignoreChange = false;
329
                    $table.trigger('update', [resort]);
330
 
331
                    // handle header
332
                    var rowCount = $('#' + tableName + ' tbody tr').length + $('#' + tableName + ' tbody tr:hidden').length;
333
                    var checkedCount = $('#' + tableName + ' tbody .checked').length;
334
                    var ua = window.navigator.userAgent;
335
                    if (checkedCount === 0) {
336
                        $table.add($sticky).find('th[data-column=' + col + '] input[type=checkbox]').prop('checked', false);
337
                        $table.add($sticky).find('th[data-column=' + col + '] input[type=checkbox]').prop('indeterminate', false);
338
                    } else if (checkedCount === rowCount) {
339
                        $table.add($sticky).find('th[data-column=' + col + '] input[type=checkbox]').prop('checked', true);
340
                        $table.add($sticky).find('th[data-column=' + col + '] input[type=checkbox]').prop('indeterminate', false);
341
                    } else {
342
                        $table.add($sticky).find('th[data-column=' + col + '] input[type=checkbox]').prop('checked', !(ua.indexOf('Trident/') > -1 || ua.indexOf('Edge/') > -1));
343
                        $table.add($sticky).find('th[data-column=' + col + '] input[type=checkbox]').prop('indeterminate', true);
344
                    }
345
                    $('#selected-rows').html(checkedCount);
346
                })
347
                .on('mouseup', function() {
348
                    return false;
349
                });
350
 
351
        });
352
 
353
        $("#" + tableName).tablesorter({
354
            theme: "blue",
355
            widgets: ["zebra", "stickyHeaders", "filter"],
356
            headers: {
357
                0: {
358
                    sorter: "checkbox"
359
                },
360
                1: {
361
                    sorter: false,
362
                    filter: false
363
                }
364
            },
365
            initialized: function() {
366
                fillListings();
367
            }
368
        });
369
 
370
        $("#" + tableName).bind('filterInit filterEnd', function(event, data) {
371
            $('#filtered-rows').html(data.filteredRows);
372
            $('#total-rows').html(data.totalRows);
373
        });
374
    });
375
}
376
 
377
function addNote(itemId) {
378
    var i;
379
    var xml;
380
 
381
    var xw = new XMLWriter('UTF-8', '1.0');
382
    var xhr = new XMLHttpRequest();
383
 
384
    if (!createAddXMLNote(xw, xhr, 'SetUserNotes', itemId)) {
385
        return;
386
    }
387
 
388
    xml = xw.flush();
389
    xw.close();
390
 
391
    xhr.onload = function() {
392
        var obj = XMLparse(xhr.responseXML);
393
 
394
        var returnCode = obj.Ack;
395
 
396
        var x = document.getElementById("results");
397
 
398
        if (returnCode == 'Success' || (returnCode == 'Warning' && obj.Errors.ErrorCode == '21917108')) {
399
            if (returnCode == 'Warning') {
400
                x.innerHTML += '<p>' + obj.CorrelationID + ': <strong>' + returnCode + '</strong></p>';
401
                x.innerHTML += "<p>" + obj.Errors.SeverityCode + " (" + obj.Errors.ErrorCode + "): " + escapeHtml(obj.Errors.LongMessage) + "</p>";
402
            }
403
        } else {
404
            x.className += " process-errors";
405
            x.innerHTML += '<p class="w3-red">' + obj.CorrelationID + ': <strong>' + returnCode + ':</strong></p>';
406
            var errors = obj.Errors;
407
            x.innerHTML += "<p>";
408
            if (errors.length > 0) {
409
                for (i = 0; i < errors.length; i++) {
410
                    x.innerHTML += errors[i].SeverityCode + " (" + errors[i].ErrorCode + "): " + escapeHtml(errors[i].LongMessage) + "<br/>";
411
                }
412
            } else {
413
                x.innerHTML += obj.Errors.SeverityCode + " (" + obj.Errors.ErrorCode + "): " + escapeHtml(obj.Errors.LongMessage) + "<br/>";
414
            }
415
            x.innerHTML += "</p>";
416
        }
417
 
418
        if (obj.Message) {
419
            x.innerHTML += obj.Message;
420
        }
421
 
422
        --listingsToRelist;
423
        ++listingsRelisted;
424
        updateProgressBar(maxListingsToRelist, listingsRelisted);
425
    };
426
 
427
    xhr.send(xml);
428
}
429
 
430
function createAddXMLNote(xw, xhr, callname, itemId) {
431
    var today = new Date();
432
    var todayYYYYMMDD = today.toISOString().slice(0, 10);
433
 
434
    xw.writeStartDocument();
435
    xw.writeStartElement(callname + "Request");
436
    xw.writeAttributeString('xmlns', 'urn:ebay:apis:eBLBaseComponents');
437
 
438
    xw.writeStartElement('RequesterCredentials');
439
    xw.writeElementString('eBayAuthToken', eBayAuthToken);
440
    xw.writeEndElement(); /* RequesterCredentials */
441
 
442
    xw.writeElementString('ItemID', itemId);
443
    xw.writeElementString('MessageID', itemId);
444
    xw.writeElementString('Action', 'AddOrUpdate');
445
    xw.writeElementString('NoteText', 'Relisted As New Item on ' + todayYYYYMMDD);
446
 
447
    xw.writeElementString('ErrorLanguage', 'en_US');
448
    xw.writeElementString('Version', configeBayTradingVersion);
449
    xw.writeElementString('WarningLevel', configWarningLevel);
450
 
451
    xw.writeEndElement(); /* xmlrequest */
452
    xw.writeEndDocument();
453
 
454
    xhr.open('POST', configProxyUrl, true);
455
    xhr.setRequestHeader('Content-Type', 'text/xml');
456
    xhr.setRequestHeader('X-EBAY-API-APP-NAME', configAppid);
457
    xhr.setRequestHeader('X-EBAY-API-COMPATIBILITY-LEVEL', configeBayTradingVersion);
458
    xhr.setRequestHeader('X-EBAY-API-CALL-NAME', callname);
459
    xhr.setRequestHeader('X-EBAY-API-SITEID', '0');
460
    xhr.setRequestHeader('X-EBAY-API-DEV-NAME', '');
461
    xhr.setRequestHeader('X-EBAY-API-CERT-NAME', '');
462
    xhr.setRequestHeader('X-Proxy-URL', configServiceEndpoint);
463
 
464
    return true;
465
}
466
 
467
function eBaySearch(pageNo) {
468
    var i;
469
    var xml;
470
 
471
    if (eBayAuthTokenFlag === false) {
472
        return;
473
    }
474
 
475
    var xw = new XMLWriter('UTF-8', '1.0');
476
    var xhr = new XMLHttpRequest();
477
 
478
    if (!createAddXMLSearch(xw, xhr, 'GetMyeBaySelling', pageNo)) {
479
        return;
480
    }
481
 
482
    xml = xw.flush();
483
    xw.close();
484
 
485
    xhr.onload = function() {
486
        var obj = XMLparse(xhr.responseXML);
487
 
488
        var returnCode = obj.Ack;
489
 
490
        var x = document.getElementById("results");
491
 
492
        if (returnCode == 'Success') {
493
            tableEntry(obj.UnsoldList.ItemArray);
494
 
495
            if (Number(obj.UnsoldList.PaginationResult.TotalNumberOfPages) > pageNo) {
496
                maxPagesToProcess = Number(obj.UnsoldList.PaginationResult.TotalNumberOfPages);
497
                ++pagesToProcess;
498
                eBaySearch(pageNo + 1);
499
            }
500
 
501
            updateProgressBar(maxPagesToProcess, pagesProcessed);
502
        } else {
503
            x.className += " process-errors";
504
            x.innerHTML += '<p class="w3-red">' + obj.CorrelationID + ': <strong>' + returnCode + ':</strong></p>';
505
            var errors = obj.Errors;
506
            x.innerHTML += "<p>";
507
            if (errors.length > 0) {
508
                for (i = 0; i < errors.length; i++) {
509
                    x.innerHTML += errors[i].SeverityCode + " (" + errors[i].ErrorCode + "): " + escapeHtml(errors[i].LongMessage) + "<br/>";
510
                }
511
            } else {
512
                x.innerHTML += obj.Errors.SeverityCode + " (" + obj.Errors.ErrorCode + "): " + escapeHtml(obj.Errors.LongMessage) + "<br/>";
513
            }
514
            x.innerHTML += "</p>";
515
        }
516
 
517
        --pagesToProcess;
518
        ++pagesProcessed;
519
 
520
        updateProgressBar(maxPagesToProcess, pagesProcessed);
521
    };
522
 
523
    xhr.send(xml);
524
}
525
 
526
function createAddXMLSearch(xw, xhr, callname, pageNo) {
527
 
528
    xw.writeStartDocument();
529
    xw.writeStartElement(callname + "Request");
530
    xw.writeAttributeString('xmlns', 'urn:ebay:apis:eBLBaseComponents');
531
 
532
    xw.writeStartElement('RequesterCredentials');
533
    xw.writeElementString('eBayAuthToken', eBayAuthToken);
534
    xw.writeEndElement(); /* RequesterCredentials */
535
 
536
    xw.writeElementString('DetailLevel', 'ReturnAll');
537
    xw.writeStartElement('ActiveList');
538
    xw.writeElementString('Include', 'false');
539
    xw.writeEndElement(); /* ActiveList */
540
    xw.writeStartElement('DeletedFromSoldList');
541
    xw.writeElementString('Include', 'false');
542
    xw.writeEndElement(); /* DeletedFromSoldList */
543
    xw.writeStartElement('DeletedFromUnsoldList');
544
    xw.writeElementString('Include', 'false');
545
    xw.writeEndElement(); /* DeletedFromUnsoldList */
546
    xw.writeStartElement('ScheduledList');
547
    xw.writeElementString('Include', 'false');
548
    xw.writeEndElement(); /* ScheduledList */
549
    xw.writeStartElement('SellingSummary');
550
    xw.writeElementString('Include', 'false');
551
    xw.writeEndElement(); /* SellingSummary */
552
    xw.writeStartElement('SoldList');
553
    xw.writeElementString('Include', 'false');
554
    xw.writeEndElement(); /* SoldList */
555
 
556
    xw.writeStartElement('UnsoldList');
557
    xw.writeElementString('Include', 'true');
558
    xw.writeElementString('IncludeNotes', 'true');
559
    xw.writeStartElement('Pagination');
560
    xw.writeElementString('EntriesPerPage', '200');
561
    xw.writeElementString('PageNumber', '' + pageNo);
562
    xw.writeEndElement(); /* Pagination*/
563
    xw.writeEndElement(); /* UnsoldList> */
564
    xw.writeElementString('OutputSelector', 'BuyItNowPrice');
565
    xw.writeElementString('OutputSelector', 'eBayNotes');
566
    xw.writeElementString('OutputSelector', 'ItemID');
567
    xw.writeElementString('OutputSelector', 'EndTime');
568
    xw.writeElementString('OutputSelector', 'ListingType');
569
    xw.writeElementString('OutputSelector', 'PrivateNotes');
570
    xw.writeElementString('OutputSelector', 'QuantityAvailable');
571
    xw.writeElementString('OutputSelector', 'PictureDetails');
572
    xw.writeElementString('OutputSelector', 'Relisted');
573
    xw.writeElementString('OutputSelector', 'SKU');
574
    xw.writeElementString('OutputSelector', 'Title');
575
    xw.writeElementString('OutputSelector', 'StartPrice');
576
    xw.writeElementString('OutputSelector', 'WatchCount');
577
    xw.writeElementString('OutputSelector', 'PaginationResult');
578
 
579
    xw.writeElementString('ErrorLanguage', 'en_US');
580
    xw.writeElementString('Version', configeBayTradingVersion);
581
    xw.writeElementString('WarningLevel', configWarningLevel);
582
 
583
    xw.writeEndElement(); /* xmlrequest */
584
    xw.writeEndDocument();
585
 
586
    xhr.open('POST', configProxyUrl, true);
587
    xhr.setRequestHeader('Content-Type', 'text/xml');
588
    xhr.setRequestHeader('X-EBAY-API-APP-NAME', configAppid);
589
    xhr.setRequestHeader('X-EBAY-API-COMPATIBILITY-LEVEL', configeBayTradingVersion);
590
    xhr.setRequestHeader('X-EBAY-API-CALL-NAME', callname);
591
    xhr.setRequestHeader('X-EBAY-API-SITEID', '0');
592
    xhr.setRequestHeader('X-EBAY-API-DEV-NAME', '');
593
    xhr.setRequestHeader('X-EBAY-API-CERT-NAME', '');
594
    xhr.setRequestHeader('X-Proxy-URL', configServiceEndpoint);
595
 
596
    return true;
597
}
598
 
599
function fillListings() {
600
    var i;
601
    var x = document.getElementById(tableName);
602
 
603
    listingsToFill = 0;
604
    maxListingsToFill = 0;
605
    listingsFilled = 0;
606
 
607
    initProgressBar('Fill Listing Information (2/2)');
608
 
609
    for (i = 2; i < x.rows.length; i++) {
610
        ++listingsToFill;
611
        ++maxListingsToFill;
612
        fillListing(x.rows[i].cells[3].innerHTML);
613
    }
614
 
615
    function checkListingsToFill() {
616
        if (listingsToFill > 0) {
617
            window.setTimeout(checkListingsToFill, 100); // wait 100 milliseconds
618
        } else {
619
            $("#" + tableName).trigger("update");
620
 
621
            endProgressBar();
622
 
623
            document.getElementById("createForm").className += " w3-hide";
624
            document.getElementById("relistForm").className += " w3-show";
625
 
626
            x = document.getElementById("results");
627
            x.innerHTML += '<p><strong>Report Finished!</strong></p>';
628
            if (!x.className.includes("process-errors")) {
629
                setTimeout(function() {
630
                    x.className = x.className.replace(" w3-show", "");
631
                }, 3000);
632
            }
633
        }
634
    }
635
 
636
    checkListingsToFill();
637
}
638
 
639
function fillListing(itemId) {
640
    var i;
641
    var xml;
642
 
643
    var xw = new XMLWriter('UTF-8', '1.0');
644
    var xhr = new XMLHttpRequest();
645
 
646
    if (!createFillXMLSearch(xw, xhr, 'GetItem', itemId)) {
647
        return;
648
    }
649
 
650
    xml = xw.flush();
651
    xw.close();
652
 
653
    xhr.onload = function() {
654
        var obj = XMLparse(xhr.responseXML);
655
 
656
        var returnCode = obj.Ack;
657
 
658
        var x = document.getElementById("results");
659
 
660
        if (returnCode == 'Success') {
661
            var itemId = getJsonValue(obj.Item.ItemID);
662
            document.getElementById("Views" + itemId).innerHTML = getJsonValue(obj.Item.HitCount);
663
            document.getElementById("Category" + itemId).innerHTML = getJsonValue(obj.Item.PrimaryCategory);
664
        } else {
665
            x.className += " process-errors";
666
            x.innerHTML += '<p class="w3-red">' + obj.CorrelationID + ': <strong>' + returnCode + ':</strong></p>';
667
 
668
            var errors = obj.Errors;
669
            x.innerHTML += "<p>";
670
            if (errors.length > 0) {
671
                for (i = 0; i < errors.length; i++) {
672
                    x.innerHTML += errors[i].SeverityCode + " (" + errors[i].ErrorCode + "): " + escapeHtml(errors[i].LongMessage) + "<br/>";
673
                }
674
            } else {
675
                x.innerHTML += obj.Errors.SeverityCode + " (" + obj.Errors.ErrorCode + "): " + escapeHtml(obj.Errors.LongMessage) + "<br/>";
676
            }
677
            x.innerHTML += "</p>";
678
        }
679
 
680
        --listingsToFill;
681
        ++listingsFilled;
682
        updateProgressBar(maxListingsToFill, listingsFilled);
683
    };
684
 
685
    xhr.send(xml);
686
}
687
 
688
function createFillXMLSearch(xw, xhr, callname, itemId) {
689
    xw.writeStartDocument();
690
    xw.writeStartElement(callname + "Request");
691
    xw.writeAttributeString('xmlns', 'urn:ebay:apis:eBLBaseComponents');
692
 
693
    xw.writeStartElement('RequesterCredentials');
694
    xw.writeElementString('eBayAuthToken', eBayAuthToken);
695
    xw.writeEndElement(); /* RequesterCredentials */
696
 
697
    xw.writeElementString('ItemID', itemId);
698
    xw.writeElementString('MessageID', itemId);
699
    xw.writeElementString('OutputSelector', 'ItemID');
700
    xw.writeElementString('OutputSelector', 'HitCount');
701
    xw.writeElementString('OutputSelector', 'CategoryName');
702
 
703
    xw.writeElementString('ErrorLanguage', 'en_US');
704
    xw.writeElementString('Version', configeBayTradingVersion);
705
    xw.writeElementString('WarningLevel', configWarningLevel);
706
 
707
    xw.writeEndElement(); /* xmlrequest */
708
    xw.writeEndDocument();
709
 
710
    xhr.open('POST', configProxyUrl, true);
711
    xhr.setRequestHeader('Content-Type', 'text/xml');
712
    xhr.setRequestHeader('X-EBAY-API-APP-NAME', configAppid);
713
    xhr.setRequestHeader('X-EBAY-API-COMPATIBILITY-LEVEL', configeBayTradingVersion);
714
    xhr.setRequestHeader('X-EBAY-API-CALL-NAME', callname);
715
    xhr.setRequestHeader('X-EBAY-API-SITEID', '0');
716
    xhr.setRequestHeader('X-EBAY-API-DEV-NAME', '');
717
    xhr.setRequestHeader('X-EBAY-API-CERT-NAME', '');
718
    xhr.setRequestHeader('X-Proxy-URL', configServiceEndpoint);
719
 
720
    return true;
721
}
722
 
723
function putListings() {
724
    var table = document.getElementById(tableName);
725
 
726
    listingsToRelist = 0;
727
    maxListingsToRelist = 0;
728
    listingsRelisted = 0;
729
 
730
    initProgressBar("Relist selected Items");
731
 
732
    var x = document.getElementById("results");
733
    x.innerHTML = '';
734
    x.className = x.className.replace("process-errors", "");
735
    if (x.className.indexOf("w3-show") == -1) {
736
        x.className += " w3-show";
737
    }
738
 
739
    for (var i = 2; i < table.rows.length; i++) {
740
        if (table.rows[i].cells[0].children[0].checked) {
741
            ++listingsToRelist;
742
            ++maxListingsToRelist;
743
 
744
            if (Number(table.rows[i].cells[10].innerHTML) > 0 || table.rows[i].cells[12].innerHTML.startsWith("Exported to ")) { // watchers or previously exported
745
                relistItem(table.rows[i].cells[3].innerHTML, (table.rows[i].cells[3].innerHTML == 'Auction'));
746
            } else {
747
                handleAddItem(table.rows[i].cells[3].innerHTML);
748
            }
749
 
750
            table.deleteRow(i--);
751
        }
752
    }
753
 
754
    function checkListingsToRelist() {
755
        if (listingsToRelist > 0) {
756
            window.setTimeout(checkListingsToRelist, 100); // wait 100 milliseconds
757
        } else {
758
            $("#" + tableName).trigger("update");
759
            $('#selected-rows').html('0');
760
            $("#" + tableName).find('thead input[type=checkbox]').prop('checked', false);
761
            $("#" + tableName).find('thead input[type=checkbox]').prop('indeterminate', false);
762
 
763
            endProgressBar();
764
 
765
            x = document.getElementById("results");
766
            x.innerHTML += '<p><strong>Relist Finished!</strong></p>';
767
            if (!x.className.includes("process-errors")) {
768
                setTimeout(function() {
769
                    x.className = x.className.replace(" w3-show", "");
770
                }, 3000);
771
            }
772
        }
773
    }
774
 
775
    checkListingsToRelist();
776
}
777
 
778
function relistItem(itemId, auctionFlag) {
779
    var i;
780
    var xml;
781
 
782
    var xw = new XMLWriter('UTF-8', '1.0');
783
    var xhr = new XMLHttpRequest();
784
 
785
    if (!createRelistXML(xw, xhr, (auctionFlag ? 'RelistItem' : "RelistFixedPriceItem"), itemId)) {
786
        return;
787
    }
788
 
789
    xml = xw.flush();
790
    xw.close();
791
 
792
    xhr.onload = function() {
793
        var obj = XMLparse(xhr.responseXML);
794
 
795
        var returnCode = obj.Ack;
796
 
797
        var x = document.getElementById("results");
798
 
799
        if (returnCode != 'Success') {
800
            x.className += " process-errors";
801
            x.innerHTML += '<p class="w3-red">' + obj.CorrelationID + ': <strong>' + returnCode + ':</strong></p>';
802
            var errors = obj.Errors;
803
            x.innerHTML += "<p>";
804
            if (errors.length > 0) {
805
                for (i = 0; i < errors.length; i++) {
806
                    x.innerHTML += errors[i].SeverityCode + " (" + errors[i].ErrorCode + "): " + escapeHtml(errors[i].LongMessage) + "<br/>";
807
                }
808
            } else {
809
                x.innerHTML += obj.Errors.SeverityCode + " (" + obj.Errors.ErrorCode + "): " + escapeHtml(obj.Errors.LongMessage) + "<br/>";
810
            }
811
            x.innerHTML += "</p>";
812
        }
813
 
814
        --listingsToRelist;
815
        ++listingsRelisted;
816
        updateProgressBar(maxListingsToRelist, listingsRelisted);
817
    };
818
 
819
    xhr.send(xml);
820
}
821
 
822
function createRelistXML(xw, xhr, callname, itemId) {
823
    xw.writeStartDocument();
824
    xw.writeStartElement(callname + "Request");
825
    xw.writeAttributeString('xmlns', 'urn:ebay:apis:eBLBaseComponents');
826
 
827
    xw.writeStartElement('RequesterCredentials');
828
    xw.writeElementString('eBayAuthToken', eBayAuthToken);
829
    xw.writeEndElement(); /* RequesterCredentials */
830
 
831
    xw.writeStartElement('Item');
832
    xw.writeElementString('ItemID', itemId);
833
    xw.writeEndElement(); /* Item */
834
 
835
    xw.writeElementString('ErrorLanguage', 'en_US');
836
    xw.writeElementString('Version', configeBayTradingVersion);
837
    xw.writeElementString('WarningLevel', configWarningLevel);
838
    xw.writeElementString('MessageID', itemId);
839
 
840
    xw.writeEndElement(); /* xmlrequest */
841
    xw.writeEndDocument();
842
 
843
    xhr.open('POST', configProxyUrl, true);
844
    xhr.setRequestHeader('Content-Type', 'text/xml');
845
    xhr.setRequestHeader('X-EBAY-API-APP-NAME', configAppid);
846
    xhr.setRequestHeader('X-EBAY-API-COMPATIBILITY-LEVEL', configeBayTradingVersion);
847
    xhr.setRequestHeader('X-EBAY-API-CALL-NAME', callname);
848
    xhr.setRequestHeader('X-EBAY-API-SITEID', '0');
849
    xhr.setRequestHeader('X-EBAY-API-DEV-NAME', '');
850
    xhr.setRequestHeader('X-EBAY-API-CERT-NAME', '');
851
    xhr.setRequestHeader('X-Proxy-URL', configServiceEndpoint);
852
 
853
    return true;
854
}
855
 
856
function handleAddItem(itemId) {
857
    var i;
858
    var xml;
859
 
860
    var xw = new XMLWriter('UTF-8', '1.0');
861
    var xhr = new XMLHttpRequest();
862
 
863
    if (!createGetItemAllXML(xw, xhr, "GetItem", itemId)) {
864
        return;
865
    }
866
 
867
    xml = xw.flush();
868
    xw.close();
869
 
870
    xhr.onload = function() {
871
        var obj = XMLparse(xhr.responseXML);
872
 
873
        var returnCode = obj.Ack;
874
 
875
        var x = document.getElementById("results");
876
 
877
        if (returnCode == 'Success') {
878
            var st = xhr.responseText.indexOf('<Item>') + 6;
879
            var len = xhr.responseText.indexOf('</Item>') - st;
880
            addItem(itemId, xhr.responseText.substr(st, len));
881
        } else {
882
            x.className += " process-errors";
883
            x.innerHTML += '<p class="w3-red">' + obj.CorrelationID + ': <strong>' + returnCode + ':</strong></p>';
884
 
885
            var errors = obj.Errors;
886
            x.innerHTML += "<p>";
887
            if (errors.length > 0) {
888
                for (i = 0; i < errors.length; i++) {
889
                    x.innerHTML += errors[i].SeverityCode + " (" + errors[i].ErrorCode + "): " + escapeHtml(errors[i].LongMessage) + "<br/>";
890
                }
891
            } else {
892
                x.innerHTML += obj.Errors.SeverityCode + " (" + obj.Errors.ErrorCode + "): " + escapeHtml(obj.Errors.LongMessage) + "<br/>";
893
            }
894
            x.innerHTML += "</p>";
895
 
896
            --listingsToRelist;
897
            ++listingsRelisted;
898
            updateProgressBar(maxListingsToRelist, listingsRelisted);
899
        }
900
    };
901
 
902
    xhr.send(xml);
903
}
904
 
905
function createGetItemAllXML(xw, xhr, callname, itemId) {
906
    xw.writeStartDocument();
907
    xw.writeStartElement(callname + "Request");
908
    xw.writeAttributeString('xmlns', 'urn:ebay:apis:eBLBaseComponents');
909
 
910
    xw.writeStartElement('RequesterCredentials');
911
    xw.writeElementString('eBayAuthToken', eBayAuthToken);
912
    xw.writeEndElement(); /* RequesterCredentials */
913
 
914
    xw.writeElementString('ItemID', itemId);
915
    xw.writeElementString('MessageID', itemId);
916
    xw.writeElementString('DetailLevel', 'ReturnAll');
917
    xw.writeElementString('IncludeItemSpecifics', 'true');
918
    xw.writeElementString('IncludeTaxTable', 'true');
919
    xw.writeElementString('OutputSelector', 'AutoPay');
920
    xw.writeElementString('OutputSelector', 'BuyItNowPrice');
921
    xw.writeElementString('OutputSelector', 'BuyerResponsibleForShipping');
922
    xw.writeElementString('OutputSelector', 'ConditionDescription');
923
    xw.writeElementString('OutputSelector', 'ConditionDisplayName');
924
    xw.writeElementString('OutputSelector', 'ConditionID');
925
    xw.writeElementString('OutputSelector', 'Country');
926
    xw.writeElementString('OutputSelector', 'Currency');
927
    xw.writeElementString('OutputSelector', 'Description');
928
    xw.writeElementString('OutputSelector', 'DispatchTimeMax');
929
    xw.writeElementString('OutputSelector', 'HitCounter');
930
    xw.writeElementString('OutputSelector', 'ItemSpecifics');
931
    xw.writeElementString('OutputSelector', 'ListingDetails');
932
    xw.writeElementString('OutputSelector', 'ListingDuration');
933
    xw.writeElementString('OutputSelector', 'ListingType');
934
    xw.writeElementString('OutputSelector', 'Location');
935
    xw.writeElementString('OutputSelector', 'PayPalEmailAddress');
936
    xw.writeElementString('OutputSelector', 'PaymentMethods');
937
    xw.writeElementString('OutputSelector', 'PictureDetails');
938
    xw.writeElementString('OutputSelector', 'PostalCode');
939
    xw.writeElementString('OutputSelector', 'PrimaryCategory');
940
    xw.writeElementString('OutputSelector', 'ProductListingDetails');
941
    xw.writeElementString('OutputSelector', 'Quantity');
942
    xw.writeElementString('OutputSelector', 'ReservePrice');
943
    xw.writeElementString('OutputSelector', 'ReturnPolicy');
944
    xw.writeElementString('OutputSelector', 'SellerProfiles');
945
    xw.writeElementString('OutputSelector', 'SKU');
946
    xw.writeElementString('OutputSelector', 'ShippingDetails');
947
    xw.writeElementString('OutputSelector', 'ShippingPackageDetails');
948
    xw.writeElementString('OutputSelector', 'Site');
949
    xw.writeElementString('OutputSelector', 'StartPrice');
950
    xw.writeElementString('OutputSelector', 'Storefront');
951
    xw.writeElementString('OutputSelector', 'Title');
952
    xw.writeElementString('OutputSelector', 'UseTaxTable');
953
    xw.writeElementString('ErrorLanguage', 'en_US');
954
    xw.writeElementString('Version', configeBayTradingVersion);
955
    xw.writeElementString('WarningLevel', configWarningLevel);
956
 
957
    xw.writeEndElement(); /* xmlrequest */
958
    xw.writeEndDocument();
959
 
960
    xhr.open('POST', configProxyUrl, true);
961
    xhr.setRequestHeader('Content-Type', 'text/xml');
962
    xhr.setRequestHeader('X-EBAY-API-APP-NAME', configAppid);
963
    xhr.setRequestHeader('X-EBAY-API-COMPATIBILITY-LEVEL', configeBayTradingVersion);
964
    xhr.setRequestHeader('X-EBAY-API-CALL-NAME', callname);
965
    xhr.setRequestHeader('X-EBAY-API-SITEID', '0');
966
    xhr.setRequestHeader('X-EBAY-API-DEV-NAME', '');
967
    xhr.setRequestHeader('X-EBAY-API-CERT-NAME', '');
968
    xhr.setRequestHeader('X-Proxy-URL', configServiceEndpoint);
969
 
970
    return true;
971
}
972
 
973
function addItem(itemId, itemXml) {
974
    var i;
975
 
976
    var xhr = new XMLHttpRequest();
977
    var xml = createAddItemXML(xhr, "AddItem", itemId, itemXml);
978
 
979
    xhr.onload = function() {
980
        var obj = XMLparse(xhr.responseXML);
981
 
982
        var returnCode = obj.Ack;
983
        var newItemId = obj.ItemID;
984
        var correlationID = obj.CorrelationID;
985
 
986
        var x = document.getElementById("results");
987
 
988
        if (returnCode == 'Success' || returnCode == 'Warning') {
989
            addNote(itemId);
990
            correlationID = newItemId;
991
        }
992
 
993
        if (returnCode != 'Success') {
994
            x.className += " process-errors";
995
            x.innerHTML += '<p class="w3-red">' + correlationID + ': <strong>' + returnCode + ':</strong></p>';
996
            var errors = obj.Errors;
997
            x.innerHTML += "<p>";
998
            if (errors.length > 0) {
999
                for (i = 0; i < errors.length; i++) {
1000
                    x.innerHTML += errors[i].SeverityCode + " (" + errors[i].ErrorCode + "): " + escapeHtml(errors[i].LongMessage) + "<br/>";
1001
                }
1002
            } else {
1003
                x.innerHTML += obj.Errors.SeverityCode + " (" + obj.Errors.ErrorCode + "): " + escapeHtml(obj.Errors.LongMessage) + "<br/>";
1004
            }
1005
            x.innerHTML += "</p>";
1006
            --listingsToRelist;
1007
            ++listingsRelisted;
1008
            updateProgressBar(maxListingsToRelist, listingsRelisted);
1009
        }
1010
    };
1011
 
1012
    xhr.send(xml);
1013
 
1014
}
1015
 
1016
function createAddItemXML(xhr, callname, itemId, itemXml) {
1017
    var n1, n2;
1018
 
1019
    if (itemXml.contains('<ShippingType>Flat</ShippingType>')) {
1020
        n1 = itemXml.indexOf('<CalculatedShippingRate>');
1021
        if (n1 > 0) {
1022
            n2 = itemXml.indexOf('</CalculatedShippingRate>') + 25;
1023
        }
1024
        str = itemXml.substr(0, n1) + itemXml.substr(n2);
1025
        itemXml = str;
1026
    }
1027
 
1028
    if (itemXml.contains('<ShippingPackage>None</ShippingPackage>')) {
1029
        n1 = itemXml.indexOf('<ShippingPackageDetails>');
1030
        if (n1 > 0) {
1031
            n2 = itemXml.indexOf('</ShippingPackageDetails>') + 25;
1032
        }
1033
        str = itemXml.substr(0, n1) + itemXml.substr(n2);
1034
        itemXml = str;
1035
    }
1036
 
1037
    var xml = '<?xml version="1.0" encoding="utf-8"?>';
1038
    xml += '<' + callname + 'Request xmlns="urn:ebay:apis:eBLBaseComponents">';
1039
    xml += '<RequesterCredentials><eBayAuthToken>' + eBayAuthToken + '</eBayAuthToken></RequesterCredentials>';
1040
    xml += '<ErrorLanguage>en_US</ErrorLanguage>';
1041
    xml += '<WarningLevel>' + configWarningLevel + '</WarningLevel>';
1042
    xml += '<MessageID>' + itemId + '</MessageID>';
1043
    xml += '<Item>';
1044
    xml += itemXml;
1045
    xml += '<UseTaxTable>true</UseTaxTable>';
1046
    xml += '</Item>';
1047
    xml += '</' + callname + 'Request>';
1048
 
1049
    xhr.open('POST', configProxyUrl, true);
1050
    xhr.setRequestHeader('Content-Type', 'text/xml');
1051
    xhr.setRequestHeader('X-EBAY-API-APP-NAME', configAppid);
1052
    xhr.setRequestHeader('X-EBAY-API-COMPATIBILITY-LEVEL', configeBayTradingVersion);
1053
    xhr.setRequestHeader('X-EBAY-API-CALL-NAME', callname);
1054
    xhr.setRequestHeader('X-EBAY-API-SITEID', '0');
1055
    xhr.setRequestHeader('X-EBAY-API-DEV-NAME', '');
1056
    xhr.setRequestHeader('X-EBAY-API-CERT-NAME', '');
1057
    xhr.setRequestHeader('X-Proxy-URL', configServiceEndpoint);
1058
 
1059
    return xml;
1060
}
1061
 
1062
    </script>
1063
 
1064
</body>
1065
</html>