/*	sIFR v2.0.2 SOURCE
	Copyright 2004 - 2006 Mike Davidson, Shaun Inman, Tomas Jogin and Mark Wubben

	This software is licensed under the CC-GNU LGPL <http://creativecommons.org/licenses/LGPL/2.1/>
*/

var SIFR_CHAR = new Array();
var SIFR_CHAR_WIDTH = new Array();
var SIFR_CHAR_DESC = new Array();
var SIFR_CHAR_ASC = new Array();
var SIFR_KERNING = new Array();
var SIFR_Interpreter = function(tag, width, sFlashFile) {

    var words = new Array();
	var delimiters = new Array();
    var lines = 1;
	width -= 4;
	for (font = 0; font<SIFR_CHAR.length; font++) {
		if (SIFR_CHAR[font][0] == sFlashFile) {
			break;
		}
	}
    newTag = tag.replace(/[\s][\s]*/g," ");
    newTag = newTag.replace(/<BR[\/]*>/gi,"\n");			// replace BR tag with new line symbol
    newTag = newTag.replace(/<[a-z\/][a-z0-9=" \/%^'(),.:;!?_@#+\-*]*>[\s]*/gi, ""); // remove all tags 
    newTag = newTag.replace(/&lt;/g,"<");
    newTag = newTag.replace(/&rt;/g,">");
    newTag = newTag.replace(/&nbsp;/g," ");
	j=0;
	words[0] = ""
	for (i=0; i<newTag.length; i++) {
		if ((newTag.charAt(i) != " ") && (newTag.charAt(i) != ".") && (newTag.charAt(i) != ";") && (newTag.charAt(i) != ":") && (newTag.charAt(i) != ",") && (newTag.charAt(i) != "\\") && (newTag.charAt(i) != "\/") && (newTag.charAt(i) != "\n")) {
			words[j] += newTag.charAt(i);
		} else {
			delimiters[j] = newTag.charAt(i);
			j++;
			words[j] = "";
		}
	}
    if (words==null || words.length==null) return 0;
    currWidth = 0;
    newStr = "";
    for(i=0; i<words.length; i++) {         // for each word we calculate
		if (words[i] == "") {
			if ((i < delimiters.length) && ((currWidth != 0) || (delimiters[i] != " "))) {
				if (delimiters[i] == "\n") {					
					newStr += "\n";
    		        currWidth = 0;				// increment the number of lines
   	    		    lines++;
				} else if (currWidth + getCharWidth(delimiters[i].charCodeAt(0)) > width) {
					newStr += "\n";
    		        currWidth = 0;				// increment the number of lines
   	    		    lines++;
					if (delimiters[i] != " ") {
						newStr += delimiters[i];
						currWidth += getCharWidth(delimiters[i].charCodeAt(0));
					}
				} else {
					newStr += delimiters[i];
					currWidth += getCharWidth(delimiters[i].charCodeAt(0));
				}
			}
			continue;	
		}
        thisWidth = getWordWidth(words[i]); // the size
		if ((i < delimiters.length) && (delimiters[i] != " ")) {
			thisWidth += getCharWidth(delimiters[i].charCodeAt(0))
		}
        currWidth += thisWidth;
        if (currWidth>width) {              // if the line exceeds our width
			if (currWidth == thisWidth) {
				currWidth = 0;
		        for(ii=0; ii<words[i].length; ii++) {
    		        currWidth += getCharWidth(words[i].charCodeAt(ii));
					if (ii<words[i].length-1) {
	        		    word_width += getCharKerning(words[i].charCodeAt(ii), words[i].charCodeAt(ii+1));
					}
					if (currWidth>width) {
						newStr += "\n";
    			        currWidth = getCharWidth(words[i].charCodeAt(ii));					// increment the number of lines
        	    		lines++;
					}
					newStr += words[i].charAt(ii);
	    	    }
				if (i < delimiters.length) {
					if (delimiters[i] == "\n") {					
						newStr += "\n";
    			        currWidth = 0;				// increment the number of lines
   	    			    lines++;
					} else if (currWidth + getCharWidth(delimiters[i].charCodeAt(0)) > width) {
						newStr += "\n";
	    		        currWidth = 0;				// increment the number of lines
    	    		    lines++;
						if (delimiters[i] != " ") {
							newStr += delimiters[i];
							currWidth += getCharWidth(delimiters[i].charCodeAt(0));
						}
					} else {
						newStr += delimiters[i];
						currWidth += getCharWidth(delimiters[i].charCodeAt(0));
					}
				}
			} else {
				if (newStr[newStr.length - 1] == " ") {
					newStr = newStr.slice(0, newStr.length - 1);
				}
				newStr += "\n";
    	        currWidth = 0;					// increment the number of lines
        	    lines++;
				i--;
			}
			continue;
        }
        newStr += words[i];
		if (i < delimiters.length) {
			if (delimiters[i] == "\n") {					
				newStr += "\n";
    	        currWidth = 0;				// increment the number of lines
   	    	    lines++;
			} else if (delimiters[i] != " ") {
				newStr += delimiters[i];
			} else {
				if (currWidth + getCharWidth(delimiters[i].charCodeAt(0)) > width) {
					newStr += "\n";
   			        currWidth = 0;				// increment the number of lines
    			    lines++;
				} else {
					newStr += delimiters[i];
					currWidth += getCharWidth(delimiters[i].charCodeAt(0));
				}
			}
		}
    }
    lines = parseInt(lines * SIFR_CHAR[font][1] + getDescender(newStr) + getAscender(newStr) + 6);
    return lines;

    function getWordWidth(word) {           // returns the width of the word in px
        word_width = 0;
        if (word_width==null || word.length==null) return 0;
        for(ii=0; ii<word.length; ii++) {
            word_width += getCharWidth(word.charCodeAt(ii));
			if (ii<word.length-1) {
	            word_width += getCharKerning(word.charCodeAt(ii), word.charCodeAt(ii+1));
			}
        }
        return word_width;
    }

    function getCharWidth(char1) {			// returns the width of individual character in px
        if (char1==null) return 0;			// from the mapping
        for(iii=3; iii<SIFR_CHAR[font].length;iii++) {
            if (SIFR_CHAR[font][iii]==char1) {
                return SIFR_CHAR_WIDTH[font][iii-1];
            }
        }
        return SIFR_CHAR_WIDTH[font][1];
    };

    function getCharKerning(char1, char2) {	// returns the width of individual character in px
        for(iii=1; iii<SIFR_KERNING[font].length;iii+=3) {
            if (SIFR_KERNING[font][iii]==char1 && SIFR_KERNING[font][iii+1]==char2) {
                return SIFR_KERNING[font][iii+2];
            }
        }
        return 0;
    };

	function getDescender(word) {
		descender = 0;
		for (k=word.length-1; k>=0; k--) {
			if (word[k] == "\n")
				break;
	        for(iii=3; iii<SIFR_CHAR[font].length;iii++) {
    	        if (SIFR_CHAR[font][iii]==word.charCodeAt(k)) {
					if (SIFR_CHAR_DESC[font][iii-1] > descender)
						descender = SIFR_CHAR_DESC[font][iii-1];
					break;
            	}
	        }
		}
		return descender;
	}

	function getAscender(word) {
		ascender = 0;
		for (k=0; k<word.length; k++) {
			if (word[k] == "\n")
				break;
	        for(iii=3; iii<SIFR_CHAR[font].length;iii++) {
    	        if (SIFR_CHAR[font][iii]==word.charCodeAt(k)) {
					if (SIFR_CHAR_ASC[font][iii-1] > ascender)
						ascender = SIFR_CHAR_ASC[font][iii-1];
					break;
            	}
	        }
		}
		return ascender;
	}
};

function getStyle(el,prop){
	var y;
	if(el.currentStyle)
		y=prop?el.currentStyle[prop]:el.currentStyle;
	else if(window.getComputedStyle){
		y=document.defaultView.getComputedStyle(el,"");
		if(prop)y=y[prop];
	}
	return y;
}

var hasFlash = function(){
	var nRequiredVersion = 6;	
	
	if(navigator.appVersion.indexOf("MSIE") != -1 && navigator.appVersion.indexOf("Windows") > -1){
		document.write('<script language="VBScript"\> \non error resume next \nhasFlash = (IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash." & ' + nRequiredVersion + '))) \n</script\> \n');
		/*	If executed, the VBScript above checks for Flash and sets the hasFlash variable. 
			If VBScript is not supported it's value will still be undefined, so we'll run it though another test
			This will make sure even Opera identified as IE will be tested */
		if(window.hasFlash != null){
			return window.hasFlash;
		};
	};
	
	if(navigator.mimeTypes && navigator.mimeTypes["application/x-shockwave-flash"] && navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin){
		var flashDescription = (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]).description;
		return parseInt(flashDescription.substr(flashDescription.indexOf(".") - 2,2),10) >= nRequiredVersion;
	};
	
	return false;
}();

String.prototype.normalize = function(){
	return this.replace(/\s+/g, " ");
};

/* IE 5.0 does not support the push method, so here goes */
if(Array.prototype.push == null){
	Array.prototype.push = function(){
		var i = 0, index = this.length, limit = arguments.length;
		while(i < limit){
			this[index++] = arguments[i++];
		};
		return this.length;
	};
};

/*	Implement function.apply for browsers which don't support it natively
	Courtesy of Aaron Boodman - http://youngpup.net */
if (!Function.prototype.apply){
	Function.prototype.apply = function(oScope, args) {
		var sarg = [];
		var rtrn, call;

		if (!oScope) oScope = window;
		if (!args) args = [];

		for (var i = 0; i < args.length; i++) {
			sarg[i] = "args["+i+"]";
		};

		call = "oScope.__applyTemp__(" + sarg.join(",") + ");";

		oScope.__applyTemp__ = this;
		rtrn = eval(call);
		oScope.__applyTemp__ = null;
		return rtrn;
	};
};

/*	The following code parses CSS selectors.
	This script however is not the right place to explain it,
	please visit the documentation for more information. */
var parseSelector = function(){
	var reParseSelector = /^([^#.>`]*)(#|\.|\>|\`)(.+)$/;
	function parseSelector(sSelector, oParentNode){
		var listSelectors = sSelector.split(/\s*\,\s*/);
		var listReturn = [];
		for(var i = 0; i < listSelectors.length; i++){
			listReturn = listReturn.concat(doParse(listSelectors[i], oParentNode));
		};
		
		return listReturn;
	};
	
	function doParse(sSelector, oParentNode, sMode){
		sSelector = sSelector.replace(" ", "`");
		var selector = sSelector.match(reParseSelector);
		var node, listNodes, listSubNodes, subselector, i, limit;
		var listReturn = [];
		
		if(selector == null){ selector = [sSelector, sSelector] };
		if(selector[1] == ""){ selector[1] = "*" };
		if(sMode == null){ sMode = "`" };
		if(oParentNode == null){
			oParentNode = document;
		};

		switch(selector[2]){
			case "#":
				subselector = selector[3].match(reParseSelector);
				if(subselector == null){ subselector = [null, selector[3]] };
				node = 	document.getElementById(subselector[1]);
				if(node == null || (selector[1] != "*" && !matchNodeNames(node, selector[1]))){
					return listReturn;
				};
				if(subselector.length == 2){
					listReturn.push(node);
					return listReturn;	
				};
				return doParse(subselector[3], node, subselector[2]);
			case ".":
				if(sMode != ">"){
					listNodes = getElementsByTagName(oParentNode, selector[1]);
				} else {
					listNodes = oParentNode.childNodes;
				};
				
				for(i = 0, limit = listNodes.length; i < limit; i++){
					node = listNodes[i];
					if(node.nodeType != 1){
						continue;	
					};
					subselector = selector[3].match(reParseSelector);
					if(subselector != null){
						if(node.className == null || node.className.match("(\\s|^)" + subselector[1] + "(\\s|$)") == null){
							continue;
						};
						listSubNodes = doParse(subselector[3], node, subselector[2]);
						listReturn = listReturn.concat(listSubNodes);	
					} else if(node.className != null && node.className.match("(\\s|^)" + selector[3] + "(\\s|$)") != null){
						listReturn.push(node);
					};
				};
				return listReturn;
			case ">":
				if(sMode != ">"){
					listNodes = getElementsByTagName(oParentNode, selector[1]);
				} else {
					listNodes = oParentNode.childNodes;
				};
								
				for(i = 0, limit = listNodes.length; i < limit; i++){
					node = listNodes[i];
					
					if(node.nodeType != 1){
						continue;	
					};
					
					if(!matchNodeNames(node, selector[1])){
						continue;
					};
					listSubNodes = doParse(selector[3], node, ">");
					listReturn = listReturn.concat(listSubNodes);	
				};
				return listReturn;
			case "`":
				listNodes = getElementsByTagName(oParentNode, selector[1]);
				for(i = 0, limit = listNodes.length; i < limit; i++){
					node = listNodes[i];
					listSubNodes = doParse(selector[3], node, "`");
					listReturn = listReturn.concat(listSubNodes);	
				};
				return listReturn;
			default:
				if(sMode != ">"){
					listNodes = getElementsByTagName(oParentNode, selector[1]);
				} else {
					listNodes = oParentNode.childNodes;
				};

				for(i = 0, limit = listNodes.length; i < limit; i++){
					node = listNodes[i];
					if(node.nodeType != 1){
						continue;	
					};
					if(!matchNodeNames(node, selector[1])){
						continue;
					};
					listReturn.push(node);
				};
				return listReturn;
		};
	};
	
	function getElementsByTagName(oParentNode, sTagName){
		/*	IE5.x does not support document.getElementsByTagName("*")
			therefore we're falling back to element.all */
		if(sTagName == "*" && oParentNode.all != null){
			return oParentNode.all;
		};
		return oParentNode.getElementsByTagName(sTagName);
	};
	
	function matchNodeNames(node, sMatch){
		if(sMatch == "*"){
			return true;
		};
		return node.nodeName.toLowerCase().replace("html:", "") == sMatch.toLowerCase();
	};
	
	return parseSelector;
}();

/*	Adds named arguments support to JavaScript. */
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;
	
	var i = listPassedArgs.length;
	while(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(sName in oNamedArgs){
		if(oMapping[sName] != null){
			oMapping[sName](oNamedArgs[sName]);
		};
	};
	
	return;
};

/**
 Function to redraw the elements on onResize event
**/

var dosIFRResize = function() {

    // this recalculates the size of flash containers onResize event
    bodyObj = document.getElementsByTagName("body")[0]
    var SIFRSize = bodyObj.getAttribute("SIFR_SIZE");
    var winWOld = bodyObj.getAttribute("INIT_SCREEN_W");
    // all of these parameters are the initial size of the window
    var win = getWindowSize();
    if (SIFRSize>0) {
        // SIFR size is the count of the replaced tags (it is used to
        // get elements by id since they are given id as floowing SIFR_OBJ_ID_XXX
        // were XXX is a digit from 0 to SIFR_SIZE)
        var ratio = win.winW / winWOld;

        for (objI=1; objI<=SIFRSize; objI++) {
            // for each element we get the corresponding flash container
            var resizeObj = document.getElementById("SIFR_OBJ_ID_" + objI);

            // get its initial width attributes togeter with the attribute
            // of word lengths
            var initWidth = resizeObj.getAttribute("initWidth");
            var oldWidth = resizeObj.getAttribute("width");
            var newWidth = initWidth * ratio;
			var src = resizeObj.getAttribute("src");
			src = src.slice(0, src.length-4);
			if (oldWidth == newWidth) {
				continue;
			}
            iFV = resizeObj.getAttribute("flashvars");

            // before we continue replace the FlashVars parameters with new
            // width and height params so that the flash redraws itself properly

            iFVarr = iFV.split("txt=");
            iFVarr = iFVarr[1].split("&");
            // we calculate the new dimensions of the container
            // in respect to the changed size ratio
            newHeight = SIFR_Interpreter(iFVarr[0], newWidth, src);

            iFVarr = iFV.split("h=");
            iFV = iFVarr[0];
            iFVarr = iFVarr[1].split("&");
            iFVarr[0] ="";
            iFV += "h=" + parseInt(newHeight) + iFVarr.join("&");

            iFVarr = iFV.split("w=");
            iFV = iFVarr[0];
            iFVarr = iFVarr[1].split("&");
            iFVarr[0] = "";
            iFV += "w=" + parseInt(newWidth) + iFVarr.join("&");

            resizeObj.setAttribute("flashvars", iFV);
            resizeObj.setAttribute("width", newWidth);
            resizeObj.setAttribute("height", newHeight);
			resizeObj.style.width = newWidth + "px";
			resizeObj.style.height = newHeight + "px";
			
            var containerObj = document.getElementById(replaced_ID[objI - 1]);
            // initiate the redrawing
            containerObj.innerHTML +="";

        }
    }
};


function getWindowSize() {
    // this function captures the window size
    // the values are then used to calculate resize ratio
    // for resizing function
    var winW=0, winH=0;

    if( typeof( window.innerWidth ) == 'number' ) {
        //Non-IE
        var thisWin = window;
        winW = thisWin.innerWidth;
        winH = thisWin.innerHeight;

    } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
        //IE 6+ in 'standards compliant mode'
        var thisWin = document;
        winW = thisWin.documentElement.clientWidth;
        winH = thisWin.documentElement.clientHeight;

    } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
        //IE 4 compatible
        var thisWin = document;
        winW = thisWin.body.clientWidth-35;
        winH = thisWin.body.clientHeight-35;
    }
    return {"winW" : winW, "winH" : winH};
}


/*	Executes an anonymous function which returns the function SIFR (defined inside the function).
	You can replace elements using SIFR.replaceElements()
	All other variables and methods you see are private. If you want to understand how this works you should
	learn more about the variable-scope in JavaScript. */
var sIFR = function(){
	/* Opera and Mozilla require a namespace when creating elements in an XML page */

    // DO NOT CHANGE THESE VAR - THEY MUST REMAIN A CONSTANT
    var objPrefix = "SIFR_OBJ_ID_"; // this will form the id's of flash objects
    var conPrefix = "SIFR_CON_ID_"; // this will form the id's of the div containers for flash + alt text
    var spanPrefix = "SIFR_SPAN_ID_"; // this will form the id's of the div containers for flash + alt text
    var conClass = "sifr"; // this is the class name for DIV container
    var objClass = "sifr-flash";    // this is the class name for flash objects
    var altClass = "sifr-alternate"; // this is the class for alternative text

    var bodyAttr = "SIFR_SIZE"; // size of replaced
    var bodyScreenWAttr = "INIT_SCREEN_W";
    var bodyScreenHAttr = "INIT_SCREEN_H";

    var initWidthAttr = "initWidth"; // attribute to remember the initial width
    var oldStringAttr = "oldString"; // attribute to remember start string
    var scaleAttr = "flashScale"; // attribute to remember scale

    // Dynamic VARS
    var sizeOfReplaced = 0;   // counter of the changed elements (Prefix + this == id of the element)

    var needIEonResizePatch = false;    // patch for onResize event

	var sNameSpaceURI = "http://www.w3.org/1999/xhtml";
	var bIsInitialized = false;
	var bIsSetUp = false;
	var bInnerHTMLTested = false;
	var sDocumentTitle;
	var stackReplaceElementArguments = [];
	var UA = function(){
		var sUA = navigator.userAgent.toLowerCase();
		var oReturn =  {
			bIsWebKit : sUA.indexOf("applewebkit") > -1,
			bIsSafari : sUA.indexOf("safari") > -1,
			bIsKonq: navigator.product != null && navigator.product.toLowerCase().indexOf("konqueror") > -1,
			bIsOpera : sUA.indexOf("opera") > -1,
			bIsXML : document.contentType != null && document.contentType.indexOf("xml") > -1,
			bHasTransparencySupport : true,
			bUseDOM : true,
			nFlashVersion : null,
			nOperaVersion : null,
			nGeckoBuildDate : null,
			nWebKitVersion : null
		};
		
		oReturn.bIsKHTML = oReturn.bIsWebKit || oReturn.bIsKonq;
		oReturn.bIsGecko = !oReturn.bIsWebKit && navigator.product != null && navigator.product.toLowerCase() == "gecko";
		if(oReturn.bIsGecko && sUA.match(/.*gecko\/(\d{8}).*/)){ oReturn.nGeckoBuildDate = new Number(sUA.match(/.*gecko\/(\d{8}).*/)[1]) };
    if(oReturn.bIsOpera && sUA.match(/.*opera(\s|\/)(\d+\.\d+)/)){ oReturn.nOperaVersion = new Number(sUA.match(/.*opera(\s|\/)(\d+\.\d+)/)[2]) };
		oReturn.bIsIE = sUA.indexOf("msie") > -1 && !oReturn.bIsOpera && !oReturn.bIsKHTML && !oReturn.bIsGecko;
		oReturn.bIsIEMac = oReturn.bIsIE && sUA.match(/.*mac.*/) != null;
		if(oReturn.bIsIE || (oReturn.bIsOpera && oReturn.nOperaVersion < 7.6)){ oReturn.bUseDOM = false };
		if(oReturn.bIsWebKit && sUA.match(/.*applewebkit\/(\d+).*/)){ oReturn.nWebKitVersion = new Number(sUA.match(/.*applewebkit\/(\d+).*/)[1]) };
		if(window.hasFlash && (!oReturn.bIsIE || oReturn.bIsIEMac)){ 
			var flashDescription = (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]).description;
			oReturn.nFlashVersion = parseInt(flashDescription.substr(flashDescription.indexOf(".") - 2,2),10);
		};
		if(sUA.match(/.*(windows|mac).*/) == null || 
		oReturn.bIsIEMac || oReturn.bIsKonq || 
		(oReturn.bIsOpera && oReturn.nOperaVersion < 7.6) || 
		(oReturn.bIsSafari && oReturn.nFlashVersion < 7) ||
		(!oReturn.bIsSafari && oReturn.bIsWebKit && oReturn.nWebKitVersion < 312) || 
		(oReturn.bIsGecko && oReturn.nGeckoBuildDate < 20020523)){
			oReturn.bHasTransparencySupport = false;
		};

		if(!oReturn.bIsIEMac && !oReturn.bIsGecko && document.createElementNS){
			try {
				document.createElementNS(sNameSpaceURI, "i").innerHTML = "";
			} catch(e){
				oReturn.bIsXML = true;
			};
		};
		
		oReturn.bUseInnerHTMLHack = oReturn.bIsKonq || (oReturn.bIsWebKit && oReturn.nWebKitVersion < 312);
		
		return oReturn;
	}();
	
	/*	Disable sIFR for non-Flash or old browsers
		Also disable it for IE and KHTML browsers in XML mode, since we are using innerHTML for those browsers */
	if(window.hasFlash == false || !document.createElement || !document.getElementById || (UA.bIsXML && (UA.bUseInnerHTMLHack || UA.bIsIE))){
		return {UA:UA};
	};
	
	function sIFR(e){
		if((!self.bAutoInit && (window.event || e) != null) || !mayReplace(e)){
			return;	
		};
		bIsInitialized = true;
		
		for(var i = 0, limit = stackReplaceElementArguments.length; i < limit; i++){
			replaceElement.apply(null, stackReplaceElementArguments[i]);
		};
		stackReplaceElementArguments = [];
	};
	
	var self = sIFR;

	function mayReplace(e){
		if(bIsSetUp == false || self.bIsDisabled == true || ((UA.bIsXML && UA.bIsGecko || UA.bIsKHTML) && e == null && bIsInitialized == false) || (document.body == null || document.getElementsByTagName("body").length == 0)){
			return false;
		};
		return true;
	};
	
	function escapeHex(sHex){
		if(UA.bIsIE){ /* The RegExp for IE breaks old Gecko's, the RegExp for non-IE breaks IE 5.01 */
			return sHex.replace(new RegExp("%\d{0}", "g"), "%25");
		}
		return sHex.replace(new RegExp("%(?!\d)", "g"), "%25");
	};
	
	function matchNodeNames(node, sMatch){
		if(sMatch == "*"){
			return true;
		};	
		return node.nodeName.toLowerCase().replace("html:", "") == sMatch.toLowerCase();
	};

	function fetchContent(node, nodeNew, sCase, nLinkCount, sLinkVars){
		var sContent = "";
		var oSearch = node.firstChild;
		var oRemove, nodeRemoved, oResult, sValue;

		if(nLinkCount == null){ nLinkCount = 0 };
		if(sLinkVars == null){ sLinkVars = "" };

		while(oSearch){
			if(oSearch.nodeType == 3){
				sValue = oSearch.nodeValue.replace("<", "&lt;");
				switch(sCase){
					case "lower":
						sContent += sValue.toLowerCase();
						break;
					case "upper":
						sContent += sValue.toUpperCase();
						break;
					default:
						sContent += sValue;
				};
			} else if(oSearch.nodeType == 1){
				if(matchNodeNames(oSearch, "a") && !oSearch.getAttribute("href") == false){
					if(oSearch.getAttribute("target")){
						sLinkVars += "&sifr_url_" + nLinkCount + "_target=" + oSearch.getAttribute("target");
					};
					sLinkVars += "&sifr_url_" + nLinkCount + "=" + escapeHex(oSearch.getAttribute("href")).replace(/&/g, "%26");
					sContent += '<a href="asfunction:_root.launchURL,' + nLinkCount + '">';
					nLinkCount++;
				} else if(matchNodeNames(oSearch, "br")){
					sContent += "<br/>";
				};
				if(oSearch.hasChildNodes()){
					/*	The childNodes are already copied with this node, so nodeNew = null */
					oResult = fetchContent(oSearch, null, sCase, nLinkCount, sLinkVars);
					sContent += oResult.sContent;
					nLinkCount = oResult.nLinkCount;
					sLinkVars = oResult.sLinkVars;
				};
				if(matchNodeNames(oSearch, "a")){
					sContent += "</a>";
				};
			};
			oRemove = oSearch;
			oSearch = oSearch.nextSibling;
			if(nodeNew != null){
				nodeRemoved = oRemove.parentNode.removeChild(oRemove);
				nodeNew.appendChild(nodeRemoved);	
			};
		};
		
		return {"sContent" : sContent, "nLinkCount" : nLinkCount, "sLinkVars" : sLinkVars};
	};
	
	function createElement(sTagName){
		if(document.createElementNS && UA.bUseDOM){
			return document.createElementNS(sNameSpaceURI, sTagName);	
		} else {
			return document.createElement(sTagName);
		};
	};

	function createObjectParameter(nodeObject, sName, sValue){
		var node = createElement("param");
		node.setAttribute("name", sName);	
		node.setAttribute("value", sValue);
		nodeObject.appendChild(node);
	};
	
	/*	Konqueror does not treat empty classNames as strings, so we need a workaround */
	function appendToClassName(node, sAppend){
		var sClassName = node.className;
		if(sClassName == null){
			sClassName = sAppend;
		} else {
			sClassName = sClassName.normalize() + (sClassName == "" ? "" : "-") + sAppend;
		};
		node.className = sClassName;
	};
	
	function prepare(bNow){
		var node = document.documentElement;
		if(self.bHideBrowserText == false){
			node = document.getElementsByTagName("body")[0];
		};
		if((self.bHideBrowserText == false || bNow) && node){
			if(node.className == null || node.className.match(/\bsIFR\-hasFlash\b/) == null){
				appendToClassName(node, "sifr-hasFlash");
			};
		};
	};
	
	function replaceElement(sSelector, sFlashSrc, sColor, sLinkColor, sHoverColor, sBgColor, nPaddingTop, nPaddingRight, nPaddingBottom, nPaddingLeft, sFlashVars, sCase, sWmode){
		if(!mayReplace()){
			return stackReplaceElementArguments.push(arguments);	
		};

		prepare();
		
		/*	Extract any named arguments.	*/
		named.extract(arguments, {
			sSelector : function(value){ sSelector = value },
			sFlashSrc : function(value){ sFlashSrc = value },
			sColor : function(value){ sColor = value },
			sLinkColor : function(value){ sLinkColor = value },
			sHoverColor : function(value){ sHoverColor = value },
			sBgColor : function(value){ sBgColor = value },
			nPaddingTop : function(value){ nPaddingTop = value },
			nPaddingRight : function(value){ nPaddingRight = value },
			nPaddingBottom : function(value){ nPaddingBottom = value },
			nPaddingLeft : function(value){ nPaddingLeft = value },
			sFlashVars : function(value){ sFlashVars = value },
			sCase : function(value){ sCase = value },
			sWmode : function(value){ sWmode = value }
		});

		/* Check if we can find any nodes first */
		var listNodes = parseSelector(sSelector);
		if(listNodes.length == 0){ return false };

		/*	Set default values. */
		if(sFlashVars != null){
			sFlashVars = "&" + sFlashVars.normalize();
		} else {
			sFlashVars = "";	
		};
		
		if(sColor != null){sFlashVars += "&textcolor=" + sColor};
		if(sHoverColor != null){sFlashVars += "&hovercolor=" + sHoverColor};
		if(sHoverColor != null || sLinkColor != null){sFlashVars += "&linkcolor=" + (sLinkColor || sColor)};
		
		if(nPaddingTop == null){ nPaddingTop = 0 };
		if(nPaddingRight == null){ nPaddingRight = 0 };
		if(nPaddingBottom == null){ nPaddingBottom = 0 };
		if(nPaddingLeft == null){ nPaddingLeft = 0 };

		if(sBgColor == null){ sBgColor = "#FFFFFF" };
		
		if(sWmode == "transparent"){
			if(!UA.bHasTransparencySupport){
				sWmode = "opaque";
			} else {
				sBgColor = "transparent";
			};
		};
		
		if(sWmode == null){ sWmode = "transparent" };
	
		/*	Do the actual replacement. */
		var node, sWidth, sHeight, sMargin, sPadding, sVars, nodeAlternate, nodeFlash, oContent;
		var nodeFlashTemplate = null;

		for(var i = 0, limit = listNodes.length; i < limit; i++){
			node = listNodes[i];
			/* Prevents elements from being replaced multiple times. */
			if(node.className != null && node.className.match(/\bsifr\b/) != null){ continue };
			
			nodeDiv = createElement("div");
			nodeID = node.getAttribute("id");
			if (!nodeID)
				nodeID = [conPrefix, sizeOfReplaced+1].join("");
			nodeAlternate = createElement("span");
			nodeAlternate.className = altClass;
			oContent = fetchContent(node, nodeAlternate, sCase);
			
			tempNode = node;
			while(tempNode.offsetWidth == 0) {
				tempNode = tempNode.parentNode;
			}
			sWidth = tempNode.offsetWidth - nPaddingLeft - nPaddingRight;
			if(UA.bIsOpera){
				sWidth -= 20;
			}
			sHeight = SIFR_Interpreter(oContent.sContent, sWidth, sFlashSrc.slice(sFlashSrc.lastIndexOf("/")+1, sFlashSrc.length-4)) - nPaddingTop - nPaddingBottom;
            // if for some reason we are not able to parse width and height we block ourself
			if(sWidth==null || sHeight==null || sWidth=="" || sHeight=="" || sWidth=="px" || sHeight=="px"){
				self.bIsDisabled = true;
				document.documentElement.className = document.documentElement.className.replace(/\bsIFR\-hasFlash\b/, "");
				return;
			};

			sVars = "txt=" + escapeHex(oContent.sContent).replace(/\+/g, "%2B").replace(/&/g, "%26").replace(/\"/g, "%22").normalize() + sFlashVars + "&w=" + sWidth + "&h=" + sHeight + oContent.sLinkVars;
			
			textsize=parseInt(getStyle(node,"fontSize"))
			if(!isNaN(textsize)) {
				sVars+="&textsize="+textsize;
			}
			appendToClassName(node, conClass);
            nodeDiv.setAttribute("width", sWidth);
            nodeDiv.setAttribute("height", sHeight);
            nodeDiv.setAttribute("id", nodeID);
            nodeDiv.innerHTML += "";

			/*	Opera only supports the object element, other browsers are given the embed element,
				for backwards compatibility reasons between different browser versions.
				Opera versions below 7.60 use innerHTML, from 7.60 and up we use the DOM */
			if(nodeFlashTemplate == null || !UA.bUseDOM){
				if(!UA.bUseDOM){
					nodeDiv.innerHTML = ['<embed id="', objPrefix, sizeOfReplaced+1,'" name="', objPrefix, sizeOfReplaced+1,'" class=', objClass,' type="application/x-shockwave-flash" src="',sFlashSrc,'" quality="best" wmode="', sWmode, '" bgcolor="', sBgColor, '" flashvars="', sVars, '" width="', sWidth, '" height="', sHeight, '" ',initWidthAttr, '="', sWidth,'" sifr="true" scale="noScale"></embed>'].join("");
				} else {
					if(UA.bIsOpera){
						nodeFlash = createElement("object");
						nodeFlash.setAttribute("data", sFlashSrc);
						nodeFlash.setAttribute("src", sFlashSrc);
						createObjectParameter(nodeFlash, "quality", "best");
						createObjectParameter(nodeFlash, "wmode", sWmode);
						createObjectParameter(nodeFlash, "bgcolor", sBgColor);
					} else {
						nodeFlash = createElement("embed");
						nodeFlash.setAttribute("src", sFlashSrc);
						nodeFlash.setAttribute("quality", "best");
						nodeFlash.setAttribute("flashvars", sVars);
						nodeFlash.setAttribute("wmode", sWmode);
						nodeFlash.setAttribute("bgcolor", sBgColor);
						nodeFlash.setAttribute("pluginspace", "http://www.macromedia.com/go/getflashplayer");
						nodeFlash.setAttribute("scale", "noScale");
					};
					nodeFlash.setAttribute("sifr", "true");
					nodeFlash.setAttribute("type", "application/x-shockwave-flash");
					nodeFlash.className = objClass;
					if(!UA.bIsKHTML || !UA.bIsXML){
						nodeFlashTemplate = nodeFlash.cloneNode(true);
					};
				};
			} else {
				nodeFlash = nodeFlashTemplate.cloneNode(true);
			};
			if(UA.bUseDOM){
				/* General settings */
				if(UA.bIsOpera){
					createObjectParameter(nodeFlash, "flashvars", sVars);
				};
				nodeFlash.setAttribute("flashvars", sVars);
                nodeFlash.setAttribute("id", "" + objPrefix + parseInt(sizeOfReplaced+1));
                nodeFlash.setAttribute("name", "" + objPrefix + parseInt(sizeOfReplaced+1));
				nodeFlash.setAttribute("width", sWidth);
				nodeFlash.setAttribute("height", sHeight);
                nodeFlash.setAttribute(initWidthAttr, sWidth);
				nodeFlash.style.width = sWidth + "px";
				nodeFlash.style.height = sHeight + "px";
				nodeDiv.appendChild(nodeFlash);
			};
			
            sizeOfReplaced++;
			nodeDiv.appendChild(nodeAlternate);
			node.parentNode.insertBefore(nodeDiv, node);
			nodeRemoved = node.parentNode.removeChild(node);

			/*	Workaround to force KHTML-browsers to repaint the document. 
				Additionally, IE for both Mac and PC need this.
				See: http://neo.dzygn.com/archive/2004/09/forcing-safari-to-repaint */
			replaced_ID = replaced_ID.concat(nodeID);

			if(UA.bUseInnerHTMLHack){
				nodeDiv.innerHTML += "";
			};
		};
		
		if(UA.bIsIE && self.bFixFragIdBug){
			setTimeout(function(){document.title = sDocumentTitle}, 0);
		};
        onResizeIEpatch();

        // set the quantity of replaced elements
        bodyObj = document.getElementsByTagName("body")[0]
        bodyObj.setAttribute(bodyAttr, sizeOfReplaced);

        // set the window initial size
        win = getWindowSize();
        bodyObj.setAttribute(bodyScreenWAttr, win.winW);
        bodyObj.setAttribute(bodyScreenHAttr, win.winH);
	};
	
	function updateDocumentTitle(){
		sDocumentTitle = document.title;
	};
	
    function onResizeIEpatch() {
      if (self.needIEonResizePatch==true) {
            var bodyObj = document.getElementsByTagName("body")[0];
            if (typeof bodyObj.onresize == "function") {
                var fOld = bodyObj.onresize;
                bodyObj.onresize = function(){ fOld(); dosIFRResize(); };
            } else {
                bodyObj.onresize = dosIFRResize;
            }
            // attaching onResize in IE causes it to go into an infinite loop
            // so we need this patch
            self.needIEonResizePatch = false;
        };
    };

	function setup(){
		if(self.bIsDisabled == true){ return };

		bIsSetUp = true;
		/*	Providing a hook for you to hide certain elements if Flash has been detected. */
		if(self.bHideBrowserText){
			prepare(true);
		};
		
        if (UA.bIsIE) { // IE
            self.needIEonResizePatch=true;
        } else {
			if(window.attachEvent){
				window.attachEvent("onload", sIFR);
                window.attachEvent("onresize", dosIFRResize);
			} else if(!UA.bIsKonq && (document.addEventListener || window.addEventListener)){
				if(document.addEventListener){
					document.addEventListener("load", sIFR, false);	
   	                document.addEventListener("resize", dosIFRResize, false);
				};
				if(window.addEventListener){
					window.addEventListener("load", sIFR, false);	
   	                window.addEventListener("resize", dosIFRResize, false);
				};
			} else {
				if(typeof window.onload == "function"){
					var fOld = window.onload;
					window.onload = function(){ fOld(); sIFR(); };
				} else {
					window.onload = sIFR;
    			};
    			if(typeof window.onresize == "function"){
    				var fOld = window.onresize;
   					window.onresize = function(){ fOld(); dosIFRResize(); };
    			} else {
    				window.onresize = dosIFRResize;
    			};
			};
		};
		
		if(!UA.bIsIE || window.location.hash == ""){
			self.bFixFragIdBug = false;
		} else {
			updateDocumentTitle();
		};
	};
	
	function debug(){
		prepare(true);
	};
	
	debug.replaceNow = function(){
		setup();
		sIFR();
	};
	
	/* Public Fields */
	self.UA = UA;
	self.bAutoInit = true;
	self.bFixFragIdBug = true;
	self.replaceElement = replaceElement;
	self.updateDocumentTitle = updateDocumentTitle;
	self.appendToClassName = appendToClassName;
	self.setup = setup;
	self.debug = debug;
	self.bIsDisabled = false;
	self.bHideBrowserText = true;
	
	return self;
}();

/*	sIFR setup. You can add browser detection here. 
	sIFR's browser detection is exposed through sIFR.UA. */
var replaced_ID = new Array();

if(typeof sIFR == "function" && !sIFR.UA.bIsIEMac){
	sIFR.setup();
};
