/alps/pcitool

To get this branch, use:
bzr branch http://suren.me/webbzr/alps/pcitool

« back to all changes in this revision

Viewing changes to pywrap/codebase/ext/swfobject.js

  • Committer: Vasilii Chernov
  • Date: 2016-02-24 14:12:53 UTC
  • mto: This revision was merged to the branch mainline in revision 357.
  • Revision ID: vchernov@inr.ru-20160224141253-f7vlfx13euogq1x0
Refresh web interface

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*!     SWFObject v2.2 <http://code.google.com/p/swfobject/> 
2
 
        is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
3
 
*/
4
 
 
5
 
var swfobject = function() {
6
 
        
7
 
        var UNDEF = "undefined",
8
 
                OBJECT = "object",
9
 
                SHOCKWAVE_FLASH = "Shockwave Flash",
10
 
                SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
11
 
                FLASH_MIME_TYPE = "application/x-shockwave-flash",
12
 
                EXPRESS_INSTALL_ID = "SWFObjectExprInst",
13
 
                ON_READY_STATE_CHANGE = "onreadystatechange",
14
 
                
15
 
                win = window,
16
 
                doc = document,
17
 
                nav = navigator,
18
 
                
19
 
                plugin = false,
20
 
                domLoadFnArr = [main],
21
 
                regObjArr = [],
22
 
                objIdArr = [],
23
 
                listenersArr = [],
24
 
                storedAltContent,
25
 
                storedAltContentId,
26
 
                storedCallbackFn,
27
 
                storedCallbackObj,
28
 
                isDomLoaded = false,
29
 
                isExpressInstallActive = false,
30
 
                dynamicStylesheet,
31
 
                dynamicStylesheetMedia,
32
 
                autoHideShow = true,
33
 
        
34
 
        /* Centralized function for browser feature detection
35
 
                - User agent string detection is only used when no good alternative is possible
36
 
                - Is executed directly for optimal performance
37
 
        */      
38
 
        ua = function() {
39
 
                var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,
40
 
                        u = nav.userAgent.toLowerCase(),
41
 
                        p = nav.platform.toLowerCase(),
42
 
                        windows = p ? /win/.test(p) : /win/.test(u),
43
 
                        mac = p ? /mac/.test(p) : /mac/.test(u),
44
 
                        webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
45
 
                        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
46
 
                        playerVersion = [0,0,0],
47
 
                        d = null;
48
 
                if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
49
 
                        d = nav.plugins[SHOCKWAVE_FLASH].description;
50
 
                        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+
51
 
                                plugin = true;
52
 
                                ie = false; // cascaded feature detection for Internet Explorer
53
 
                                d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
54
 
                                playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
55
 
                                playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
56
 
                                playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;
57
 
                        }
58
 
                }
59
 
                else if (typeof win.ActiveXObject != UNDEF) {
60
 
                        try {
61
 
                                var a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
62
 
                                if (a) { // a will return null when ActiveX is disabled
63
 
                                        d = a.GetVariable("$version");
64
 
                                        if (d) {
65
 
                                                ie = true; // cascaded feature detection for Internet Explorer
66
 
                                                d = d.split(" ")[1].split(",");
67
 
                                                playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
68
 
                                        }
69
 
                                }
70
 
                        }
71
 
                        catch(e) {}
72
 
                }
73
 
                return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac };
74
 
        }(),
75
 
        
76
 
        /* Cross-browser onDomLoad
77
 
                - Will fire an event as soon as the DOM of a web page is loaded
78
 
                - Internet Explorer workaround based on Diego Perini's solution: http://javascript.nwbox.com/IEContentLoaded/
79
 
                - Regular onload serves as fallback
80
 
        */ 
81
 
        onDomLoad = function() {
82
 
                if (!ua.w3) { return; }
83
 
                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 
84
 
                        callDomLoadFunctions();
85
 
                }
86
 
                if (!isDomLoaded) {
87
 
                        if (typeof doc.addEventListener != UNDEF) {
88
 
                                doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, false);
89
 
                        }               
