Wikipedia:WikiProject User scripts/Scripts/TwoColumns.js
/* TwoColumns, version [0.0.5]Documentation: Wikipedia:WikiProject User scripts/Scripts/TwoColumns*/if(mw.config.get('wgAction')=='view'&&mw.config.get('wgCanonicalNamespace')=='')addOnloadHook(fr_format)varfr_columns;varimgRegExp=/(thumb|frame)/i;vartrashNodes;functionfr_format(){fr_addButton();fr_columns=fr_getCookie('fr_columns');if(!(0<1*fr_columns))fr_columns=1;trashNodes=newArray;if(fr_columns==1)return;varbodyContent=document.getElementById('bodyContent');if(!bodyContent||!bodyContent.innerHTML||bodyContent.innerHTML=='')return;varallNodes=bodyContent.childNodes;vargroup=newArray,node,groupArea=0;for(vari=allNodes.length-1;0<=i;i--){node=allNodes[i];varpre=node.tagName=="PRE"||(node.tagName=="DIV"&&node.childNodes[1]&&node.childNodes[1].tagName=='PRE')if(node.nodeValue&&node.nodeValue.substr(0,1)=="\n"){// } else if (node.tagName=="p" || node.tagName=="P" || node.tagName=="ul" || node.tagName=="UL" ) {}elseif(node.tagName&&node.tagName.substr(0,1)!="H"&&node.tagName.substr(0,5)!="TABLE"&&node.tagName.substr(0,5)!="SCRIPT"&&node.style.MozColumnCount<=0&&!pre){//everything but Hgroup.push(node);groupArea+=node.clientHeight*node.clientWidth;}else{if(node.tagName&&node.tagName.substr(0,1)=="H"){varprevNode=node;varcount=0;do{do{prevNode=prevNode.previousSibling;count++;}while(prevNode&&(prevNode.clientHeight==0||prevNode.clientHeight===undefined));if(prevNode&&prevNode.className&&imgRegExp.test(prevNode.className)){group.push(prevNode);i=i-count;count=0;groupArea+=prevNode.clientHeight*prevNode.clientWidth;}}while(prevNode&&prevNode.className&&imgRegExp.test(prevNode.className))}if(0<group.length)fr_layoutDiv(group,groupArea);group=newArray;groupArea=0;}}for(vari=trashNodes.length-1;0<=i;i--){trashNodes[i].parentNode.removeChild(trashNodes[i]);}}functionfr_layoutDiv(aGroup,groupArea){varcontentWidth=aGroup[0].parentNode.clientWidth;if(groupArea<100*contentWidth)return;varstart=0,stop=aGroup.length-1;varpieces=Math.round(groupArea/(window.innerHeight*contentWidth)+0.5);vartargetArea=groupArea/pieces;vartargetHeight=(pieces==1)?window.innerHeight:targetArea/contentWidth;vardivArea=0,first=true,imgHeight=0;for(vari=stop;0<=i;i--){if(aGroup[i].className&&imgRegExp.test(aGroup[i].className)){imgHeight+=aGroup[i].clientHeight;}divArea+=aGroup[i].clientHeight*aGroup[i].clientWidth;if(targetArea<divArea||targetHeight<imgHeight){fr_createDiv(aGroup,i+1,stop,fr_columns,first);first=false;stop=i;if(aGroup[i].className&&imgRegExp.test(aGroup[i].className)){imgHeight=aGroup[i].clientHeight;}else{imgHeight=0;}divArea=aGroup[i].clientHeight*aGroup[i].clientWidth;}}if(0<=stop){divArea=0;for(i=stop;0<=i;i--){divArea+=aGroup[i].clientHeight*aGroup[i].clientWidth;}if(100*contentWidth<divArea)fr_createDiv(aGroup,0,stop,fr_columns,first);}}functionfr_createDiv(aGroup,start,stop,columns,noHR){// start, stop: inclusive, (counting in the Group !), e.g. 0..3if(stop<start)return;varnewDiv=document.createElement('div');newDiv.style.MozColumnCount=columns;newDiv.style.MozColumnGap='2em';newDiv.style.textAlign='justify';vartooBig=false;for(vari=stop;start<=i;i--){// first append the thumbif(imgRegExp.test(aGroup[i].className)){newNode=aGroup[i].cloneNode(true);newDiv.appendChild(newNode);if(imgRegExp.test(aGroup[i].className)&&aGroup[i].parentNode.clientWidth/columns<newNode.clientWidth){tooBig=true;}}}for(vari=stop;start<=i;i--){if(!imgRegExp.test(aGroup[i].className)){newNode=aGroup[i].cloneNode(true);newDiv.appendChild(newNode)}}if(window.innerHeight<newDiv.clientHeight||tooBig/* window.innerHeight-10 < imgHeight */){// safety valve: too big return;}aGroup[start].parentNode.insertBefore(newDiv,aGroup[start]);if(!noHR){varHR=document.createElement('HR');newDiv.parentNode.insertBefore(HR,newDiv);}for(vari=stop;start<=i;i--){trashNodes.push(aGroup[i]);//newDiv.parentNode.removeChild(aGroup[i])}}// Button to increment the number of columnsfunctionfr_addButton(){varnode=document.getElementById('p-personal');if(!node)returnnull;node=node.getElementsByTagName("ul")[0];if(!node)returnnull;varlink=document.createElement("img");link.src='http://upload.wikimedia.org/wikipedia/commons/f/f5/FastReader_logo.PNG';link.appendChild(document.createTextNode("FastReader"));link.onclick=function(){fr_next()};varitem=document.createElement("li");item.appendChild(link);link.setAttribute("title",'FastReader');node.appendChild(item);// IE compatibility (?)}functionfr_next(){fr_columns=fr_columns%2+1;fr_setCookie('fr_columns',fr_columns);document.location.reload();};// Cookie routines to save the number of columnsfunctionfr_getCookie(cookieName){varcookie=' '+document.cookie;varsearch=' '+cookieName+'=';varcookieValue='';varoffset=0;varend=0;offset=cookie.indexOf(search);if(offset!=-1){offset+=search.length;end=cookie.indexOf(';',offset)if(end==-1){end=cookie.length;}cookieValue=cookie.substring(offset,end);cookieValue=cookieValue.replace(/\\+/g,' ');cookieValue=decodeURIComponent(cookieValue);}return(cookieValue);}functionfr_setCookie(name,value){varcookie=name+'='+encodeURIComponent(value);varcookieExpire=newDate();expires=cookieExpire.setTime(cookieExpire.getTime()+30*24*60*60*1000);expires=cookieExpire.toUTCString();cookie+='; expires='+expires;document.cookie=cookie;return;}