Subversion Repositories munaweb

Rev

Rev 5 | Go to most recent revision | Details | Last modification | View Log | RSS feed

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