themes/classic/source/javascripts/libs/swfobject-dynamic.js
929e6061
 /*!	SWFObject v2.2 <http://code.google.com/p/swfobject/>
 	is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
 */
 
 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,
 
 		plugin = false,
 		regObjArr = [],
 		objIdArr = [],
 		storedAltContent,
 		storedAltContentId,
 		storedCallbackFn,
 		storedCallbackObj,
 		autoHideShow = true,
 
 	/* Centralized function for browser feature detection
 		- User agent string detection is only used when no good alternative is possible
 		- Is executed directly for optimal performance
 	*/
 	ua = function() {
 		var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,
 			u = nav.userAgent.toLowerCase(),
 			p = nav.platform.toLowerCase(),
 			windows = p ? /win/.test(p) : /win/.test(u),
 			mac = p ? /mac/.test(p) : /mac/.test(u),
 			webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
 			ie = !+"\v1", // feature detection based on Andrea Giammarchi's solution: http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html
 			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+
 				plugin = true;
 				ie = false; // cascaded feature detection for Internet Explorer
 				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] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;
 			}
 		}
 		else if (typeof win.ActiveXObject != UNDEF) {
 			try {
 				var a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
 				if (a) { // a will return null when ActiveX is disabled
 					d = a.GetVariable("$version");
 					if (d) {
 						ie = true; // cascaded feature detection for Internet Explorer
 						d = d.split(" ")[1].split(",");
 						playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
 					}
 				}
 			}
 			catch(e) {}
 		}
 		return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac };
 	}()
 
 
 	/* Main function
 		- Will preferably execute onDomLoad, otherwise onload (as a fallback)
 	*/
 	function main() {
 		if (plugin) { testPlayerVersion(); }
 		else { matchVersions(); }
 	}
 
 	/* Detect the Flash Player version for non-Internet Explorer browsers
 		- Detecting the plug-in version via the object element is more precise than using the plugins collection item's description:
 		  a. Both release and build numbers can be detected
 		  b. Avoid wrong descriptions by corrupt installers provided by Adobe
 		  c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports
 		- Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available
 	*/
 	function testPlayerVersion() {
 		var b = doc.getElementsByTagName("body")[0];
 		var o = createElement(OBJECT);
 		o.setAttribute("type", FLASH_MIME_TYPE);
 		var t = b.appendChild(o);
 		if (t) {
 			var counter = 0;
 			(function(){
 				if (typeof t.GetVariable != UNDEF) {
 					var d = t.GetVariable("$version");
 					if (d) {
 						d = d.split(" ")[1].split(",");
 						ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
 					}
 				}
 				else if (counter < 10) {
 					counter++;
 					setTimeout(arguments.callee, 10);
 					return;
 				}
 				b.removeChild(o);
 				t = null;
 				matchVersions();
 			})();
 		}
 		else {
 			matchVersions();
 		}
 	}
 
 
 	/* Cross-browser dynamic SWF creation
 	*/
 	function createSWF(attObj, parObj, id) {
 		var r, el = getElementById(id);
 		if (ua.wk && ua.wk < 312) { return r; }
 		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) { // Internet Explorer + the HTML object element + 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
 						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 { // 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
 	*/
 	/* Functions to optimize JavaScript compression
 	*/
 	function getElementById(id) {
 		var el = null;
 		try {
 			el = doc.getElementById(id);
 		}
 		catch (e) {}
 		return el;
 	}
 
 	function createElement(el) {
 		return doc.createElement(el);
 	}
 
 	/* 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;
 	}
 
 
 	/* Filter to avoid XSS attacks
 	*/
 	function urlEncodeIfNecessary(s) {
 		var regex = /[\\\"<>\.;]/;
 		var hasBadChars = regex.exec(s) != null;
 		return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s;
 	}
 
 	return {
 		/* Public API
 			- Reference: http://code.google.com/p/swfobject/wiki/documentation
 		*/
 
 		embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, flashvarsObj, parObj, attObj, callbackFn) {
 			var callbackObj = {success:false, id:replaceElemIdStr};
 			if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) {
               widthStr += ""; // auto-convert to string
               heightStr += "";
               var att = {};
               if (attObj && typeof attObj === OBJECT) {
                 for (var i in attObj) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs
                   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) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs
                   par[j] = parObj[j];
                 }
               }
               if (flashvarsObj && typeof flashvarsObj === OBJECT) {
                 for (var k in flashvarsObj) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs
                   if (typeof par.flashvars != UNDEF) {
                     par.flashvars += "&" + k + "=" + flashvarsObj[k];
                   }
                   else {
                     par.flashvars = k + "=" + flashvarsObj[k];
                   }
                 }
               }
               if (hasPlayerVersion(swfVersionStr)) { // create SWF
                 var obj = createSWF(att, par, replaceElemIdStr);
                 callbackObj.success = true;
                 callbackObj.ref = obj;
               }
               if (callbackFn) { callbackFn(callbackObj); }
 			}
 			else if (callbackFn) { callbackFn(callbackObj);	}
 		},
 
 		ua: ua,
 
 		getFlashPlayerVersion: function() {
 			return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
 		},
 
 		hasFlashPlayerVersion: hasPlayerVersion,
 
 		createSWF: function(attObj, parObj, replaceElemIdStr) {
 			if (ua.w3) {
 				return createSWF(attObj, parObj, replaceElemIdStr);
 			}
 			else {
 				return undefined;
 			}
 		},
 
 		getQueryParamValue: function(param) {
 			var q = doc.location.search || doc.location.hash;
 			if (q) {
 				if (/\?/.test(q)) { q = q.split("?")[1]; } // strip question mark
 				if (param == null) {
 					return urlEncodeIfNecessary(q);
 				}
 				var pairs = q.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 "";
 		}
 	};
 }();