Subversion Repositories munaweb

Rev

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