experts exchange

By smk Last update Jan 18, 2011 — Installed 9,377 times.

There are 20 previous versions of this script.

// ==UserScript==
// @name           expertsExchange
// @namespace      smk
// @description    kill the stupid hiding mechanisms
// @include        *.experts-exchange.*
// ==/UserScript==

/**
history:
	[fix] remove light box overlay
	+[fix] google cache not displaying properly
	[fix] made answer type display original header instead of text
	[add] fix answer type display: they are in the styles (post times are present)
	[add] clearing experts-exchange cookies and reloading page makes answers visible
	[add] remove adInNav height ad placeholder
	[add] use google cache

purged:
	[add] make page refresh after clearing cookie
		this is equivalent to fetching answers using google bot user agent
	[fix] check if realAnswers include post types
		this will be more recent, even if answer types are not shown
*/

var options={
	warn_noanswers: true,
	googleBotUserAgent: 'Googlebot/2.1 (+http://www.google.com/bot.html)',
	useGoogleReferrer: false,
	loadingOverlay: true,
	google404: 'http://www.google.com/!',
	googleCache: 'http://webcache.googleusercontent.com/search?q=cache:',
}

var msg_answersNotFound='Warning: answers are not present on this page';
var msg_googleReferrer='<center><pre>Please wait, attempting to retrieve answers using http://www.google.com as referrer</pre></center>';

Array.prototype.remove=function(n){
	var i=this.indexOf(n);
	if(i==-1) return this;
	this.splice(i,1);
	return this;
}
	
String.prototype.endsWith=function(s){
	if(this.substr(this.length-s.length)==s) return true;
	return false;
}

function setCookie(name,value,expires,path,domain,secure){
    //set time,it's in milliseconds
    var today=new Date();
    today.setTime(today.getTime());
	/*
	if the expires variable is set,make the correct
	expires time,the current script below will set
	it for x number of days,to make it for hours,
	delete*24,for minutes,delete*60*24
	*/
    if(expires){
        expires=expires*1000*60*60*24;
    }
    var expires_date=new Date(today.getTime()+(expires));
    document.cookie=name+"="+escape(value)+((expires)? ";expires="+expires_date.toGMTString(): "")+((path)? ";path="+path : "")+((domain)? ";domain="+domain : "")+((secure)? ";secure" : "");
}

function getCookie(check_name){
    //first we'll split this cookie up into name/value pairs
    //note: document.cookie only returns name=value,not the other components
    var a_all_cookies=document.cookie.split(';');
    var a_temp_cookie='';
    var cookie_name='';
    var cookie_value='';
    var b_cookie_found=false; //set boolean t/f default f
    for(i=0; i < a_all_cookies.length; i++){
        //now we'll split apart each name=value pair
        a_temp_cookie=a_all_cookies[i].split('=');
        //and trim left/right whitespace while we're at it
        cookie_name=a_temp_cookie[0].replace(/^\s+|\s+$/g,'');
        //if the extracted name matches passed check_name
        if(cookie_name==check_name){
            b_cookie_found=true;
            //we need to handle case where cookie has no value but exists(no=sign,that is):
            if(a_temp_cookie.length > 1){
                cookie_value=unescape(a_temp_cookie[1].replace(/^\s+|\s+$/g,''));
            }
            //note that in cases where cookie is initialized but no value,null is returned
            return cookie_value;
            break;
        }
        a_temp_cookie=null;
        cookie_name='';
    }
    if(!b_cookie_found){
        return null;
    }
}

function deleteCookie(name,path,domain){
    if(getCookie(name))document.cookie=name+"="+((path)? ";path="+path : "")+((domain)? ";domain="+domain : "")+";expires=Thu,01-Jan-1970 00:00:01 GMT";
}

