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