90
 
                        if (ua.ie && ua.win) {
91
 
                                doc.attachEvent(ON_READY_STATE_CHANGE, function() {
92
 
                                        if (doc.readyState == "complete") {
93
 
                                                doc.detachEvent(ON_READY_STATE_CHANGE, arguments.callee);
94
 
                                                callDomLoadFunctions();
95
 
                                        }
96
 
                                });
97
 
                                if (win == top) { // if not inside an iframe
98
 
                                        (function(){
99
 
                                                if (isDomLoaded) { return; }
100
 
                                                try {
101
 
                                                        doc.documentElement.doScroll("left");
102
 
                                                }
103
 
                                                catch(e) {
104
 
                                                        setTimeout(arguments.callee, 0);
105
 
                                                        return;
106
 
                                                }
107
 
                                                callDomLoadFunctions();
108
 
                                        })();
109
 
                                }
110
 
                        }
111
 
                        if (ua.wk) {
112
 
                                (function(){
113
 
                                        if (isDomLoaded) { return; }
114
 
                                        if (!/loaded|complete/.test(doc.readyState)) {
115
 
                                                setTimeout(arguments.callee, 0);
116
 
                                                return;
117
 
                                        }
118
 
                                        callDomLoadFunctions();
119
 
                                })();
120
 
                        }
121
 
                        addLoadEvent(callDomLoadFunctions);
122
 
                }
123
 
        }();
124
 
        
125
 
        function callDomLoadFunctions() {
126
 
                if (isDomLoaded) { return; }
127
 
                try { // test if we can really add/remove elements to/from the DOM; we don't want to fire it too early
128
 
                        var t = doc.getElementsByTagName("body")[0].appendChild(createElement("span"));
129
 
                        t.parentNode.removeChild(t);
130
 
                }
131
 
                catch (e) { return; }
132
 
                isDomLoaded = true;
133
 
                var dl = domLoadFnArr.length;
134
 
                for (var i = 0; i < dl; i++) {
135
 
                        domLoadFnArr[i]();
136
 
                }
137
 
        }
138
 
        
139
 
        function addDomLoadEvent(fn) {
140
 
                if (isDomLoaded) {
141
 
                        fn();
142
 
                }
143
 
                else { 
144
 
                        domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+
145
 
                }
146
 
        }
147
 
        
148
 
        /* Cross-browser onload
149
 
                - Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/
150
 
                - Will fire an event as soon as a web page including all of its assets are loaded 
151
 
         */
152
 
        function addLoadEvent(fn) {
153
 
                if (typeof win.addEventListener != UNDEF) {
154
 
                        win.addEventListener("load", fn, false);
155
 
                }
156
 
                else if (typeof doc.addEventListener != UNDEF) {
157
 
                        doc.addEventListener("load", fn, false);
158
 
                }
159
 
                else if (typeof win.attachEvent != UNDEF) {
160
 
                        addListener(win, "onload", fn);
161
 
                }
162
 
                else if (typeof win.onload == "function") {
163
 
                        var fnOld = win.onload;
164
 
                        win.onload = function() {
165
 
                                fnOld();
166
 
                                fn();
167
 
                        };
168
 
                }
169
 
                else {
170
 
                        win.onload = fn;
171
 
                }
172
 
        }
173
 
        
174
 
        /* Main function
175
 
                - Will preferably execute onDomLoad, otherwise onload (as a fallback)
176
 
        */
177
 
        function main() { 
178
 
                if (plugin) {
179
 
                        testPlayerVersion();
180
 
                }
181
 
                else {
182
 
                        matchVersions();
183
 
                }
184
 
        }
185
 
        
186
 
        /* Detect the Flash Player version for non-Internet Explorer browsers
187
 
                - Detecting the plug-in version via the object element is more precise than using the plugins collection item's description:
188
 
                  a. Both release and build numbers can be detected
189
 
                  b. Avoid wrong descriptions by corrupt installers provided by Adobe
190
 
                  c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports
191
 
                - Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available
192
 
        */
