var swfobject = function() {
	
	var UNDEF = "undefined",
		OBJECT = "object",
		SHOCKWAVE_FLASH = "Shockwave Flash",
		SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
		FLASH_MIME_TYPE = "application/x-shockwave-flash",
		EXPRESS_INSTALL_ID = "SWFObjectExprInst",
		
		win = window,
		doc = document,
		nav = navigator,
		
		domLoadFnArr = [],
		regObjArr = [],
		objIdArr = [],
		listenersArr = [],
		script,
		timer = null,
		storedAltContent = null,
		storedAltContentId = null,
		isDomLoaded = false,
		isExpressInstallActive = false;
	
	/* Centralized function for browser feature detection
		- Proprietary feature detection (conditional compiling) is used to detect Internet Explorer's features
		- User agent string detection is only used when no alternative is possible
		- Is executed directly for optimal performance
	*/	
	var ua = function() {
		var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,
			playerVersion = [0,0,0],
			d = null;
		if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
			d = nav.plugins[SHOCKWAVE_FLASH].description;
			if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+
				d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
				playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
				playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
				playerVersion[2] = /r/.test(d) ? parseInt(d.replace(/^.*r(.*)$/, "$1"), 10) : 0;
			}
		}
		else if (typeof win.ActiveXObject != UNDEF) {
			var a = null, fp6Crash = false;
			try {
				a = new ActiveXObject(SHOCKWAVE_FLASH_AX + ".7");
			}
			catch(e) {
				try { 
					a = new ActiveXObject(SHOCKWAVE_FLASH_AX + ".6");
					playerVersion = [6,0,21];
					a.AllowScriptAccess = "always";	 // Introduced in fp6.0.47
				}
				catch(e) {
					if (playerVersion[0] == 6) {
						fp6Crash = true;
					}
				}
				if (!fp6Crash) {
					try {
						a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
					}
					catch(e) {}
				}
			}
			if (!fp6Crash && a) { // a will return null when ActiveX is disabled
				try {
					d = a.GetVariable("$version");	// Will crash fp6.0.21/23/29
					if (d) {
						d = d.split(" ")[1].split(",");
						playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
					}
				}
				catch(e) {}
			}
		}
		var u = nav.userAgent.toLowerCase(),
			p = nav.platform.toLowerCase(),
			webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
			ie = false,
			windows = p ? /win/.test(p) : /win/.test(u),
			mac = p ? /mac/.test(p) : /mac/.test(u);
		/*@cc_on
			ie = true;
			@if (@_win32)
				windows = true;
			@elif (@_mac)
				mac = true;
			@end
		@*/
		return { w3cdom:w3cdom, pv:playerVersion, webkit:webkit, ie:ie, win:windows, mac:mac };
	}();

	/* Cross-browser onDomLoad
		- Based on Dean Edwards' solution: http://dean.edwards.name/weblog/2006/06/again/
		- Will fire an event as soon as the DOM of a page is loaded (supported by Gecko based browsers - like Firefox -, IE, Opera9+, Safari)
	*/ 
	var onDomLoad = function() {
		if (!ua.w3cdom) {
			return;
		}
		addDomLoadEvent(main);
		if (ua.ie && ua.win) {
			try {	 // Avoid a possible Operation Aborted error
				doc.write("<scr" + "ipt id=__ie_ondomload defer=true src=//:></scr" + "ipt>"); // String is split into pieces to avoid Norton AV to add code that can cause errors 
				script = getElementById("__ie_ondomload");
				if (script) {
					addListener(script, "onreadystatechange", checkReadyState);
				}
			}
			catch(e) {}
		}
		if (ua.webkit && typeof doc.readyState != UNDEF) {
			timer = setInterval(function() { if (/loaded|complete/.test(doc.readyState)) { callDomLoadFunctions(); }}, 10);
		}
		if (typeof doc.addEventListener != UNDEF) {
			doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, null);
		}
		addLoadEvent(callDomLoadFunctions);
	}();
	
	function checkReadyState() {
		if (script.readyState == "complete") {
		//script.parentNode.removeChild(script);
			if (script.parentNode) { 
			script.parentNode.removeChild(script);
			}
			callDomLoadFunctions();
		}
	}
	
	function callDomLoadFunctions() {
		if (isDomLoaded) {
			return;
		}
		if (ua.ie && ua.win) { // Test if we can really add elements to the DOM; we don't want to fire it too early
			var s = createElement("span");
			try { // Avoid a possible Operation Aborted error
				var t = doc.getElementsByTagName("body")[0].appendChild(s);
				t.parentNode.removeChild(t);
			}
			catch (e) {
				return;
			}
		}
		isDomLoaded = true;
		if (timer) {
			clearInterval(timer);
			timer = null;
		}
		var dl = domLoadFnArr.length;
		for (var i = 0; i < dl; i++) {
			domLoadFnArr[i]();
		}
	}
	
	function addDomLoadEvent(fn) {
		if (isDomLoaded) {
			fn();
		}
		else { 
			domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+
		}
	}
	
	/* Cross-browser onload
		- Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/
		- Will fire an event as soon as a web page including all of its assets are loaded 
	 */
	function addLoadEvent(fn) {
		if (typeof win.addEventListener != UNDEF) {
			win.addEventListener("load", fn, false);
		}
		else if (typeof doc.addEventListener != UNDEF) {
			doc.addEventListener("load", fn, false);
		}
		else if (typeof win.attachEvent != UNDEF) {
			addListener(win, "onload", fn);
		}
		else if (typeof win.onload == "function") {
			var fnOld = win.onload;
			win.onload = function() {
				fnOld();
				fn();
			};
		}
		else {
			win.onload = fn;
		}
	}
	
	/* Main function
		- Will preferably execute onDomLoad, otherwise onload (as a fallback)
	*/
	function main() { // Static publishing only
		var rl = regObjArr.length;
		for (var i = 0; i < rl; i++) { // For each registered object element
			var id = regObjArr[i].id;
			if (ua.pv[0] > 0) {
				var obj = getElementById(id);
				if (obj) {
					regObjArr[i].width = obj.getAttribute("width") ? obj.getAttribute("width") : "0";
					regObjArr[i].height = obj.getAttribute("height") ? obj.getAttribute("height") : "0";
					if (hasPlayerVersion(regObjArr[i].swfVersion)) { // Flash plug-in version >= Flash content version: Houston, we have a match!
						if (ua.webkit && ua.webkit < 312) { // Older webkit engines ignore the object element's nested param elements
							fixParams(obj);
						}
						setVisibility(id, true);
					}
					else if (regObjArr[i].expressInstall && !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac)) { // Show the Adobe Express Install dialog if set by the web page author and if supported (fp6.0.65+ on Win/Mac OS only)
						showExpressInstall(regObjArr[i]);
					}
					else { // Flash plug-in and Flash content version mismatch: display alternative content instead of Flash content
						displayAltContent(obj);
					}
				}
			}
			else {	// If no fp is installed, we let the object element do its job (show alternative content)
				setVisibility(id, true);
			}
		}
	}
	
	/* Fix nested param elements, which are ignored by older webkit engines
		- This includes Safari up to and including version 1.2.2 on Mac OS 10.3
		- Fall back to the proprietary embed element
	*/
	function fixParams(obj) {
		var nestedObj = obj.getElementsByTagName(OBJECT)[0];
		if (nestedObj) {
			var e = createElement("embed"), a = nestedObj.attributes;
			if (a) {
				var al = a.length;
				for (var i = 0; i < al; i++) {
					if (a[i].nodeName == "DATA") {
						e.setAttribute("src", a[i].nodeValue);
					}
					else {
						e.setAttribute(a[i].nodeName, a[i].nodeValue);
					}
				}
			}
			var c = nestedObj.childNodes;
			if (c) {
				var cl = c.length;
				for (var j = 0; j < cl; j++) {
					if (c[j].nodeType == 1 && c[j].nodeName == "PARAM") {
						e.setAttribute(c[j].getAttribute("name"), c[j].getAttribute("value"));
					}
				}
			}
			obj.parentNode.replaceChild(e, obj);
		}
	}
	
	/* Show the Adobe Express Install dialog
		- Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75
	*/
	function showExpressInstall(regObj) {
		isExpressInstallActive = true;
		var obj = getElementById(regObj.id);
		if (obj) {
			if (regObj.altContentId) {
				var ac = getElementById(regObj.altContentId);
				if (ac) {
					storedAltContent = ac;
					storedAltContentId = regObj.altContentId;
				}
			}
			else {
				storedAltContent = abstractAltContent(obj);
			}
			if (!(/%$/.test(regObj.width)) && parseInt(regObj.width, 10) < 310) {
				regObj.width = "310";
			}
			if (!(/%$/.test(regObj.height)) && parseInt(regObj.height, 10) < 137) {
				regObj.height = "137";
			}
			doc.title = doc.title.slice(0, 47) + " - Flash Player Installation";
			var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn",
				dt = doc.title,
				fv = "MMredirectURL=" + win.location + "&MMplayerType=" + pt + "&MMdoctitle=" + dt,
				replaceId = regObj.id;
			// For IE when a SWF is loading (AND: not available in cache) wait for the onload event to fire to remove the original object element
			// In IE you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
			if (ua.ie && ua.win && obj.readyState != 4) {
				var newObj = createElement("div");
				replaceId += "SWFObjectNew";
				newObj.setAttribute("id", replaceId);
				obj.parentNode.insertBefore(newObj, obj); // Insert placeholder div that will be replaced by the object element that loads expressinstall.swf
				obj.style.display = "none";
				var fn = function() {
					obj.parentNode.removeChild(obj);
				};
				addListener(win, "onload", fn);
			}
			createSWF({ data:regObj.expressInstall, id:EXPRESS_INSTALL_ID, width:regObj.width, height:regObj.height }, { flashvars:fv }, replaceId);
		}
	}
	
	/* Functions to abstract and display alternative content
	*/
	function displayAltContent(obj) {
		if (ua.ie && ua.win && obj.readyState != 4) {
			// For IE when a SWF is loading (AND: not available in cache) wait for the onload event to fire to remove the original object element
			// In IE you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
			var el = createElement("div");
			obj.parentNode.insertBefore(el, obj); // Insert placeholder div that will be replaced by the alternative content
			el.parentNode.replaceChild(abstractAltContent(obj), el);
			obj.style.display = "none";
			var fn = function() {
				obj.parentNode.removeChild(obj);
			};
			addListener(win, "onload", fn);
		}
		else {
			obj.parentNode.replaceChild(abstractAltContent(obj), obj);
		}
	} 

	function abstractAltContent(obj) {
		var ac = createElement("div");
		if (ua.win && ua.ie) {
			ac.innerHTML = obj.innerHTML;
		}
		else {
			var nestedObj = obj.getElementsByTagName(OBJECT)[0];
			if (nestedObj) {
				var c = nestedObj.childNodes;
				if (c) {
					var cl = c.length;
					for (var i = 0; i < cl; i++) {
						if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) {
							ac.appendChild(c[i].cloneNode(true));
						}
					}
				}
			}
		}
		return ac;
	}
	
	/* Cross-browser dynamic SWF creation
	*/
	function createSWF(attObj, parObj, id) {
		var r, el = getElementById(id);
		if (el) {
			if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content
				attObj.id = id;
			}
			if (ua.ie && ua.win) { // IE, the object element and W3C DOM methods do not combine: fall back to outerHTML
				var att = "";
				for (var i in attObj) {
					if (attObj[i] != Object.prototype[i]) { // Filter out prototype additions from other potential libraries, like Object.prototype.toJSONString = function() {}
						if (i.toLowerCase() == "data") {
							parObj.movie = attObj[i];
						}
						else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
							att += ' class="' + attObj[i] + '"';
						}
						else if (i.toLowerCase() != "classid") {
							att += ' ' + i + '="' + attObj[i] + '"';
						}
					}
				}
				var par = "";
				for (var j in parObj) {
					if (parObj[j] != Object.prototype[j]) { // Filter out prototype additions from other potential libraries
						par += '<param name="' + j + '" value="' + parObj[j] + '" />';
					}
				}
				el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';
				objIdArr[objIdArr.length] = attObj.id; // Stored to fix object 'leaks' on unload (dynamic publishing only)
				r = getElementById(attObj.id);	
			}
			else if (ua.webkit && ua.webkit < 312) { // Older webkit engines ignore the object element's nested param elements: fall back to the proprietary embed element
				var e = createElement("embed");
				e.setAttribute("type", FLASH_MIME_TYPE);
				for (var k in attObj) {
					if (attObj[k] != Object.prototype[k]) { // Filter out prototype additions from other potential libraries
						if (k.toLowerCase() == "data") {
							e.setAttribute("src", attObj[k]);
						}
						else if (k.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
							e.setAttribute("class", attObj[k]);
						}
						else if (k.toLowerCase() != "classid") { // Filter out IE specific attribute
							e.setAttribute(k, attObj[k]);
						}
					}
				}
				for (var l in parObj) {
					if (parObj[l] != Object.prototype[l]) { // Filter out prototype additions from other potential libraries
						if (l.toLowerCase() != "movie") { // Filter out IE specific param element
							e.setAttribute(l, parObj[l]);
						}
					}
				}
				el.parentNode.replaceChild(e, el);
				r = e;
			}
			else { // Well-behaving browsers
				var o = createElement(OBJECT);
				o.setAttribute("type", FLASH_MIME_TYPE);
				for (var m in attObj) {
					if (attObj[m] != Object.prototype[m]) { // Filter out prototype additions from other potential libraries
						if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
							o.setAttribute("class", attObj[m]);
						}
						else if (m.toLowerCase() != "classid") { // Filter out IE specific attribute
							o.setAttribute(m, attObj[m]);
						}
					}
				}
				for (var n in parObj) {
					if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // Filter out prototype additions from other potential libraries and IE specific param element
						createObjParam(o, n, parObj[n]);
					}
				}
				el.parentNode.replaceChild(o, el);
				r = o;
			}
		}
		return r;
	}
	
	function createObjParam(el, pName, pValue) {
		var p = createElement("param");
		p.setAttribute("name", pName);	
		p.setAttribute("value", pValue);
		el.appendChild(p);
	}
	
	/* Cross-browser SWF removal
		- Especially needed to safely and completely remove a SWF in Internet Explorer
	*/
	function removeSWF(id) {
		var obj = getElementById(id);
		if (obj && (obj.nodeName == "OBJECT" || obj.nodeName == "EMBED")) {
			if (ua.ie && ua.win) {
				if (obj.readyState == 4) {
					removeObjectInIE(id);
				}
				else {
					win.attachEvent("onload", function() {
						removeObjectInIE(id);
					});
				}
			}
			else {
				obj.parentNode.removeChild(obj);
			}
		}
	}
	
	function removeObjectInIE(id) {
		var obj = getElementById(id);
		if (obj) {
			for (var i in obj) {
				if (typeof obj[i] == "function") {
					obj[i] = null;
				}
			}
			obj.parentNode.removeChild(obj);
		}
	}
	
	/* Functions to optimize JavaScript compression
	*/
	function getElementById(id) {
		return doc.getElementById(id);
	}
	
	function createElement(el) {
		return doc.createElement(el);
	}
	
	/* Updated attachEvent function for Internet Explorer
		- Stores attachEvent information in an Array, so on unload the detachEvent functions can be called to avoid memory leaks
	*/	
	function addListener(target, eventType, fn) {
		target.attachEvent(eventType, fn);
		listenersArr[listenersArr.length] = [target, eventType, fn];
	}
	
	/* Flash Player and SWF content version matching
	*/
	function hasPlayerVersion(rv) {
		var pv = ua.pv, v = rv.split(".");
		v[0] = parseInt(v[0], 10);
		v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0"
		v[2] = parseInt(v[2], 10) || 0;
		return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
	}
	
	/* Cross-browser dynamic CSS creation
		- Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php
	*/	
	function createCSS(sel, decl) {
		if (ua.ie && ua.mac) {
			return;
		}
		var h = doc.getElementsByTagName("head")[0], s = createElement("style");
		s.setAttribute("type", "text/css");
		s.setAttribute("media", "screen");
		if (!(ua.ie && ua.win) && typeof doc.createTextNode != UNDEF) {
			s.appendChild(doc.createTextNode(sel + " {" + decl + "}"));
		}
		h.appendChild(s);
		if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) {
			var ls = doc.styleSheets[doc.styleSheets.length - 1];
			if (typeof ls.addRule == OBJECT) {
				ls.addRule(sel, decl);
			}
		}
	}
	
	function setVisibility(id, isVisible) {
		var v = isVisible ? "visible" : "hidden";
		if (isDomLoaded && getElementById(id)) {
			getElementById(id).style.visibility = v;
		}
		else {
			createCSS("#" + id, "visibility:" + v);
		}
	}

	/* Filter to avoid XSS attacks 
	*/
	function urlEncodeIfNecessary(str) {
		var regex = /[\\\"<>\.;]/;
		var hasBadChars = regex.exec(s) != null;
		return hasBadChars ? encodeURIComponent(s) : s;
	}
	
	/* Release memory to avoid memory leaks caused by closures, fix hanging audio/video threads and force open sockets/NetConnections to disconnect (Internet Explorer only)
	*/
	var cleanup = function() {
		if (ua.ie && ua.win) {
			window.attachEvent("onunload", function() {
				// remove listeners to avoid memory leaks
				var ll = listenersArr.length;
				for (var i = 0; i < ll; i++) {
					listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]);
				}
				// cleanup dynamically embedded objects to fix audio/video threads and force open sockets and NetConnections to disconnect
				var il = objIdArr.length;
				for (var j = 0; j < il; j++) {
					removeSWF(objIdArr[j]);
				}
				// cleanup library's main closures to avoid memory leaks
				for (var k in ua) {
					ua[k] = null;
				}
				ua = null;
				for (var l in swfobject) {
					swfobject[l] = null;
				}
				swfobject = null;
			});
		}
	}();
	
	
	return {
		/* Public API
			- Reference: http://code.google.com/p/swfobject/wiki/SWFObject_2_0_documentation
		*/ 
		registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr) {
			if (!ua.w3cdom || !objectIdStr || !swfVersionStr) {
				return;
			}
			var regObj = {};
			regObj.id = objectIdStr;
			regObj.swfVersion = swfVersionStr;
			regObj.expressInstall = xiSwfUrlStr ? xiSwfUrlStr : false;
			regObjArr[regObjArr.length] = regObj;
			setVisibility(objectIdStr, false);
		},
		
		getObjectById: function(objectIdStr) {
			var r = null;
			if (ua.w3cdom) {
				var o = getElementById(objectIdStr);
				if (o) {
					var n = o.getElementsByTagName(OBJECT)[0];
					if (!n || (n && typeof o.SetVariable != UNDEF)) {
							r = o;
					}
					else if (typeof n.SetVariable != UNDEF) {
						r = n;
					}
				}
			}
			return r;
		},
		
		embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj) {
			if (!ua.w3cdom || !swfUrlStr || !replaceElemIdStr || !widthStr || !heightStr || !swfVersionStr) {
				return;
			}
			widthStr += ""; // Auto-convert to string
			heightStr += "";
			if (hasPlayerVersion(swfVersionStr)) {
				setVisibility(replaceElemIdStr, false);
				var att = {};
				if (attObj && typeof attObj === OBJECT) {
					for (var i in attObj) {
						if (attObj[i] != Object.prototype[i]) { // Filter out prototype additions from other potential libraries
							att[i] = attObj[i];
						}
					}
				}
				att.data = swfUrlStr;
				att.width = widthStr;
				att.height = heightStr;
				var par = {}; 
				if (parObj && typeof parObj === OBJECT) {
					for (var j in parObj) {
						if (parObj[j] != Object.prototype[j]) { // Filter out prototype additions from other potential libraries
							par[j] = parObj[j];
						}
					}
				}
				if (flashvarsObj && typeof flashvarsObj === OBJECT) {
					for (var k in flashvarsObj) {
						if (flashvarsObj[k] != Object.prototype[k]) { // Filter out prototype additions from other potential libraries
							if (typeof par.flashvars != UNDEF) {
								par.flashvars += "&" + k + "=" + flashvarsObj[k];
							}
							else {
								par.flashvars = k + "=" + flashvarsObj[k];
							}
						}
					}
				}
				addDomLoadEvent(function() {
					createSWF(att, par, replaceElemIdStr);
					if (att.id == replaceElemIdStr) {
						setVisibility(replaceElemIdStr, true);
					}
				});
			}
			else if (xiSwfUrlStr && !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac)) {
				isExpressInstallActive = true; // deferred execution
				setVisibility(replaceElemIdStr, false);
				addDomLoadEvent(function() {
					var regObj = {};
					regObj.id = regObj.altContentId = replaceElemIdStr;
					regObj.width = widthStr;
					regObj.height = heightStr;
					regObj.expressInstall = xiSwfUrlStr;
					showExpressInstall(regObj);
				});
			}
		},
		
		getFlashPlayerVersion: function() {
			return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
		},
		
		hasFlashPlayerVersion: hasPlayerVersion,
		
		createSWF: function(attObj, parObj, replaceElemIdStr) {
			if (ua.w3cdom) {
				return createSWF(attObj, parObj, replaceElemIdStr);
			}
			else {
				return undefined;
			}
		},
		
		removeSWF: function(objElemIdStr) {
			if (ua.w3cdom) {
				removeSWF(objElemIdStr);
			}
		},
		
		createCSS: function(sel, decl) {
			if (ua.w3cdom) {
				createCSS(sel, decl);
			}
		},
		
		addDomLoadEvent: addDomLoadEvent,
		
		addLoadEvent: addLoadEvent,
		
		getQueryParamValue: function(param) {
			var q = doc.location.search || doc.location.hash;
			if (param == null) {
				return urlEncodeIfNecessary(q);
			}
			if (q) {
				var pairs = q.substring(1).split("&");
				for (var i = 0; i < pairs.length; i++) {
					if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
						return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1)));
					}
				}
			}
			return "";
		},
		
		// For internal usage only
		expressInstallCallback: function() {
			if (isExpressInstallActive && storedAltContent) {
				var obj = getElementById(EXPRESS_INSTALL_ID);
				if (obj) {
					obj.parentNode.replaceChild(storedAltContent, obj);
					if (storedAltContentId) {
						setVisibility(storedAltContentId, true);
						if (ua.ie && ua.win) {
							storedAltContent.style.display = "block";
						}
					}
					storedAltContent = null;
					storedAltContentId = null;
					isExpressInstallActive = false;
				}
			} 
		}
	};
}();

