/*	Named Arguments Version 1.0.1
	Copyright 2004 Mark Wubben

	Adds named arguments support to JavaScript. See also <http://novemberborn.net/javascript/named-arguments>
	This software is licensed under the CC-GNU LGPL <http://creativecommons.org/licenses/LGPL/2.1/>
*/

function named(oArgs){ 
	return new named.Arguments(oArgs);
};

named.Arguments = function(oArgs){
	this.oArgs = oArgs;
};

named.Arguments.prototype.constructor = named.Arguments;

named.extract = function(listPassedArgs, oMapping){
	var oNamedArgs, passedArg;
	
	for(var i = 0; i < listPassedArgs.length; i++){
		passedArg = listPassedArgs[i];
		if(passedArg != null && passedArg.constructor != null && passedArg.constructor == named.Arguments){
			oNamedArgs = listPassedArgs[i].oArgs; // oNamedArgs isn't the named.Arguments class!
			break;
		};
	};
	
	if(oNamedArgs == null){ return };
	
	for(var sName in oNamedArgs){
		if(sName in oMapping){
			oMapping[sName](oNamedArgs[sName]);
		};
	};
	
	return;
};

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("h1.h1-dtr","/includes/dtr/heading.php",true);
replaceSelector("div.content h1.h1-dtr","/includes/dtr/heading.php",true,
				named({background_color: "#5B83B3", shadow_offset: "1"}));

var content_header_template = named({url: "/includes/dtr/heading.php",
									    wordwrap: true, background_color: "#324B6B", shadow_offset: "1", 
					   				 font_size: "14", font_file: "VERDANAZ.TTF"});
replaceSelector("div.content-txt h2", content_header_template);
replaceSelector("div.content-txt h1", content_header_template);

var sidebar_header_template = named({url: "/includes/dtr/heading.php",
									 wordwrap: true, shadow_offset: "1"})
replaceSelector("div.container.menu h1.h1-menu", sidebar_header_template );
replaceSelector("div.container.menu h2.h2-menu", sidebar_header_template );
replaceSelector("div.container h1.h1-dtr", sidebar_header_template );
replaceSelector("#masthead div.account-details h1.h1-dtr", sidebar_header_template );

replaceSelector("#masthead div.login h1.h1-dtr",
                named({url: "/includes/dtr/heading.php", background_color: "#719DCA", 
							 wordwrap: true, shadow_offset: "1"}));

replaceSelector("#sidebar h2.dtr", 
                named({url: "/includes/dtr/heading.php", font_size: "13", 
                       background_color: "#B9CFE5", wordwrap: false, 
                       shadow_offset: "1"}));

replaceSelector("div.box h2.dtr", 
                named({url: "/includes/dtr/heading.php", font_size: "14", 
                       background_color: "#C1E4CD", wordwrap: true, 
                       font_color: "#16377E", shadow_color: "#ffffff", shadow_offset: "2"}));

var h3_template = named({url: "/includes/dtr/heading.php", font_size: "12", 
                       wordwrap: true, font_file: "arial.ttf"});
replaceSelector("#masthead-box h3", h3_template);
var h3_template = named({url: "/includes/dtr/heading.php", font_size: "10", shadow_color: "#000000", shadow_offset: "1", 
                       background_color: "#5175A1", wordwrap: true, font_file: "VERDANAZ.TTF"});
replaceSelector("h3.h3-dtr", h3_template);

var h3_template = named({url: "/includes/dtr/heading.php", font_size: "10", shadow_color: "#ffffff", shadow_offset: "1", 
                       background_color: "#FFE7C4", wordwrap: true, font_color: "#935800", font_file: "VERDANAZ.TTF"});
replaceSelector("h3.h3-product-box-dtr", h3_template);

var testURL = "/includes/dtr/test.png" ;

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

var hideFlicker = false;
var hideFlickerCSS = "replacement-screen.css";
var hideFlickerTimeout = 500;

var textTransform = "uppercase";