193
 
        function testPlayerVersion() {
194
 
                var b = doc.getElementsByTagName("body")[0];
195
 
                var o = createElement(OBJECT);
196
 
                o.setAttribute("type", FLASH_MIME_TYPE);
197
 
                var t = b.appendChild(o);
198
 
                if (t) {
199
 
                        var counter = 0;
200
 
                        (function(){
201
 
                                if (typeof t.GetVariable != UNDEF) {
202
 
                                        var d = t.GetVariable("$version");
203
 
                                        if (d) {
204
 
                                                d = d.split(" ")[1].split(",");
205
 
                                                ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
206
 
                                        }
207
 
                                }
208
 
                                else if (counter < 10) {
209
 
                                        counter++;
210
 
                                        setTimeout(arguments.callee, 10);
211
 
                                        return;
212
 
                                }
213
 
                                b.removeChild(o);
214
 
                                t = null;
215
 
                                matchVersions();
216
 
                        })();
217
 
                }
218
 
                else {
219
 
                        matchVersions();
220
 
                }
221
 
        }
222
 
        
223
 
        /* Perform Flash Player and SWF version matching; static publishing only
224
 
        */
225
 
        function matchVersions() {
226
 
                var rl = regObjArr.length;
227
 
                if (rl > 0) {
228
 
                        for (var i = 0; i < rl; i++) { // for each registered object element
229
 
                                var id = regObjArr[i].id;
230
 
                                var cb = regObjArr[i].callbackFn;
231
 
                                var cbObj = {success:false, id:id};
232
 
                                if (ua.pv[0] > 0) {
233
 
                                        var obj = getElementById(id);
234
 
                                        if (obj) {
235
 
                                                if (hasPlayerVersion(regObjArr[i].swfVersion) && !(ua.wk && ua.wk < 312)) { // Flash Player version >= published SWF version: Houston, we have a match!
236
 
                                                        setVisibility(id, true);
237
 
                                                        if (cb) {
238
 
                                                                cbObj.success = true;
239
 
                                                                cbObj.ref = getObjectById(id);
240
 
                                                                cb(cbObj);
241
 
                                                        }
242
 
                                                }
243
 
                                                else if (regObjArr[i].expressInstall && canExpressInstall()) { // show the Adobe Express Install dialog if set by the web page author and if supported
244
 
                                                        var att = {};
245
 
                                                        att.data = regObjArr[i].expressInstall;
246
 
                                                        att.width = obj.getAttribute("width") || "0";
247
 
                                                        att.height = obj.getAttribute("height") || "0";
248
 
                                                        if (obj.getAttribute("class")) { att.styleclass = obj.getAttribute("class"); }
249
 
                                                        if (obj.getAttribute("align")) { att.align = obj.getAttribute("align"); }
250
 
                                                        // parse HTML object param element's name-value pairs
251
 
                                                        var par = {};
252
 
                                                        var p = obj.getElementsByTagName("param");
253
 
                                                        var pl = p.length;
254
 
                                                        for (var j = 0; j < pl; j++) {
255
 
                                                                if (p[j].getAttribute("name").toLowerCase() != "movie") {
256
 
                                                                        par[p[j].getAttribute("name")] = p[j].getAttribute("value");
257
 
                                                                }
258
 
                                                        }
259
 
                                                        showExpressInstall(att, par, id, cb);
260
 
                                                }
261
 
                                                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
262
 
                                                        displayAltContent(obj);
263
 
                                                        if (cb) { cb(cbObj); }
264
 
                                                }
265
 
                                        }
266
 
                                }
267
 
                                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)
268
 
                                        setVisibility(id, true);
269
 
                                        if (cb) {
270
 
                                                var o = getObjectById(id); // test whether there is an HTML object element or not
271
 
                                                if (o && typeof o.SetVariable != UNDEF) { 
272
 
                                                        cbObj.success = true;
273
 
                                                        cbObj.ref = o;
274
 
                                                }
275
 
                                                cb(cbObj);
276
 
                                        }
277
 
                                }
278
 
                        }
279
 
                }
280
 
        }
281
 
        
282
 
        function getObjectById(objectIdStr) {
283
 
                var r = null;
284
 
                var o = getElementById(objectIdStr);
285
 
                if (o && o.nodeName == "OBJECT") {
286
 
                        if (typeof o.SetVariable != UNDEF) {
287
 
                                r = o;
288
 
                        }
289
 
                        else {
290
 
                                var n = o.getElementsByTagName(OBJECT)[0];
291
 
                                if (n) {
292
 
                                        r = n;
293
 
                                }
294
 
                        }
295
 
                }
296
 
                return r;
297
 
        }