function removeBlurredCSS(e){
	/**
	remove blurred css and post-type-hiding css
	cannot modify the css directly, will raise security error (document.styleSheets[1].cssRules[0].styleSheet.cssRules)
	reloads css using http request
	*/
	for(var i=0;i<document.styleSheets.length;i++){
		var n=document.styleSheets[i].cssRules[0];
		if(n.type==3){
			if(n.href.indexOf('-include-eeAd')!=-1){
				document.styleSheets[i].disabled=true;
				GM_xmlhttpRequest({
					method: 'GET',
					url: n.href,
					onload: function(e){
						//find post-hiding css line
						var i=e.responseText.indexOf('acceptedBlurredSolution');
						if(i==-1) return;
						var start=e.responseText.lastIndexOf('\n',i);
						var end=e.responseText.indexOf('\n',i);
						GM_addStyle(e.responseText.substr(0,start)+e.responseText.substr(end));
					}
				});
			}
		}
	}
}

function removeLogCookies(){
	deleteCookie('EECC_0','/','.experts-exchange.com');
}

function childToCenter(node){
	node.innerHTML='<table style="width:100%; height:100%;"><tr align="center" valign="middle"><td>'+node.innerHTML+
		'</td></tr></table>';
}

function removeNode(node){if(node) node.parentNode.removeChild(node);}

function getClass(className,partial,num){
	var ret;
	if(num==null) num=0;
	if(partial) return document.evaluate('//*[contains(concat("",normalize-space(@class),""),"'+className+'")]',document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null).snapshotItem(num);
	return document.evaluate('//*[@class="'+className+'"]',document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null).snapshotItem(num);
}

function getPageStyle(html){
	var pageStyleStart='http://images.experts-exchange.com/getCSS?key=';
	var pageStyleEnd='/';
	var pageStyleStart_i=html.indexOf(pageStyleStart)+pageStyleStart.length;
	var pageStyleEnd_i=html.indexOf(pageStyleEnd,pageStyleStart_i+1)+pageStyleEnd.length;
	return html.substring(pageStyleStart_i,pageStyleEnd_i);
}

/**
answer retrieval methods
*/
function getGoogleBotAnswers(){
	//get answers via Googlebot user-agent
	GM_xmlhttpRequest({
		method: 'GET',
		url: window.location.href,
		headers: {
			'User-Agent': options.googleBotUserAgent,
			'Accept': '*/*',
		},
		onload: function(e){
			document.evaluate('//html',document,null,9,null).singleNodeValue.innerHTML=e.responseText;
			if(cleanupEE(true)==false){
				getGoogleCacheAnswers();
			}else{
				getSuccess();
			}
		}
	});
}

function getGoogleCacheAnswers(){
	GM_xmlhttpRequest({
		method: 'GET',
		url: options.googleCache+window.location.href,
		headers: {
			'Accept': '*/*',
		},
		onload: function(e){
			var response=e.responseText;
			var cacheEnd='<div style="position:relative">';
			var cacheEnd_i=response.indexOf(cacheEnd)+cacheEnd.length;
			response=response.substr(cacheEnd_i);
			var responseStart='>';
			var responseEnd='<';
			response=response.substring(response.indexOf(responseStart)+responseStart.length,response.lastIndexOf(responseEnd));
			//replace cache response styles with current styles (or else may not display properly)
			var htmlNode=document.evaluate('//html',document,null,9,null).singleNodeValue;
			response=response.replace(getPageStyle(response),getPageStyle(htmlNode.innerHTML),'g');
			htmlNode.innerHTML=response;
			if(cleanupEE(true)==false){
				getGoogleReferrerAnswers();
			}else{
				getSuccess();
			}
		}
	});
}

function getGoogleReferrerAnswers(){
	if(options.useGoogleReferrer){
		//get answers by using google.com as referrer
		//this is not allowed by GM_xmlhttpRequest, so load www.google.com
		url=GM_getValue('url',null);
		GM_deleteValue('url');
		if(url=='!'){
			getFailed();
		}else{
			document.body.innerHTML=msg_googleReferrer;
			GM_setValue('url',window.location.href);
			window.location.href=options.google404;
		}
	}
}

function getFailed(){
	if(options.warn_noanswers)
		alert(msg_answersNotFound);
	if(options.loadingOverlay) removeNode(overlay);
}

function getSuccess(){
	if(options.loadingOverlay) removeNode(overlay);
}

