function com_stewartspeak_replacement() {
/*
	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.

	* Modified by grigri, 2007
*/

if (typeof(baseURL) == 'undefined') {
  baseURL = document.getElementsByTagName("script")[0].src.replace(/js\/.*$/, '');
}

replaceSelector('h1', 'h1', baseURL + 'img', true);
replaceSelector('h2', '#main h2', baseURL + 'img', true);
//replaceSelector('h3', '#main h3', baseURL + 'img', true);

/*
replaceSelector("h1 small", baseURL + "img/h1-sub.php",true);
replaceSelector("h1 span", baseURL + "img/h1-top.php",true);

replaceSelector("#featured h2 small", baseURL + "img/h2-sub.php",true);
replaceSelector("#featured h2 span", baseURL + "img/h2-top.php",true);

replaceSelector("#inset h2", baseURL + "img/h3.php",true);

replaceSelector("h3", baseURL + "img/h3.php",true);
*/

var testURL = baseURL + "img/pixel.png" ;

var doNotPrintImages = false;
var printerCSS = baseURL + "css/replacement-print.css";

var hideFlicker = false;//true;
var hideFlickerCSS = baseURL + "css/replacement-screen.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 trim( str ) {
  return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}

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

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

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)
}

if(doNotPrintImages)
	document.write('<link id="print-text" rel="stylesheet" media="print" href="' + printerCSS + '" />');

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

window.ContentLoaded(window, function() { documentLoaded = true; if(imageLoaded) replacement(); });

function documentLoad()
{
	documentLoaded = true;
	if(imageLoaded)
		replacement();
}

function replacement()
{
  // added by grigri
  if (document.location.protocol == 'file:') { return; }
  // end added by grigri

  var done_elements = [];

	for(var i=0;i<items.length;i++)
	{
    var elements = getElementsBySelector(items[i].selector);

		//alert(items[i].selector + "\n\n" + elements.length);

		if(elements.length > 0) for(var j=0;j<elements.length;j++)
		{
			if(!elements[j])
				continue ;

      // added by grigri
      var base_url = items[i].url;
			if(items[i].callback && !items[i].callback(elements[j], base_url))
        continue;
      // end added by grigri

      var already_done = false;
      for (var k=0; k<done_elements.length; k++) {
        if (done_elements[k] == elements[j]) {
          already_done = true; break;
        }
      }
      if (already_done) { continue; }

			var text = trim(extractText(elements[j]));
			
    	while(elements[j].hasChildNodes())
				elements[j].removeChild(elements[j].firstChild);

			var tokens = items[i].wordwrap ? text.split(/\s+/) : [text] ;
			for(var k=0;k<tokens.length;k++)
			{
			  if (tokens[k].length == 0) {
				  continue;
				}
			  var url = base_url + '/titles/' + items[i].alias + '/?text=' + encodeURIComponent(tokens[k]);
				//if (window.ActiveXObject) {
        //  url += '&rand=' + Math.floor(Math.random() * 1000);
				//}
				if (k > 0) {
				  elements[j].appendChild(document.createTextNode(' '));
				}
				
				if (window.ActiveXObject) {
				  var image = document.createElement('<img src="'+url+'" class="replacement" alt="'+(tokens[k].replace(/</g, '&lt;').replace(/>/g, '&gt;'))+'" />');
				}
				else {
					var image = document.createElement("img");
					image.className = "replacement";
					image.alt = tokens[k] ;
					image.src = url;
				}
				elements[j].appendChild(image);
			}
			
			elements[j].className = (elements[j].className+' replaced').replace(/^\s+/, '');

			if(doNotPrintImages)
			{
				var span = document.createElement("span");
				span.style.display = 'none';
				span.className = "print-text";
				span.appendChild(document.createTextNode(text));
				elements[j].appendChild(span);
			}

			done_elements[done_elements.length] = elements[j];
		}
	}

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

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

function extractText(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]);
		else if(kids[i].nodeType == 3)
		text += kids[i].nodeValue;
	}

	return text;
}