298
 
        
299
 
        /* Requirements for Adobe Express Install
300
 
                - only one instance can be active at a time
301
 
                - fp 6.0.65 or higher
302
 
                - Win/Mac OS only
303
 
                - no Webkit engines older than version 312
304
 
        */
305
 
        function canExpressInstall() {
306
 
                return !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac) && !(ua.wk && ua.wk < 312);
307
 
        }
308
 
        
309
 
        /* Show the Adobe Express Install dialog
310
 
                - Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75
311
 
        */
312
 
        function showExpressInstall(att, par, replaceElemIdStr, callbackFn) {
313
 
                isExpressInstallActive = true;
314
 
                storedCallbackFn = callbackFn || null;
315
 
                storedCallbackObj = {success:false, id:replaceElemIdStr};
316
 
                var obj = getElementById(replaceElemIdStr);
317
 
                if (obj) {
318
 
                        if (obj.nodeName == "OBJECT") { // static publishing
319
 
                                storedAltContent = abstractAltContent(obj);
320
 
                                storedAltContentId = null;
321
 
                        }
322
 
                        else { // dynamic publishing
323
 
                                storedAltContent = obj;
324
 
                                storedAltContentId = replaceElemIdStr;
325
 
                        }
326
 
                        att.id = EXPRESS_INSTALL_ID;
327
 
                        if (typeof att.width == UNDEF || (!/%$/.test(att.width) && parseInt(att.width, 10) < 310)) { att.width = "310"; }
328
 
                        if (typeof att.height == UNDEF || (!/%$/.test(att.height) && parseInt(att.height, 10) < 137)) { att.height = "137"; }
329
 
                        doc.title = doc.title.slice(0, 47) + " - Flash Player Installation";
330
 
                        var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn",
331
 
                                fv = "MMredirectURL=" + encodeURI(window.location).toString().replace(/&/g,"%26") + "&MMplayerType=" + pt + "&MMdoctitle=" + doc.title;
332
 
                        if (typeof par.flashvars != UNDEF) {
333
 
                                par.flashvars += "&" + fv;
334
 
                        }
335
 
                        else {
336
 
                                par.flashvars = fv;
337
 
                        }
338
 
                        // 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,
339
 
                        // because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
340
 
                        if (ua.ie && ua.win && obj.readyState != 4) {
341
 
                                var newObj = createElement("div");
342
 
                                replaceElemIdStr += "SWFObjectNew";
343
 
                                newObj.setAttribute("id", replaceElemIdStr);
344
 
                                obj.parentNode.insertBefore(newObj, obj); // insert placeholder div that will be replaced by the object element that loads expressinstall.swf
345
 
                                obj.style.display = "none";
346
 
                                (function(){
347
 
                                        if (obj.readyState == 4) {
348
 
                                                obj.parentNode.removeChild(obj);
349
 
                                        }
350
 
                                        else {
351
 
                                                setTimeout(arguments.callee, 10);
352
 
                                        }
353
 
                                })();
354
 
                        }
355
 
                        createSWF(att, par, replaceElemIdStr);
356
 
                }
357
 
        }
358
 
        
359
 
        /* Functions to abstract and display alternative content
360
 
        */
361
 
        function displayAltContent(obj) {
362
 
                if (ua.ie && ua.win && obj.readyState != 4) {
363
 
                        // 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,
364
 
                        // because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
365
 
                        var el = createElement("div");
366
 
                        obj.parentNode.insertBefore(el, obj); // insert placeholder div that will be replaced by the alternative content
367
 
                        el.parentNode.replaceChild(abstractAltContent(obj), el);
368
 
                        obj.style.display = "none";
369
 
                        (function(){
370
 
                                if (obj.readyState == 4) {
371
 
                                        obj.parentNode.removeChild(obj);
372
 
                                }
373
 
                                else {
374
 
                                        setTimeout(arguments.callee, 10);
375
 
                                }
376
 
                        })();
377
 
                }
378
 
                else {
379
 
                        obj.parentNode.replaceChild(abstractAltContent(obj), obj);
380
 
                }
381
 
        } 
