3 <title>The source code</title>
4 <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
5 <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
7 <body onload="prettyPrint();">
8 <pre class="prettyprint lang-js">/*!
10 * Copyright(c) 2006-2009 Ext JS, LLC
12 * http://www.extjs.com/license
14 /*! SWFObject v2.2 <http://code.google.com/p/swfobject/>
\r
15 is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
\r
18 var swfobject = function() {
\r
20 var UNDEF = "undefined",
\r
22 SHOCKWAVE_FLASH = "Shockwave Flash",
\r
23 SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
\r
24 FLASH_MIME_TYPE = "application/x-shockwave-flash",
\r
25 EXPRESS_INSTALL_ID = "SWFObjectExprInst",
\r
26 ON_READY_STATE_CHANGE = "onreadystatechange",
\r
33 domLoadFnArr = [main],
\r
41 isDomLoaded = false,
\r
42 isExpressInstallActive = false,
\r
44 dynamicStylesheetMedia,
\r
45 autoHideShow = true,
\r
47 /* Centralized function for browser feature detection
\r
48 - User agent string detection is only used when no good alternative is possible
\r
49 - Is executed directly for optimal performance
\r
52 var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,
\r
53 u = nav.userAgent.toLowerCase(),
\r
54 p = nav.platform.toLowerCase(),
\r
55 windows = p ? /win/.test(p) : /win/.test(u),
\r
56 mac = p ? /mac/.test(p) : /mac/.test(u),
\r
57 webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
\r
58 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
\r
59 playerVersion = [0,0,0],
\r
61 if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
\r
62 d = nav.plugins[SHOCKWAVE_FLASH].description;
\r
63 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+
\r
65 ie = false; // cascaded feature detection for Internet Explorer
\r
66 d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
\r
67 playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
\r
68 playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
\r
69 playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;
\r
72 else if (typeof win.ActiveXObject != UNDEF) {
\r
74 var a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
\r
75 if (a) { // a will return null when ActiveX is disabled
\r
76 d = a.GetVariable("$version");
\r
78 ie = true; // cascaded feature detection for Internet Explorer
\r
79 d = d.split(" ")[1].split(",");
\r
80 playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
\r
86 return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac };
\r
89 /* Cross-browser onDomLoad
\r
90 - Will fire an event as soon as the DOM of a web page is loaded
\r
91 - Internet Explorer workaround based on Diego Perini's solution: http://javascript.nwbox.com/IEContentLoaded/
\r
92 - Regular onload serves as fallback
\r
94 onDomLoad = function() {
\r
95 if (!ua.w3) { return; }
\r
96 if ((typeof doc.readyState != UNDEF && doc.readyState == "complete") || (typeof doc.readyState == UNDEF && (doc.getElementsByTagName("body")[0] || doc.body))) { // function is fired after onload, e.g. when script is inserted dynamically
\r
97 callDomLoadFunctions();
\r
100 if (typeof doc.addEventListener != UNDEF) {
\r
101 doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, false);
\r
103 if (ua.ie && ua.win) {
\r
104 doc.attachEvent(ON_READY_STATE_CHANGE, function() {
\r
105 if (doc.readyState == "complete") {
\r
106 doc.detachEvent(ON_READY_STATE_CHANGE, arguments.callee);
\r
107 callDomLoadFunctions();
\r
110 if (win == top) { // if not inside an iframe
\r
112 if (isDomLoaded) { return; }
\r
114 doc.documentElement.doScroll("left");
\r
117 setTimeout(arguments.callee, 0);
\r
120 callDomLoadFunctions();
\r
126 if (isDomLoaded) { return; }
\r
127 if (!/loaded|complete/.test(doc.readyState)) {
\r
128 setTimeout(arguments.callee, 0);
\r
131 callDomLoadFunctions();
\r
134 addLoadEvent(callDomLoadFunctions);
\r
138 function callDomLoadFunctions() {
\r
139 if (isDomLoaded) { return; }
\r
140 try { // test if we can really add/remove elements to/from the DOM; we don't want to fire it too early
\r
141 var t = doc.getElementsByTagName("body")[0].appendChild(createElement("span"));
\r
142 t.parentNode.removeChild(t);
\r
144 catch (e) { return; }
\r
145 isDomLoaded = true;
\r
146 var dl = domLoadFnArr.length;
\r
147 for (var i = 0; i < dl; i++) {
\r
152 function addDomLoadEvent(fn) {
\r
157 domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+
\r
161 /* Cross-browser onload
\r
162 - Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/
\r
163 - Will fire an event as soon as a web page including all of its assets are loaded
\r
165 function addLoadEvent(fn) {
\r
166 if (typeof win.addEventListener != UNDEF) {
\r
167 win.addEventListener("load", fn, false);
\r
169 else if (typeof doc.addEventListener != UNDEF) {
\r
170 doc.addEventListener("load", fn, false);
\r
172 else if (typeof win.attachEvent != UNDEF) {
\r
173 addListener(win, "onload", fn);
\r
175 else if (typeof win.onload == "function") {
\r
176 var fnOld = win.onload;
\r
177 win.onload = function() {
\r
188 - Will preferably execute onDomLoad, otherwise onload (as a fallback)
\r
192 testPlayerVersion();
\r
199 /* Detect the Flash Player version for non-Internet Explorer browsers
\r
200 - Detecting the plug-in version via the object element is more precise than using the plugins collection item's description:
\r
201 a. Both release and build numbers can be detected
\r
202 b. Avoid wrong descriptions by corrupt installers provided by Adobe
\r
203 c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports
\r
204 - Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available
\r
206 function testPlayerVersion() {
\r
207 var b = doc.getElementsByTagName("body")[0];
\r
208 var o = createElement(OBJECT);
\r
209 o.setAttribute("type", FLASH_MIME_TYPE);
\r
210 var t = b.appendChild(o);
\r
214 if (typeof t.GetVariable != UNDEF) {
\r
215 var d = t.GetVariable("$version");
\r
217 d = d.split(" ")[1].split(",");
\r
218 ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
\r
221 else if (counter < 10) {
\r
223 setTimeout(arguments.callee, 10);
\r
236 /* Perform Flash Player and SWF version matching; static publishing only
\r
238 function matchVersions() {
\r
239 var rl = regObjArr.length;
\r
241 for (var i = 0; i < rl; i++) { // for each registered object element
\r
242 var id = regObjArr[i].id;
\r
243 var cb = regObjArr[i].callbackFn;
\r
244 var cbObj = {success:false, id:id};
\r
245 if (ua.pv[0] > 0) {
\r
246 var obj = getElementById(id);
\r
248 if (hasPlayerVersion(regObjArr[i].swfVersion) && !(ua.wk && ua.wk < 312)) { // Flash Player version >= published SWF version: Houston, we have a match!
\r
249 setVisibility(id, true);
\r
251 cbObj.success = true;
\r
252 cbObj.ref = getObjectById(id);
\r
256 else if (regObjArr[i].expressInstall && canExpressInstall()) { // show the Adobe Express Install dialog if set by the web page author and if supported
\r
258 att.data = regObjArr[i].expressInstall;
\r
259 att.width = obj.getAttribute("width") || "0";
\r
260 att.height = obj.getAttribute("height") || "0";
\r
261 if (obj.getAttribute("class")) { att.styleclass = obj.getAttribute("class"); }
\r
262 if (obj.getAttribute("align")) { att.align = obj.getAttribute("align"); }
\r
263 // parse HTML object param element's name-value pairs
\r
265 var p = obj.getElementsByTagName("param");
\r
267 for (var j = 0; j < pl; j++) {
\r
268 if (p[j].getAttribute("name").toLowerCase() != "movie") {
\r
269 par[p[j].getAttribute("name")] = p[j].getAttribute("value");
\r
272 showExpressInstall(att, par, id, cb);
\r
274 else { // Flash Player and SWF version mismatch or an older Webkit engine that ignores the HTML object element's nested param elements: display alternative content instead of SWF
\r
275 displayAltContent(obj);
\r
276 if (cb) { cb(cbObj); }
\r
280 else { // if no Flash Player is installed or the fp version cannot be detected we let the HTML object element do its job (either show a SWF or alternative content)
\r
281 setVisibility(id, true);
\r
283 var o = getObjectById(id); // test whether there is an HTML object element or not
\r
284 if (o && typeof o.SetVariable != UNDEF) {
\r
285 cbObj.success = true;
\r
295 function getObjectById(objectIdStr) {
\r
297 var o = getElementById(objectIdStr);
\r
298 if (o && o.nodeName == "OBJECT") {
\r
299 if (typeof o.SetVariable != UNDEF) {
\r
303 var n = o.getElementsByTagName(OBJECT)[0];
\r
312 /* Requirements for Adobe Express Install
\r
313 - only one instance can be active at a time
\r
314 - fp 6.0.65 or higher
\r
316 - no Webkit engines older than version 312
\r
318 function canExpressInstall() {
\r
319 return !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac) && !(ua.wk && ua.wk < 312);
\r
322 /* Show the Adobe Express Install dialog
\r
323 - Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75
\r
325 function showExpressInstall(att, par, replaceElemIdStr, callbackFn) {
\r
326 isExpressInstallActive = true;
\r
327 storedCallbackFn = callbackFn || null;
\r
328 storedCallbackObj = {success:false, id:replaceElemIdStr};
\r
329 var obj = getElementById(replaceElemIdStr);
\r
331 if (obj.nodeName == "OBJECT") { // static publishing
\r
332 storedAltContent = abstractAltContent(obj);
\r
333 storedAltContentId = null;
\r
335 else { // dynamic publishing
\r
336 storedAltContent = obj;
\r
337 storedAltContentId = replaceElemIdStr;
\r
339 att.id = EXPRESS_INSTALL_ID;
\r
340 if (typeof att.width == UNDEF || (!/%$/.test(att.width) && parseInt(att.width, 10) < 310)) { att.width = "310"; }
\r
341 if (typeof att.height == UNDEF || (!/%$/.test(att.height) && parseInt(att.height, 10) < 137)) { att.height = "137"; }
\r
342 doc.title = doc.title.slice(0, 47) + " - Flash Player Installation";
\r
343 var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn",
\r
344 fv = "MMredirectURL=" + win.location.toString().replace(/&/g,"%26") + "&MMplayerType=" + pt + "&MMdoctitle=" + doc.title;
\r
345 if (typeof par.flashvars != UNDEF) {
\r
346 par.flashvars += "&" + fv;
\r
349 par.flashvars = fv;
\r
351 // IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it,
\r
352 // because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
\r
353 if (ua.ie && ua.win && obj.readyState != 4) {
\r
354 var newObj = createElement("div");
\r
355 replaceElemIdStr += "SWFObjectNew";
\r
356 newObj.setAttribute("id", replaceElemIdStr);
\r
357 obj.parentNode.insertBefore(newObj, obj); // insert placeholder div that will be replaced by the object element that loads expressinstall.swf
\r
358 obj.style.display = "none";
\r
360 if (obj.readyState == 4) {
\r
361 obj.parentNode.removeChild(obj);
\r
364 setTimeout(arguments.callee, 10);
\r
368 createSWF(att, par, replaceElemIdStr);
\r
372 /* Functions to abstract and display alternative content
\r
374 function displayAltContent(obj) {
\r
375 if (ua.ie && ua.win && obj.readyState != 4) {
\r
376 // IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it,
\r
377 // because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
\r
378 var el = createElement("div");
\r
379 obj.parentNode.insertBefore(el, obj); // insert placeholder div that will be replaced by the alternative content
\r
380 el.parentNode.replaceChild(abstractAltContent(obj), el);
\r
381 obj.style.display = "none";
\r
383 if (obj.readyState == 4) {
\r
384 obj.parentNode.removeChild(obj);
\r
387 setTimeout(arguments.callee, 10);
\r
392 obj.parentNode.replaceChild(abstractAltContent(obj), obj);
\r
396 function abstractAltContent(obj) {
\r
397 var ac = createElement("div");
\r
398 if (ua.win && ua.ie) {
\r
399 ac.innerHTML = obj.innerHTML;
\r
402 var nestedObj = obj.getElementsByTagName(OBJECT)[0];
\r
404 var c = nestedObj.childNodes;
\r
407 for (var i = 0; i < cl; i++) {
\r
408 if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) {
\r
409 ac.appendChild(c[i].cloneNode(true));
\r
418 /* Cross-browser dynamic SWF creation
\r
420 function createSWF(attObj, parObj, id) {
\r
421 var r, el = getElementById(id);
\r
422 if (ua.wk && ua.wk < 312) { return r; }
\r
424 if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content
\r
427 if (ua.ie && ua.win) { // Internet Explorer + the HTML object element + W3C DOM methods do not combine: fall back to outerHTML
\r
429 for (var i in attObj) {
\r
430 if (attObj[i] != Object.prototype[i]) { // filter out prototype additions from other potential libraries
\r
431 if (i.toLowerCase() == "data") {
\r
432 parObj.movie = attObj[i];
\r
434 else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
\r
435 att += ' class="' + attObj[i] + '"';
\r
437 else if (i.toLowerCase() != "classid") {
\r
438 att += ' ' + i + '="' + attObj[i] + '"';
\r
443 for (var j in parObj) {
\r
444 if (parObj[j] != Object.prototype[j]) { // filter out prototype additions from other potential libraries
\r
445 par += '<param name="' + j + '" value="' + parObj[j] + '" />';
\r
448 el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';
\r
449 objIdArr[objIdArr.length] = attObj.id; // stored to fix object 'leaks' on unload (dynamic publishing only)
\r
450 r = getElementById(attObj.id);
\r
452 else { // well-behaving browsers
\r
453 var o = createElement(OBJECT);
\r
454 o.setAttribute("type", FLASH_MIME_TYPE);
\r
455 for (var m in attObj) {
\r
456 if (attObj[m] != Object.prototype[m]) { // filter out prototype additions from other potential libraries
\r
457 if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
\r
458 o.setAttribute("class", attObj[m]);
\r
460 else if (m.toLowerCase() != "classid") { // filter out IE specific attribute
\r
461 o.setAttribute(m, attObj[m]);
\r
465 for (var n in parObj) {
\r
466 if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // filter out prototype additions from other potential libraries and IE specific param element
\r
467 createObjParam(o, n, parObj[n]);
\r
470 el.parentNode.replaceChild(o, el);
\r
477 function createObjParam(el, pName, pValue) {
\r
478 var p = createElement("param");
\r
479 p.setAttribute("name", pName);
\r
480 p.setAttribute("value", pValue);
\r
484 /* Cross-browser SWF removal
\r
485 - Especially needed to safely and completely remove a SWF in Internet Explorer
\r
487 function removeSWF(id) {
\r
488 var obj = getElementById(id);
\r
489 if (obj && obj.nodeName == "OBJECT") {
\r
490 if (ua.ie && ua.win) {
\r
491 obj.style.display = "none";
\r
493 if (obj.readyState == 4) {
\r
494 removeObjectInIE(id);
\r
497 setTimeout(arguments.callee, 10);
\r
502 obj.parentNode.removeChild(obj);
\r
507 function removeObjectInIE(id) {
\r
508 var obj = getElementById(id);
\r
510 for (var i in obj) {
\r
511 if (typeof obj[i] == "function") {
\r
515 obj.parentNode.removeChild(obj);
\r
519 /* Functions to optimize JavaScript compression
\r
521 function getElementById(id) {
\r
524 el = doc.getElementById(id);
\r
530 function createElement(el) {
\r
531 return doc.createElement(el);
\r
534 /* Updated attachEvent function for Internet Explorer
\r
535 - Stores attachEvent information in an Array, so on unload the detachEvent functions can be called to avoid memory leaks
\r
537 function addListener(target, eventType, fn) {
\r
538 target.attachEvent(eventType, fn);
\r
539 listenersArr[listenersArr.length] = [target, eventType, fn];
\r
542 /* Flash Player and SWF content version matching
\r
544 function hasPlayerVersion(rv) {
\r
545 var pv = ua.pv, v = rv.split(".");
\r
546 v[0] = parseInt(v[0], 10);
\r
547 v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0"
\r
548 v[2] = parseInt(v[2], 10) || 0;
\r
549 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;
\r
552 /* Cross-browser dynamic CSS creation
\r
553 - Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php
\r
555 function createCSS(sel, decl, media, newStyle) {
\r
556 if (ua.ie && ua.mac) { return; }
\r
557 var h = doc.getElementsByTagName("head")[0];
\r
558 if (!h) { return; } // to also support badly authored HTML pages that lack a head element
\r
559 var m = (media && typeof media == "string") ? media : "screen";
\r
561 dynamicStylesheet = null;
\r
562 dynamicStylesheetMedia = null;
\r
564 if (!dynamicStylesheet || dynamicStylesheetMedia != m) {
\r
565 // create dynamic stylesheet + get a global reference to it
\r
566 var s = createElement("style");
\r
567 s.setAttribute("type", "text/css");
\r
568 s.setAttribute("media", m);
\r
569 dynamicStylesheet = h.appendChild(s);
\r
570 if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) {
\r
571 dynamicStylesheet = doc.styleSheets[doc.styleSheets.length - 1];
\r
573 dynamicStylesheetMedia = m;
\r
576 if (ua.ie && ua.win) {
\r
577 if (dynamicStylesheet && typeof dynamicStylesheet.addRule == OBJECT) {
\r
578 dynamicStylesheet.addRule(sel, decl);
\r
582 if (dynamicStylesheet && typeof doc.createTextNode != UNDEF) {
\r
583 dynamicStylesheet.appendChild(doc.createTextNode(sel + " {" + decl + "}"));
\r
588 function setVisibility(id, isVisible) {
\r
589 if (!autoHideShow) { return; }
\r
590 var v = isVisible ? "visible" : "hidden";
\r
591 if (isDomLoaded && getElementById(id)) {
\r
592 getElementById(id).style.visibility = v;
\r
595 createCSS("#" + id, "visibility:" + v);
\r
599 /* Filter to avoid XSS attacks
\r
601 function urlEncodeIfNecessary(s) {
\r
602 var regex = /[\\\"<>\.;]/;
\r
603 var hasBadChars = regex.exec(s) != null;
\r
604 return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s;
\r
607 /* Release memory to avoid memory leaks caused by closures, fix hanging audio/video threads and force open sockets/NetConnections to disconnect (Internet Explorer only)
\r
609 var cleanup = function() {
\r
610 if (ua.ie && ua.win) {
\r
611 window.attachEvent("onunload", function() {
\r
612 // remove listeners to avoid memory leaks
\r
613 var ll = listenersArr.length;
\r
614 for (var i = 0; i < ll; i++) {
\r
615 listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]);
\r
617 // cleanup dynamically embedded objects to fix audio/video threads and force open sockets and NetConnections to disconnect
\r
618 var il = objIdArr.length;
\r
619 for (var j = 0; j < il; j++) {
\r
620 removeSWF(objIdArr[j]);
\r
622 // cleanup library's main closures to avoid memory leaks
\r
623 for (var k in ua) {
\r
627 for (var l in swfobject) {
\r
628 swfobject[l] = null;
\r
637 - Reference: http://code.google.com/p/swfobject/wiki/documentation
\r
639 registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr, callbackFn) {
\r
640 if (ua.w3 && objectIdStr && swfVersionStr) {
\r
642 regObj.id = objectIdStr;
\r
643 regObj.swfVersion = swfVersionStr;
\r
644 regObj.expressInstall = xiSwfUrlStr;
\r
645 regObj.callbackFn = callbackFn;
\r
646 regObjArr[regObjArr.length] = regObj;
\r
647 setVisibility(objectIdStr, false);
\r
649 else if (callbackFn) {
\r
650 callbackFn({success:false, id:objectIdStr});
\r
654 getObjectById: function(objectIdStr) {
\r
656 return getObjectById(objectIdStr);
\r
660 embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) {
\r
661 var callbackObj = {success:false, id:replaceElemIdStr};
\r
662 if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) {
\r
663 setVisibility(replaceElemIdStr, false);
\r
664 addDomLoadEvent(function() {
\r
665 widthStr += ""; // auto-convert to string
\r
668 if (attObj && typeof attObj === OBJECT) {
\r
669 for (var i in attObj) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs
\r
670 att[i] = attObj[i];
\r
673 att.data = swfUrlStr;
\r
674 att.width = widthStr;
\r
675 att.height = heightStr;
\r
677 if (parObj && typeof parObj === OBJECT) {
\r
678 for (var j in parObj) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs
\r
679 par[j] = parObj[j];
\r
682 if (flashvarsObj && typeof flashvarsObj === OBJECT) {
\r
683 for (var k in flashvarsObj) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs
\r
684 if (typeof par.flashvars != UNDEF) {
\r
685 par.flashvars += "&" + k + "=" + flashvarsObj[k];
\r
688 par.flashvars = k + "=" + flashvarsObj[k];
\r
692 if (hasPlayerVersion(swfVersionStr)) { // create SWF
\r
693 var obj = createSWF(att, par, replaceElemIdStr);
\r
694 if (att.id == replaceElemIdStr) {
\r
695 setVisibility(replaceElemIdStr, true);
\r
697 callbackObj.success = true;
\r
698 callbackObj.ref = obj;
\r
700 else if (xiSwfUrlStr && canExpressInstall()) { // show Adobe Express Install
\r
701 att.data = xiSwfUrlStr;
\r
702 showExpressInstall(att, par, replaceElemIdStr, callbackFn);
\r
705 else { // show alternative content
\r
706 setVisibility(replaceElemIdStr, true);
\r
708 if (callbackFn) { callbackFn(callbackObj); }
\r
711 else if (callbackFn) { callbackFn(callbackObj); }
\r
714 switchOffAutoHideShow: function() {
\r
715 autoHideShow = false;
\r
720 getFlashPlayerVersion: function() {
\r
721 return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
\r
724 hasFlashPlayerVersion: hasPlayerVersion,
\r
726 createSWF: function(attObj, parObj, replaceElemIdStr) {
\r
728 return createSWF(attObj, parObj, replaceElemIdStr);
\r
735 showExpressInstall: function(att, par, replaceElemIdStr, callbackFn) {
\r
736 if (ua.w3 && canExpressInstall()) {
\r
737 showExpressInstall(att, par, replaceElemIdStr, callbackFn);
\r
741 removeSWF: function(objElemIdStr) {
\r
743 removeSWF(objElemIdStr);
\r
747 createCSS: function(selStr, declStr, mediaStr, newStyleBoolean) {
\r
749 createCSS(selStr, declStr, mediaStr, newStyleBoolean);
\r
753 addDomLoadEvent: addDomLoadEvent,
\r
755 addLoadEvent: addLoadEvent,
\r
757 getQueryParamValue: function(param) {
\r
758 var q = doc.location.search || doc.location.hash;
\r
760 if (/\?/.test(q)) { q = q.split("?")[1]; } // strip question mark
\r
761 if (param == null) {
\r
762 return urlEncodeIfNecessary(q);
\r
764 var pairs = q.split("&");
\r
765 for (var i = 0; i < pairs.length; i++) {
\r
766 if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
\r
767 return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1)));
\r
774 // For internal usage only
\r
775 expressInstallCallback: function() {
\r
776 if (isExpressInstallActive) {
\r
777 var obj = getElementById(EXPRESS_INSTALL_ID);
\r
778 if (obj && storedAltContent) {
\r
779 obj.parentNode.replaceChild(storedAltContent, obj);
\r
780 if (storedAltContentId) {
\r
781 setVisibility(storedAltContentId, true);
\r
782 if (ua.ie && ua.win) { storedAltContent.style.display = "block"; }
\r
784 if (storedCallbackFn) { storedCallbackFn(storedCallbackObj); }
\r
786 isExpressInstallActive = false;
\r