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.
*/


//	replaceSelector('h3.replace', 'text-image.aspx', false);
//	replaceSelector('span.replace', 'text-image.aspx', false);
imageSelector('div.jobs-by-interest a.more', 'image/gui/button/more.gif', false);
imageSelector('div.shadow a.more', 'image/gui/button/more.gif', false);
//linkSelector('div#content a', 'ext', true);

var testURL = 'image/1x1transparent.gif';

var doNotPrintImages = false;
var printerCSS = 'replacement-print.css';

var hideFlicker = false;
var hideFlickerCSS = '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 imgs;
var items;
var links;
var imageLoaded = false;
var documentLoaded = false;

function imageSelector(selector, url, alt)
{

	if ( typeof imgs == 'undefined' )
		imgs = new Array();

	imgs[imgs.length] = { selector: selector, url: url, alt: alt };
}

function linkSelector(selector, cls, popup)
{

	if ( typeof links == 'undefined' )
		links = new Array();

	links[links.length] = { selector: selector, cls: cls, popup: popup };
}

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)
}

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();

addLoadHandler(function() { documentLoaded = true; if ( imageLoaded ) replacement(); });

function documentLoad()
{
	documentLoaded = true;

	if ( imageLoaded )
		replacement();
}

function replacement()
{
	var color;
	var css;
	var elements;
	var fontsize;
	var img;
	var rgb;
	var span;
	var text;
	var tokens;
	var url;

	var i = (typeof items == 'undefined' ? 0 : items.length);

	while ( i-- > 0 ) {
		elements = getElementsBySelector(items[i].selector);

		if ( elements.length > 0 )

			for ( var j = 0; j < elements.length; j++ ) {

				if ( !elements[j] )
					continue;

				text = extractText(elements[j]);

				while ( elements[j].hasChildNodes() )
					elements[j].removeChild(elements[j].firstChild);

				tokens = items[i].wordwrap ? text.split(' ') : [text] ;

				for ( var k = 0; k < tokens.length; k++ ) {
//					url = items[i].url + '?text=' + escape(tokens[k]+' ') + '&selector=' + escape(items[i].selector);
					url = items[i].url + '?text=' + escape(tokens[k]+' ');
					fontsize = -1;

					if ( document.defaultView && document.defaultView.getComputedStyle ) {
						color = document.defaultView.getComputedStyle(elements[j], null);
						css = color.getPropertyCSSValue('color');
						rgb = css.getRGBColorValue();
						fontsize = color.getPropertyCSSValue('font-size').getFloatValue(5);
						color = htmlColor(rgb);
					} else if ( elements[j].currentStyle ) {
						color = elements[j].currentStyle.color;
						fontsize = elements[j].currentStyle.fontSize;

						if ( fontsize.toLowerCase().substr(fontsize.length - 2, 2) == 'em' ) {
							fontsize = fontsize.substr(0, fontsize.length - 2);
							fontsize = fontsize * 10;
						}
					}

					if ( color.length )
						url += '&fontcolor=' + escape(color);

					if ( fontsize > 0 )
						url += '&fontsize=' + Math.ceil(fontsize).toString();
					else
						alert('\'' + fontsize + '\'');

					img = document.createElement('img');

					img.className = 'replacement';
					img.alt = tokens[k];
					img.src = url;
					elements[j].appendChild(img);
				}

				if ( doNotPrintImages ) {
					span = document.createElement('span');
					span.style.display = 'none';
					span.className = 'print-text';
					span.appendChild(document.createTextNode(text));
					elements[j].appendChild(span);
				}
			}
	}

	i = (typeof imgs == 'undefined' ? 0 : imgs.length);

	while ( i-- > 0 ) {
		elements = getElementsBySelector(imgs[i].selector);

		if ( elements.length > 0 ) {

			for ( var j = 0; j < elements.length; j++ ) {

				if ( elements[j] ) {
					text = extractText(elements[j]);

					while ( elements[j].hasChildNodes() )
						elements[j].removeChild(elements[j].firstChild);

					img = document.createElement('img');
					img.className = 'replacement';

					if ( imgs[i].alt && imgs[i].alt != '' )
						img.alt = imgs[i].alt;
					else

						if ( text && text != '' )
							img.alt = text;

					img.src = imgs[i].url;
					elements[j].appendChild(img);

					if ( elements[j].tagName.toLowerCase() == 'a' && img.alt != '' )
						elements[j].title = img.alt;
				}
			}
		}
	}

	var domain = '://' + document.domain.toLowerCase();

	i = (typeof links == 'undefined' ? 0 : links.length);

	while ( i-- > 0 ) {
		elements = getElementsBySelector(links[i].selector);

		if ( elements.length > 0 ) {

			for ( var j = 0; j < elements.length; j++ ) {

				if ( elements[j] ) {
					href = elements[j].getAttribute('href');

					if ( href ) {
						var protocol = href.indexOf('://');

						if ( protocol > -1 && href.toLowerCase().indexOf(domain) != protocol )  {

							if ( !findImage(elements[j]) ) {
								var cls = elements[j].className;

								if ( cls == undefined || cls.length == 0 )
									elements[j].className = links[i].cls;
/*
								else
									elements[j].className = cls + ' ' + links[i].cls;
*/
							}

							if ( links[i].popup == true )
								elements[j].setAttribute('target', '_blank');
						}
					}
				}
			}
		}
	}

	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)
{
	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;
}

function findImage(element)
{
	var childCount;
	var children;
	var imgFound = false;

	if ( typeof element != 'undefined' ) {
		children = element.childNodes;
		childCount = children.length;

		while ( childCount-- > 0 && !imgFound ) {
			var child = children[childCount];

			if ( child.nodeType == 1 ) {

				if ( child.nodeName.toLowerCase() == 'img' ) {
					imgFound = true;
				} else {
					imgFound = findImage(child);
				}
			}
		}
	}

	return imgFound;
}

/*
	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;
}

function hexValue(val, len)
{
	var out = '';
	var i = 0;

	while ( i++ < len )
		out += '0';

	out += val.toString(16);

	return out.substr(0 - len, len);
}

function htmlColor(rgb)
{
	return '#' + hexValue(rgb.red.getFloatValue(1), 2)  + hexValue(rgb.green.getFloatValue(1), 2) + hexValue(rgb.blue.getFloatValue(1), 2);
}

function printIt (s)
{
	document.write('<pre>' + escape(s).replace(/\%([0-9a-f])([0-9a-f])/gi, '&#x$1$2;') + '</pre>\r\n');
}

}// end of scope, execute code

if ( document.createElement && document.getElementsByTagName && !navigator.userAgent.match(/opera\/?6/i) )
	com_stewartspeak_replacement();