382
 
 
383
 
        function abstractAltContent(obj) {
384
 
                var ac = createElement("div");
385
 
                if (ua.win && ua.ie) {
386
 
                        ac.innerHTML = obj.innerHTML;
387
 
                }
388
 
                else {
389
 
                        var nestedObj = obj.getElementsByTagName(OBJECT)[0];
390
 
                        if (nestedObj) {
391
 
                                var c = nestedObj.childNodes;
392
 
                                if (c) {
393
 
                                        var cl = c.length;
394
 
                                        for (var i = 0; i < cl; i++) {
395
 
                                                if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) {
396
 
                                                        ac.appendChild(c[i].cloneNode(true));
397
 
                                                }
398
 
                                        }
399
 
                                }
400
 
                        }
401
 
                }
402
 
                return ac;
403
 
        }
404
 
        
405
 
        /* Cross-browser dynamic SWF creation
406
 
        */
407
 
        function createSWF(attObj, parObj, id) {
408
 
                var r, el = getElementById(id);
409
 
                if (ua.wk && ua.wk < 312) { return r; }
410
 
                if (el) {
411
 
                        if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content
412
 
                                attObj.id = id;
413
 
                        }
414
 
                        if (ua.ie && ua.win) { // Internet Explorer + the HTML object element + W3C DOM methods do not combine: fall back to outerHTML
415
 
                                var att = "";
416
 
                                for (var i in attObj) {
417
 
                                        if (attObj[i] != Object.prototype[i]) { // filter out prototype additions from other potential libraries
418
 
                                                if (i.toLowerCase() == "data") {
419
 
                                                        parObj.movie = attObj[i];
420
 
                                                }
421
 
                                                else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
422
 
                                                        att += ' class="' + attObj[i] + '"';
423
 
                                                }
424
 
                                                else if (i.toLowerCase() != "classid") {
425
 
                                                        att += ' ' + i + '="' + attObj[i] + '"';
426
 
                                                }
427
 
                                        }
428
 
                                }
429
 
                                var par = "";
430
 
                                for (var j in parObj) {
431
 
                                        if (parObj[j] != Object.prototype[j]) { // filter out prototype additions from other potential libraries
432
 
                                                par += '<param name="' + j + '" value="' + parObj[j] + '" />';
433
 
                                        }
434
 
                                }
435
 
                                el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';
436
 
                                objIdArr[objIdArr.length] = attObj.id; // stored to fix object 'leaks' on unload (dynamic publishing only)
437
 
                                r = getElementById(attObj.id);  
438
 
                        }
439
 
                        else { // well-behaving browsers
440
 
                                var o = createElement(OBJECT);
441
 
                                o.setAttribute("type", FLASH_MIME_TYPE);
442
 
                                for (var m in attObj) {
443
 
                                        if (attObj[m] != Object.prototype[m]) { // filter out prototype additions from other potential libraries
444
 
                                                if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
445
 
                                                        o.setAttribute("class", attObj[m]);
446
 
                                                }
447
 
                                                else if (m.toLowerCase() != "classid") { // filter out IE specific attribute
448
 
                                                        o.setAttribute(m, attObj[m]);
449
 
                                                }
450
 
                                        }
451
 
                                }
452
 
                                for (var n in parObj) {
453
 
                                        if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // filter out prototype additions from other potential libraries and IE specific param element
454
 
                                                createObjParam(o, n, parObj[n]);
455
 
                                        }
456
 
                                }
457
 
                                el.parentNode.replaceChild(o, el);
458
 
                                r = o;
459
 
                        }
460
 
                }
461
 
                return r;
462
 
        }
463
 
        
464
 
        function createObjParam(el, pName, pValue) {
465
 
                var p = createElement("param");
466
 
                p.setAttribute("name", pName);  
467
 
                p.setAttribute("value", pValue);
468
 
                el.appendChild(p);
469
 
        }
470
 
        
471
 
        /* Cross-browser SWF removal
472
 
                - Especially needed to safely and completely remove a SWF in Internet Explorer
473
 
        */
