Subversion Repositories munaweb

Rev

Rev 5 | Rev 10 | 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>eBay Listing Promotion</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
    <script src="js/jquery.js"></script>
12
    <link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
13
    <link href="https://fonts.googleapis.com/css?family=Lato" rel="stylesheet">
14
    <link rel="stylesheet" href="css/style.css">
15
    <script src="js/XMLWriter.js"></script>
16
    <script src="js/lodash.min.js"></script>
17
    <script src="js/XMLparse.js"></script>
18
    <script src="js/moment.js"></script>
19
    <script src="js/moment-timezone.js"></script>
20
    <script src="js/muna-tools.js"></script>
21
</head>
22
 
23
<body onload="return initConfig();">
24
    <div class="w3-main">
25
        <div class="w3-container w3-padding w3-margin w3-card-4">
26
            <div class="w3-container w3-gray" style="height:100px">
27
                <img class="w3-image" src="images/MUNA%20-%20Logo%20100x100.png" alt="MUNA Trading Logo" style="height:100px">
28
                <p id="connected" class="w3-xxlarge w3-right">eBay Listing Promotion
29
                    <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" />
30
               	</p>
31
            </div>
32
 
33
            <div class="w3-row">
34
                <div>
35
                    <form id="searchForm" class="w3-container w3-light-grey w3-padding w3-small" onsubmit="return getListingsForPromote();">
36
                        <div class="w3-container w3-card-2 w3-cell w3-padding">
37
                            <input id="promoteButton" type="button" class="w3-btn w3-large w3-red w3-margin w3-round-large w3-ripple" onclick="getListingsForPromote();" value="Promote" />
38
                        </div>
39
                    </form>
40
                </div>
41
                <div id="progressBarDiv" class="w3-container w3-padding w3-margin w3-card-4 w3-hide">
42
                  	<h2 id="progressBarHeader"></h2>
43
                    <div class="w3-light-grey">
44
                        <div id="progressBar" class="w3-container w3-green w3-center" style="width:0%">0%</div>
45
                    </div>
46
                </div>
47
                <div id="results" class="w3-container w3-padding w3-card-4 w3-hide"></div>
48
                <div id="logging" class="w3-container w3-padding"></div>
49
            </div>
50
        </div>
51
 
52
        <footer class="w3-container w3-center w3-border-top w3-margin">
53
            Copyright &#169; 2018 MUNA Trading. All rights reserved.
54
        </footer>
55
 
56
    </div>
57
 
58
    <script>
59
 
60
// Config
61
var configCampaignId = '10477406018';
6 - 62
var accessToken = '';
63
var refreshToken = '';
2 - 64
 
65
var pagesToProcess = 0;
66
var pagesProcessed = 0;
67
var html = [];
68
 
69
// Initialize Configuration Variables
70
function initConfig() {
71
    eBayAuthToken = readCookie();
72
    if (eBayAuthToken.length > 0) {
73
        connected();
74
    }
75
 
76
    if (eBayAuthTokenFlag === false) {
77
        var x = document.getElementById("login");
78
        if (x.className.indexOf("w3-show") == -1) {
79
            x.className += " w3-show";
80
        }
81
    }
6 - 82
 
3 - 83
    getOAuthToken();
2 - 84
}
85
 
86
function requireNewLogin() {
87
    // dummy
88
}
89
 
90
function connected() {
91
    var x;
92
 
93
    eBayAuthTokenFlag = true;
94
    document.getElementById("connected").innerHTML += " (Connected)";
95
 
96
    x = document.getElementById("promoteButton");
97
    x.className = x.className.replace(" w3-red", " w3-black");
98
 
99
    x = document.getElementById("login");
100
    x.className = x.className.replace(" w3-show", "");
101
 
102
    x = document.getElementById("results");
103
    x.innerHTML = "";
104
    x.className = x.className.replace(" w3-show", "");
105
    x.className = x.className.replace("process-errors", "");
106
}
107
 
