// ==UserScript== // @name eBay - Show Option Prices // @namespace http://www.toraboka.com/~mrudat // @description Inserts prices for all the extra options that may be included in the eBay page. // @include http://*.ebay.tld/*sch/* // @include http://*.ebay.tld/*i.html?* // @include http://*.ebay.tld/itm/* // @version 0.0.1 // @downloadURL none // ==/UserScript== /* jshint esnext: true */ process(); function process() { var currency = '\$'; var price = /\$([\d\,]*\.\d\d)/; // regexp to test for currency var tld = location.host.split('.').reverse()[0]; switch (tld) { case 'uk': currency = '£'; price = /£([\d\,]*.\d\d)/; break; } var itemPage = /^\/itm\//.test(location.pathname); if (itemPage) { var chosenVariation = document.querySelector('span#sel-msku-variation'); if (chosenVariation === null) { return; } var variationsPanel = chosenVariation.parentNode; console.log(variationsPanel); var request = new XMLHttpRequest(); request.open("GET", location.href); console.log(location.href) request.onloadend = function(){ var rdata = request.responseText; console.log("foo"); var varipoint = rdata.indexOf('"itmVarModel":{'); if (varipoint == -1){ return; } var varidata = rdata.substring(varipoint); varidata = '{' + varidata.substring(0, varidata.indexOf('"unavailableVariationIds"')-1) + '}}'; var itmVarModel = JSON.parse(varidata).itmVarModel; console.log(itmVarModel); var menuModels = itmVarModel.menuModels; var menuItemMap = itmVarModel.menuItemMap; var itemVariations = Object.keys(itmVarModel.itemVariationsMap).map(k => itmVarModel.itemVariationsMap[k]); itemVariations = itemVariations .map(itemVariation => { var convertedPrice = itemVariation.convertedPrice || itemVariation.price; convertedPrice = convertedPrice.match(price)[1].replace(',',''); return [convertedPrice, itemVariation]; }) .sort((a,b) => a[0] - b[0]) .map(i => i[1]); var finaldata = ""; menuModels.forEach(menuModel => { finaldata += ""; }); finaldata += ""; console.log(finaldata); itemVariations.forEach(itemVariation => { console.log(itemVariation); finaldata += ""; var traitValuesMap = itemVariation.traitValuesMap; menuModels.forEach(menuModel => { finaldata += ""; }); var convertedPrice = itemVariation.convertedPrice || itemVariation.price; var priceCurrency = convertedPrice.substring(0, convertedPrice.indexOf(currency) + 1); convertedPrice = convertedPrice.substring(convertedPrice.indexOf(currency) + 1); finaldata += ""; console.log(finaldata); }); finaldata += "
" + menuModel.displayName + "Price
" + menuItemMap[traitValuesMap[menuModel.name]].displayName + "" + priceCurrency + convertedPrice + "
"; console.log(finaldata); var el = document.createElement('div'); el.class = "vi-msku-cntr"; el.innerHTML = finaldata; console.log(el); variationsPanel.appendChild(el); }; request.send(); } else { Array.prototype.forEach.call(document.querySelectorAll('li[listingid]'),rowElement => { var lvprices = rowElement.querySelector('ul.lvprices'); var buyItNow = lvprices.querySelector('li.lvprice span.bold') || lvprices.querySelector('li.lvprice'); if (buyItNow === null) { return; } if (buyItNow.textContent.indexOf(" to ") == -1) { // doesn't have variations return; } var lvdetails = rowElement.querySelector('ul.lvdetails'); if (lvdetails === null) { // couldn't find element to stick table into return; } var request = new XMLHttpRequest(); var productUrl = rowElement.getElementsByTagName('a')[0].href; request.open("GET", productUrl); request.onloadend = function(){ var rdata = request.responseText; var varipoint = rdata.indexOf('"itmVarModel":{'); if (varipoint == -1){ return; } var varidata = rdata.substring(varipoint); varidata = '{' + varidata.substring(0, varidata.indexOf('"unavailableVariationIds"')-1) + '}}'; var itmVarModel = JSON.parse(varidata).itmVarModel; var menuModels = itmVarModel.menuModels; var menuItemMap = itmVarModel.menuItemMap; var itemVariations = Object.keys(itmVarModel.itemVariationsMap).map(k => itmVarModel.itemVariationsMap[k]); itemVariations = itemVariations .map(itemVariation => { var convertedPrice = itemVariation.convertedPrice || itemVariation.price; convertedPrice = convertedPrice.match(price)[1].replace(',',''); return [convertedPrice, itemVariation]; }) .sort((a,b) => a[0] - b[0]) .map(i => i[1]); var truncated = false; if (itemVariations.length > 10) { itemVariations.length = 10; truncated = true; } var finaldata = ""; menuModels.forEach(menuModel => { finaldata += ""; }); finaldata += ""; itemVariations.forEach(itemVariation => { finaldata += ""; var traitValuesMap = itemVariation.traitValuesMap; menuModels.forEach(menuModel => { finaldata += ""; }); var convertedPrice = itemVariation.convertedPrice || itemVariation.price; var priceCurrency = convertedPrice.substring(0, convertedPrice.indexOf(currency) + 1); convertedPrice = convertedPrice.substring(convertedPrice.indexOf(currency) + 1); finaldata += ""; }); if (truncated) { finaldata += ''; } finaldata += "
" + menuModel.displayName + "Price
" + menuItemMap[traitValuesMap[menuModel.name]].displayName + "" + priceCurrency + convertedPrice + "
...
"; var el = document.createElement('li'); el.innerHTML = finaldata; lvdetails.appendChild(el); }; request.send(); }); } }