474
 
        function removeSWF(id) {
475
 
                var obj = getElementById(id);
476
 
                if (obj && obj.nodeName == "OBJECT") {
477
 
                        if (ua.ie && ua.win) {
478
 
                                obj.style.display = "none";
479
 
                                (function(){
480
 
                                        if (obj.readyState == 4) {
481
 
                                                removeObjectInIE(id);
482
 
                                        }
483
 
                                        else {
484
 
                                                setTimeout(arguments.callee, 10);
485
 
                                        }
486
 
                                })();
487
 
                        }
488
 
                        else {
489
 
                                obj.parentNode.removeChild(obj);
490
 
                        }
491
 
                }
492
 
        }
493
 
        
494
 
        function removeObjectInIE(id) {
495
 
                var obj = getElementById(id);
496
 
                if (obj) {
497
 
                        for (var i in obj) {
498
 
                                if (typeof obj[i] == "function") {
499
 
                                        obj[i] = null;
500
 
                                }
501
 
                        }
502
 
                        obj.parentNode.removeChild(obj);
503
 
                }
504
 
        }
505
 
        
506
 
        /* Functions to optimize JavaScript compression
507
 
        */
508
 
        function getElementById(id) {
509
 
                var el = null;
510
 
                try {
511
 
                        el = doc.getElementById(id);
512
 
                }
513
 
                catch (e) {}
514
 
                return el;
515
 
        }
516
 
        
517
 
        function createElement(el) {
518
 
                return doc.createElement(el);
519
 
        }
520
 
        
521
 
        /* Updated attachEvent function for Internet Explorer
522
 
                - Stores attachEvent information in an Array, so on unload the detachEvent functions can be called to avoid memory leaks
523
 
        */      
524
 
        function addListener(target, eventType, fn) {
525
 
                target.attachEvent(eventType, fn);
526
 
                listenersArr[listenersArr.length] = [target, eventType, fn];
527
 
        }
528
 
        
529
 
        /* Flash Player and SWF content version matching
530
 
        */
531
 
        function hasPlayerVersion(rv) {
532
 
                var pv = ua.pv, v = rv.split(".");
533
 
                v[0] = parseInt(v[0], 10);
534
 
                v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0"
535
 
                v[2] = parseInt(v[2], 10) || 0;
536
 
                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;
537
 
        }
538
 
        
539
 
        /* Cross-browser dynamic CSS creation
540
 
                - Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php
541
 
        */      
542
 
        function createCSS(sel, decl, media, newStyle) {
543
 
                if (ua.ie && ua.mac) { return; }
544
 
                var h = doc.getElementsByTagName("head")[0];
545
 
                if (!h) { return; } // to also support badly authored HTML pages that lack a head element
546
 
                var m = (media && typeof media == "string") ? media : "screen";
547
 
                if (newStyle) {
548
 
                        dynamicStylesheet = null;
549
 
                        dynamicStylesheetMedia = null;
550
 
                }
551
 
                if (!dynamicStylesheet || dynamicStylesheetMedia != m) { 
552
 
                        // create dynamic stylesheet + get a global reference to it
553
 
                        var s = createElement("style");
554
 
                        s.setAttribute("type", "text/css");
555
 
                        s.setAttribute("media", m);
556
 
                        dynamicStylesheet = h.appendChild(s);
557
 
                        if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) {
558
 
                                dynamicStylesheet = doc.styleSheets[doc.styleSheets.length - 1];
559
 
                        }
560
 
                        dynamicStylesheetMedia = m;
561
 
                }
562
 
                // add style rule
563
 
                if (ua.ie && ua.win) {
564
 
                        if (dynamicStylesheet && typeof dynamicStylesheet.addRule == OBJECT) {
565
 
                                dynamicStylesheet.addRule(sel, decl);
566
 
                        }
567
 
                }
568
 
                else {
569
 
                        if (dynamicStylesheet && typeof doc.createTextNode != UNDEF) {
570
 
                                dynamicStylesheet.appendChild(doc.createTextNode(sel + " {" + decl + "}"));
571
 
                        }
572
 
                }
573
 
        }
574
 
        
575
 
        function setVisibility(id, isVisible) {
576
 
                if (!autoHideShow) { return; }
577
 
                var v = isVisible ? "visible" : "hidden";
578
 
                if (isDomLoaded && getElementById(id)) {
579
 
                        getElementById(id).style.visibility = v;
580
 
                }
581
 
                else {
582
 
                        createCSS("#" + id, "visibility:" + v);
583
 
                }
584
 
        }