108
function getListingsForPromote() {
109
    var x;
110
 
111
    if (eBayAuthTokenFlag === false) {
112
        return;
113
    }
114
 
6 - 115
//    if (accessToken.length < 1) {
116
//        getOAuthToken();
117
//    } else if (refreshToken.length > 0) {
118
//        refreshApplicationToken(refreshToken);
119
//    }
120
 
121
    if (accessToken.length < 1) {
2 - 122
        return;
123
    }
124
 
125
    document.getElementById("logging").innerHTML = '';
126
 
127
    x = document.getElementById("results");
128
    if (x.className.indexOf("w3-show") == -1) {
129
        x.className += " w3-show";
130
    }
131
    x.innerHTML = '<p><strong>Retrieving Listings...</strong></p>';
132
    x.className = x.className.replace("process-errors", "");
133
 
134
    pagesToProcess = 1;
135
    pagesProcessed = 0;
136
    initProgressBar("Retrieving Listings...");
137
    eBaySearch(1);
138
 
139
    function checkpagesToProcess() {
140
        if (pagesToProcess > 0) {
141
            window.setTimeout(checkpagesToProcess, 300); // wait 100 milliseconds
142
        } else {
143
            endProgressBar();
144
            processCurrentAds();
145
        }
146
    }
147
 
148
    checkpagesToProcess();
149
}
150
 
151
function processCurrentAds() {
152
    adsToRead = 1;
153
    getCurrentAds(1);
154
 
155
    function checkAdsToRead() {
156
        if (adsToRead > 0) {
157
            window.setTimeout(checkAdsToRead, 100); // wait 100 milliseconds
158
        } else {
159
            updateAds();
160
        }
161
    }
162
 
163
    checkAdsToRead();
164
}
165
 
166
function updateAds() {
167
    var i = 1;
168
    var pt = document.getElementById("promoteTable");
169
    var x;
170
    var updateList = [];
171
    var addList = [];
172
    var entry;
173
    var maxAds = 500;
174
 
175
    adsToUpdate = 0;
176
 
177
    for (i = 1; i < pt.rows.length; i++) {
178
        if (pt.rows[i].cells[1].innerHTML != pt.rows[i].cells[3].innerHTML) {
179
            entry = '{"bidPercentage":"' + pt.rows[i].cells[1].innerHTML + '","listingId" : "' + pt.rows[i].cells[0].innerHTML + '"}';
180
            if (pt.rows[i].cells[2].innerHTML.length > 0) {
181
                if (updateList.indexOf(entry) == -1) {
182
                    updateList.push(entry);
183
                }
184
            } else {
185
                if (addList.indexOf(entry) == -1) {
186
                    addList.push(entry);
187
                }
188
            }
189
        }
190
    }
191
 
192
    for (i = 0; (i * maxAds) < updateList.length; i++) {
193
        ++adsToUpdate;
194
        updateAd(1, updateList.slice(i * maxAds, (i + 1) * maxAds));
195
    }
196
 
197
    for (i = 0; (i * maxAds) < addList.length; i++) {
198
        ++adsToUpdate;
199
        updateAd(0, addList.slice(i * maxAds, (i + 1) * maxAds));
200
    }
201
 
202
    function checkAdsToUpdate() {
203
        if (adsToUpdate > 0) {
204
            window.setTimeout(checkAdsToUpdate, 100); // wait 100 milliseconds
205
        } else {
206
            x = document.getElementById("results");
207
            x.innerHTML += '<p><strong>Report Finished!</strong></p>';
208
            if (!x.className.includes("process-errors")) {
209
                setTimeout(function() {
210
                    x.className = x.className.replace(" w3-show", "");
211
                }, 3000);
212
            }
213
        }
214
    }
215
 
216
    checkAdsToUpdate();
217
}
218
 
