eBay - Display Totals with Shipping

Computes and displays the total price with shipping added. Inserts prices for all the extra options that may be included in the eBay page. Makes a new column that shows the final price for both the BuyItNow and Shipping price. Note: Only tested on ebay AU.

  1. // ==UserScript==
  2. // @name eBay - Display Totals with Shipping
  3. // @namespace http://www.facebook.com/Tophness
  4. // @description Computes and displays the total price with shipping added. Inserts prices for all the extra options that may be included in the eBay page. Makes a new column that shows the final price for both the BuyItNow and Shipping price. Note: Only tested on ebay AU.
  5. // @include http://*.ebay.tld/*sch/*
  6. // @include http://*.ebay.tld/*i.html?*
  7. // @version 0.0.1.20140928141320
  8. // ==/UserScript==
  9.  
  10. var total = 0;
  11. var crapfilteron = false;
  12. var crapfilter = ['cable', 'adapter', 'case', 'only', 'protector', 'cord', 'guard'];
  13. var urls = [];
  14. var vurls = {};
  15. var purls = {};
  16. var ListingsRows = [];
  17. var currencySymbol = '$'; //default to dollars
  18. var price = /\$([\d\,]*.\d\d)/; // regexp to test for currency
  19. var shippingText = 'Shipping';
  20. var hostSplit = location.host.split ('.');
  21. var tld = hostSplit [hostSplit.length - 1];
  22. switch (tld) {
  23. case 'uk':
  24. currencySymbol = '£';
  25. price = /£([\d\,]*.\d\d)/;
  26. shippingText = 'Postage';
  27. break;
  28. }
  29. FindAllRows();
  30.  
  31. function FindAllRows() {
  32. var allElements = document.getElementsByTagName('li');
  33. for (var i = 0; i < allElements.length; ++i) {
  34. if (allElements[i].outerHTML.indexOf('listingid=') != -1) {
  35. ListingsRows.push(allElements[i]);
  36. }
  37. }
  38. total = ListingsRows.length;
  39. if (ListingsRows.length > 0) {
  40. for (var i = 0; i < ListingsRows.length; ++i) {
  41. WorkOnRow(ListingsRows[i]);
  42. }
  43. }
  44. }
  45.  
  46. function WorkOnRow(RowElement) {
  47. var buyItNowPrice = -1;
  48. var shippingPrice = -1;
  49. var allElements = RowElement.getElementsByTagName('ul');
  50.  
  51. for (var i = 0; i < allElements.length; ++i) {
  52. if (allElements[i].className.indexOf("lvprices") != -1) {
  53. var pricedivs = allElements[i].getElementsByTagName('div');
  54. if (pricedivs.length > 0){
  55. for (var k = 0; k < pricedivs.length; ++k) {
  56. if(pricedivs[k].className == "cmpat"){
  57. pricedivs[k].parentNode.removeChild(pricedivs[k]);
  58. }
  59. }
  60. }
  61. var spans = allElements[i].getElementsByTagName('span');
  62. var buyItNow;
  63. var shipping;
  64. var tc;
  65. if(spans.length > 0){
  66. for (var j = 0; j < spans.length; ++j) {
  67. tc = spans[j].textContent;
  68. if (spans[j].className == "fee") {
  69. shipping = spans[j];
  70. if (/Free/.test (tc) || (/Digital delivery/.test(tc))) {
  71. shippingPrice = 0;
  72. } else if (/Not specified/.test(tc)) {
  73. shippingPrice = '?';
  74. } else if (price.test(tc)){
  75. shippingPrice = tc.match(price)[1].replace(',','');
  76. }
  77. }
  78. else if (spans[j].className == 'g-b') {
  79. buyItNow = spans[j];
  80. buyItNowPrice = tc.match(price)[1].replace(',','');
  81. }
  82. }
  83. }
  84. var buyItNowTotal;
  85. if (buyItNowPrice != -1 && shippingPrice != -1) {
  86. if(isNaN(buyItNowPrice) || isNaN(shippingPrice)){
  87. buyItNowTotal = "?";
  88. }
  89. else{
  90. buyItNowTotal = (parseFloat(buyItNowPrice) + parseFloat(shippingPrice)).toFixed(2);
  91. }
  92. buyItNow.innerHTML = buyItNow.innerHTML.substring(0, buyItNow.innerHTML.indexOf('</b>') + 4) + buyItNowTotal;
  93. shipping.innerHTML = '<b>$' + buyItNowPrice + '</b> + ' + shipping.innerHTML.substring(shipping.innerHTML.indexOf('$'));
  94. }
  95. }
  96. else if(allElements[i].className.indexOf("lvdetails") != -1){
  97. allElements[i].innerHTML = "";
  98. }
  99. }
  100. if (buyItNowPrice != -1) {
  101. purls[RowElement.getElementsByTagName('a')[0].href] = buyItNowPrice;
  102. ajaxsubmit(RowElement.getElementsByTagName('a')[0].href);
  103. }
  104. }
  105.  
  106. function checkloaded(url){
  107. urls.push(url);
  108. if(urls.length == total){
  109. checkurls();
  110. }
  111. }
  112.  
  113. function checkurls(){
  114. for (var i = 0; i < ListingsRows.length; ++i) {
  115. var curl = ListingsRows[i].getElementsByTagName('a')[0];
  116. if(curl != null){
  117. var viddata = vurls[curl.href];
  118. if(viddata){
  119. var lruls = ListingsRows[i].getElementsByTagName('ul');
  120. for (var j = 0; j < lruls.length; ++j) {
  121. if(lruls[j].className.indexOf("lvdetails") != -1){
  122. var el = document.createElement('div');
  123. el.innerHTML = viddata;
  124. lruls[j].appendChild(el);
  125. }
  126. }
  127. }
  128. }
  129. }
  130. }
  131.  
  132. function ajaxsubmit(url)
  133. {
  134. var mygetrequest=new ajaxRequest();
  135. mygetrequest.onreadystatechange=function(){
  136. if (mygetrequest.readyState==4){
  137. if (mygetrequest.status==200){
  138. var rdata = mygetrequest.responseText;
  139. var varipoint = rdata.indexOf('"itmVarModel":{"key":"ItemVariations"');
  140. if(varipoint != -1){
  141. var varidata = rdata.substring(varipoint);
  142. varidata = '{' + varidata.substring(0, varidata.indexOf('"unavailableVariationIds"')-1) + '}}';
  143. var finaldata = "";
  144. var varijson = JSON.parse(varidata)["itmVarModel"];
  145. var mmodels = varijson.menuModels;
  146. for(var m=0;m<mmodels.length;m++){
  147. finaldata += "<br><b>" + mmodels[m].displayName + "</b><br>";
  148. if(mmodels[m].menuItemValueIds){
  149. var itemmap = mmodels[m].menuItemValueIds;
  150. for(var i=0;i<itemmap.length;i++){
  151. if(varijson.menuItemMap[i]){
  152. var optname = varijson.menuItemMap[i].displayName;
  153. if(crapfilteron){
  154. for(var oi=0;oi<crapfilter.length;oi++){
  155. if(optname.indexOf(crapfilter[oi]) != -1){
  156. return;
  157. }
  158. }
  159. }
  160. var matchids = varijson.menuItemMap[i].matchingVariationIds;
  161. for(var j=0;j<matchids.length;j++){
  162. var convertedPrice;
  163. if(varijson.itemVariationsMap[matchids[j]].convertedPrice){
  164. convertedPrice = varijson.itemVariationsMap[matchids[j]].convertedPrice;
  165. }
  166. else{
  167. convertedPrice = varijson.itemVariationsMap[matchids[j]].price;
  168. }
  169. var currency = convertedPrice.substring(0, convertedPrice.indexOf('$') + 1);
  170. convertedPrice = convertedPrice.substring(convertedPrice.indexOf('$') + 1);
  171. if(convertedPrice != purls[url]){
  172. finaldata += optname + ' = ' + currency + convertedPrice + "<br>";
  173. }
  174. }
  175. }
  176. }
  177. }
  178. }
  179. vurls[url] = finaldata;
  180. }
  181. checkloaded(url);
  182. }
  183. }
  184. }
  185. mygetrequest.open("GET", url, true);
  186. mygetrequest.send(null);
  187. }
  188.  
  189. function ajaxRequest(){
  190. var activexmodes=["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];
  191. if (window.ActiveXObject){
  192. for (var i=0; i<activexmodes.length; i++){
  193. try{
  194. return new ActiveXObject(activexmodes[i]);
  195. }
  196. catch(e){
  197. }
  198. }
  199. }
  200. else if (window.XMLHttpRequest)
  201. return new XMLHttpRequest();
  202. else
  203. return false;
  204. }