function swapImage(imgId, imgPath)	
{
	if(document.images)	
	{
		if (imgId && imgPath)
		{
			document[imgId].src = imgPath;
		}
	}
}

function displaySwitch(r_arrOpen, r_arrClose, v_strDisplayType)
{
	
	// Open the elements in the first array passed
	for (var i=0; i<r_arrOpen.length; i++)
			if (document.getElementById(r_arrOpen[i]))
			document.getElementById(r_arrOpen[i]).style.display = (v_strDisplayType == null) ? 'block' : v_strDisplayType;
			
	// Close the elements in second array passed
	for (i=0; i<r_arrClose.length; i++)
		if (document.getElementById(r_arrClose[i]))
			document.getElementById(r_arrClose[i]).style.display = 'none';
			
			
}

// Additional piece added to provide state management local to the page
var prev_state;

function hideElement(obj) 
{			
	var curr_state = document.getElementById(obj);			
	if (!(curr_state==null) && !(prev_state==null) && (curr_state!=prev_state))
	{	
		prev_state.style.display = "none";
	}
	prev_state = curr_state;
	
}

//***********************************************************************************************

// External linking

	//Off Ramp Alert
	function offRampin(theSite)
	{
		
		return offRampStandard_local(1,'rhinocortaqua',null,theSite,null,false);
	}

	/* CURRENT FUNCTIONS */
	function offRampStandard_local(langIncluded,siteName,windowName,URL,otherOptions,returnEnabled) 
	{	
				
		var aLanguage = new Array(2);

		langIncluded = langIncluded - 1	
		aLanguage[0] = "This link will take you to a site maintained by a third party who is solely responsible for its contents.\n\n AstraZeneca provides this link as a service to Web site visitors. AstraZeneca is not responsible for the Privacy Policy of any third party Web sites. We encourage you to read the privacy policy of every Web site you visit. \nClick Cancel to return or OK to continue.";
		aLanguage[1] = "This link will take you to a site maintained by a third party who is solely responsible for its contents.\n\n AstraZeneca provides this link as a service to Web site visitors. AstraZeneca is not responsible for the Privacy Policy of any third party Web sites. We encourage you to read the privacy policy of every Web site you visit. \nClick Cancel to return or OK to continue.";

		if (windowName == null) windowName = '';
		if (otherOptions == null) otherOptions = '';
		
  		if (confirm(aLanguage[langIncluded]))
  		{
			if (URL != null) window.open(URL,windowName ,otherOptions);
			if (returnEnabled) return true;
		}
		else	
			if (returnEnabled) return false;
	}
		
		/* function that prompts the user to let them know that they are leaving the site.*/
		
		//*************************************************************************
		function showVideoContainer(flashSrc, video, image, thumbImage)
		{
			var divMovieContainer = document.getElementById(video);
			//alert("OK1");
			if (divMovieContainer)
			{
				swfobject.embedSWF(flashSrc, video, "758", "453", "8", "", {}, {}, {});
			
				divMovieContainer.style.display = "inline";
				divMovieContainer.style.visibility = "visible";
				//alert("OK2");
			}
			
			var contentContainer1 = document.getElementById(image);
			if (contentContainer1)
			{
				contentContainer1.style.display = "none";
				contentContainer1.style.visibility = "hidden";
				//alert("OK3");
			}
			
			var thumbnail = document.getElementById(thumbImage);
			if(thumbnail)
			{
				if(thumbnail.src.indexOf('_gray.jpg')<0)
				{
					thumbnail.src = thumbnail.src.substring(0, (thumbnail.src.length-4)) + '_gray.jpg';
				}
			}
		}
		
		function hideVideoContainer(video, image, thumbImage)
		{
			var divMovieContainer = document.getElementById(video);
			
			//alert("OK1");
			if (divMovieContainer)
			{	
				divMovieContainer.style.display = "none";
				divMovieContainer.style.visibility = "hidden";
				//alert("OK2");
			}
			
			var contentContainer1 = document.getElementById(image);
			if (contentContainer1)
			{
				contentContainer1.style.display = "inline";
				contentContainer1.style.visibility = "visible";
				//alert("OK3");
			}
			
			var thumbnail = document.getElementById(thumbImage);
			if(thumbnail)
			{
				thumbnail.src = thumbImage;
			}
		}
			