219
function getCurrentAds(pageNumber) {
220
    var i;
221
    var response;
222
    var limit = 500;
223
    url = configeBayAdCampaign;
224
    url += configCampaignId;
225
    url += '/ad?';
226
    url += 'offset=';
227
    url += (pageNumber - 1) * limit;
228
    url += '&limit=';
229
    url += limit;
230
 
231
    var xhttp = new XMLHttpRequest();
232
 
233
    xhttp.onreadystatechange = function() {
234
        if (this.readyState == 4) {
235
            if (this.status == 200) {
236
                response = JSON.parse(this.responseText);
237
 
238
                for (i = 0; i < response.ads.length; i++) {
239
                    itemId = response.ads[i].listingId;
240
                    if (document.getElementById('AdId' + itemId) !== null) {
241
                        document.getElementById('AdId' + itemId).innerHTML = response.ads[i].adId;
242
                        document.getElementById('CurrentRate' + itemId).innerHTML = response.ads[i].bidPercentage;
243
                    }
244
                }
245
 
246
                if (Number(response.total) > (pageNumber * limit)) {
247
                    ++adsToRead;
248
                    document.getElementById("results").innerHTML += '<p><strong>Retrieving Ads (' + pageNumber + '/' + Number((response.total / limit) + 1).toFixed(0) + ')</strong></p>';
249
                    getCurrentAds(pageNumber + 1);
250
                }
251
            }
252
 
253
            --adsToRead;
254
        }
255
    };
256
 
257
    xhttp.open("GET", configProxyUrl, true);
258
    xhttp.setRequestHeader("X-Proxy-Url", encodeURI(url));
6 - 259
    xhttp.setRequestHeader('X-Authorization', 'Bearer ' + accessToken);
2 - 260
    xhttp.send();
261
}
262
 
263
function updateAd(flag, list) {
264
    var xhttp;
265
    var json;
6 - 266
    var i, j;
2 - 267
    var obj;
6 - 268
    var errors;
2 - 269
 
270
    if (list.length === 0) {
271
        return;
272
    }
273
 
274
    json = '{"requests":[' + list.join(',') + ']}';
275
 
276
    if (flag) {
277
        url = configeBayAdCampaign;
278
        url += configCampaignId;
279
        url += '/bulk_update_ads_bid_by_listing_id';
280
 
281
        xhttp = new XMLHttpRequest();
282
 
283
        xhttp.onreadystatechange = function() {
284
            if (this.readyState == 4) {
285
                obj = JSON.parse(this.responseText);
286
                if (this.status == 200 || this.status == 207) {
287
                    for (i = 0; i < obj.responses.length; i++) {
288
                        if (Number(obj.responses[i].statusCode) == 200) {
289
                            document.getElementById('AdId' + obj.responses[i].listingId).innerHTML = obj.responses[i].adId;
290
                            document.getElementById('UpdateStatus' + obj.responses[i].listingId).innerHTML = 'Updated';
291
                            document.getElementById('UpdateStatus' + obj.responses[i].listingId).style.color = 'green';
292
                        } else {
293
                            document.getElementById('UpdateStatus' + obj.responses[i].listingId).innerHTML = 'Update Failed (';
6 - 294
                            errors = getJsonArray(obj.responses[i].errors);
295
                            if (errors[0] !== undefined) {
296
                                document.getElementById('UpdateStatus' + obj.responses[i].listingId).innerHTML += errors[0].message;
2 - 297
                            } else if (obj.responses[i].statusCode !== undefined) {
6 - 298
                                document.getElementById('UpdateStatus' + obj.responses[i].listingId).innerHTML += " " + obj.responses[i].statusCode;
2 - 299
                            }
300
                            document.getElementById('UpdateStatus' + obj.responses[i].listingId).innerHTML += ')';
301
                            document.getElementById('UpdateStatus' + obj.responses[i].listingId).style.color = 'red';
302
                        }
303
                    }
304
                } else {
305
                    var x = document.getElementById("results");
306
                    x.className += " process-errors";
307
                    x.innerHTML += '<p class="w3-red">Bulk Update Ads: <strong>' + this.status + '</strong></p>';
308
                }
309
 
310
                --adsToRead;
311
            }
312
        };
313
 
314
        xhttp.open("POST", configProxyUrl, true);
315
        xhttp.setRequestHeader("X-Proxy-Url", encodeURI(url));
6 - 316
        xhttp.setRequestHeader('X-Authorization', 'Bearer ' + accessToken);
2 - 317
        xhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
318
        xhttp.send(json);
319
 
320
    } else {
321
        url = configeBayAdCampaign;
322
        url += configCampaignId;
323
        url += '/bulk_create_ads_by_listing_id';
324
 
325
        xhttp = new XMLHttpRequest();
326
 
327
        xhttp.onreadystatechange = function() {
328
            if (this.readyState == 4) {
329
                obj = JSON.parse(this.responseText);
330
                if (this.status == 200 || this.status == 207) {
331
                    for (i = 0; i < obj.responses.length; i++) {
332
                        if (Number(obj.responses[i].statusCode) == 201) {
333
                            document.getElementById('AdId' + obj.responses[i].listingId).innerHTML = obj.responses[i].adId;
334
                            document.getElementById('UpdateStatus' + obj.responses[i].listingId).innerHTML = 'Added';
335
                            document.getElementById('UpdateStatus' + obj.responses[i].listingId).style.color = 'green';
336
                        } else {
6 - 337
                            errors = getJsonArray(obj.responses[i].errors);
338
                            document.getElementById('UpdateStatus' + obj.responses[i].listingId).innerHTML = 'Add Failed (' + getJsonValue(errors[0].message) + ')';
2 - 339
                            document.getElementById('UpdateStatus' + obj.responses[i].listingId).style.color = 'red';
340
                        }
341
                    }
342
                } else {
343
                    var x = document.getElementById("results");
344
                    x.className += " process-errors";
345
                    x.innerHTML += '<p class="w3-red">Bulk Create Ads: <strong>' + this.status + '</strong></p>';
346
                }
347
 
348
                --adsToRead;
349
            }
350
        };
351
 
352
        xhttp.open("POST", configProxyUrl, true);
353
        xhttp.setRequestHeader("X-Proxy-Url", encodeURI(url));
6 - 354
        xhttp.setRequestHeader('X-Authorization', 'Bearer ' + accessToken);
2 - 355
        xhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
356
        xhttp.send(json);
357
    }
358
 
359
    --adsToUpdate;
360
}
361
 
