
function 
text_replacement() 
{
/*
	Modified from the following:
	
	Dynamic Heading Generator
    By Stewart Rosenberger
    http://www.stewartspeak.com/headings/

	This script searches through a web page for specific or general elements
	and replaces them with dynamically generated images, in conjunction with
	a server-side script.
*/
/*
replaceSelector("#links li.sublinks a","/cgi/image.py",true);
replaceSelector("#links li a","/cgi/image.py",true);
replaceSelector("#links li a:hover","/cgi/image.py",true);
*/

replaceSelector("h1", "/cgi/image.py", true);
replaceSelector("#menulogo h2", "/cgi/image.py", true);
replaceSelector("h2.warning", "/cgi/image.py", true);
replaceSelector("h2", "/cgi/image.py", true);
//replaceSelector("h2 span", "/cgi/image.py", true);

replaceSelector("h3.subsection", "/cgi/image.py", true);
replaceSelector("h3.subsection3", "/cgi/image.py", true);
replaceSelector("h3 .subtitle2", "/cgi/image.py", true);
replaceSelector("h3 .subtitle", "/cgi/image.py", true);

/*
replaceSelector("h3","/cgi/image.py",true);
replaceSelector("h3 .subtitle2","/cgi/image.py",true);
replaceSelector("h3 .subtitle","/cgi/image.py",true);
*/

//replaceSelector("h4","/cgi/image.py",true);

var testURL = "test.png" ;

var hideFlicker = false;
var hideFlickerCSS = "flicker.css";
var hideFlickerTimeout = 1000;




/* ---------------------------------------------------------------------------
    For basic usage, you should not need to edit anything below this comment.
    If you need to further customize this script's abilities, make sure
	you're familiar with Javascript. And grab a soda or something.
*/

var items;
var imageLoaded = false;
var documentLoaded = false;

function 
replaceSelector(selector,url,wordwrap)
{
	if(typeof items == "undefined")
		items = new Array();

	items[items.length] = {selector: selector, url: url, wordwrap: wordwrap};
}

if(hideFlicker){		
	document.write('<link id="hide-flicker" rel="stylesheet" media="screen" href="' + hideFlickerCSS + '" />');		
	window.flickerCheck = function(){
		if(!imageLoaded)
			setStyleSheetState('hide-flicker',false);
	};
	setTimeout('window.flickerCheck();',hideFlickerTimeout)
}


/* var test = new Image(); */
/* test.onload = function() { imageLoaded = true; if(documentLoaded) replacement(); }; */
/* test.src = testURL + "?date=" + (new Date()).getTime(); */
/*  */
/* addLoadHandler(function(){ documentLoaded = true; if(!imageLoaded) replacement(); }); */
addLoadHandler(function(){ documentLoaded = true; replacement(); });

function 
documentLoad()
{
	documentLoaded = true;
//	if(imageLoaded)
	replacement();
}
function 
replacement()
{
	var replace = document.createElement("img");
//	var entity = /&nbsp;/g;
	
	for(var i=0;i<items.length;i++){
		var elements = getElementsBySelector(items[i].selector);
		if(elements.length > 0) 
		
			for(var j=0;j<elements.length;j++){				
				if(!elements[j])
					continue;
			
				var text = extractText(elements[j]);
				if (text.length < 1)
					continue;

//				text = text.replace(entity, " ");
				var url = items[i].url + "?text=" + text + "&selector="+escape(items[i].selector);

				var y = replace.cloneNode(true);
				y.src = url;
				y.className = "replacement";
				y.alt = elements[j].firstChild.nodeValue;
				
				elements[j].replaceChild(y,elements[j].firstChild);
				// leave text for google
				var span = document.createElement("span");
				span.style.display = 'none';
				span.className = "print-text";
				span.appendChild(document.createTextNode(text));
				elements[j].appendChild(span);
			}
	}

	if(hideFlicker)
		setStyleSheetState('hide-flicker',false);
}

function 
replacement1()
{
	for(var i=0;i<items.length;i++){
		var elements = getElementsBySelector(items[i].selector);
		if(elements.length > 0) 
		
			for(var j=0;j<elements.length;j++){				
				if(!elements[j])
					continue;
			
				var text = extractText(elements[j]);
				
				if (text.length < 1)
					continue;

				while(elements[j].hasChildNodes())
					elements[j].removeChild(elements[j].firstChild);
				
				 
				var url = items[i].url + "?text=" + text + "&selector="+escape(items[i].selector);
				
				var image = document.createElement("img");
				image.className = "replacement";
				image.alt = text;
				image.src = url;
				image.processed = 1;			
				elements[j].appendChild(image);
	
	/* 			var tokens = items[i].wordwrap ? text.split(' ') : [text] ; */
	/* 			for(var k=0; k<tokens.length; k++){ */
	/* 				var url = items[i].url + "?text="+escape(tokens[k]+' ')+"&selector="+escape(items[i].selector); */
	/* 				 */
	/* 				var image = document.createElement("img"); */
	/* 				image.className = "replacement"; */
	/* 				image.alt = tokens[k] ; */
	/* 				image.src = url; */
	/* 				elements[j].appendChild(image); */
	/* 				 */
	/* 				var debug = document.createElement("p"); */
	/* 				debug.innerHTML = tokens[k];				 */
	/* 				elements[j].appendChild(debug); */
	/* 				 */
	/* 			} */
	
				if(doNotPrintImages){
					var span = document.createElement("span");
					span.style.display = 'none';
					span.className = "print-text";
					span.appendChild(document.createTextNode(text));
					elements[j].appendChild(span);
				}
			}
	}

	if(hideFlicker)
		setStyleSheetState('hide-flicker',false);
}

function 
addLoadHandler(handler)
{
	if(window.addEventListener){
		window.addEventListener("load",handler,false);
	} else if(window.attachEvent){
		window.attachEvent("onload",handler);
	} else if(window.onload){
		var oldHandler = window.onload;
		window.onload = function piggyback(){
			oldHandler();
			handler();
		};
	} else {
		window.onload = handler;
	}
}

function 
setStyleSheetState(id,enabled) 
{
	var sheet = document.getElementById(id);
	if(sheet)
		sheet.disabled = (!enabled);
}

function 
extractText(element)
{
//	return typeof element;
	if(typeof element == "string")
		return element;
	else if(typeof element == "undefined")
		return element;
//	else if(element.innerText)
//		return element.innerText;


	var text = "";
	var kids = element.childNodes;
	for(var i=0;i<kids.length;i++){
		if(kids[i].nodeType == 1) {
//			text += extractText(kids[i]);
//			text +=  kids[i].nodeType;
		} else if(kids[i].nodeType == 3){
			text += kids[i].nodeValue;
//			text +=  kids[i].nodeValue;			
		}	
	}

	return text;
}

/*
	Finds elements on page that match a given CSS selector rule. Some
	complicated rules are not compatible.
	Based on Simon Willison's excellent "getElementsBySelector" function.
	Original code (with comments and description):
		http://simon.incutio.com/archive/2003/03/25/getElementsBySelector
*/
function 
getElementsBySelector(selector)
{
	var tokens = selector.split(' ');
	var currentContext = new Array(document);
	for(var i=0;i<tokens.length;i++){
		token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');
		if(token.indexOf('#') > -1){
			var bits = token.split('#');
			var tagName = bits[0];
			var id = bits[1];
			var element = document.getElementById(id);
			if(tagName && element.nodeName.toLowerCase() != tagName)
				return new Array();
			currentContext = new Array(element);
			continue;
		}

		if(token.indexOf('.') > -1){
			var bits = token.split('.');
			var tagName = bits[0];
			var className = bits[1];
			if(!tagName)
				tagName = '*';

			var found = new Array;
			var foundCount = 0;
			for(var h=0;h<currentContext.length;h++){
				var elements;
				if(tagName == '*')
					elements = currentContext[h].all ? currentContext[h].all : currentContext[h].getElementsByTagName('*');
				else
					elements = currentContext[h].getElementsByTagName(tagName);

				for(var j=0;j<elements.length;j++)
					found[foundCount++] = elements[j];
			}

			currentContext = new Array;
			var currentContextIndex = 0;
			for(var k=0;k<found.length;k++){
				if(found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b')))
					currentContext[currentContextIndex++] = found[k];
			}

			continue;
	    }

		if(token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)){
			var tagName = RegExp.$1;
			var attrName = RegExp.$2;
			var attrOperator = RegExp.$3;
			var attrValue = RegExp.$4;
			if(!tagName)
				tagName = '*';

			var found = new Array;
			var foundCount = 0;
			for(var h=0;h<currentContext.length;h++){
				var elements;
	        	if(tagName == '*')
					elements = currentContext[h].all ? currentContext[h].all : currentContext[h].getElementsByTagName('*');
				else
					elements = currentContext[h].getElementsByTagName(tagName);

				for(var j=0;j<elements.length;j++)
					found[foundCount++] = elements[j];
			}

			currentContext = new Array;
			var currentContextIndex = 0;
			var checkFunction;
			switch(attrOperator){
				case '=':
					checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };
					break;
				case '~':
					checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); };
					break;
				case '|':
					checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };
					break;
				case '^':
					checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };
					break;
				case '$':
					checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };
					break;
				case '*':
					checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };
					break;
				default :
					checkFunction = function(e) { return e.getAttribute(attrName); };
			}

			currentContext = new Array;
			var currentContextIndex = 0;
			for(var k=0;k<found.length;k++){
				if(checkFunction(found[k]))
					currentContext[currentContextIndex++] = found[k];
			}

			continue;
		}

		tagName = token;
		var found = new Array;
		var foundCount = 0;
		for(var h=0;h<currentContext.length;h++){
			var elements = currentContext[h].getElementsByTagName(tagName);
			for(var j=0;j<elements.length; j++)
				found[foundCount++] = elements[j];
		}

		currentContext = found;
	}

	return currentContext;
}


}// end of scope, execute code

var W3CDOM = (document.createElement && document.getElementsByTagName);
if (W3CDOM)
	if(document.createElement && document.getElementsByTagName && !navigator.userAgent.match(/opera\/?6/i))
		text_replacement();