//*** Print functionality ***
function PrintThisPage()
{
	var sWinHTML = document.getElementById('content-static').innerHTML;
	var winprint = window.open("","");
	
	winprint.document.open();
	winprint.document.write('<html><link href=../../styles/three-column-style.css type=text/css rel=stylesheet></link><body onload=window.print();><div id=content-print>');
	winprint.document.write(sWinHTML);
	winprint.document.write('</div></body></html>');
	
	winprint.document.close();
	winprint.focus();
}

//******* Disease State Videos *************
function playVideo(flashSrc)
{
	var flashvars = {};
	var params = { wmode: "transparent" };
	var attributes = {};
	
	swfobject.embedSWF(flashSrc,"content-flash", "758", "514", "8", "", flashvars, params, attributes);
	
	document.getElementById("content-flash").style.display = "block";
}

function exitVideo()
{
	document.getElementById("content-flash").style.display = "none";
}

function toggle(obj) 
{
	var el = document.getElementById(obj);
	if ( el.style.display != 'none' ) 
	{
		el.style.display = 'none';
	}
	else 
	{
		el.style.display = '';
	}
}

function clearSearch(val,f){
	if(val=="Search") f.value = "";
}

function showElement(obj)
{
	var el = document.getElementById(obj);
	el.style.display = '';
}

