
var gFIRLoadTimeout   = 100;
var gFIRAbortTimeout  = 2000;

var gFIRStyleOpen1   = "<style type=\"text/css\" media=\"";
var gFIRStyleOpen2   = "\">";
var gFIRStyleClose   = "</style>";
var gFIRStyleVisible = "{visibility: visible;}";
var gFIRStyleHidden  = "{visibility: hidden;}";
var gFIRStyleExclude = "{display:    none;}";

var gFIRQueueFlag     = false
var gFIRStaticQueue   = Array();
var gFIRDynamicQueue  = Array();
var gFIRSuffix        = new Date().getTime();
var gFIRObjTest       = (document.getElementById && document.createElement && document.getElementsByTagName)? true : false;

function fnSetFIRTestImagePath(aPath) {
}

function fnInitFIR(aTestImagePath) {

	if (gFIRObjTest) {
		var lTestImage    = new Image();
		lTestImage.src    = aTestImagePath + "?" + gFIRSuffix;
		gFIRSuffix        = false;
		lTestImage.onload = fnStartFIR;
		gFIRQueueFlag     = true;
		queueLoad("fnAbortFIR",false);
		fnStartFIR();
	}
}


function fnQueueStaticFIR ( aSelector,
							aMediaTypes,
							aClassOrId,
							aRegexReplace,
							aReplaceString )
							{

	if (aClassOrId == "id" || aClassOrId == "classname") {
		var lFIRObj           = new Object;
		lFIRObj.selector      = aSelector;
		lFIRObj.mediaTypes    = aMediaTypes;
		lFIRObj.altMediaTypes = fnGetAlternateMediaTypes(aMediaTypes);
		lFIRObj.classOrId     = aClassOrId;
		lFIRObj.regexReplace  = aRegexReplace;
		lFIRObj.replaceString = aReplaceString;
		gFIRStaticQueue[gFIRStaticQueue.length] = lFIRObj;
		
		
		document.writeln(gFIRStyleOpen1 + lFIRObj.mediaTypes    + gFIRStyleOpen2 + lFIRObj.selector +           gFIRStyleHidden  + gFIRStyleClose);
		document.writeln(gFIRStyleOpen1 + lFIRObj.mediaTypes    + gFIRStyleOpen2 + lFIRObj.selector + " span" + gFIRStyleExclude + gFIRStyleClose);

		if (aMediaTypes.toLowerCase() != "all") {
			document.writeln(gFIRStyleOpen1 + lFIRObj.altMediaTypes + gFIRStyleOpen2 + lFIRObj.selector + " img"  + gFIRStyleExclude + gFIRStyleClose);
		}
	}
}


function fnGetAlternateMediaTypes(aMediaTypes) {
	lTypes = aMediaTypes.split(",");
	lAltTypes               = new Array();
	lAltTypes['screen']     = true;
	lAltTypes['tty']        = true;
	lAltTypes['tv']         = true;
	lAltTypes['projection'] = true;
	lAltTypes['handheld']   = true;
	lAltTypes['print']      = true;
	lAltTypes['braille']    = true;
	lAltTypes['aural']      = true;

	for (var i=0; i < lTypes.length; i++) {
		lType = lTypes[i].replace(/^\s+/,"").replace(/\s+$/,""); // Strip whitespace
		lAltTypes[lType] = false;
	}
	
	lAltTypesString = "";

	for (iType in lAltTypes) {
		lTypeSeperator = (lAltTypesString.length > 1)? ", " : "";
		if (lAltTypes[iType]) {lAltTypesString += lTypeSeperator + iType};
	}

	return lAltTypesString;

}