//Get DOM elements based on the given CSS Selector - V 1.00.A Beta
//http://www.openjs.com/scripts/dom/css_selector/
function getElementsBySelector(all_selectors) {
	var selected = new Array();
	if(!document.getElementsByTagName) return selected;
	all_selectors = all_selectors.replace(/\s*([^\w])\s*/g,"$1");//Remove the 'beutification' spaces
	var selectors = all_selectors.split(",");
	// Grab all of the tagName elements within current context
	var getElements = function(context,tag) {
		if (!tag) tag = '*';
		// Get elements matching tag, filter them for class selector
		var found = new Array;
		for (var a=0,len=context.length; con=context[a],a<len; a++) {
			var eles;
			if (tag == '*') eles = con.all ? con.all : con.getElementsByTagName("*");
			else eles = con.getElementsByTagName(tag);

			for(var b=0,leng=eles.length;b<leng; b++) found.push(eles[b]);
		}
		return found;
	}

	COMMA:
	for(var i=0,len1=selectors.length; selector=selectors[i],i<len1; i++) {
		var context = new Array(document);
		var inheriters = selector.split(" ");

		SPACE:
		for(var j=0,len2=inheriters.length; element=inheriters[j],j<len2;j++) {
			//This part is to make sure that it is not part of a CSS3 Selector
			var left_bracket = element.indexOf("[");
			var right_bracket = element.indexOf("]");
			var pos = element.indexOf("#");//ID
			if(pos+1 && !(pos>left_bracket&&pos<right_bracket)) {
				var parts = element.split("#");
				var tag = parts[0];
				var id = parts[1];
				var ele = document.getElementById(id);
				if(!ele || (tag && ele.nodeName.toLowerCase() != tag)) { //Specified element not found
					continue COMMA;
				}
				context = new Array(ele);
				continue SPACE;
			}

			pos = element.indexOf(".");//Class
			if(pos+1 && !(pos>left_bracket&&pos<right_bracket)) {
				var parts = element.split('.');
				var tag = parts[0];
				var class_name = parts[1];

				var found = getElements(context,tag);
				context = new Array;
 				for (var l=0,len=found.length; fnd=found[l],l<len; l++) {
 					if(fnd.className && fnd.className.match(new RegExp('(^|\s)'+class_name+'(\s|$)'))) context.push(fnd);
 				}
				continue SPACE;
			}

			pos = element.indexOf(">");//Child
			if(pos+1 && !(pos>left_bracket&&pos<right_bracket)) {
        alert(element);
			}

			if(element.indexOf('[')+1) {//If the char '[' appears, that means it needs CSS 3 parsing
				// Code to deal with attribute selectors
				if (element.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?['"]?([^\]'"]*)['"]?\]$/)) {
					var tag = RegExp.$1;
					var attr = RegExp.$2;
					var operator = RegExp.$3;
					var value = RegExp.$4;
				}
				var found = getElements(context,tag);
				context = new Array;
				for (var l=0,len=found.length; fnd=found[l],l<len; l++) {
 					if(operator=='=' && fnd.getAttribute(attr) != value) continue;
					if(operator=='~' && !fnd.getAttribute(attr).match(new RegExp('(^|\\s)'+value+'(\\s|$)'))) continue;
					if(operator=='|' && !fnd.getAttribute(attr).match(new RegExp('^'+value+'-?'))) continue;
					if(operator=='^' && fnd.getAttribute(attr).indexOf(value)!=0) continue;
					if(operator=='$' && fnd.getAttribute(attr).lastIndexOf(value)!=(fnd.getAttribute(attr).length-value.length)) continue;
					if(operator=='*' && !(fnd.getAttribute(attr).indexOf(value)+1)) continue;
					else if(!fnd.getAttribute(attr)) continue;
					context.push(fnd);
 				}

				continue SPACE;
			}

			//Tag selectors - no class or id specified.
			var found = getElements(context,element);
			context = found;
		}
		for (var o=0,len=context.length;o<len; o++) selected.push(context[o]);
	}
	return selected;
}


}// end of scope, execute code
if(document.createElement && document.getElementsByTagName && !navigator.userAgent.match(/opera\/?6/i))
	com_stewartspeak_replacement();
