
/* - textheworld6.user.js - */
// http://www.geodynamics.org/cig/portal_javascripts/textheworld6.user.js?original=1
var splitRegexp=/([\s\S]*?)\[;([\s\S]*?);\]([\s\S]*)/m;var matchRegexp=/\[;([\s\S]*?);\]/m;var matchRegexpGlobal=/\[;([\s\S]*?);\]/mg;var signature='[To see formulas: http://thewe.net/tex]';
function createTeXifiedImageElement(expr){var imgElement=document.createElement('img');imgElement.src="http://stress.geodynamics.org/cgi-bin/mathtex/mathtex.cgi?"+expr;imgElement.title=expr;imgElement.alt="[;"+expr+";]";imgElement.addEventListener('dblclick',unTeXifyImage,false);return imgElement}
function TeXifyRange(startNode,startNodeOpen,endNode,endNodeClose){if(startNode==endNode){var textNode=startNode;if(textNode.parentNode.nodeName=='TEXTAREA')
return;while(textNode.nodeValue.match(matchRegexp)){textNodeSplit=splitRegexp.exec(textNode.nodeValue);textNode.nodeValue='';var rightHalfNode=document.createTextNode(textNodeSplit[3]);textNode.parentNode.insertBefore(rightHalfNode,textNode);var imgElement=createTeXifiedImageElement(textNodeSplit[2]);textNode.parentNode.insertBefore(imgElement,rightHalfNode);textNode.parentNode.insertBefore(document.createTextNode(textNodeSplit[1]),imgElement);textNode=rightHalfNode}}
else{if(startNode.parentNode!=endNode.parentNode)
return;var node;for(node=startNode;node!=endNode;node=node.nextSibling)
if(node.nodeType==1&&node.tagName!='BR'&&node.tagName!='WBR')
break;if(node!=endNode)
return;var texRange=document.createRange();texRange.setStart(startNode,startNodeOpen);texRange.setEnd(endNode,endNodeClose);var tex=texRange.toString();tex=tex.substring(2,tex.length-2);texRange.detach();var deleteRange=document.createRange();deleteRange.setStart(startNode,startNodeOpen);deleteRange.setEndBefore(endNode);deleteRange.deleteContents();deleteRange.insertNode(createTeXifiedImageElement(tex));var lastString=endNode.nodeValue.substring(endNodeClose);endNode.parentNode.insertBefore(document.createTextNode(lastString),endNode);endNode.nodeValue='';deleteRange.detach()}}
textContentData=function(baseNode,relevantIndexes,riIndex,index,result){var relIndex=relevantIndexes[riIndex];for(var child=baseNode.firstChild;child!=null&&riIndex<relevantIndexes.length;child=child.nextSibling){if(child.nodeType==7||child.nodeType==8)
continue;var newIndex=index+child.textContent.length;while(newIndex>relIndex){if(child.nodeType==3||child.nodeType==4){result.push({node:child,offset:relIndex-index});riIndex++}
else{result=textContentData(child,relevantIndexes,riIndex,index,result);riIndex=result.length}
if(riIndex>=relevantIndexes.length)
break;relIndex=relevantIndexes[riIndex]}
index=newIndex}
return result}
function TeXAFrame(win){try{if(!win.document.body.hasAttribute('_texified')){win.document.addEventListener('keydown',onKeyDown,true);win.document.body.setAttribute('_texified',true)}
var text=win.document.body.textContent;var relevantIndexes=[];while((theMatch=matchRegexpGlobal.exec(text))!=null){relevantIndexes.push(theMatch.index);relevantIndexes.push(theMatch.index+theMatch[0].length-1)}
var data=textContentData(win.document.body,relevantIndexes,0,0,[]);for(var i=0;i<data.length;i+=2)
TeXifyRange(data[i].node,data[i].offset,data[i+1].node,data[i+1].offset+1)}
catch(e){}
for(var i=0,n=win.frames.length;i<n;i++)
TeXAFrame(win.frames[i])}
function reTeXifyImage(event){var text=event.currentTarget.innerHTML;var imgElement=createTeXifiedImageElement(text.substring(1,text.length-1));event.currentTarget.parentNode.replaceChild(imgElement,event.currentTarget)}
function unTeXifyImage(event){var imgElement=event.currentTarget;var newSpanElement=document.createElement('span');newSpanElement.appendChild(document.createTextNode('['+imgElement.title+']'));newSpanElement.addEventListener('dblclick',reTeXifyImage,false);var newOuterSpanElement=document.createElement('span');newOuterSpanElement.appendChild(newSpanElement);imgElement.parentNode.replaceChild(newOuterSpanElement,imgElement)}
function simulateTextTyping(target,str){for(var i=0;i<str.length;i++){var keyEvent=document.createEvent("KeyboardEvent");keyEvent.initKeyEvent("keypress",true,true,null,false,false,false,false,0,str.charCodeAt(i));target.dispatchEvent(keyEvent)}}
function onKeyDown(event){if(event.keyCode==59&&(event.ctrlKey||event.metaKey)&&event.shiftKey){simulateTextTyping(event.target,signature)}}
function TeXTheWorld(){var startTime=new Date();TeXAFrame(window.top)}
if(self==top){TeXTheWorld();setInterval(TeXTheWorld,3000)}