//JD - 07/30/08
//Disables the user from submitting the page using the Enter key.  Prevents page format mess-up.
//Currently being used in the Medication Reminder pages
function disableEnterKey(e)
{
	var key;
	if(window.event)
		key = window.event.keyCode; //IE
	else
		key = e.which; //FF
		
	return (key != 13);
}

//JD - 09/15/08
//Function that returns a boolean value based on the User querystring in print.aspx.
//Evaluates the value which is then used in the HitBox tagging.
function getQuerystring(key, default_)
{
if (default_==null) default_=""; 
key = key.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
var regex = new RegExp("[\\?&]"+key+"=([^&#]*)");
var qs = regex.exec(window.location.href);
if(qs == null){
	return default_;
}
else{
	return qs[1];
	}
}

function ToggleMedicationQuestions(obj)
{
    if (obj.options[obj.selectedIndex].value == 11)
    {
        document.Form1.ddlMedicationFrequency.selectedIndex = 5;
        document.Form1.ddlMedicationDuration.selectedIndex = 3;
        document.Form1.ddlMedicationFrequency.disabled = true;
        document.Form1.ddlMedicationDuration.disabled = true;
    }
    else
    {
        document.Form1.ddlMedicationFrequency.selectedIndex = 0;
        document.Form1.ddlMedicationDuration.selectedIndex = 0;
        document.Form1.ddlMedicationFrequency.disabled = false;
        document.Form1.ddlMedicationDuration.disabled = false;
    }
}

