1/*! SWFObject v2.0 <http://code.google.com/p/swfobject/> 2 Copyright (c) 2007 Geoff Stearns, Michael Williams, and Bobby van der Sluis 3 This software is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 4*/ 5 6var swfobject = function() { 7 8 var UNDEF = "undefined", 9 OBJECT = "object", 10 SHOCKWAVE_FLASH = "Shockwave Flash", 11 SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash", 12 FLASH_MIME_TYPE = "application/x-shockwave-flash", 13 EXPRESS_INSTALL_ID = "SWFObjectExprInst", 14 15 win = window, 16 doc = document, 17 nav = navigator, 18 19 domLoadFnArr = [], 20 regObjArr = [], 21 timer = null, 22 storedAltContent = null, 23 storedAltContentId = null, 24 isDomLoaded = false, 25 isExpressInstallActive = false; 26 27 /* Centralized function for browser feature detection 28 - Proprietary feature detection (conditional compiling) is used to detect Internet Explorer's features 29 - User agent string detection is only used when no alternative is possible 30 - Is executed directly for optimal performance 31 */ 32 var ua = function() { 33 var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF && typeof doc.appendChild != UNDEF && typeof doc.replaceChild != UNDEF && typeof doc.removeChild != UNDEF && typeof doc.cloneNode != UNDEF, 34 playerVersion = [0,0,0], 35 d = null; 36 if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) { 37 d = nav.plugins[SHOCKWAVE_FLASH].description; 38 if (d) { 39 d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1"); 40 playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10); 41 playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10); 42 playerVersion[2] = /r/.test(d) ? parseInt(d.replace(/^.*r(.*)$/, "$1"), 10) : 0; 43 } 44 } 45 else if (typeof win.ActiveXObject != UNDEF) { 46 var a = null, fp6Crash = false; 47 try { 48 a = new ActiveXObject(SHOCKWAVE_FLASH_AX + ".7"); 49 } 50 catch(e) { 51 try { 52 a = new ActiveXObject(SHOCKWAVE_FLASH_AX + ".6"); 53 playerVersion = [6,0,21]; 54 a.AllowScriptAccess = "always"; // Introduced in fp6.0.47 55 } 56 catch(e) { 57 if (playerVersion[0] == 6) { 58 fp6Crash = true; 59 } 60 } 61 if (!fp6Crash) { 62 try { 63 a = new ActiveXObject(SHOCKWAVE_FLASH_AX); 64 } 65 catch(e) {} 66 } 67 } 68 if (!fp6Crash && a) { // a will return null when ActiveX is disabled 69 try { 70 d = a.GetVariable("$version"); // Will crash fp6.0.21/23/29 71 if (d) { 72 d = d.split(" ")[1].split(","); 73 playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; 74 } 75 } 76 catch(e) {} 77 } 78 } 79 var u = nav.userAgent.toLowerCase(), 80 p = nav.platform.toLowerCase(), 81 webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit 82 ie = false, 83 windows = p ? /win/.test(p) : /win/.test(u), 84 mac = p ? /mac/.test(p) : /mac/.test(u); 85 /*@cc_on 86 ie = true; 87 @if (@_win32) 88 windows = true; 89 @elif (@_mac) 90 mac = true; 91 @end 92 @*/ 93 return { w3cdom:w3cdom, pv:playerVersion, webkit:webkit, ie:ie, win:windows, mac:mac }; 94 }(); 95 96 /* Cross-browser onDomLoad 97 - Based on Dean Edwards' solution: http://dean.edwards.name/weblog/2006/06/again/ 98 - Will fire an event as soon as the DOM of a page is loaded (supported by Gecko based browsers - like Firefox -, IE, Opera9+, Safari) 99 */ 100 var onDomLoad = function() { 101 if (!ua.w3cdom) { 102 return; 103 } 104 addDomLoadEvent(main); 105 if (ua.ie && ua.win) { 106 try { // Avoid a possible Operation Aborted error 107 doc.write("<scr" + "ipt id=__ie_ondomload defer=true src=//:></scr" + "ipt>"); // String is split into pieces to avoid Norton AV to add code that can cause errors 108 var s = getElementById("__ie_ondomload"); 109 if (s) { 110 s.onreadystatechange = function() { 111 if (this.readyState == "complete") { 112 this.parentNode.removeChild(this); 113 callDomLoadFunctions(); 114 } 115 }; 116 } 117 } 118 catch(e) {} 119 } 120 if (ua.webkit && typeof doc.readyState != UNDEF) { 121 timer = setInterval(function() { if (/loaded|complete/.test(doc.readyState)) { callDomLoadFunctions(); }}, 10); 122 } 123 if (typeof doc.addEventListener != UNDEF) { 124 doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, null); 125 } 126 addLoadEvent(callDomLoadFunctions); 127 }(); 128 129 function callDomLoadFunctions() { 130 if (isDomLoaded) { 131 return; 132 } 133 if (ua.ie && ua.win) { // Test if we can really add elements to the DOM; we don't want to fire it too early 134 var s = createElement("span"); 135 try { // Avoid a possible Operation Aborted error 136 var t = doc.getElementsByTagName("body")[0].appendChild(s); 137 t.parentNode.removeChild(t); 138 } 139 catch (e) { 140 return; 141 } 142 } 143 isDomLoaded = true; 144 if (timer) { 145 clearInterval(timer); 146 timer = null; 147 } 148 var dl = domLoadFnArr.length; 149 for (var i = 0; i < dl; i++) { 150 domLoadFnArr[i](); 151 } 152 } 153 154 function addDomLoadEvent(fn) { 155 if (isDomLoaded) { 156 fn(); 157 } 158 else { 159 domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+ 160 } 161 } 162 163 /* Cross-browser onload 164 - Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/ 165 - Will fire an event as soon as a web page including all of its assets are loaded 166 */ 167 function addLoadEvent(fn) { 168 if (typeof win.addEventListener != UNDEF) { 169 win.addEventListener("load", fn, false); 170 } 171 else if (typeof doc.addEventListener != UNDEF) { 172 doc.addEventListener("load", fn, false); 173 } 174 else if (typeof win.attachEvent != UNDEF) { 175 win.attachEvent("onload", fn); 176 } 177 else if (typeof win.onload == "function") { 178 var fnOld = win.onload; 179 win.onload = function() { 180 fnOld(); 181 fn(); 182 }; 183 } 184 else { 185 win.onload = fn; 186 } 187 } 188 189 /* Main function 190 - Will preferably execute onDomLoad, otherwise onload (as a fallback) 191 */ 192 function main() { // Static publishing only 193 var rl = regObjArr.length; 194 for (var i = 0; i < rl; i++) { // For each registered object element 195 var id = regObjArr[i].id; 196 if (ua.pv[0] > 0) { 197 var obj = getElementById(id); 198 if (obj) { 199 regObjArr[i].width = obj.getAttribute("width") ? obj.getAttribute("width") : "0"; 200 regObjArr[i].height = obj.getAttribute("height") ? obj.getAttribute("height") : "0"; 201 if (hasPlayerVersion(regObjArr[i].swfVersion)) { // Flash plug-in version >= Flash content version: Houston, we have a match! 202 if (ua.webkit && ua.webkit < 312) { // Older webkit engines ignore the object element's nested param elements 203 fixParams(obj); 204 } 205 setVisibility(id, true); 206 } 207 else if (regObjArr[i].expressInstall && !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac)) { // Show the Adobe Express Install dialog if set by the web page author and if supported (fp6.0.65+ on Win/Mac OS only) 208 showExpressInstall(regObjArr[i]); 209 } 210 else { // Flash plug-in and Flash content version mismatch: display alternative content instead of Flash content 211 displayAltContent(obj); 212 } 213 } 214 } 215 else { // If no fp is installed, we let the object element do its job (show alternative content) 216 setVisibility(id, true); 217 } 218 } 219 } 220 221 /* Fix nested param elements, which are ignored by older webkit engines 222 - This includes Safari up to and including version 1.2.2 on Mac OS 10.3 223 - Fall back to the proprietary embed element 224 */ 225 function fixParams(obj) { 226 var nestedObj = obj.getElementsByTagName(OBJECT)[0];
227 if (nestedObj) { 228 var e = createElement("embed"), a = nestedObj.attributes; 229 if (a) { 230 var al = a.length; 231 for (var i = 0; i < al; i++) { 232 if (a[i].nodeName.toLowerCase() == "data") { 233 e.setAttribute("src", a[i].nodeValue); 234 } 235 else { 236 e.setAttribute(a[i].nodeName, a[i].nodeValue); 237 } 238 } 239 } 240 var c = nestedObj.childNodes; 241 if (c) { 242 var cl = c.length; 243 for (var j = 0; j < cl; j++) { 244 if (c[j].nodeType == 1 && c[j].nodeName.toLowerCase() == "param") { 245 e.setAttribute(c[j].getAttribute("name"), c[j].getAttribute("value")); 246 } 247 } 248 } 249 obj.parentNode.replaceChild(e, obj); 250 } 251 } 252 253 /* Fix hanging audio/video threads and force open sockets and NetConnections to disconnect 254 - Occurs when unloading a web page in IE using fp8+ and innerHTML/outerHTML 255 - Dynamic publishing only 256 */ 257 function fixObjectLeaks(id) { 258 if (ua.ie && ua.win && hasPlayerVersion("8.0.0")) { 259 win.attachEvent("onunload", function () { 260 var obj = getElementById(id); 261 if (obj) { 262 for (var i in obj) { 263 if (typeof obj[i] == "function") { 264 obj[i] = function() {}; 265 } 266 } 267 obj.parentNode.removeChild(obj); 268 } 269 }); 270 } 271 } 272 273 /* Show the Adobe Express Install dialog 274 - Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75 275 */ 276 function showExpressInstall(regObj) { 277 isExpressInstallActive = true; 278 var obj = getElementById(regObj.id); 279 if (obj) { 280 if (regObj.altContentId) { 281 var ac = getElementById(regObj.altContentId); 282 if (ac) { 283 storedAltContent = ac; 284 storedAltContentId = regObj.altContentId; 285 } 286 } 287 else { 288 storedAltContent = abstractAltContent(obj); 289 } 290 if (!(/%$/.test(regObj.width)) && parseInt(regObj.width, 10) < 310) { 291 regObj.width = "310"; 292 } 293 if (!(/%$/.test(regObj.height)) && parseInt(regObj.height, 10) < 137) { 294 regObj.height = "137"; 295 } 296 doc.title = doc.title.slice(0, 47) + " - Flash Player Installation"; 297 var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn", 298 dt = doc.title, 299 fv = "MMredirectURL=" + win.location + "&MMplayerType=" + pt + "&MMdoctitle=" + dt, 300 replaceId = regObj.id; 301 // For IE when a SWF is loading (AND: not available in cache) wait for the onload event to fire to remove the original object element 302 // In IE you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work 303 if (ua.ie && ua.win && obj.readyState != 4) { 304 var newObj = createElement("div"); 305 replaceId += "SWFObjectNew"; 306 newObj.setAttribute("id", replaceId); 307 obj.parentNode.insertBefore(newObj, obj); // Insert placeholder div that will be replaced by the object element that loads expressinstall.swf 308 obj.style.display = "none"; 309 win.attachEvent("onload", function() { obj.parentNode.removeChild(obj); }); 310 } 311 createSWF({ data:regObj.expressInstall, id:EXPRESS_INSTALL_ID, width:regObj.width, height:regObj.height }, { flashvars:fv }, replaceId); 312 } 313 } 314 315 /* Functions to abstract and display alternative content 316 */ 317 function displayAltContent(obj) { 318 if (ua.ie && ua.win && obj.readyState != 4) { 319 // For IE when a SWF is loading (AND: not available in cache) wait for the onload event to fire to remove the original object element 320 // In IE you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work 321 var el = createElement("div"); 322 obj.parentNode.insertBefore(el, obj); // Insert placeholder div that will be replaced by the alternative content 323 el.parentNode.replaceChild(abstractAltContent(obj), el); 324 obj.style.display = "none"; 325 win.attachEvent("onload", function() { obj.parentNode.removeChild(obj); }); 326 } 327 else { 328 obj.parentNode.replaceChild(abstractAltContent(obj), obj); 329 } 330 } 331 332 function abstractAltContent(obj) { 333 var ac = createElement("div"); 334 if (ua.win && ua.ie) { 335 ac.innerHTML = obj.innerHTML; 336 } 337 else { 338 var nestedObj = obj.getElementsByTagName(OBJECT)[0];
339 if (nestedObj) { 340 var c = nestedObj.childNodes; 341 if (c) { 342 var cl = c.length; 343 for (var i = 0; i < cl; i++) { 344 if (!(c[i].nodeType == 1 && c[i].nodeName.toLowerCase() == "param") && !(c[i].nodeType == 8)) { 345 ac.appendChild(c[i].cloneNode(true)); 346 } 347 } 348 } 349 } 350 } 351 return ac; 352 } 353 354 /* Cross-browser dynamic SWF creation 355 */ 356 function createSWF(attObj, parObj, id) { 357 var r, el = getElementById(id); 358 if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content 359 attObj.id = id; 360 } 361 if (ua.ie && ua.win) { // IE, the object element and W3C DOM methods do not combine: fall back to outerHTML 362 var att = ""; 363 for (var i in attObj) { 364 if (attObj[i] != Object.prototype[i]) { // Filter out prototype additions from other potential libraries, like Object.prototype.toJSONString = function() {} 365 if (i == "data") { 366 parObj.movie = attObj[i]; 367 } 368 else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword 369 att += ' class="' + attObj[i] + '"'; 370 } 371 else if (i != "classid") { 372 att += ' ' + i + '="' + attObj[i] + '"'; 373 } 374 } 375 } 376 var par = ""; 377 for (var j in parObj) { 378 if (parObj[j] != Object.prototype[j]) { // Filter out prototype additions from other potential libraries 379 par += '<param name="' + j + '" value="' + parObj[j] + '" />'; 380 } 381 } 382 el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>'; 383 fixObjectLeaks(attObj.id); // This bug affects dynamic publishing only 384 r = getElementById(attObj.id); 385 } 386 else if (ua.webkit && ua.webkit < 312) { // Older webkit engines ignore the object element's nested param elements: fall back to the proprietary embed element 387 var e = createElement("embed"); 388 e.setAttribute("type", FLASH_MIME_TYPE); 389 for (var k in attObj) { 390 if (attObj[k] != Object.prototype[k]) { // Filter out prototype additions from other potential libraries 391 if (k == "data") { 392 e.setAttribute("src", attObj[k]); 393 } 394 else if (k.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword 395 e.setAttribute("class", attObj[k]); 396 } 397 else if (k != "classid") { // Filter out IE specific attribute 398 e.setAttribute(k, attObj[k]); 399 } 400 } 401 } 402 for (var l in parObj) { 403 if (parObj[l] != Object.prototype[l]) { // Filter out prototype additions from other potential libraries 404 if (l != "movie") { // Filter out IE specific param element 405 e.setAttribute(l, parObj[l]); 406 } 407 } 408 } 409 el.parentNode.replaceChild(e, el); 410 r = e; 411 } 412 else { // Well-behaving browsers 413 var o = createElement(OBJECT); 414 o.setAttribute("type", FLASH_MIME_TYPE); 415 for (var m in attObj) { 416 if (attObj[m] != Object.prototype[m]) { // Filter out prototype additions from other potential libraries 417 if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword 418 o.setAttribute("class", attObj[m]); 419 } 420 else if (m != "classid") { // Filter out IE specific attribute 421 o.setAttribute(m, attObj[m]); 422 } 423 } 424 } 425 for (var n in parObj) { 426 if (parObj[n] != Object.prototype[n] && n != "movie") { // Filter out prototype additions from other potential libraries and IE specific param element 427 createObjParam(o, n, parObj[n]); 428 } 429 } 430 el.parentNode.replaceChild(o, el); 431 r = o; 432 } 433 return r; 434 } 435 436 function createObjParam(el, pName, pValue) { 437 var p = createElement("param"); 438 p.setAttribute("name", pName); 439 p.setAttribute("value", pValue); 440 el.appendChild(p); 441 } 442 443 function getElementById(id) { 444 return doc.getElementById(id); 445 } 446 447 function createElement(el) { 448 return doc.createElement(el); 449 } 450 451 function hasPlayerVersion(rv) { 452 var pv = ua.pv, v = rv.split("."); 453 v[0] = parseInt(v[0], 10); 454 v[1] = parseInt(v[1], 10); 455 v[2] = parseInt(v[2], 10); 456 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; 457 } 458 459 /* Cross-browser dynamic CSS creation
460 - Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php 461 */ 462 function createCSS(sel, decl) { 463 if (ua.ie && ua.mac) { 464 return; 465 } 466 var h = doc.getElementsByTagName("head")[0], s = createElement("style"); 467 s.setAttribute("type", "text/css"); 468 s.setAttribute("media", "screen"); 469 if (!(ua.ie && ua.win) && typeof doc.createTextNode != UNDEF) { 470 s.appendChild(doc.createTextNode(sel + " {" + decl + "}")); 471 } 472 h.appendChild(s); 473 if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) { 474 var ls = doc.styleSheets[doc.styleSheets.length - 1]; 475 if (typeof ls.addRule == OBJECT) { 476 ls.addRule(sel, decl); 477 } 478 } 479 } 480 481 function setVisibility(id, isVisible) { 482 var v = isVisible ? "visible" : "hidden"; 483 if (isDomLoaded) { 484 getElementById(id).style.visibility = v; 485 } 486 else { 487 createCSS("#" + id, "visibility:" + v); 488 } 489 } 490 491 function getTargetVersion(obj) { 492 if (!obj) 493 return 0; 494 var c = obj.childNodes; 495 var cl = c.length; 496 for (var i = 0; i < cl; i++) { 497 if (c[i].nodeType == 1 && c[i].nodeName.toLowerCase() == "object") { 498 c = c[i].childNodes; 499 cl = c.length; 500 i = 0; 501 } 502 if (c[i].nodeType == 1 && c[i].nodeName.toLowerCase() == "param" && c[i].getAttribute("name") == "swfversion") { 503 return c[i].getAttribute("value"); 504 } 505 } 506 return 0; 507 } 508 509 function getExpressInstall(obj) { 510 if (!obj) 511 return ""; 512 var c = obj.childNodes; 513 var cl = c.length; 514 for (var i = 0; i < cl; i++) { 515 if (c[i].nodeType == 1 && c[i].nodeName.toLowerCase() == "object") { 516 c = c[i].childNodes; 517 cl = c.length; 518 i = 0; 519 } 520 if (c[i].nodeType == 1 && c[i].nodeName.toLowerCase() == "param" && c[i].getAttribute("name") == "expressinstall") { 521 return c[i].getAttribute("value"); 522 } 523 } 524 return ""; 525 } 526 527 return { 528 /* Public API 529 - Reference: http://code.google.com/p/swfobject/wiki/SWFObject_2_0_documentation 530 */ 531 registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr) { 532 if (!ua.w3cdom || !objectIdStr) { 533 return; 534 } 535 var obj = document.getElementById(objectIdStr); 536 var xi = getExpressInstall(obj); 537 var regObj = {}; 538 regObj.id = objectIdStr; 539 regObj.swfVersion = swfVersionStr ? swfVersionStr : getTargetVersion(obj); 540 regObj.expressInstall = xiSwfUrlStr ? xiSwfUrlStr : ((xi != "") ? xi : false); 541 regObjArr[regObjArr.length] = regObj; 542 setVisibility(objectIdStr, false); 543 }, 544 545 getObjectById: function(objectIdStr) { 546 var r = null; 547 if (ua.w3cdom && isDomLoaded) { 548 var o = getElementById(objectIdStr); 549 if (o) { 550 var n = o.getElementsByTagName(OBJECT)[0]; 551 if (!n || (n && typeof o.SetVariable != UNDEF)) { 552 r = o; 553 } 554 else if (typeof n.SetVariable != UNDEF) { 555 r = n; 556 } 557 } 558 } 559 return r; 560 }, 561 562 embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj) { 563 if (!ua.w3cdom || !swfUrlStr || !replaceElemIdStr || !widthStr || !heightStr || !swfVersionStr) { 564 return; 565 } 566 widthStr += ""; // Auto-convert to string to make it idiot proof 567 heightStr += ""; 568 if (hasPlayerVersion(swfVersionStr)) { 569 setVisibility(replaceElemIdStr, false); 570 var att = (typeof attObj == OBJECT) ? attObj : {}; 571 att.data = swfUrlStr; 572 att.width = widthStr; 573 att.height = heightStr; 574 var par = (typeof parObj == OBJECT) ? parObj : {}; 575 if (typeof flashvarsObj == OBJECT) { 576 for (var i in flashvarsObj) { 577 if (flashvarsObj[i] != Object.prototype[i]) { // Filter out prototype additions from other potential libraries 578 if (typeof par.flashvars != UNDEF) { 579 par.flashvars += "&" + i + "=" + flashvarsObj[i];
580 } 581 else { 582 par.flashvars = i + "=" + flashvarsObj[i]; 583 } 584 } 585 } 586 } 587 addDomLoadEvent(function() { 588 createSWF(att, par, replaceElemIdStr); 589 if (att.id == replaceElemIdStr) { 590 setVisibility(replaceElemIdStr, true); 591 } 592 }); 593 } 594 else if (xiSwfUrlStr && !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac)) { 595 setVisibility(replaceElemIdStr, false); 596 addDomLoadEvent(function() { 597 var regObj = {}; 598 regObj.id = regObj.altContentId = replaceElemIdStr; 599 regObj.width = widthStr; 600 regObj.height = heightStr; 601 regObj.expressInstall = xiSwfUrlStr; 602 showExpressInstall(regObj); 603 }); 604 } 605 }, 606 607 getFlashPlayerVersion: function() { 608 return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] }; 609 }, 610 611 hasFlashPlayerVersion:hasPlayerVersion, 612 613 createSWF: function(attObj, parObj, replaceElemIdStr) { 614 if (ua.w3cdom && isDomLoaded) { 615 return createSWF(attObj, parObj, replaceElemIdStr); 616 } 617 else { 618 return undefined; 619 } 620 }, 621 622 createCSS: function(sel, decl) { 623 if (ua.w3cdom) { 624 createCSS(sel, decl); 625 } 626 }, 627 628 addDomLoadEvent:addDomLoadEvent, 629 630 addLoadEvent:addLoadEvent, 631 632 getQueryParamValue: function(param) { 633 var q = doc.location.search || doc.location.hash; 634 if (param == null) { 635 return q; 636 } 637 if(q) { 638 var pairs = q.substring(1).split("&"); 639 for (var i = 0; i < pairs.length; i++) { 640 if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) { 641 return pairs[i].substring((pairs[i].indexOf("=") + 1)); 642 } 643 } 644 } 645 return ""; 646 }, 647 648 // For internal usage only 649 expressInstallCallback: function() { 650 if (isExpressInstallActive && storedAltContent) { 651 var obj = getElementById(EXPRESS_INSTALL_ID); 652 if (obj) { 653 obj.parentNode.replaceChild(storedAltContent, obj); 654 if (storedAltContentId) { 655 setVisibility(storedAltContentId, true); 656 if (ua.ie && ua.win) { 657 storedAltContent.style.display = "block"; 658 } 659 } 660 storedAltContent = null; 661 storedAltContentId = null; 662 isExpressInstallActive = false; 663 } 664 } 665 } 666 667 }; 668 669}();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.