585
 
 
586
 
        /* Filter to avoid XSS attacks
587
 
        */
588
 
        function urlEncodeIfNecessary(s) {
589
 
                var regex = /[\\\"<>\.;]/;
590
 
                var hasBadChars = regex.exec(s) != null;
591
 
                return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s;
592
 
        }
593
 
        
594
 
        /* Release memory to avoid memory leaks caused by closures, fix hanging audio/video threads and force open sockets/NetConnections to disconnect (Internet Explorer only)
595
 
        */
596
 
        var cleanup = function() {
597
 
                if (ua.ie && ua.win) {
598
 
                        window.attachEvent("onunload", function() {
599
 
                                // remove listeners to avoid memory leaks
600
 
                                var ll = listenersArr.length;
601
 
                                for (var i = 0; i < ll; i++) {
602
 
                                        listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]);
603
 
                                }
604
 
                                // cleanup dynamically embedded objects to fix audio/video threads and force open sockets and NetConnections to disconnect
605
 
                                var il = objIdArr.length;
606
 
                                for (var j = 0; j < il; j++) {
607
 
                                        removeSWF(objIdArr[j]);
608
 
                                }
609
 
                                // cleanup library's main closures to avoid memory leaks
610
 
                                for (var k in ua) {
611
 
                                        ua[k] = null;
612
 
                                }
613
 
                                ua = null;
614
 
                                for (var l in swfobject) {
615
 
                                        swfobject[l] = null;
616
 
                                }
617
 
                                swfobject = null;
618
 
                        });
619
 
                }
620
 
        }();
621
 
        
622
 
        return {
623
 
                /* Public API
624
 
                        - Reference: http://code.google.com/p/swfobject/wiki/documentation
625
 
                */ 
626
 
                registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr, callbackFn) {
627
 
                        if (ua.w3 && objectIdStr && swfVersionStr) {
628
 
                                var regObj = {};
629
 
                                regObj.id = objectIdStr;
630
 
                                regObj.swfVersion = swfVersionStr;
631
 
                                regObj.expressInstall = xiSwfUrlStr;
632
 
                                regObj.callbackFn = callbackFn;
633
 
                                regObjArr[regObjArr.length] = regObj;
634
 
                                setVisibility(objectIdStr, false);
635
 
                        }
636
 
                        else if (callbackFn) {
637
 
                                callbackFn({success:false, id:objectIdStr});
638
 
                        }
639
 
                },
640
 
                
641
 
                getObjectById: function(objectIdStr) {
642
 
                        if (ua.w3) {
643
 
                                return getObjectById(objectIdStr);
644
 
                        }
645
 
                },
646
 
                
647
 
                embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) {
648
 
                        var callbackObj = {success:false, id:replaceElemIdStr};
649
 
                        if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) {
650
 
                                setVisibility(replaceElemIdStr, false);
651
 
                                addDomLoadEvent(function() {
652
 
                                        widthStr += ""; // auto-convert to string
653
 
                                        heightStr += "";
654
 
                                        var att = {};
655
 
                                        if (attObj && typeof attObj === OBJECT) {
656
 
                                                for (var i in attObj) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs
657
 
                                                        att[i] = attObj[i];
658
 
                                                }
659
 
                                        }
660
 
                                        att.data = swfUrlStr;
661
 
                                        att.width = widthStr;
662
 
                                        att.height = heightStr;
663
 
                                        var par = {}; 
664
 
                                        if (parObj && typeof parObj === OBJECT) {
665
 
                                                for (var j in parObj) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs
666
 
                                                        par[j] = parObj[j];
667
 
                                                }
668
 
                                        }
669
 
                                        if (flashvarsObj && typeof flashvarsObj === OBJECT) {
670
 
                                                for (var k in flashvarsObj) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs
671
 
                                                        if (typeof par.flashvars != UNDEF) {
672
 
                                                                par.flashvars += "&" + k + "=" + flashvarsObj[k];
673
 
                                                        }
674
 
                                                        else {
675
 
                                                                par.flashvars = k + "=" + flashvarsObj[k];
676
 
                                                        }
677
 
                                                }
678
 
                                        }