// Clear Default Text from Textboxs
function clearText(thefield){
	if (thefield.defaultValue==thefield.value)
	thefield.value = "";
} 
function addText(thefield,thetext){
	if (thefield.value=="")
	thefield.value = thetext;
}

function flashResize() {
    $("#content").css("left", $(window).width() / 2 - 489);

    $(window).resize( function() {       
        $("#content").css("left", $(window).width() / 2 - 489);
    });
}

/***********************************************************************

Global variables for offRamp language

************************************************************************/
var iGlobalEng = 1;
var iThirdPartyEng = 2;
var iGlobalSpan = 3;
var iThirdPartySpan = 4;
var Abraxis = 5;
var Arimidex = 6;
var Faslodex = 7;

/***********************************************************************
function FollowURL(iLanguage, sURL, bReturn, sWndName, sOptions)

Description:
	Shows the off-ramp language to the user before navigating to a third-
	party or global site. 
	
Parameters:
	iLanguage: integer value defined above identifying the language to use
		Global AZ English = 1
		Third Party English = 2
		Global AZ Spanish = 3
		Third Party Spanish = 4
	sURL: string value identifying the URL the user is attempting to navigate to
	bReturn: optional boolean value identifying whether a return value is required by the caller
	sWndName: optional string identifying the name of the target window
	sOptions: optional string identifying window.open options
	
Example:
	FollowURL(iGlobalEng, "http://www.cnn.com", false, "CNN", "top=10,left=10")

************************************************************************/
function FollowURL(iLanguage, sURL, bReturn, sWndName, sOptions)
{
	var sPrompt;
	
	switch (iLanguage)
	{
		case 1: // iGlobalEng
			sPrompt = "This link will take you to a global section of this site maintained by AstraZeneca.\nIt may contain information that does not fall within the indications and guidelines of United States regulatory agencies.\n\nClick Cancel to return or OK to continue."
			break;
		case 2: // iThirdPartyEng
			sPrompt = "This link will take you to a site maintained by a third party who is solely responsible for its contents.\n\nAstraZeneca provides this link as a service to Web site visitors. AstraZeneca is not responsible for the Privacy Policy of any third party Web sites. We encourage you to read the privacy policy of every Web site you visit.\n\nClick Cancel to return or OK to continue."
			break;
		case 3: // iGlobalSpan
			sPrompt = "Este enlace lo llevará a una sección mundial de este sitio mantenida por AstraZeneca.\nEste sitio puede contener información que no entra dentro de las indicaciones y guías de las agencias reglamentarias de Estados Unidos.\n\nHaga clic en Cancelar para regresar o en OK para continuar."
			break;
		case 4: //iThirdPartySpan
			sPrompt = "Este enlace lo llevará a un sitio que es mantenido por terceros, que son los únicos responsables de su contenido.\n\nAstraZeneca proporciona este enlace como un servicio a los visitantes a su sitio web. AstraZeneca no es responsable de la Política de Privacidad de sitios web de terceros. Por favor, lea la política de privacidad de cada sitio web que visite.\n\nHaga clic en Cancelar para regresar o en OK para continuar."
			break;
		case 5: //Abraxis
			sPrompt = 'This link will take you to a product Web site where you will find information about a chemotherapy option for metastatic breast cancer.\n\nThis site is maintained by Abraxis BioScience who is solely responsible for its contents. Abraxis and AstraZeneca are not responsible for the Privacy Policy of any third party web sites, should you choose to exit an Abraxis or AstraZeneca Web site. We encourage you to read the privacy policy of every web site you visit. Click "Cancel" to return or "OK" to continue.'
			break;	
		case 6: // ARIMIDEX
			sPrompt = "This link will take you to a product Web site where you will find information about a hormonal treatment for breast cancer.\n\nBreast cancer is a malignant tumor that grows in one or both of the breasts. Breast cancer usually develops in the ducts or lobules of the breast. Even after initial treatment for breast cancer, it's possible for breast cancer to come back--or recur--either at the same site as the original tumor or somewhere else in the body. The risk of recurrence is highest in the first 5 years following initial diagnosis, peaking within the first 3 years."
			break;
		case 7: // FASLODEX
			sPrompt = "This link will take you to a product Web site where you will find information about a hormonal treatment for hormone receptor-positive metastatic breast cancer in postmenopausal women whose disease has returned or progressed following antiestrogen therapy.\n\nDoctors use the term \"stage\" to refer to the extent of cancer within the body. Breast cancer staging takes into account the size and location of the primary breast tumor any regional lymph node involvement near the breast and underarm, and any metastatic disease. In stage IV, also known as metastatic cancer, the disease has spread from the breast to other parts of the body such as the bone, liver, lungs, or brain."
			break;
		case 8: // Pulmicort Spanish 
			sPrompt = "Las páginas que visites de aquí en adelante están en inglés." 
			break; 

		
	}
	
	if (sWndName == null) sWndName = "opener";
	if (sOptions == null) sOptions = "";

	if(! confirm(sPrompt))
		if (bReturn) return false;
		else return;

	var externalWin = window.open(sURL, null, sOptions);
	if (externalWin.opener == null)
		externalWin.opener = window;
	externalWin.opener.name = sWndName;
	if (bReturn) return true;
/*
	if (confirm(sPrompt))
  	{
		if (sURL != null) window.open(sURL, sWndName, sOptions);
		if (bReturn) return true;
	}
	else	
	{
		if (bReturn) return false;
	}
*/
}

 function addHoverToClass(obj){
	if (obj.className.indexOf("selected") == -1){
		obj.className = obj.className + "_hover";
	}
}

function removeHoverFromClass(obj){
	if (obj.className.indexOf("selected") == -1){
		obj.className = obj.className.replace(new RegExp("_hover"), "");
	}
} 