/ *
* SWFObject 1.5 & 2.2 hybrid solution for the Chamilo LMS
*
* The problem to be solved :
*
* The SWFObject 2. x javascript for embedding flash - based multimedia is the
* successor of SWFObject 1.5 , but it does not provide backward compatibility .
* The Chamilo LMS under its past brand used the version 1.5 of the script ,
* a lot of pages have been created . On the other hand , SWFObject 1.5
* gets old , there must be a way found for using the modern version of the
* script for the newly created pages without breaking the old ones .
* Note that both vesrsions of the script share a common file name swfobject . js
*
* The solution :
*
* ... is simply merging sources of 1.5 and 2.2 scripts into one . Javsscript is
* a case - sensitive language , and fortunately there are no name - conflicts between
* both versions of the script . So , version 2.2 part of this combined script
* is to be used for creation of new pages , while the version 1.5 part is to
* provide the desired compatibility for old pages . Also , the "compressed"
* production scripts are merged .
*
* Links :
* http : //blog.deconcept.com/swfobject/
* http : //code.google.com/p/swfobject/
*
* License :
* The MIT License - http : //www.opensource.org/licenses/mit-license.php
*
* Authors :
* ( c ) 2007 Geoff Stearns ( SWFObject 1.5 )
* For SWFObject 2.2 , a list of the authors may be seen at :
* http : //code.google.com/p/swfobject/people/list
*
* This hybrid solution has been prepared by Ivan Tcholakov
* July 2009 - first implementation
* January 2010 - this description has been updated
* /
/******************************************************************************/
/ * *
* SWFObject v1 . 5 : Flash Player detection and embed - http : //blog.deconcept.com/swfobject/
*
* SWFObject is ( c ) 2007 Geoff Stearns and is released under the MIT License :
* http : //www.opensource.org/licenses/mit-license.php
*
* /
if ( typeof deconcept == "undefined" ) var deconcept = new Object ( ) ;
if ( typeof deconcept . util == "undefined" ) deconcept . util = new Object ( ) ;
if ( typeof deconcept . SWFObjectUtil == "undefined" ) deconcept . SWFObjectUtil = new Object ( ) ;
deconcept . SWFObject = function ( swf , id , w , h , ver , c , quality , xiRedirectUrl , redirectUrl , detectKey ) {
if ( ! document . getElementById ) { return ; }
this . DETECT _KEY = detectKey ? detectKey : 'detectflash' ;
this . skipDetect = deconcept . util . getRequestParameter ( this . DETECT _KEY ) ;
this . params = new Object ( ) ;
this . variables = new Object ( ) ;
this . attributes = new Array ( ) ;
if ( swf ) { this . setAttribute ( 'swf' , swf ) ; }
if ( id ) { this . setAttribute ( 'id' , id ) ; }
if ( w ) { this . setAttribute ( 'width' , w ) ; }
if ( h ) { this . setAttribute ( 'height' , h ) ; }
if ( ver ) { this . setAttribute ( 'version' , new deconcept . PlayerVersion ( ver . toString ( ) . split ( "." ) ) ) ; }
this . installedVer = deconcept . SWFObjectUtil . getPlayerVersion ( ) ;
if ( ! window . opera && document . all && this . installedVer . major > 7 ) {
// only add the onunload cleanup if the Flash Player version supports External Interface and we are in IE
deconcept . SWFObject . doPrepUnload = true ;
}
if ( c ) { this . addParam ( 'bgcolor' , c ) ; }
var q = quality ? quality : 'high' ;
this . addParam ( 'quality' , q ) ;
this . setAttribute ( 'useExpressInstall' , false ) ;
this . setAttribute ( 'doExpressInstall' , false ) ;
var xir = ( xiRedirectUrl ) ? xiRedirectUrl : window . location ;
this . setAttribute ( 'xiRedirectUrl' , xir ) ;
this . setAttribute ( 'redirectUrl' , '' ) ;
if ( redirectUrl ) { this . setAttribute ( 'redirectUrl' , redirectUrl ) ; }
}
deconcept . SWFObject . prototype = {
useExpressInstall : function ( path ) {
this . xiSWFPath = ! path ? "expressinstall.swf" : path ;
this . setAttribute ( 'useExpressInstall' , true ) ;
} ,
setAttribute : function ( name , value ) {
this . attributes [ name ] = value ;
} ,
getAttribute : function ( name ) {
return this . attributes [ name ] ;
} ,
addParam : function ( name , value ) {
this . params [ name ] = value ;
} ,
getParams : function ( ) {
return this . params ;
} ,
addVariable : function ( name , value ) {
this . variables [ name ] = value ;
} ,
getVariable : function ( name ) {
return this . variables [ name ] ;
} ,
getVariables : function ( ) {
return this . variables ;
} ,
getVariablePairs : function ( ) {
var variablePairs = new Array ( ) ;
var key ;
var variables = this . getVariables ( ) ;
for ( key in variables ) {
variablePairs [ variablePairs . length ] = key + "=" + variables [ key ] ;
}
return variablePairs ;
} ,
getSWFHTML : function ( ) {
var swfNode = "" ;
if ( navigator . plugins && navigator . mimeTypes && navigator . mimeTypes . length ) { // netscape plugin architecture
if ( this . getAttribute ( "doExpressInstall" ) ) {
this . addVariable ( "MMplayerType" , "PlugIn" ) ;
this . setAttribute ( 'swf' , this . xiSWFPath ) ;
}
swfNode = '<embed type="application/x-shockwave-flash" src="' + this . getAttribute ( 'swf' ) + '" width="' + this . getAttribute ( 'width' ) + '" height="' + this . getAttribute ( 'height' ) + '" style="' + this . getAttribute ( 'style' ) + '"' ;
swfNode += ' id="' + this . getAttribute ( 'id' ) + '" name="' + this . getAttribute ( 'id' ) + '" ' ;
var params = this . getParams ( ) ;
for ( var key in params ) { swfNode += [ key ] + '="' + params [ key ] + '" ' ; }
var pairs = this . getVariablePairs ( ) . join ( "&" ) ;
if ( pairs . length > 0 ) { swfNode += 'flashvars="' + pairs + '"' ; }
swfNode += '/>' ;
} else { // PC IE
if ( this . getAttribute ( "doExpressInstall" ) ) {
this . addVariable ( "MMplayerType" , "ActiveX" ) ;
this . setAttribute ( 'swf' , this . xiSWFPath ) ;
}
swfNode = '<object id="' + this . getAttribute ( 'id' ) + '" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="' + this . getAttribute ( 'width' ) + '" height="' + this . getAttribute ( 'height' ) + '" style="' + this . getAttribute ( 'style' ) + '">' ;
swfNode += '<param name="movie" value="' + this . getAttribute ( 'swf' ) + '" />' ;
var params = this . getParams ( ) ;
for ( var key in params ) {
swfNode += '<param name="' + key + '" value="' + params [ key ] + '" />' ;
}
var pairs = this . getVariablePairs ( ) . join ( "&" ) ;
if ( pairs . length > 0 ) { swfNode += '<param name="flashvars" value="' + pairs + '" />' ; }
swfNode += "</object>" ;
}
return swfNode ;
} ,
write : function ( elementId ) {
if ( this . getAttribute ( 'useExpressInstall' ) ) {
// check to see if we need to do an express install
var expressInstallReqVer = new deconcept . PlayerVersion ( [ 6 , 0 , 65 ] ) ;
if ( this . installedVer . versionIsValid ( expressInstallReqVer ) && ! this . installedVer . versionIsValid ( this . getAttribute ( 'version' ) ) ) {
this . setAttribute ( 'doExpressInstall' , true ) ;
this . addVariable ( "MMredirectURL" , escape ( this . getAttribute ( 'xiRedirectUrl' ) ) ) ;
document . title = document . title . slice ( 0 , 47 ) + " - Flash Player Installation" ;
this . addVariable ( "MMdoctitle" , document . title ) ;
}
}
if ( this . skipDetect || this . getAttribute ( 'doExpressInstall' ) || this . installedVer . versionIsValid ( this . getAttribute ( 'version' ) ) ) {
var n = ( typeof elementId == 'string' ) ? document . getElementById ( elementId ) : elementId ;
n . innerHTML = this . getSWFHTML ( ) ;
return true ;
} else {
if ( this . getAttribute ( 'redirectUrl' ) != "" ) {
document . location . replace ( this . getAttribute ( 'redirectUrl' ) ) ;
}
}
return false ;
}
}
/* ---- detection functions ---- */
deconcept . SWFObjectUtil . getPlayerVersion = function ( ) {
var PlayerVersion = new deconcept . PlayerVersion ( [ 0 , 0 , 0 ] ) ;
if ( navigator . plugins && navigator . mimeTypes . length ) {
var x = navigator . plugins [ "Shockwave Flash" ] ;
if ( x && x . description ) {
PlayerVersion = new deconcept . PlayerVersion ( x . description . replace ( /([a-zA-Z]|\s)+/ , "" ) . replace ( /(\s+r|\s+b[0-9]+)/ , "." ) . split ( "." ) ) ;
}
} else if ( navigator . userAgent && navigator . userAgent . indexOf ( "Windows CE" ) >= 0 ) { // if Windows CE
var axo = 1 ;
var counter = 3 ;
while ( axo ) {
try {
counter ++ ;
axo = new ActiveXObject ( "ShockwaveFlash.ShockwaveFlash." + counter ) ;
// document.write("player v: "+ counter);
PlayerVersion = new deconcept . PlayerVersion ( [ counter , 0 , 0 ] ) ;
} catch ( e ) {
axo = null ;
}
}
} else { // Win IE (non mobile)
// do minor version lookup in IE, but avoid fp6 crashing issues
// see http://blog.deconcept.com/2006/01/11/getvariable-setvariable-crash-internet-explorer-flash-6/
try {
var axo = new ActiveXObject ( "ShockwaveFlash.ShockwaveFlash.7" ) ;
} catch ( e ) {
try {
var axo = new ActiveXObject ( "ShockwaveFlash.ShockwaveFlash.6" ) ;
PlayerVersion = new deconcept . PlayerVersion ( [ 6 , 0 , 21 ] ) ;
axo . AllowScriptAccess = "always" ; // error if player version < 6.0.47 (thanks to Michael Williams @ Adobe for this code)
} catch ( e ) {
if ( PlayerVersion . major == 6 ) {
return PlayerVersion ;
}
}
try {
axo = new ActiveXObject ( "ShockwaveFlash.ShockwaveFlash" ) ;
} catch ( e ) { }
}
if ( axo != null ) {
PlayerVersion = new deconcept . PlayerVersion ( axo . GetVariable ( "$version" ) . split ( " " ) [ 1 ] . split ( "," ) ) ;
}
}
return PlayerVersion ;
}
deconcept . PlayerVersion = function ( arrVersion ) {
this . major = arrVersion [ 0 ] != null ? parseInt ( arrVersion [ 0 ] ) : 0 ;
this . minor = arrVersion [ 1 ] != null ? parseInt ( arrVersion [ 1 ] ) : 0 ;
this . rev = arrVersion [ 2 ] != null ? parseInt ( arrVersion [ 2 ] ) : 0 ;
}
deconcept . PlayerVersion . prototype . versionIsValid = function ( fv ) {
if ( this . major < fv . major ) return false ;
if ( this . major > fv . major ) return true ;
if ( this . minor < fv . minor ) return false ;
if ( this . minor > fv . minor ) return true ;
if ( this . rev < fv . rev ) return false ;
return true ;
}
/* ---- get value of query string param ---- */
deconcept . util = {
getRequestParameter : function ( param ) {
var q = document . location . search || document . location . hash ;
if ( param == null ) { return q ; }
if ( q ) {
var pairs = q . substring ( 1 ) . split ( "&" ) ;
for ( var i = 0 ; i < pairs . length ; i ++ ) {
if ( pairs [ i ] . substring ( 0 , pairs [ i ] . indexOf ( "=" ) ) == param ) {
return pairs [ i ] . substring ( ( pairs [ i ] . indexOf ( "=" ) + 1 ) ) ;
}
}
}
return "" ;
}
}
/* fix for video streaming bug */
deconcept . SWFObjectUtil . cleanupSWFs = function ( ) {
var objects = document . getElementsByTagName ( "OBJECT" ) ;
for ( var i = objects . length - 1 ; i >= 0 ; i -- ) {
objects [ i ] . style . display = 'none' ;
for ( var x in objects [ i ] ) {
if ( typeof objects [ i ] [ x ] == 'function' ) {
objects [ i ] [ x ] = function ( ) { } ;
}
}
}
}
// fixes bug in some fp9 versions see http://blog.deconcept.com/2006/07/28/swfobject-143-released/
if ( deconcept . SWFObject . doPrepUnload ) {
if ( ! deconcept . unloadSet ) {
deconcept . SWFObjectUtil . prepUnload = function ( ) {
_ _flash _unloadHandler = function ( ) { } ;
_ _flash _savedUnloadHandler = function ( ) { } ;
window . attachEvent ( "onunload" , deconcept . SWFObjectUtil . cleanupSWFs ) ;
}
window . attachEvent ( "onbeforeunload" , deconcept . SWFObjectUtil . prepUnload ) ;
deconcept . unloadSet = true ;
}
}
/* add document.getElementById if needed (mobile IE < 5) */
if ( ! document . getElementById && document . all ) { document . getElementById = function ( id ) { return document . all [ id ] ; } }
/* add some aliases for ease of use/backwards compatibility */
var getQueryParamValue = deconcept . util . getRequestParameter ;
var FlashObject = deconcept . SWFObject ; // for legacy support
var SWFObject = deconcept . SWFObject ;
/******************************************************************************/
/*! SWFObject v2.2 <http:/ / code . google . com / p / swfobject / >
is released under the MIT License < http : //www.opensource.org/licenses/mit-license.php>
* /
var swfobject = function ( ) {
var UNDEF = "undefined" ,
OBJECT = "object" ,
SHOCKWAVE _FLASH = "Shockwave Flash" ,
SHOCKWAVE _FLASH _AX = "ShockwaveFlash.ShockwaveFlash" ,
FLASH _MIME _TYPE = "application/x-shockwave-flash" ,
EXPRESS _INSTALL _ID = "SWFObjectExprInst" ,
ON _READY _STATE _CHANGE = "onreadystatechange" ,
win = window ,
doc = document ,
nav = navigator ,
plugin = false ,
domLoadFnArr = [ main ] ,
regObjArr = [ ] ,
objIdArr = [ ] ,
listenersArr = [ ] ,
storedAltContent ,
storedAltContentId ,
storedCallbackFn ,
storedCallbackObj ,
isDomLoaded = false ,
isExpressInstallActive = false ,
dynamicStylesheet ,
dynamicStylesheetMedia ,
autoHideShow = true ,
/ * C e n t r a l i z e d f u n c t i o n f o r b r o w s e r f e a t u r e d e t e c t i o n
- User agent string detection is only used when no good alternative is possible
- Is executed directly for optimal performance
* /
ua = function ( ) {
var w3cdom = typeof doc . getElementById != UNDEF && typeof doc . getElementsByTagName != UNDEF && typeof doc . createElement != UNDEF ,
u = nav . userAgent . toLowerCase ( ) ,
p = nav . platform . toLowerCase ( ) ,
windows = p ? /win/ . test ( p ) : /win/ . test ( u ) ,
mac = p ? /mac/ . test ( p ) : /mac/ . test ( u ) ,
webkit = /webkit/ . test ( u ) ? parseFloat ( u . replace ( /^.*webkit\/(\d+(\.\d+)?).*$/ , "$1" ) ) : false , // returns either the webkit version or false if not webkit
ie = ! + "\v1" , // feature detection based on Andrea Giammarchi's solution: http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html
playerVersion = [ 0 , 0 , 0 ] ,
d = null ;
if ( typeof nav . plugins != UNDEF && typeof nav . plugins [ SHOCKWAVE _FLASH ] == OBJECT ) {
d = nav . plugins [ SHOCKWAVE _FLASH ] . description ;
if ( d && ! ( typeof nav . mimeTypes != UNDEF && nav . mimeTypes [ FLASH _MIME _TYPE ] && ! nav . mimeTypes [ FLASH _MIME _TYPE ] . enabledPlugin ) ) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+
plugin = true ;
ie = false ; // cascaded feature detection for Internet Explorer
d = d . replace ( /^.*\s+(\S+\s+\S+$)/ , "$1" ) ;
playerVersion [ 0 ] = parseInt ( d . replace ( /^(.*)\..*$/ , "$1" ) , 10 ) ;
playerVersion [ 1 ] = parseInt ( d . replace ( /^.*\.(.*)\s.*$/ , "$1" ) , 10 ) ;
playerVersion [ 2 ] = /[a-zA-Z]/ . test ( d ) ? parseInt ( d . replace ( /^.*[a-zA-Z]+(.*)$/ , "$1" ) , 10 ) : 0 ;
}
}
else if ( typeof win . ActiveXObject != UNDEF ) {
try {
var a = new ActiveXObject ( SHOCKWAVE _FLASH _AX ) ;
if ( a ) { // a will return null when ActiveX is disabled
d = a . GetVariable ( "$version" ) ;
if ( d ) {
ie = true ; // cascaded feature detection for Internet Explorer
d = d . split ( " " ) [ 1 ] . split ( "," ) ;
playerVersion = [ parseInt ( d [ 0 ] , 10 ) , parseInt ( d [ 1 ] , 10 ) , parseInt ( d [ 2 ] , 10 ) ] ;
}
}
}
catch ( e ) { }
}
return { w3 : w3cdom , pv : playerVersion , wk : webkit , ie : ie , win : windows , mac : mac } ;
} ( ) ,
/ * C r o s s - b r o w s e r o n D o m L o a d
- Will fire an event as soon as the DOM of a web page is loaded
- Internet Explorer workaround based on Diego Perini ' s solution : http : //javascript.nwbox.com/IEContentLoaded/
- Regular onload serves as fallback
* /
onDomLoad = function ( ) {
if ( ! ua . w3 ) { return ; }
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
callDomLoadFunctions ( ) ;
}
if ( ! isDomLoaded ) {
if ( typeof doc . addEventListener != UNDEF ) {
doc . addEventListener ( "DOMContentLoaded" , callDomLoadFunctions , false ) ;
}
if ( ua . ie && ua . win ) {
doc . attachEvent ( ON _READY _STATE _CHANGE , function ( ) {
if ( doc . readyState == "complete" ) {
doc . detachEvent ( ON _READY _STATE _CHANGE , arguments . callee ) ;
callDomLoadFunctions ( ) ;
}
} ) ;
if ( win == top ) { // if not inside an iframe
( function ( ) {
if ( isDomLoaded ) { return ; }
try {
doc . documentElement . doScroll ( "left" ) ;
}
catch ( e ) {
setTimeout ( arguments . callee , 0 ) ;
return ;
}
callDomLoadFunctions ( ) ;
} ) ( ) ;
}
}
if ( ua . wk ) {
( function ( ) {
if ( isDomLoaded ) { return ; }
if ( ! /loaded|complete/ . test ( doc . readyState ) ) {
setTimeout ( arguments . callee , 0 ) ;
return ;
}
callDomLoadFunctions ( ) ;
} ) ( ) ;
}
addLoadEvent ( callDomLoadFunctions ) ;
}
} ( ) ;
function callDomLoadFunctions ( ) {
if ( isDomLoaded ) { return ; }
try { // test if we can really add/remove elements to/from the DOM; we don't want to fire it too early
var t = doc . getElementsByTagName ( "body" ) [ 0 ] . appendChild ( createElement ( "span" ) ) ;
t . parentNode . removeChild ( t ) ;
}
catch ( e ) { return ; }
isDomLoaded = true ;
var dl = domLoadFnArr . length ;
for ( var i = 0 ; i < dl ; i ++ ) {
domLoadFnArr [ i ] ( ) ;
}
}
function addDomLoadEvent ( fn ) {
if ( isDomLoaded ) {
fn ( ) ;
}
else {
domLoadFnArr [ domLoadFnArr . length ] = fn ; // Array.push() is only available in IE5.5+
}
}
/ * C r o s s - b r o w s e r o n l o a d
- Based on James Edwards ' solution : http : //brothercake.com/site/resources/scripts/onload/
- Will fire an event as soon as a web page including all of its assets are loaded
* /
function addLoadEvent ( fn ) {
if ( typeof win . addEventListener != UNDEF ) {
win . addEventListener ( "load" , fn , false ) ;
}
else if ( typeof doc . addEventListener != UNDEF ) {
doc . addEventListener ( "load" , fn , false ) ;
}
else if ( typeof win . attachEvent != UNDEF ) {
addListener ( win , "onload" , fn ) ;
}
else if ( typeof win . onload == "function" ) {
var fnOld = win . onload ;
win . onload = function ( ) {
fnOld ( ) ;
fn ( ) ;
} ;
}
else {
win . onload = fn ;
}
}
/ * M a i n f u n c t i o n
- Will preferably execute onDomLoad , otherwise onload ( as a fallback )
* /
function main ( ) {
if ( plugin ) {
testPlayerVersion ( ) ;
}
else {
matchVersions ( ) ;
}
}
/ * D e t e c t t h e F l a s h P l a y e r v e r s i o n f o r n o n - I n t e r n e t E x p l o r e r b r o w s e r s
- Detecting the plug - in version via the object element is more precise than using the plugins collection item ' s description :
a . Both release and build numbers can be detected
b . Avoid wrong descriptions by corrupt installers provided by Adobe
c . Avoid wrong descriptions by multiple Flash Player entries in the plugin Array , caused by incorrect browser imports
- Disadvantage of this method is that it depends on the availability of the DOM , while the plugins collection is immediately available
* /
function testPlayerVersion ( ) {
var b = doc . getElementsByTagName ( "body" ) [ 0 ] ;
var o = createElement ( OBJECT ) ;
o . setAttribute ( "type" , FLASH _MIME _TYPE ) ;
var t = b . appendChild ( o ) ;
if ( t ) {
var counter = 0 ;
( function ( ) {
if ( typeof t . GetVariable != UNDEF ) {
var d = t . GetVariable ( "$version" ) ;
if ( d ) {
d = d . split ( " " ) [ 1 ] . split ( "," ) ;
ua . pv = [ parseInt ( d [ 0 ] , 10 ) , parseInt ( d [ 1 ] , 10 ) , parseInt ( d [ 2 ] , 10 ) ] ;
}
}
else if ( counter < 10 ) {
counter ++ ;
setTimeout ( arguments . callee , 10 ) ;
return ;
}
b . removeChild ( o ) ;
t = null ;
matchVersions ( ) ;
} ) ( ) ;
}
else {
matchVersions ( ) ;
}
}
/ * P e r f o r m F l a s h P l a y e r a n d S W F v e r s i o n m a t c h i n g ; s t a t i c p u b l i s h i n g o n l y
* /
function matchVersions ( ) {
var rl = regObjArr . length ;
if ( rl > 0 ) {
for ( var i = 0 ; i < rl ; i ++ ) { // for each registered object element
var id = regObjArr [ i ] . id ;
var cb = regObjArr [ i ] . callbackFn ;
var cbObj = { success : false , id : id } ;
if ( ua . pv [ 0 ] > 0 ) {
var obj = getElementById ( id ) ;
if ( obj ) {
if ( hasPlayerVersion ( regObjArr [ i ] . swfVersion ) && ! ( ua . wk && ua . wk < 312 ) ) { // Flash Player version >= published SWF version: Houston, we have a match!
setVisibility ( id , true ) ;
if ( cb ) {
cbObj . success = true ;
cbObj . ref = getObjectById ( id ) ;
cb ( cbObj ) ;
}
}
else if ( regObjArr [ i ] . expressInstall && canExpressInstall ( ) ) { // show the Adobe Express Install dialog if set by the web page author and if supported
var att = { } ;
att . data = regObjArr [ i ] . expressInstall ;
att . width = obj . getAttribute ( "width" ) || "0" ;
att . height = obj . getAttribute ( "height" ) || "0" ;
if ( obj . getAttribute ( "class" ) ) { att . styleclass = obj . getAttribute ( "class" ) ; }
if ( obj . getAttribute ( "align" ) ) { att . align = obj . getAttribute ( "align" ) ; }
// parse HTML object param element's name-value pairs
var par = { } ;
var p = obj . getElementsByTagName ( "param" ) ;
var pl = p . length ;
for ( var j = 0 ; j < pl ; j ++ ) {
if ( p [ j ] . getAttribute ( "name" ) . toLowerCase ( ) != "movie" ) {
par [ p [ j ] . getAttribute ( "name" ) ] = p [ j ] . getAttribute ( "value" ) ;
}
}
showExpressInstall ( att , par , id , cb ) ;
}
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
displayAltContent ( obj ) ;
if ( cb ) { cb ( cbObj ) ; }
}
}
}
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)
setVisibility ( id , true ) ;
if ( cb ) {
var o = getObjectById ( id ) ; // test whether there is an HTML object element or not
if ( o && typeof o . SetVariable != UNDEF ) {
cbObj . success = true ;
cbObj . ref = o ;
}
cb ( cbObj ) ;
}
}
}
}
}
function getObjectById ( objectIdStr ) {
var r = null ;
var o = getElementById ( objectIdStr ) ;
if ( o && o . nodeName == "OBJECT" ) {
if ( typeof o . SetVariable != UNDEF ) {
r = o ;
}
else {
var n = o . getElementsByTagName ( OBJECT ) [ 0 ] ;
if ( n ) {
r = n ;
}
}
}
return r ;
}
/ * R e q u i r e m e n t s f o r A d o b e E x p r e s s I n s t a l l
- only one instance can be active at a time
- fp 6.0 . 65 or higher
- Win / Mac OS only
- no Webkit engines older than version 312
* /
function canExpressInstall ( ) {
return ! isExpressInstallActive && hasPlayerVersion ( "6.0.65" ) && ( ua . win || ua . mac ) && ! ( ua . wk && ua . wk < 312 ) ;
}
/ * S h o w t h e A d o b e E x p r e s s I n s t a l l d i a l o g
- Reference : http : //www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75
* /
function showExpressInstall ( att , par , replaceElemIdStr , callbackFn ) {
isExpressInstallActive = true ;
storedCallbackFn = callbackFn || null ;
storedCallbackObj = { success : false , id : replaceElemIdStr } ;
var obj = getElementById ( replaceElemIdStr ) ;
if ( obj ) {
if ( obj . nodeName == "OBJECT" ) { // static publishing
storedAltContent = abstractAltContent ( obj ) ;
storedAltContentId = null ;
}
else { // dynamic publishing
storedAltContent = obj ;
storedAltContentId = replaceElemIdStr ;
}
att . id = EXPRESS _INSTALL _ID ;
if ( typeof att . width == UNDEF || ( ! /%$/ . test ( att . width ) && parseInt ( att . width , 10 ) < 310 ) ) { att . width = "310" ; }
if ( typeof att . height == UNDEF || ( ! /%$/ . test ( att . height ) && parseInt ( att . height , 10 ) < 137 ) ) { att . height = "137" ; }
doc . title = doc . title . slice ( 0 , 47 ) + " - Flash Player Installation" ;
var pt = ua . ie && ua . win ? "ActiveX" : "PlugIn" ,
fv = "MMredirectURL=" + win . location . toString ( ) . replace ( /&/g , "%26" ) + "&MMplayerType=" + pt + "&MMdoctitle=" + doc . title ;
if ( typeof par . flashvars != UNDEF ) {
par . flashvars += "&" + fv ;
}
else {
par . flashvars = fv ;
}
// 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,
// because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
if ( ua . ie && ua . win && obj . readyState != 4 ) {
var newObj = createElement ( "div" ) ;
replaceElemIdStr += "SWFObjectNew" ;
newObj . setAttribute ( "id" , replaceElemIdStr ) ;
obj . parentNode . insertBefore ( newObj , obj ) ; // insert placeholder div that will be replaced by the object element that loads expressinstall.swf
obj . style . display = "none" ;
( function ( ) {
if ( obj . readyState == 4 ) {
obj . parentNode . removeChild ( obj ) ;
}
else {
setTimeout ( arguments . callee , 10 ) ;
}
} ) ( ) ;
}
createSWF ( att , par , replaceElemIdStr ) ;
}
}
/ * F u n c t i o n s t o a b s t r a c t a n d d i s p l a y a l t e r n a t i v e c o n t e n t
* /
function displayAltContent ( obj ) {
if ( ua . ie && ua . win && obj . readyState != 4 ) {
// 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,
// because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
var el = createElement ( "div" ) ;
obj . parentNode . insertBefore ( el , obj ) ; // insert placeholder div that will be replaced by the alternative content
el . parentNode . replaceChild ( abstractAltContent ( obj ) , el ) ;
obj . style . display = "none" ;
( function ( ) {
if ( obj . readyState == 4 ) {
obj . parentNode . removeChild ( obj ) ;
}
else {
setTimeout ( arguments . callee , 10 ) ;
}
} ) ( ) ;
}
else {
obj . parentNode . replaceChild ( abstractAltContent ( obj ) , obj ) ;
}
}
function abstractAltContent ( obj ) {
var ac = createElement ( "div" ) ;
if ( ua . win && ua . ie ) {
ac . innerHTML = obj . innerHTML ;
}
else {
var nestedObj = obj . getElementsByTagName ( OBJECT ) [ 0 ] ;
if ( nestedObj ) {
var c = nestedObj . childNodes ;
if ( c ) {
var cl = c . length ;
for ( var i = 0 ; i < cl ; i ++ ) {
if ( ! ( c [ i ] . nodeType == 1 && c [ i ] . nodeName == "PARAM" ) && ! ( c [ i ] . nodeType == 8 ) ) {
ac . appendChild ( c [ i ] . cloneNode ( true ) ) ;
}
}
}
}
}
return ac ;
}
/ * C r o s s - b r o w s e r d y n a m i c S W F c r e a t i o n
* /
function createSWF ( attObj , parObj , id ) {
var r , el = getElementById ( id ) ;
if ( ua . wk && ua . wk < 312 ) { return r ; }
if ( el ) {
if ( typeof attObj . id == UNDEF ) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content
attObj . id = id ;
}
if ( ua . ie && ua . win ) { // Internet Explorer + the HTML object element + W3C DOM methods do not combine: fall back to outerHTML
var att = "" ;
for ( var i in attObj ) {
if ( attObj [ i ] != Object . prototype [ i ] ) { // filter out prototype additions from other potential libraries
if ( i . toLowerCase ( ) == "data" ) {
parObj . movie = attObj [ i ] ;
}
else if ( i . toLowerCase ( ) == "styleclass" ) { // 'class' is an ECMA4 reserved keyword
att += ' class="' + attObj [ i ] + '"' ;
}
else if ( i . toLowerCase ( ) != "classid" ) {
att += ' ' + i + '="' + attObj [ i ] + '"' ;
}
}
}
var par = "" ;
for ( var j in parObj ) {
if ( parObj [ j ] != Object . prototype [ j ] ) { // filter out prototype additions from other potential libraries
par += '<param name="' + j + '" value="' + parObj [ j ] + '" />' ;
}
}
el . outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>' ;
objIdArr [ objIdArr . length ] = attObj . id ; // stored to fix object 'leaks' on unload (dynamic publishing only)
r = getElementById ( attObj . id ) ;
}
else { // well-behaving browsers
var o = createElement ( OBJECT ) ;
o . setAttribute ( "type" , FLASH _MIME _TYPE ) ;
for ( var m in attObj ) {
if ( attObj [ m ] != Object . prototype [ m ] ) { // filter out prototype additions from other potential libraries
if ( m . toLowerCase ( ) == "styleclass" ) { // 'class' is an ECMA4 reserved keyword
o . setAttribute ( "class" , attObj [ m ] ) ;
}
else if ( m . toLowerCase ( ) != "classid" ) { // filter out IE specific attribute
o . setAttribute ( m , attObj [ m ] ) ;
}
}
}
for ( var n in parObj ) {
if ( parObj [ n ] != Object . prototype [ n ] && n . toLowerCase ( ) != "movie" ) { // filter out prototype additions from other potential libraries and IE specific param element
createObjParam ( o , n , parObj [ n ] ) ;
}
}
el . parentNode . replaceChild ( o , el ) ;
r = o ;
}
}
return r ;
}
function createObjParam ( el , pName , pValue ) {
var p = createElement ( "param" ) ;
p . setAttribute ( "name" , pName ) ;
p . setAttribute ( "value" , pValue ) ;
el . appendChild ( p ) ;
}
/ * C r o s s - b r o w s e r S W F r e m o v a l
- Especially needed to safely and completely remove a SWF in Internet Explorer
* /
function removeSWF ( id ) {
var obj = getElementById ( id ) ;
if ( obj && obj . nodeName == "OBJECT" ) {
if ( ua . ie && ua . win ) {
obj . style . display = "none" ;
( function ( ) {
if ( obj . readyState == 4 ) {
removeObjectInIE ( id ) ;
}
else {
setTimeout ( arguments . callee , 10 ) ;
}
} ) ( ) ;
}
else {
obj . parentNode . removeChild ( obj ) ;
}
}
}
function removeObjectInIE ( id ) {
var obj = getElementById ( id ) ;
if ( obj ) {
for ( var i in obj ) {
if ( typeof obj [ i ] == "function" ) {
obj [ i ] = null ;
}
}
obj . parentNode . removeChild ( obj ) ;
}
}
/ * F u n c t i o n s t o o p t i m i z e J a v a S c r i p t c o m p r e s s i o n
* /
function getElementById ( id ) {
var el = null ;
try {
el = doc . getElementById ( id ) ;
}
catch ( e ) { }
return el ;
}
function createElement ( el ) {
return doc . createElement ( el ) ;
}
/ * U p d a t e d a t t a c h E v e n t f u n c t i o n f o r I n t e r n e t E x p l o r e r
- Stores attachEvent information in an Array , so on unload the detachEvent functions can be called to avoid memory leaks
* /
function addListener ( target , eventType , fn ) {
target . attachEvent ( eventType , fn ) ;
listenersArr [ listenersArr . length ] = [ target , eventType , fn ] ;
}
/ * F l a s h P l a y e r a n d S W F c o n t e n t v e r s i o n m a t c h i n g
* /
function hasPlayerVersion ( rv ) {
var pv = ua . pv , v = rv . split ( "." ) ;
v [ 0 ] = parseInt ( v [ 0 ] , 10 ) ;
v [ 1 ] = parseInt ( v [ 1 ] , 10 ) || 0 ; // supports short notation, e.g. "9" instead of "9.0.0"
v [ 2 ] = parseInt ( v [ 2 ] , 10 ) || 0 ;
return ( pv [ 0 ] > v [ 0 ] || ( pv [ 0 ] == v [ 0 ] && pv [ 1 ] > v [ 1 ] ) || ( pv [ 0 ] == v [ 0 ] && pv [ 1 ] == v [ 1 ] && pv [ 2 ] >= v [ 2 ] ) ) ? true : false ;
}
/ * C r o s s - b r o w s e r d y n a m i c C S S c r e a t i o n
- Based on Bobby van der Sluis ' solution : http : //www.bobbyvandersluis.com/articles/dynamicCSS.php
* /
function createCSS ( sel , decl , media , newStyle ) {
if ( ua . ie && ua . mac ) { return ; }
var h = doc . getElementsByTagName ( "head" ) [ 0 ] ;
if ( ! h ) { return ; } // to also support badly authored HTML pages that lack a head element
var m = ( media && typeof media == "string" ) ? media : "screen" ;
if ( newStyle ) {
dynamicStylesheet = null ;
dynamicStylesheetMedia = null ;
}
if ( ! dynamicStylesheet || dynamicStylesheetMedia != m ) {
// create dynamic stylesheet + get a global reference to it
var s = createElement ( "style" ) ;
s . setAttribute ( "type" , "text/css" ) ;
s . setAttribute ( "media" , m ) ;
dynamicStylesheet = h . appendChild ( s ) ;
if ( ua . ie && ua . win && typeof doc . styleSheets != UNDEF && doc . styleSheets . length > 0 ) {
dynamicStylesheet = doc . styleSheets [ doc . styleSheets . length - 1 ] ;
}
dynamicStylesheetMedia = m ;
}
// add style rule
if ( ua . ie && ua . win ) {
if ( dynamicStylesheet && typeof dynamicStylesheet . addRule == OBJECT ) {
dynamicStylesheet . addRule ( sel , decl ) ;
}
}
else {
if ( dynamicStylesheet && typeof doc . createTextNode != UNDEF ) {
dynamicStylesheet . appendChild ( doc . createTextNode ( sel + " {" + decl + "}" ) ) ;
}
}
}
function setVisibility ( id , isVisible ) {
if ( ! autoHideShow ) { return ; }
var v = isVisible ? "visible" : "hidden" ;
if ( isDomLoaded && getElementById ( id ) ) {
getElementById ( id ) . style . visibility = v ;
}
else {
createCSS ( "#" + id , "visibility:" + v ) ;
}
}
/ * F i l t e r t o a v o i d X S S a t t a c k s
* /
function urlEncodeIfNecessary ( s ) {
var regex = /[\\\"<>\.;]/ ;
var hasBadChars = regex . exec ( s ) != null ;
return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent ( s ) : s ;
}
/ * R e l e a s e m e m o r y t o a v o i d m e m o r y l e a k s c a u s e d b y c l o s u r e s , f i x h a n g i n g a u d i o / v i d e o t h r e a d s a n d f o r c e o p e n s o c k e t s / N e t C o n n e c t i o n s t o d i s c o n n e c t ( I n t e r n e t E x p l o r e r o n l y )
* /
var cleanup = function ( ) {
if ( ua . ie && ua . win ) {
window . attachEvent ( "onunload" , function ( ) {
// remove listeners to avoid memory leaks
var ll = listenersArr . length ;
for ( var i = 0 ; i < ll ; i ++ ) {
listenersArr [ i ] [ 0 ] . detachEvent ( listenersArr [ i ] [ 1 ] , listenersArr [ i ] [ 2 ] ) ;
}
// cleanup dynamically embedded objects to fix audio/video threads and force open sockets and NetConnections to disconnect
var il = objIdArr . length ;
for ( var j = 0 ; j < il ; j ++ ) {
removeSWF ( objIdArr [ j ] ) ;
}
// cleanup library's main closures to avoid memory leaks
for ( var k in ua ) {
ua [ k ] = null ;
}
ua = null ;
for ( var l in swfobject ) {
swfobject [ l ] = null ;
}
swfobject = null ;
} ) ;
}
} ( ) ;
return {
/ * P u b l i c A P I
- Reference : http : //code.google.com/p/swfobject/wiki/documentation
* /
registerObject : function ( objectIdStr , swfVersionStr , xiSwfUrlStr , callbackFn ) {
if ( ua . w3 && objectIdStr && swfVersionStr ) {
var regObj = { } ;
regObj . id = objectIdStr ;
regObj . swfVersion = swfVersionStr ;
regObj . expressInstall = xiSwfUrlStr ;
regObj . callbackFn = callbackFn ;
regObjArr [ regObjArr . length ] = regObj ;
setVisibility ( objectIdStr , false ) ;
}
else if ( callbackFn ) {
callbackFn ( { success : false , id : objectIdStr } ) ;
}
} ,
getObjectById : function ( objectIdStr ) {
if ( ua . w3 ) {
return getObjectById ( objectIdStr ) ;
}
} ,
embedSWF : function ( swfUrlStr , replaceElemIdStr , widthStr , heightStr , swfVersionStr , xiSwfUrlStr , flashvarsObj , parObj , attObj , callbackFn ) {
var callbackObj = { success : false , id : replaceElemIdStr } ;
if ( ua . w3 && ! ( ua . wk && ua . wk < 312 ) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr ) {
setVisibility ( replaceElemIdStr , false ) ;
addDomLoadEvent ( function ( ) {
widthStr += "" ; // auto-convert to string
heightStr += "" ;
var att = { } ;
if ( attObj && typeof attObj === OBJECT ) {
for ( var i in attObj ) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs
att [ i ] = attObj [ i ] ;
}
}
att . data = swfUrlStr ;
att . width = widthStr ;
att . height = heightStr ;
var par = { } ;
if ( parObj && typeof parObj === OBJECT ) {
for ( var j in parObj ) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs
par [ j ] = parObj [ j ] ;
}
}
if ( flashvarsObj && typeof flashvarsObj === OBJECT ) {
for ( var k in flashvarsObj ) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs
if ( typeof par . flashvars != UNDEF ) {
par . flashvars += "&" + k + "=" + flashvarsObj [ k ] ;
}
else {
par . flashvars = k + "=" + flashvarsObj [ k ] ;
}
}
}
if ( hasPlayerVersion ( swfVersionStr ) ) { // create SWF
var obj = createSWF ( att , par , replaceElemIdStr ) ;
if ( att . id == replaceElemIdStr ) {
setVisibility ( replaceElemIdStr , true ) ;
}
callbackObj . success = true ;
callbackObj . ref = obj ;
}
else if ( xiSwfUrlStr && canExpressInstall ( ) ) { // show Adobe Express Install
att . data = xiSwfUrlStr ;
showExpressInstall ( att , par , replaceElemIdStr , callbackFn ) ;
return ;
}
else { // show alternative content
setVisibility ( replaceElemIdStr , true ) ;
}
if ( callbackFn ) { callbackFn ( callbackObj ) ; }
} ) ;
}
else if ( callbackFn ) { callbackFn ( callbackObj ) ; }
} ,
switchOffAutoHideShow : function ( ) {
autoHideShow = false ;
} ,
ua : ua ,
getFlashPlayerVersion : function ( ) {
return { major : ua . pv [ 0 ] , minor : ua . pv [ 1 ] , release : ua . pv [ 2 ] } ;
} ,
hasFlashPlayerVersion : hasPlayerVersion ,
createSWF : function ( attObj , parObj , replaceElemIdStr ) {
if ( ua . w3 ) {
return createSWF ( attObj , parObj , replaceElemIdStr ) ;
}
else {
return undefined ;
}
} ,
showExpressInstall : function ( att , par , replaceElemIdStr , callbackFn ) {
if ( ua . w3 && canExpressInstall ( ) ) {
showExpressInstall ( att , par , replaceElemIdStr , callbackFn ) ;
}
} ,
removeSWF : function ( objElemIdStr ) {
if ( ua . w3 ) {
removeSWF ( objElemIdStr ) ;
}
} ,
createCSS : function ( selStr , declStr , mediaStr , newStyleBoolean ) {
if ( ua . w3 ) {
createCSS ( selStr , declStr , mediaStr , newStyleBoolean ) ;
}
} ,
addDomLoadEvent : addDomLoadEvent ,
addLoadEvent : addLoadEvent ,
getQueryParamValue : function ( param ) {
var q = doc . location . search || doc . location . hash ;
if ( q ) {
if ( /\?/ . test ( q ) ) { q = q . split ( "?" ) [ 1 ] ; } // strip question mark
if ( param == null ) {
return urlEncodeIfNecessary ( q ) ;
}
var pairs = q . split ( "&" ) ;
for ( var i = 0 ; i < pairs . length ; i ++ ) {
if ( pairs [ i ] . substring ( 0 , pairs [ i ] . indexOf ( "=" ) ) == param ) {
return urlEncodeIfNecessary ( pairs [ i ] . substring ( ( pairs [ i ] . indexOf ( "=" ) + 1 ) ) ) ;
}
}
}
return "" ;
} ,
// For internal usage only
expressInstallCallback : function ( ) {
if ( isExpressInstallActive ) {
var obj = getElementById ( EXPRESS _INSTALL _ID ) ;
if ( obj && storedAltContent ) {
obj . parentNode . replaceChild ( storedAltContent , obj ) ;
if ( storedAltContentId ) {
setVisibility ( storedAltContentId , true ) ;
if ( ua . ie && ua . win ) { storedAltContent . style . display = "block" ; }
}
if ( storedCallbackFn ) { storedCallbackFn ( storedCallbackObj ) ; }
}
isExpressInstallActive = false ;
}
}
} ;
} ( ) ;
/******************************************************************************/