/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/static/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
}();