679
 
                                        if (hasPlayerVersion(swfVersionStr)) { // create SWF
680
 
                                                var obj = createSWF(att, par, replaceElemIdStr);
681
 
                                                if (att.id == replaceElemIdStr) {
682
 
                                                        setVisibility(replaceElemIdStr, true);
683
 
                                                }
684
 
                                                callbackObj.success = true;
685
 
                                                callbackObj.ref = obj;
686
 
                                        }
687
 
                                        else if (xiSwfUrlStr && canExpressInstall()) { // show Adobe Express Install
688
 
                                                att.data = xiSwfUrlStr;
689
 
                                                showExpressInstall(att, par, replaceElemIdStr, callbackFn);
690
 
                                                return;
691
 
                                        }
692
 
                                        else { // show alternative content
693
 
                                                setVisibility(replaceElemIdStr, true);
694
 
                                        }
695
 
                                        if (callbackFn) { callbackFn(callbackObj); }
696
 
                                });
697
 
                        }
698
 
                        else if (callbackFn) { callbackFn(callbackObj); }
699
 
                },
700
 
                
701
 
                switchOffAutoHideShow: function() {
702
 
                        autoHideShow = false;
703
 
                },
704
 
                
705
 
                ua: ua,
706
 
                
707
 
                getFlashPlayerVersion: function() {
708
 
                        return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
709
 
                },
710
 
                
711
 
                hasFlashPlayerVersion: hasPlayerVersion,
712
 
                
713
 
                createSWF: function(attObj, parObj, replaceElemIdStr) {
714
 
                        if (ua.w3) {
715
 
                                return createSWF(attObj, parObj, replaceElemIdStr);
716
 
                        }
717
 
                        else {
718
 
                                return undefined;
719
 
                        }
720
 
                },
721
 
                
722
 
                showExpressInstall: function(att, par, replaceElemIdStr, callbackFn) {
723
 
                        if (ua.w3 && canExpressInstall()) {
724
 
                                showExpressInstall(att, par, replaceElemIdStr, callbackFn);
725
 
                        }
726
 
                },
727
 
                
728
 
                removeSWF: function(objElemIdStr) {
729
 
                        if (ua.w3) {
730
 
                                removeSWF(objElemIdStr);
731
 
                        }
732
 
                },
733
 
                
734
 
                createCSS: function(selStr, declStr, mediaStr, newStyleBoolean) {
735
 
                        if (ua.w3) {
736
 
                                createCSS(selStr, declStr, mediaStr, newStyleBoolean);
737
 
                        }
738
 
                },
739
 
                
740
 
                addDomLoadEvent: addDomLoadEvent,
741
 
                
742
 
                addLoadEvent: addLoadEvent,
743
 
                
744
 
                getQueryParamValue: function(param) {
745
 
                        var q = doc.location.search || doc.location.hash;
746
 
                        if (q) {
747
 
                                if (/\?/.test(q)) { q = q.split("?")[1]; } // strip question mark
748
 
                                if (param == null) {
749
 
                                        return urlEncodeIfNecessary(q);
750
 
                                }
751
 
                                var pairs = q.split("&");
752
 
                                for (var i = 0; i < pairs.length; i++) {
753
 
                                        if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
754
 
                                                return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1)));
755
 
                                        }
756
 
                                }
757
 
                        }
758
 
                        return "";
759
 
                },
760
 
                
761
 
                // For internal usage only
762
 
                expressInstallCallback: function() {
763
 
                        if (isExpressInstallActive) {
764
 
                                var obj = getElementById(EXPRESS_INSTALL_ID);
765
 
                                if (obj && storedAltContent) {
766
 
                                        obj.parentNode.replaceChild(storedAltContent, obj);
767
 
                                        if (storedAltContentId) {
768
 
                                                setVisibility(storedAltContentId, true);
769
 
                                                if (ua.ie && ua.win) { storedAltContent.style.display = "block"; }
770
 
                                        }
771
 
                                        if (storedCallbackFn) { storedCallbackFn(storedCallbackObj); }
772
 
                                }
773
 
                                isExpressInstallActive = false;
774
 
                        } 
775
 
                }
776
 
        };
777
 
}();