function getAnswers(inHttpRequest){
	var realAnswers;
	try{
		realAnswers=getClass("answers",false,1);
		var pRealAnswers=realAnswers;
		while(pRealAnswers.getAttribute('id')!='pageMain'){
			realAnswers=pRealAnswers;
			pRealAnswers=pRealAnswers.parentNode;
		}
	}catch(e){
		realAnswers=document.getElementById('bottomSolutionDiv');
	}
	if(!realAnswers){
		if(!inHttpRequest){
			if(options.loadingOverlay){
				overlay=document.createElement('div');
				overlay.id='eeOverlay';
				overlay.setAttribute('style',
					'z-index:10000;'+
					'opacity:0.5;'+
					'background-color:#000000;'+
					'position:fixed; top:0px; left:0px; width:100%; height:100%; color:#FFFFFF; text-align:center; vertical-align:middle;');
				var overlayText=document.createElement('div');
				overlayText.setAttribute('style','font-size:1.5em; width:100%; height:100%;');
				overlayText.textContent='Loading...';
				childToCenter(overlayText);
				overlay.appendChild(overlayText);
				document.body.appendChild(overlay);
			}
			getGoogleBotAnswers();
		}
	}
	return realAnswers;
}

function cleanupEE(inHttpRequest){
	//remove log cookies
	removeLogCookies();
	
	//add actual answers
	var question=getClass("bcQuestion",true);
	if(!question) return;
	remove();
	var realAnswers=getAnswers(inHttpRequest);
	if(!realAnswers) return false;
	var inBetweenQA=null;
	if(inBetweenQA==null) inBetweenQA=getClass("zoneBarrier",true);
	if(inBetweenQA==null) inBetweenQA=getClass("allZones").parentNode.parentNode.parentNode.parentNode.parentNode;
	inBetweenQA.parentNode.insertBefore(realAnswers,inBetweenQA);
	//set answer header style
	removeBlurredCSS();
	var realAnswersHeader=document.evaluate('./div[contains(@class,"sectionTwo")]',realAnswers,null,9,null).singleNodeValue;
	realAnswersHeaderClass=realAnswersHeader.getAttribute('class').split(' ');
	realAnswersHeaderClass.push('sgray');
	realAnswersHeaderClass.remove('snhFFF5');
	realAnswersHeaderClass.push('shFFF5');
	realAnswersHeader.setAttribute('class',realAnswersHeaderClass.join(' '));
	var realAnswersType=document.evaluate('./table[@class="h"]//td[@class="l"]/following-sibling::td[1]',realAnswersHeader,null,9,null).singleNodeValue;
	realAnswersType.innerHTML='<div class="t2i" style="background: url(\'http://t2i.experts-exchange.com/t/411752-50.png\') no-repeat scroll 0% 0% transparent !important; height: 19px;"></div>';
	//set answer types if not present
	var answerHeaders=document.evaluate('//div[@class="answers"]/div[contains(@class," answer ")]/table[@class="h"]//td[@class="l"]/following-sibling::td[1]',document,null,6,null);
	for(var i=0;i<answerHeaders.snapshotLength;i++){
		var answerHeader=answerHeaders.snapshotItem(i);
		answerHeader.style.fontSize='12px';
		var answerTypeNode=answerHeader;
		while(answerTypeNode.nodeName!='DIV') answerTypeNode=answerTypeNode.parentNode;
		var answerTypeNodeClass=answerTypeNode.getAttribute('class').split(' ');
		for(var j=0;j<answerTypeNodeClass.length;j++){
			var n=answerTypeNodeClass[j];
			if(n.endsWith('Header')){
				var tdClasses=answerTypeNode.getAttribute('class').split(' ');
				tdClasses.remove('answer');
				tdClasses.remove('snhF5FF');
				tdClasses.push('sgray');
				answerTypeNode.setAttribute('class',tdClasses.join(' '));
				var i_url='';
				switch(n){
					case 'acceptedHeader':			i_url='http://images.experts-exchange.com/t/61-50.png'; break;
					case 'adminHeader':				i_url='http://images.experts-exchange.com/t/63-50.png'; break;
					case 'answerHeader':			i_url='http://images.experts-exchange.com/t/59-50.png'; break;
					case 'askerHeader':				i_url='http://images.experts-exchange.com/t/60-50.png'; break;
					case 'askerClosingHeader':		i_url='http://t2i.experts-exchange.com/t/438867-50.png'; break;
					case 'assistedHeader':			i_url='http://images.experts-exchange.com/t/58-50.png'; break;
				}
				answerHeader.innerHTML='<div class="t2i" style="background: url(\''+i_url+'\') no-repeat scroll 0% 0% transparent !important; height: 19px;"></div>';
				break;
			}
		}
	}
	
	//remove fake answers
	var fakeAnswers=document.evaluate('//div[contains(concat("",normalize-space(@class),""),"blurredAnswer")]',document,null,7,null);
	for(var i=0;i<fakeAnswers.snapshotLength;i++){fakeAnswers.snapshotItem(i).style.display='none';}
	//remove fake blurred solutions
	var fakeBlurred=getClass('acceptedBlurredSolution',true);
	if(fakeBlurred) fakeBlurred.parentNode.removeChild(fakeBlurred);
	//clean-up inBetweenQA
	var zoneTopics=document.evaluate('.//div[@class="zones"]',inBetweenQA,null,9,null);
	if(zoneTopics && zoneTopics.singleNodeValue){
		zoneTopics=zoneTopics.singleNodeValue;
		var zoneToipicsHr=zoneTopics.previousSibling.previousSibling;
		var zoneParent=zoneTopics.parentNode;
		while(zoneParent.firstChild)
			zoneParent.removeChild(zoneParent.firstChild);
		zoneParent.appendChild(zoneToipicsHr);
		zoneParent.appendChild(zoneTopics);
	}
	//move relatedSolutions box
	var relatedSolutions=getClass('RelatedSolutions',true);
	if(relatedSolutions){
		relatedSolutions=relatedSolutions.parentNode;
		question.appendChild(relatedSolutions);
	}
	//remove topBanner
	if(document.getElementById('topBanner')!=null){
		document.getElementById('topBanner').style.display='none';
		document.getElementById('outerWrap').style.marginTop='0px';
	}
	//remove adInNav height ad placeholder
	var adInNavPlaceholder=document.evaluate('//div[@id="adInNav"]/div[@id="pageHeader"]',document,null,9,null).singleNodeValue;
	if(adInNavPlaceholder){
		adInNavPlaceholder.style.height='120px';
	}
	//remove light box overlay
	removeNode(document.getElementById('lightBoxOverlay'));
	removeNode(document.getElementById('lightBoxBackground'));
	return true;
}

