2012-06-16 19:34:53 -04:00
/ * ! S W F O b j e c t v 2 . 2 m o d i f i e d b y B r a n d o n M a t h i s t o c o n t a i n o n l y w h a t i s n e c e s s a r y t o d y n a m i c a l l y e m b e d f l a s h o b j e c t s
* Uncompressed source in javascripts / libs / swfobject - dynamic . js
* < http : //code.google.com/p/swfobject/>
released under the MIT License < http : //www.opensource.org/licenses/mit-license.php>
2011-06-13 16:41:03 -04:00
* /
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" ,
win = window ,
doc = document ,
nav = navigator ,
plugin = false ,
regObjArr = [ ] ,
objIdArr = [ ] ,
storedAltContent ,
storedAltContentId ,
storedCallbackFn ,
storedCallbackObj ,
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 } ;
} ( )
/ * 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 ( ) ;
}
}
/ * 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
* /
/ * 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 ) ;
}
/ * 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 ;
}
/ * 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 ;
}
return {
/ * P u b l i c A P I
- Reference : http : //code.google.com/p/swfobject/wiki/documentation
* /
embedSWF : function ( swfUrlStr , replaceElemIdStr , widthStr , heightStr , swfVersionStr , flashvarsObj , parObj , attObj , callbackFn ) {
var callbackObj = { success : false , id : replaceElemIdStr } ;
if ( ua . w3 && ! ( ua . wk && ua . wk < 312 ) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr ) {
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 ) ;
callbackObj . success = true ;
callbackObj . ref = obj ;
}
if ( callbackFn ) { callbackFn ( callbackObj ) ; }
}
else if ( callbackFn ) { callbackFn ( callbackObj ) ; }
} ,
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 ;
}
} ,
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 "" ;
}
} ;
} ( ) ;