362
 
363
// Build an HTML table to display search results
364
function eBaySearch(pageNo) {
365
    var i;
366
    var xml;
367
 
368
    if (eBayAuthTokenFlag === false) {
369
        return;
370
    }
371
 
372
    var xw = new XMLWriter('UTF-8', '1.0');
373
    var xhr = new XMLHttpRequest();
374
 
375
    if (!createAddXMLSearch(xw, xhr, 'GetSellerList', pageNo)) {
376
        return;
377
    }
378
 
379
    xml = xw.flush();
380
    xw.close();
381
 
382
    xhr.onload = function() {
383
        var obj = XMLparse(xhr.responseXML);
384
        var returnCode = obj.Ack;
385
 
386
        var x = document.getElementById("results");
387
 
388
        if (returnCode == 'Success') {
389
            createTable(obj.ItemArray, pageNo, Number(obj.PaginationResult.TotalNumberOfPages));
390
 
391
            if (Number(obj.PaginationResult.TotalNumberOfPages) > pageNo) {
392
                maxPagesToProcess = Number(obj.PaginationResult.TotalNumberOfPages);
393
                ++pagesToProcess;
394
                eBaySearch(pageNo + 1);
395
            }
396
 
397
            updateProgressBar(maxPagesToProcess, pagesProcessed);
398
        } else {
399
            x.className += " process-errors";
400
            x.innerHTML += '<p class="w3-red"><strong>' + returnCode + ':</strong></p>';
6 - 401
            var errors = getJsonArray(obj.Errors);
2 - 402
            x.innerHTML += "<p>";
6 - 403
            for (i = 0; i < errors.length; i++) {
404
                x.innerHTML += errors[i].SeverityCode + " (" + errors[i].ErrorCode + "): " + escapeHtml(errors[i].LongMessage) + "<br/>";
2 - 405
            }
406
            x.innerHTML += "</p>";
407
        }
408
 
409
        --pagesToProcess;
410
        ++pagesProcessed;
411
 
412
        document.getElementById("logging").innerHTML = html.join('');
413
        updateProgressBar(maxPagesToProcess, pagesProcessed);
414
    };
415
 
416
    xhr.send(xml);
417
}
418
 