function remove(){
	//remove useless/duplicate nodes
	removeNode(getClass("startFreeTrial",true));
	removeNode(getClass("squareSignUp"));
	removeNode(getClass("notFreePAQ",true));
	removeNode(getClass("freePAQ",true));
	removeNode(getClass("freeInProg",true));
}

function redirectLinks(){
	var i,currLink,currHref;
	var eeLinks=document.evaluate('//a[contains(@href,"/www.experts-exchange.com/") and contains(@href,"/Q_")]',document,null,7,null);
	for(i=0;i<eeLinks.snapshotLength;i++){
		currLink=eeLinks.snapshotItem(i);
		currHref=currLink.href;
		currLink.href=options.google404+'#'+currLink;
		currLink.addEventListener('mousedown',function(e){
			e.preventDefault();
			e.stopPropagation();
			GM_setValue('url',currHref);
		},false);
	}
}

function main(){
	if(options.useGoogleReferrer && window.location.href.indexOf(options.google404)==0 && document.body){
		var url=GM_getValue('url',null);
		if(url!=null){
			document.body.innerHTML=msg_googleReferrer;
			GM_setValue('url','!');
			window.location.href=url;
		}
	}else{
		if(options.useGoogleReferrer && window.location.href.indexOf('http://www.google.com')!=0) redirectLinks();
		cleanupEE();
	}
}

main();