Newegg.com: Show the Hidden Prices

Never be annoyed with hidden prices on newegg.com again :)

// ==UserScript==
// @name           Newegg.com: Show the Hidden Prices
// @description    Never be annoyed with hidden prices on newegg.com again :)
// @version        3.3.1
// @include        http://www.newegg.tld/*
// @namespace https://greasyfork.org/users/2178
// ==/UserScript==
/* Script badly broken, working of fix this contains what I have so far, better than nothing, the old awesome version is commended out if you want to work on fixing it
function getURL(findMe,txt){
	if(txt){
		txt=txt.slice(1);
		txt=txt.slice(txt.indexOf(findMe+'='));
		var l=txt.indexOf('&');
		if(l!=-1){
			return txt.slice(findMe.length+1,l);
		}
		else{
			return txt.slice(findMe.length+1);
		}
	}
	return null;
}*/
function addCommas(nStr){// http://www.mredkj.com/javascript/nfbasic.html
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}/*
function roundNumber(num, dec){// http://forums.devarticles.com/showpost.php?p=71368&postcount=2
	return Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
}
function comboPriceInCart(e,combo){
	GM_xmlhttpRequest({
		method: "GET",
		url: 'http://www.newegg.com/Product/MappingPrice.aspx?ComboID='+combo,
		onload: function(r){
			var save=r.responseText;
			save=save.substr(save.indexOf('<dd class="rebate">You Save: ')+29);
			save=save.substr(0,save.indexOf('</dd>'));
			e.parentNode.previousElementSibling.textContent='Discount: '+save;
			var price=r.responseText;
			price=price.substr(price.indexOf('<h3 class="zmp">')+16);
			price=price.slice(0,price.indexOf('</h3>')).replace(/[(\t\r\n\ ]/g,'');
			e.parentNode.innerHTML='<strong>Combo Price: '+price+'</strong>';
		}
	});
}
function comboPriceFinder(ele){
	if(document.evaluate("//table[@class='comboOverview']/tbody/tr/td[@class='price']/em",document,null,9,null).singleNodeValue){
		setTimeout(function(){
			comboPriceFinder(ele);
		},2000);
	}
	else{
		var prices=document.evaluate("//table[@class='comboOverview']/tbody/tr/td[@class='price']",document,null,6,null);
		var is=0;
		for(var i=prices.snapshotLength-1;i>-1;i--){
			is+=Number(prices.snapshotItem(i).textContent.replace(/[( \n\r\t\$,]/g,''));
		}
		insertComboPageHTML(roundNumber(is,2).toString(),ele);
	}
}
function fetchPrice(ITEM,ele,bool,comboList){
	if(bool){
		GM_xmlhttpRequest({
			method: "GET",
			url: 'http://www.newegg.com/Common/Ajax/RelationItemInfo.aspx?item='+ITEM+'&type=Newegg&_='+(new Date().getTime().toString().substring(0,10)),
			onload: function(price){
				price=price.responseText;
				price=price.substr(price.indexOf(ITEM+'$')+ITEM.length+1);
				price=price.slice(0,price.indexOf('">')).replace(/[(\n\r\t \$,]/g,'');
				if(Number(price)==price){
					if(comboList){
						ele.innerHTML='$'+addCommas(price);
					}
					else{
						insertProductPageHTML(ele,price.split('.'));
					}
				}
				else{
					GM_log('No price for '+ITEM+' advailable');
				}
			}
		});
	}
	else{
		if(ITEM.indexOf('Combo')!=-1){
			ITEM='ComboID='+ITEM;
		}
		else{
			ITEM='Item='+ITEM;
		}
		GM_xmlhttpRequest({// price in cart
			method: "GET",
			url: 'http://www.newegg.com/Product/MappingPrice.aspx?'+ITEM,
			onload: function(price){
				price=price.responseText;
				price=price.substr(price.indexOf('<h3 class="zmp">')+16);
				price=price.slice(0,price.indexOf('</h3>')).replace(/[(\t\r\n\$, ]/g,'');
				if(comboList){
					ele.innerHTML='$'+addCommas(price);
				}
				else{
					insertComboPageHTML(price,ele);
				}
			}
		});
	}
}
function insertComboPageHTML(is,ele){
		var tmp=document.getElementById('singleFinalPrice').nextElementSibling.cloneNode(true);
		insertProductPageHTML(ele,is.split('.'));
		ele.appendChild(tmp);
		tmp=tmp.innerHTML;
		var save=Number(tmp.replace(/,/g,'').substr(tmp.indexOf('$')+1));
		var was=addCommas(roundNumber(Number(is)+save,2));
		ele.previousElementSibling.innerHTML='<span class="label">Was: </span><span>$'+was+'</span>';
		var comboFoot=document.evaluate("//tfoot/tr[@class='grand_total']/td[@class='price']",document,null,9,null).singleNodeValue;
		comboFoot.innerHTML='$'+addCommas(is.indexOf('.')==-1?is+'.00':is);
		comboFoot=comboFoot.parentNode.parentNode;
		tmp=document.createElement('tr');
		tmp.innerHTML='<td colspan="2">Combo Discounts:</td><td class="price">-$'+addCommas(save.toString().indexOf('.')==-1?save+'.00':save)+'</td>';     
		comboFoot.insertBefore(tmp,comboFoot.childNodes[0]);
		tmp=document.createElement('tr');
		tmp.innerHTML='<td colspan="2">Combined Total:</td><td class="price">$'+(was.indexOf('.')==-1?was+'.00':was)+'</td>';
		comboFoot.insertBefore(tmp,comboFoot.childNodes[0]);
}
function insertProductPageHTML(ele,item){
	var html='',ele2=ele.parentNode.childNodes[0];
	if(ele2.className=='original'){
		var p=Number(ele2.childNodes[1].textContent.substr(1).replace(/,/g,''))-Number(item[0].replace(/,/g,'')+'.'+item[1]);
		p=addCommas(roundNumber(p,2));
		html='<div class="original"><span class="label">Save: </span>$'+(p.indexOf('.')==-1?p+'.00':p)+'</div>';
	}
	ele.innerHTML='<div id="singleFinalPrice" class="current"><span class="label">Now: </span><span>$</span>'+addCommas(item[0])+'<sup>.'+item[1]+'</sup></div>'+html;
}
function showPrice(target){
	var price,eles=document.evaluate('//ul/li[@class="'+target+'"]',document,null,6,null);
	for(var i=eles.snapshotLength-1;i>-1;i--){
		price=eles.snapshotItem(i).parentNode;
		price=price.nextElementSibling.value.substr(1).split('.');
		eles.snapshotItem(i).innerHTML='<span class="label">Now: </span>$<strong>'+price[0]+'</strong><sup>.'+price[1]+'</sup>';
		eles.snapshotItem(i).className='priceFinal';
	}
}
function showPriceLoop(){// Timed loop is used cause DOMSubtreeModified will fire hundreds of times a second which is hell on slow systems
	showPrice('priceMAP');
	setTimeout(function(){
		showPriceLoop();
	},3250);
}
showPrice('priceRange');
showPriceLoop();

var Item=getURL('Item',location.search),ele;
if(!Item)
	Item=getURL('ItemList',location.search);
if(Item){// Product Pages
	setTimeout(function(){
		ele=document.evaluate("//div[@class='wrapper']/a[@class='blkLink map']/em",document,null,9,null).singleNodeValue;
		if(ele){// Normal Item
			try{// Check page for price
				insertProductPageHTML(ele.parentNode.parentNode,document.evaluate("//div[starts-with(@rel,'"+Item+"')]",document,null,9,null).singleNodeValue.getAttribute('rel').split('$')[1].split('.'));
			}
			catch(e){// Price did not load on page in time or will not be loading; Now getting price my self
				fetchPrice(Item,ele.parentNode.parentNode,ele.textContent=="Click for Details",false);
			}
		}
		else{// Combo Item
			ele=document.evaluate("//div[@id='singleFinalPrice']/h3/a/em",document,null,9,null).singleNodeValue;
			var products=document.evaluate("//tr/td[@class='price']/em/../../td[@class='desc']/a",document,null,6,null);
			var prices=document.evaluate("//tr/td[@class='price']/em/..",document,null,6,null);
			if(ele.textContent=='See price in cart'){// Slightly Hidden
				fetchPrice(Item,ele.parentNode.parentNode.parentNode.parentNode,false,false);
				for(var i=products.snapshotLength-1;i>-1;i--){
					var id=products.snapshotItem(i).href;
					fetchPrice(getURL('Item',id.substr(id.indexOf('?'))),prices.snapshotItem(i),false,true);
				}
				var prices=document.evaluate("//tr/td[@class='price']",document,null,6,null);
			}
			else{// Very Hidden
				setTimeout(function(){
					comboPriceFinder(ele.parentNode.parentNode.parentNode.parentNode);
				},3000);
				for(var i=products.snapshotLength-1;i>-1;i--){
					var id=products.snapshotItem(i).href;
					fetchPrice(getURL('Item',id.substr(id.indexOf('?'))),prices.snapshotItem(i),true,true);
				}
			}
		}
	},2550);
}
else{
	var eles=document.evaluate("//ul[@class='comboPrice map']/li[@class='comboFinal']/a[@class='priceAction']",document,null,6,null);
	for(var i=eles.snapshotLength-1;i>-1;i--){
		ele=eles.snapshotItem(i);
		if(ele.textContent=='See price in cart'){
			var combo=ele.getAttribute('onclick');
			combo=combo.slice(combo.indexOf('ComboID=')+8,combo.indexOf("','"));
			comboPriceInCart(ele,combo);
		}
		else{
			var url=ele.parentNode.nextElementSibling.getElementsByTagName('a')[0].href;
			ele.removeAttribute('onclick');
			ele.href="/Product/ComboDealDetails.aspx?ItemList="+url.substr(url.lastIndexOf('=')+1);
			ele.textContent='Click for Price';
			ele.removeAttribute('title');
		}
	}
}*/
function showPrice(){
	var paths=Array("//div[@class='itemCell']/div[@class='itemAction']/ul/li[@class='price-map']/a/../../li[@class='price-current ']",
	"//div/div[@class='wrap_inner']/div[@class='wrap_pitch']/ul/li[@class='price-map']/a/../../li[@class='price-current ']",
	"//div[@class='infoSideSell']/ul/li[@class='price-map']/*/../../li[@class='price-current ']");
	for(var x=0,stp=paths.length;x<stp;x++){
		eles=document.evaluate(paths[x],document,null,6,null);
		for(var i=eles.snapshotLength-1;i>-1;i--){
			ele=eles.snapshotItem(i);
			price=ele.parentNode.parentNode.getElementsByTagName('input')[0].value;
			GM_log(price+" == "+Number(price));
			if(!isNaN(price))
				price="$"+price;
			price=price.split(".");
			ele.innerHTML="<strong>"+price[0]+"</strong><sup>."+price[1]+"</sup>";
			ele.className+="patched";
		}
	}
}
function showPriceLoop(){// Timed loop is used cause DOMSubtreeModified will fire hundreds of times a second which is hell on slow systems
	showPrice();
	setTimeout(function(){
		showPriceLoop();
	},3250);
}

GM_addStyle("#singleFinalPrice,.is-map .price-current.patched{display:block!important;}.is-map .price-map{display:none!important;}");
var ele=document.evaluate("//li[@class='price-map']/a/../../li[@id='singleFinalPrice']",document,null,9,null).singleNodeValue,eles,price;
if(ele){
	price=ele.getAttribute('content').split(".");
	ele.innerHTML="$<strong>"+addCommas(price[0])+"</strong><sup>."+price[1]+"</sup>";
}
showPriceLoop();