/* ---------------------------------------------------------------------------
    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,
						 font_file, font_size, font_color,
						 shadow_color, shadow_offset,
						 background_color, transparent_background,
						 cache_images, cache_folder)
{
	/*	Extract any named arguments.	*/
	named.extract(arguments, {
		selector : function(value){ selector = value },
		url : function(value){ url = value },
		wordwrap : function(value){ wordwrap = value },
		font_file : function(value){ font_file = value },
		font_size : function(value){ font_size = value },
		font_color : function(value){ font_color = value },
		shadow_color : function(value){ shadow_color = value },
		shadow_offset : function(value){ shadow_offset = value },
		background_color : function(value){ background_color = value },
		transparent_background : function(value){ transparent_background = value },
		cache_images : function(value){ cache_images = value },
		cache_folder : function(value){ cache_folder = value }
	});		
	selector = ((typeof selector == 'object') || (typeof selector == 'undefined')) ? '' : selector;
	url = ((typeof url == 'object') || (typeof url == 'undefined')) ? '' : url;
	wordwrap = ((typeof wordwrap == 'object') || (typeof wordwrap == 'undefined')) ? '' : wordwrap;
	font_file = ((typeof font_file == 'object') || (typeof font_file == 'undefined')) ? '' : font_file;
	font_size = ((typeof font_size == 'object') || (typeof font_size == 'undefined')) ? '' : font_size;
	font_color = ((typeof font_color == 'object') || (typeof font_color == 'undefined')) ? '' : font_color;
	shadow_color = ((typeof shadow_color == 'object') || (typeof shadow_color == 'undefined')) ? '' : shadow_color;
	shadow_offset = ((typeof shadow_offset == 'object') || (typeof shadow_offset == 'undefined')) ? '' : shadow_offset;
	background_color = ((typeof background_color == 'object') || (typeof background_color == 'undefined')) ? '' : background_color;
	transparent_background = ((typeof transparent_background == 'object') || (typeof transparent_background == 'undefined')) ? '' : transparent_background;
	cache_images = ((typeof cache_images == 'object') || (typeof cache_images == 'undefined')) ? '' : cache_images;
	cache_folder = ((typeof cache_folder == 'object') || (typeof cache_folder == 'undefined')) ? '' : cache_folder;

	if(typeof items == "undefined")
		items = new Array();
	
	
	
	items[items.length] = {selector: selector, url: url, wordwrap: wordwrap,
						   font_file: font_file, font_size: font_size, font_color: font_color,
						   shadow_color: shadow_color, shadow_offset: shadow_offset,
						   background_color: background_color, transparent_background: transparent_background,
						   cache_images: cache_images, cache_folder: cache_folder};
}

window.onbeforeloadDTR = function() {
	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 + '" />');
	
};
document.write("<script>window.onbeforeloadDTR();</script>");

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()
{
	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]);
			var tt = elements[j].style.textTransform;
			if (tt) textTransform = tt.toLowerCase();
			switch (textTransform) {
				case "lowercase": text = text.toLowerCase(); break;
				case "uppercase": text = text.toUpperCase(); break;
			}

			//var ts = elements[j].getAttribute('font-style');
			//if (ts) ts = "&style="+escape(ts); else ts = "";
    		while(elements[j].hasChildNodes())
				elements[j].removeChild(elements[j].firstChild);

			var tokens = items[i].wordwrap ? text.split(' ') : [text] ;
			for(var k=0;k<tokens.length;k++)
			{
				var itm = items[i];
				var url = itm.url + "?text="+escape(tokens[k]+' ')+"&selector="+escape(itm.selector);//+ts;
				url += "&font_file="+escape(itm.font_file)+"&font_size="+escape(itm.font_size)+"&font_color="+escape(itm.font_color)
					+"&shadow_color="+escape(itm.shadow_color)+"&shadow_offset="+escape(itm.shadow_offset)
					+"&background_color="+escape(itm.background_color)+"&transparent_background="+escape(itm.transparent_background)
					+"&cache_images="+escape(itm.cache_images)+"&cache_folder="+escape(itm.cache_folder);
				//alert(url);
				var image = document.createElement("img");
				image.className = "replacement";
				image.alt = tokens[k] ;
				image.title = text;
				image.src = url;
				elements[j].appendChild(image);
			}

			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 = function () { 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;
}

/*
	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
if(document.createElement && document.getElementsByTagName && !navigator.userAgent.match(/opera\/?6/i))
	com_stewartspeak_replacement();