419
function createAddXMLSearch(xw, xhr, callname, pageNo) {
420
    var startDate = moment(moment().subtract(31, "days").format('YYYY-MM-DD') + " 00:00:00", "YYYY-MM-DD HH:mm:ss").tz("UTC").toISOString();
421
    var todayDate = moment(moment().format('YYYY-MM-DD') + " 23:59:59", "YYYY-MM-DD HH:mm:ss").tz("UTC").toISOString();
422
    var endDate = moment(moment().add(31, "days").format('YYYY-MM-DD') + " 00:00:00", "YYYY-MM-DD HH:mm:ss").tz("UTC").toISOString();
423
 
424
    xw.writeStartDocument();
425
    xw.writeStartElement(callname + "Request");
426
    xw.writeAttributeString('xmlns', 'urn:ebay:apis:eBLBaseComponents');
427
 
428
    xw.writeStartElement('RequesterCredentials');
429
    xw.writeElementString('eBayAuthToken', eBayAuthToken);
430
    xw.writeEndElement(); /* RequesterCredentials */
431
 
432
    xw.writeElementString('GranularityLevel', 'Coarse');
433
    xw.writeElementString('StartTimeFrom', startDate);
434
    xw.writeElementString('StartTimeTo', todayDate);
435
    xw.writeElementString('EndTimeFrom', todayDate);
436
    xw.writeElementString('EndTimeTo', endDate);
437
    xw.writeElementString('OutputSelector', 'ItemArray.Item.ItemID');
438
    xw.writeElementString('OutputSelector', 'ItemArray.Item.ListingType');
439
    xw.writeElementString('OutputSelector', 'PaginationResult');
440
    xw.writeElementString('OutputSelector', 'ItemArray.Item.SellingStatus.ConvertedCurrentPrice');
441
    xw.writeStartElement('Pagination');
442
    xw.writeElementString('EntriesPerPage', '200');
443
    xw.writeElementString('PageNumber', '' + pageNo);
444
    xw.writeEndElement(); /* Pagination*/
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 createTable(obj, pageNumber, totalPages) {
467
    var currentPrice;
468
    var adRate;
469
 
470
    if (pageNumber == 1) {
471
        document.getElementById("logging").innerHTML = '';
472
        html = [];
473
 
474
        html.push('<h3>Listing Promotions</h3>');
475
        html.push('<div class="w3-responsive">');
476
        html.push('<table id="promoteTable" class="w3-table-all w3-hoverable">');
477
        html.push('<thead>');
478
        html.push('<tr>');
479
 
480
        html.push(tableHeader('Item ID'));
481
        html.push(tableHeader('New Ad Rate'));
482
        html.push(tableHeader('Ad Id'));
483
        html.push(tableHeader('Current Ad Rate'));
484
        html.push(tableHeader('Create/Update Status'));
485
 
486
        html.push('</tr>');
487
        html.push('</thead>');
488
        html.push('<tbody>');
489
    }
490
 
491
    for (var entry = 0; entry < obj.length; entry++) {
492
 
493
        if (obj[entry].ListingType == 'Chinese') {
494
            continue;
495
        }
496
 
497
        currentPrice = Number(obj[entry].SellingStatus.text).toFixed(2);
498
 
499
        // minimum ad rate is 1.00%
500
        if (currentPrice > 99.99) {
501
            adRate = 2.0;
502
        } else if (currentPrice > 49.99) {
503
            adRate = 2.7;
504
        } else if (currentPrice > 29.99) {
505
            adRate = 3.0;
506
        } else if (currentPrice > 19.99) {
507
            adRate = 3.2;
508
        } else if (currentPrice > 14.99) {
509
            adRate = 3.5;
510
        } else if (currentPrice > 9.99) {
511
            adRate = 3.7;
512
        } else if (currentPrice > 4.99) {
513
            adRate = 4.0;
514
        } else if (currentPrice > 3.99) {
515
            adRate = 4.2;
516
        } else {
517
            continue;
518
        }
519
 
520
        html.push('<tr>');
521
 
522
        html.push(tableCell(obj[entry].ItemID));
523
        html.push(tableCell(Number(adRate).toFixed(1)));
524
        html.push(tableCellLabel('AdId' + obj[entry].ItemID));
525
        html.push(tableCellLabel('CurrentRate' + obj[entry].ItemID));
526
        html.push(tableCellLabel('UpdateStatus' + obj[entry].ItemID));
527
 
528
        html.push('</tr>');
529
    }
530
 
531
    if (pageNumber == totalPages) {
532
        html.push('</tbody>');
533
        html.push('</table>');
534
        html.push('</div>');
535
    }
536
}
537
 
3 - 538
function getOAuthToken() {
539
    var code = "";
540
 
541
	var win = window.open(configeBayLoginUrl, "eBay OAUTH", "");
542
 
543
	var pollTimer = window.setInterval(function() {
544
		if (win.closed !== false) {
545
			window.clearInterval(pollTimer);
546
			getApplicationToken(code);
547
		} else {
548
		    if (code === null || code.length === 0) {
549
                try {
550
                  code = getUrlParameter(win, 'code');
551
                } catch(err) {
552
                  // empty
6 - 553
                }
3 - 554
		    }
555
		}
556
	}, 200);
6 - 557
 
3 - 558
}
559
 
560
function getApplicationToken(code) {
561
    var param;
6 - 562
 
3 - 563
    param = 'grant_type=authorization_code';
564
    param += '&code=' + code;
565
    param += '&redirect_uri=' + configRuName;
6 - 566
 
3 - 567
    var xhttp = new XMLHttpRequest();
568
 
569
    xhttp.onreadystatechange = function() {
570
        if (this.readyState == 4) {
571
            if (this.status == 200) {
572
                response = JSON.parse(this.responseText);
573
 
6 - 574
            	accessToken = getJsonValue(response.access_token);
575
            	refreshToken = getJsonValue(response.refresh_token);
3 - 576
            }
577
        }
578
    };
579
 
580
    xhttp.open("POST", configProxyUrl, true);
581
    xhttp.setRequestHeader("X-Proxy-Url", configOauthTokenUrl);
582
    xhttp.setRequestHeader('X-Authorization', 'Basic ' + btoa(configAppid + ':' + configCertid));
4 - 583
    xhttp.setRequestHeader('X-DECODE-PARAMS', '1');
6 - 584
    xhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
585
    xhttp.send(param);
586
}
3 - 587
 
6 - 588
function refreshApplicationToken(code) {
589
    var param;
590
 
591
    param = 'grant_type=refresh_token';
592
    param += '&refresh_token=' + code;
593
    param += '&scope=https%3A%2F%2Fapi.ebay.com%2Foauth%2Fapi_scope%2Fsell.marketing';
594
 
595
    var xhttp = new XMLHttpRequest();
596
 
597
    xhttp.onreadystatechange = function() {
598
        if (this.readyState == 4) {
599
            if (this.status == 200) {
600
                response = JSON.parse(this.responseText);
601
 
602
            	accessToken = getJsonValue(response.access_token);
603
            	refreshToken = getJsonValue(response.refresh_token);
604
            }
605
        }
606
    };
607
 
608
    xhttp.open("POST", configProxyUrl, true);
609
    xhttp.setRequestHeader("X-Proxy-Url", configOauthTokenUrl);
610
    xhttp.setRequestHeader('X-Authorization', 'Basic ' + btoa(configAppid + ':' + configCertid));
611
    xhttp.setRequestHeader('X-DECODE-PARAMS', '1');
3 - 612
    xhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
613
    xhttp.send(param);
614
}
2 - 615
    </script>
616
 
617
</body>
618
</html>