Newegg.com: Show the Hidden Prices

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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==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();