function fnStaticFIR () {

	var lImageElement = document.createElement("img");

	for (var i=0; i < gFIRStaticQueue.length; i++) {
		
		
		var lElements = document.getElementsBySelector(gFIRStaticQueue[i].selector);
		for (var j=0; j < lElements.length; j++) {

			var lRegexSource = null;
			if      (gFIRStaticQueue[i].classOrId == "id"        && lElements[j].id)        { lRegexSource = lElements[j].id; }
			else if (gFIRStaticQueue[i].classOrId == "classname" && lElements[j].classname) { lRegexSource = lElements[j].classname; }

			if (lRegexSource != null) {

				var lRegExp              = new RegExp(gFIRStaticQueue[i].regexReplace)
				var lStaticSourceFile    = lRegexSource.replace(lRegExp, gFIRStaticQueue[i].replaceString)
				var lReplacmentImage     = lImageElement.cloneNode(true);
				var lReplacmentPrintSpan = document.createElement("span");

				lReplacmentImage.src  = lStaticSourceFile;
				lReplacmentImage.style.visibility = "visible";


				if (lElements[j].firstChild.nodeName.toLowerCase() == "a") {
					lReplacmentImage.alt = lElements[j].firstChild.firstChild.nodeValue;
					lReplacmentPrintSpan.appendChild(document.createTextNode(lReplacmentImage.alt))
					lElements[j].firstChild.replaceChild(lReplacmentImage, lElements[j].firstChild.firstChild);
					lElements[j].firstChild.appendChild(lReplacmentPrintSpan);
				} else {
					lReplacmentImage.alt = lElements[j].firstChild.nodeValue;
					lReplacmentPrintSpan.appendChild(document.createTextNode(lReplacmentImage.alt))
					lElements[j].replaceChild(lReplacmentImage, lElements[j].firstChild);
					lElements[j].appendChild(lReplacmentPrintSpan);
				}
				lElements[j].style.visibility = "visible";
			}
		}
	}
}



function fnStartFIR() {
	gFIRQueueFlag = false;

	if (gLoaded) { fnStaticFIR(); }
	else         { setTimeout(fnStartFIR,gFIRLoadTimeout); }

}

function fnAbortFIR(aTimeoutBoolean) {
	if (gFIRQueueFlag && !aTimeoutBoolean) {
		setTimeout("fnAbortFIR(true)",gFIRAbortTimeout);
	} else if (gFIRQueueFlag && aTimeoutBoolean) {
		for (var i=0; i < gFIRStaticQueue.length; i++) {
			var lElements = document.getElementsBySelector(gFIRStaticQueue[i].selector);
			for (var j=0; j < lElements.length; j++) {
				lElements[j].style.visibility = "visible";
			}
		}
	}

}

document.getElementsBySelector = function(aSelector) {

	if (!document.getElementsByTagName) {return new Array();}

	var lSelectors       = aSelector.split(" ");
	var lCurrentContext = new Array(document);

	for (var i=0; i < lSelectors.length; i++) {
		lSelector = lSelectors[i].replace(/^\s+/,"").replace(/\s+$/,"");
		if (lSelector.indexOf("#") != -1) {
			var lSelectorBits = lSelector.split("#"); 
			var lElementName  = lSelectorBits[0];
			var lElementId    = lSelectorBits[1];
			var lElementRef   = document.getElementById(lElementId);
			if ((lElementName && lElementRef.nodeName.toLowerCase() != lElementName) || !lElementRef) {
				return new Array();
			}
			lCurrentContext = new Array(lElementRef);
			continue;
		}
		if (lSelector.indexOf('.') != -1) {

			var lSelectorBits = lSelector.split(".");
			var lElementName  = lSelectorBits[0];
			var lClassName    = lSelectorBits[1];

			if (!lElementName) {lElementName = '*';}
			
			var lMatches = new Array();

			for (var iElement=0; iElement < lCurrentContext.length; iElement++) {
				var lMatchingElements = (lElementName == "*")? fnGetAllChildren(lCurrentContext[iElement]) : lCurrentContext[iElement].getElementsByTagName(lElementName);
				for (var iMatch = 0; iMatch < lMatchingElements.length; iMatch++) {
					lMatches[lMatches.length] = lMatchingElements[iMatch];
				}
			}

			lCurrentContext = new Array();

			for (var iMatch = 0; iMatch < lMatches.length; iMatch++) {
				if (lMatches[iMatch].className && lMatches[iMatch].className.match(new RegExp('\\b'+lClassName+'\\b'))) {
					lCurrentContext[lCurrentContext.length] = lMatches[iMatch];
				}
			}
			continue;
		}

		lElementName = lSelector;
		var lMatch = new Array();
		
		for (var iElement = 0; iElement < lCurrentContext.length; iElement++) {

			var lMatchingElements = lCurrentContext[iElement].getElementsByTagName(lElementName);
			for (var iMatch = 0; iMatch < lMatchingElements.length; iMatch++) {
				lMatch[lMatch.length] = lMatchingElements[iMatch];
			}
		}
		lCurrentContext = lMatch;
	}
	return lCurrentContext;
};

function getAllChildren(aElement) {return (aElement.all)? aElement.all : aElement.getElementsByTagName("*");}