2013-03-16 06:25:44 +01:00
/ * !
* MediaElement . js
* HTML5 < video > and < audio > shim and player
* http : //mediaelementjs.com/
*
* Creates a JavaScript object that mimics HTML5 MediaElement API
* for browsers that don 't understand HTML5 or can' t play the provided codec
* Can play MP4 ( H . 264 ) , Ogg , WebM , FLV , WMV , WMA , ACC , and MP3
*
2013-04-12 23:48:16 +02:00
* Copyright 2010 - 2013 , John Dyer ( http : //j.hn)
2013-04-11 00:38:30 +02:00
* License : MIT
2013-03-16 06:25:44 +01:00
*
2013-04-12 23:48:16 +02:00
* / v a r m e j s = m e j s | | { } ; m e j s . v e r s i o n = " 2 . 1 1 . 3 " ; m e j s . m e I n d e x = 0 ;
2013-04-12 00:13:44 +02:00
mejs . plugins = { silverlight : [ { version : [ 3 , 0 ] , types : [ "video/mp4" , "video/m4v" , "video/mov" , "video/wmv" , "audio/wma" , "audio/m4a" , "audio/mp3" , "audio/wav" , "audio/mpeg" ] } ] , flash : [ { version : [ 9 , 0 , 124 ] , types : [ "video/mp4" , "video/m4v" , "video/mov" , "video/flv" , "video/rtmp" , "video/x-flv" , "audio/flv" , "audio/x-flv" , "audio/mp3" , "audio/m4a" , "audio/mpeg" , "video/youtube" , "video/x-youtube" ] } ] , youtube : [ { version : null , types : [ "video/youtube" , "video/x-youtube" , "audio/youtube" , "audio/x-youtube" ] } ] , vimeo : [ { version : null , types : [ "video/vimeo" ,
"video/x-vimeo" ] } ] } ;
2013-04-12 23:48:16 +02:00
mejs . Utility = { encodeUrl : function ( a ) { return encodeURIComponent ( a ) } , escapeHTML : function ( a ) { return a . toString ( ) . split ( "&" ) . join ( "&" ) . split ( "<" ) . join ( "<" ) . split ( '"' ) . join ( """ ) } , absolutizeUrl : function ( a ) { var b = document . createElement ( "div" ) ; b . innerHTML = '<a href="' + this . escapeHTML ( a ) + '">x</a>' ; return b . firstChild . href } , getScriptPath : function ( a ) { for ( var b = 0 , c , d = "" , e = "" , f , g , h = document . getElementsByTagName ( "script" ) , l = h . length , j = a . length ; b < l ; b ++ ) { f = h [ b ] . src ; c = f . lastIndexOf ( "/" ) ; if ( c > - 1 ) { g = f . substring ( c +
1 ) ; f = f . substring ( 0 , c + 1 ) } else { g = f ; f = "" } for ( c = 0 ; c < j ; c ++ ) { e = a [ c ] ; e = g . indexOf ( e ) ; if ( e > - 1 ) { d = f ; break } } if ( d !== "" ) break } return d } , secondsToTimeCode : function ( a , b , c , d ) { if ( typeof c == "undefined" ) c = false ; else if ( typeof d == "undefined" ) d = 25 ; var e = Math . floor ( a / 3600 ) % 24 , f = Math . floor ( a / 60 ) % 60 , g = Math . floor ( a % 60 ) ; a = Math . floor ( ( a % 1 * d ) . toFixed ( 3 ) ) ; return ( b || e > 0 ? ( e < 10 ? "0" + e : e ) + ":" : "" ) + ( f < 10 ? "0" + f : f ) + ":" + ( g < 10 ? "0" + g : g ) + ( c ? ":" + ( a < 10 ? "0" + a : a ) : "" ) } , timeCodeToSeconds : function ( a , b , c , d ) { if ( typeof c == "undefined" ) c = false ; else if ( typeof d ==
"undefined" ) d = 25 ; a = a . split ( ":" ) ; b = parseInt ( a [ 0 ] , 10 ) ; var e = parseInt ( a [ 1 ] , 10 ) , f = parseInt ( a [ 2 ] , 10 ) , g = 0 , h = 0 ; if ( c ) g = parseInt ( a [ 3 ] ) / d ; return h = b * 3600 + e * 60 + f + g } , convertSMPTEtoSeconds : function ( a ) { if ( typeof a != "string" ) return false ; a = a . replace ( "," , "." ) ; var b = 0 , c = a . indexOf ( "." ) != - 1 ? a . split ( "." ) [ 1 ] . length : 0 , d = 1 ; a = a . split ( ":" ) . reverse ( ) ; for ( var e = 0 ; e < a . length ; e ++ ) { d = 1 ; if ( e > 0 ) d = Math . pow ( 60 , e ) ; b += Number ( a [ e ] ) * d } return Number ( b . toFixed ( c ) ) } , removeSwf : function ( a ) { var b = document . getElementById ( a ) ; if ( b && /object|embed/i . test ( b . nodeName ) ) if ( mejs . MediaFeatures . isIE ) { b . style . display =
2013-04-12 00:13:44 +02:00
"none" ; ( function ( ) { b . readyState == 4 ? mejs . Utility . removeObjectInIE ( a ) : setTimeout ( arguments . callee , 10 ) } ) ( ) } else b . parentNode . removeChild ( b ) } , removeObjectInIE : function ( a ) { if ( a = document . getElementById ( a ) ) { for ( var b in a ) if ( typeof a [ b ] == "function" ) a [ b ] = null ; a . parentNode . removeChild ( a ) } } } ;
2013-04-12 23:48:16 +02:00
mejs . PluginDetector = { hasPluginVersion : function ( a , b ) { var c = this . plugins [ a ] ; b [ 1 ] = b [ 1 ] || 0 ; b [ 2 ] = b [ 2 ] || 0 ; return c [ 0 ] > b [ 0 ] || c [ 0 ] == b [ 0 ] && c [ 1 ] > b [ 1 ] || c [ 0 ] == b [ 0 ] && c [ 1 ] == b [ 1 ] && c [ 2 ] >= b [ 2 ] ? true : false } , nav : window . navigator , ua : window . navigator . userAgent . toLowerCase ( ) , plugins : [ ] , addPlugin : function ( a , b , c , d , e ) { this . plugins [ a ] = this . detectPlugin ( b , c , d , e ) } , detectPlugin : function ( a , b , c , d ) { var e = [ 0 , 0 , 0 ] , f ; if ( typeof this . nav . plugins != "undefined" && typeof this . nav . plugins [ a ] == "object" ) { if ( ( c = this . nav . plugins [ a ] . description ) &&
! ( typeof this . nav . mimeTypes != "undefined" && this . nav . mimeTypes [ b ] && ! this . nav . mimeTypes [ b ] . enabledPlugin ) ) { e = c . replace ( a , "" ) . replace ( /^\s+/ , "" ) . replace ( /\sr/gi , "." ) . split ( "." ) ; for ( a = 0 ; a < e . length ; a ++ ) e [ a ] = parseInt ( e [ a ] . match ( /\d+/ ) , 10 ) } } else if ( typeof window . ActiveXObject != "undefined" ) try { if ( f = new ActiveXObject ( c ) ) e = d ( f ) } catch ( g ) { } return e } } ;
2013-04-12 00:13:44 +02:00
mejs . PluginDetector . addPlugin ( "flash" , "Shockwave Flash" , "application/x-shockwave-flash" , "ShockwaveFlash.ShockwaveFlash" , function ( a ) { var b = [ ] ; if ( a = a . GetVariable ( "$version" ) ) { a = a . split ( " " ) [ 1 ] . split ( "," ) ; b = [ parseInt ( a [ 0 ] , 10 ) , parseInt ( a [ 1 ] , 10 ) , parseInt ( a [ 2 ] , 10 ) ] } return b } ) ;
2013-04-12 23:48:16 +02:00
mejs . PluginDetector . addPlugin ( "silverlight" , "Silverlight Plug-In" , "application/x-silverlight-2" , "AgControl.AgControl" , function ( a ) { var b = [ 0 , 0 , 0 , 0 ] , c = function ( d , e , f , g ) { for ( ; d . isVersionSupported ( e [ 0 ] + "." + e [ 1 ] + "." + e [ 2 ] + "." + e [ 3 ] ) ; ) e [ f ] += g ; e [ f ] -= g } ; c ( a , b , 0 , 1 ) ; c ( a , b , 1 , 1 ) ; c ( a , b , 2 , 1E4 ) ; c ( a , b , 2 , 1E3 ) ; c ( a , b , 2 , 100 ) ; c ( a , b , 2 , 10 ) ; c ( a , b , 2 , 1 ) ; c ( a , b , 3 , 1 ) ; return b } ) ;
mejs . MediaFeatures = { init : function ( ) { var a = this , b = document , c = mejs . PluginDetector . nav , d = mejs . PluginDetector . ua . toLowerCase ( ) , e , f = [ "source" , "track" , "audio" , "video" ] ; a . isiPad = d . match ( /ipad/i ) !== null ; a . isiPhone = d . match ( /iphone/i ) !== null ; a . isiOS = a . isiPhone || a . isiPad ; a . isAndroid = d . match ( /android/i ) !== null ; a . isBustedAndroid = d . match ( /android 2\.[12]/ ) !== null ; a . isIE = c . appName . toLowerCase ( ) . indexOf ( "microsoft" ) != - 1 ; a . isChrome = d . match ( /chrome/gi ) !== null ; a . isFirefox = d . match ( /firefox/gi ) !== null ; a . isWebkit = d . match ( /webkit/gi ) !==
null ; a . isGecko = d . match ( /gecko/gi ) !== null && ! a . isWebkit ; a . isOpera = d . match ( /opera/gi ) !== null ; a . hasTouch = "ontouchstart" in window ; a . svg = ! ! document . createElementNS && ! ! document . createElementNS ( "http://www.w3.org/2000/svg" , "svg" ) . createSVGRect ; for ( c = 0 ; c < f . length ; c ++ ) e = document . createElement ( f [ c ] ) ; a . supportsMediaTag = typeof e . canPlayType !== "undefined" || a . isBustedAndroid ; a . hasSemiNativeFullScreen = typeof e . webkitEnterFullscreen !== "undefined" ; a . hasWebkitNativeFullScreen = typeof e . webkitRequestFullScreen !== "undefined" ;
2013-04-12 00:13:44 +02:00
a . hasMozNativeFullScreen = typeof e . mozRequestFullScreen !== "undefined" ; a . hasTrueNativeFullScreen = a . hasWebkitNativeFullScreen || a . hasMozNativeFullScreen ; a . nativeFullScreenEnabled = a . hasTrueNativeFullScreen ; if ( a . hasMozNativeFullScreen ) a . nativeFullScreenEnabled = e . mozFullScreenEnabled ; if ( this . isChrome ) a . hasSemiNativeFullScreen = false ; if ( a . hasTrueNativeFullScreen ) { a . fullScreenEventName = a . hasWebkitNativeFullScreen ? "webkitfullscreenchange" : "mozfullscreenchange" ; a . isFullScreen = function ( ) { if ( e . mozRequestFullScreen ) return b . mozFullScreen ;
2013-04-12 23:48:16 +02:00
else if ( e . webkitRequestFullScreen ) return b . webkitIsFullScreen } ; a . requestFullScreen = function ( g ) { if ( a . hasWebkitNativeFullScreen ) g . webkitRequestFullScreen ( ) ; else a . hasMozNativeFullScreen && g . mozRequestFullScreen ( ) } ; a . cancelFullScreen = function ( ) { if ( a . hasWebkitNativeFullScreen ) document . webkitCancelFullScreen ( ) ; else a . hasMozNativeFullScreen && document . mozCancelFullScreen ( ) } } if ( a . hasSemiNativeFullScreen && d . match ( /mac os x 10_5/i ) ) { a . hasNativeFullScreen = false ; a . hasSemiNativeFullScreen = false } } } ; mejs . MediaFeatures . init ( ) ;
2013-04-12 00:13:44 +02:00
mejs . HtmlMediaElement = { pluginType : "native" , isFullScreen : false , setCurrentTime : function ( a ) { this . currentTime = a } , setMuted : function ( a ) { this . muted = a } , setVolume : function ( a ) { this . volume = a } , stop : function ( ) { this . pause ( ) } , setSrc : function ( a ) { for ( var b = this . getElementsByTagName ( "source" ) ; b . length > 0 ; ) this . removeChild ( b [ 0 ] ) ; if ( typeof a == "string" ) this . src = a ; else { var c ; for ( b = 0 ; b < a . length ; b ++ ) { c = a [ b ] ; if ( this . canPlayType ( c . type ) ) { this . src = c . src ; break } } } } , setVideoSize : function ( a , b ) { this . width = a ; this . height = b } } ;
mejs . PluginMediaElement = function ( a , b , c ) { this . id = a ; this . pluginType = b ; this . src = c ; this . events = { } ; this . attributes = { } } ;
mejs . PluginMediaElement . prototype = { pluginElement : null , pluginType : "" , isFullScreen : false , playbackRate : - 1 , defaultPlaybackRate : - 1 , seekable : [ ] , played : [ ] , paused : true , ended : false , seeking : false , duration : 0 , error : null , tagName : "" , muted : false , volume : 1 , currentTime : 0 , play : function ( ) { if ( this . pluginApi != null ) { this . pluginType == "youtube" ? this . pluginApi . playVideo ( ) : this . pluginApi . playMedia ( ) ; this . paused = false } } , load : function ( ) { if ( this . pluginApi != null ) { this . pluginType != "youtube" && this . pluginApi . loadMedia ( ) ; this . paused =
false } } , pause : function ( ) { if ( this . pluginApi != null ) { this . pluginType == "youtube" ? this . pluginApi . pauseVideo ( ) : this . pluginApi . pauseMedia ( ) ; this . paused = true } } , stop : function ( ) { if ( this . pluginApi != null ) { this . pluginType == "youtube" ? this . pluginApi . stopVideo ( ) : this . pluginApi . stopMedia ( ) ; this . paused = true } } , canPlayType : function ( a ) { var b , c , d , e = mejs . plugins [ this . pluginType ] ; for ( b = 0 ; b < e . length ; b ++ ) { d = e [ b ] ; if ( mejs . PluginDetector . hasPluginVersion ( this . pluginType , d . version ) ) for ( c = 0 ; c < d . types . length ; c ++ ) if ( a == d . types [ c ] ) return "probably" } return "" } ,
positionFullscreenButton : function ( a , b , c ) { this . pluginApi != null && this . pluginApi . positionFullscreenButton && this . pluginApi . positionFullscreenButton ( a , b , c ) } , hideFullscreenButton : function ( ) { this . pluginApi != null && this . pluginApi . hideFullscreenButton && this . pluginApi . hideFullscreenButton ( ) } , setSrc : function ( a ) { if ( typeof a == "string" ) { this . pluginApi . setSrc ( mejs . Utility . absolutizeUrl ( a ) ) ; this . src = mejs . Utility . absolutizeUrl ( a ) } else { var b , c ; for ( b = 0 ; b < a . length ; b ++ ) { c = a [ b ] ; if ( this . canPlayType ( c . type ) ) { this . pluginApi . setSrc ( mejs . Utility . absolutizeUrl ( c . src ) ) ;
this . src = mejs . Utility . absolutizeUrl ( a ) ; break } } } } , setCurrentTime : function ( a ) { if ( this . pluginApi != null ) { this . pluginType == "youtube" ? this . pluginApi . seekTo ( a ) : this . pluginApi . setCurrentTime ( a ) ; this . currentTime = a } } , setVolume : function ( a ) { if ( this . pluginApi != null ) { this . pluginType == "youtube" ? this . pluginApi . setVolume ( a * 100 ) : this . pluginApi . setVolume ( a ) ; this . volume = a } } , setMuted : function ( a ) { if ( this . pluginApi != null ) { if ( this . pluginType == "youtube" ) { a ? this . pluginApi . mute ( ) : this . pluginApi . unMute ( ) ; this . muted = a ; this . dispatchEvent ( "volumechange" ) } else this . pluginApi . setMuted ( a ) ;
this . muted = a } } , setVideoSize : function ( a , b ) { if ( this . pluginElement . style ) { this . pluginElement . style . width = a + "px" ; this . pluginElement . style . height = b + "px" } this . pluginApi != null && this . pluginApi . setVideoSize && this . pluginApi . setVideoSize ( a , b ) } , setFullscreen : function ( a ) { this . pluginApi != null && this . pluginApi . setFullscreen && this . pluginApi . setFullscreen ( a ) } , enterFullScreen : function ( ) { this . pluginApi != null && this . pluginApi . setFullscreen && this . setFullscreen ( true ) } , exitFullScreen : function ( ) { this . pluginApi != null && this . pluginApi . setFullscreen &&
this . setFullscreen ( false ) } , addEventListener : function ( a , b ) { this . events [ a ] = this . events [ a ] || [ ] ; this . events [ a ] . push ( b ) } , removeEventListener : function ( a , b ) { if ( ! a ) { this . events = { } ; return true } var c = this . events [ a ] ; if ( ! c ) return true ; if ( ! b ) { this . events [ a ] = [ ] ; return true } for ( i = 0 ; i < c . length ; i ++ ) if ( c [ i ] === b ) { this . events [ a ] . splice ( i , 1 ) ; return true } return false } , dispatchEvent : function ( a ) { var b , c , d = this . events [ a ] ; if ( d ) { c = Array . prototype . slice . call ( arguments , 1 ) ; for ( b = 0 ; b < d . length ; b ++ ) d [ b ] . apply ( null , c ) } } , hasAttribute : function ( a ) { return a in
this . attributes } , removeAttribute : function ( a ) { delete this . attributes [ a ] } , getAttribute : function ( a ) { if ( this . hasAttribute ( a ) ) return this . attributes [ a ] ; return "" } , setAttribute : function ( a , b ) { this . attributes [ a ] = b } , remove : function ( ) { mejs . Utility . removeSwf ( this . pluginElement . id ) ; mejs . MediaPluginBridge . unregisterPluginElement ( this . pluginElement . id ) } } ;
mejs . MediaPluginBridge = { pluginMediaElements : { } , htmlMediaElements : { } , registerPluginElement : function ( a , b , c ) { this . pluginMediaElements [ a ] = b ; this . htmlMediaElements [ a ] = c } , unregisterPluginElement : function ( a ) { delete this . pluginMediaElements [ a ] ; delete this . htmlMediaElements [ a ] } , initPlugin : function ( a ) { var b = this . pluginMediaElements [ a ] , c = this . htmlMediaElements [ a ] ; if ( b ) { switch ( b . pluginType ) { case "flash" : b . pluginElement = b . pluginApi = document . getElementById ( a ) ; break ; case "silverlight" : b . pluginElement = document . getElementById ( b . id ) ;
b . pluginApi = b . pluginElement . Content . MediaElementJS } b . pluginApi != null && b . success && b . success ( b , c ) } } , fireEvent : function ( a , b , c ) { var d , e ; a = this . pluginMediaElements [ a ] ; b = { type : b , target : a } ; for ( d in c ) { a [ d ] = c [ d ] ; b [ d ] = c [ d ] } e = c . bufferedTime || 0 ; b . target . buffered = b . buffered = { start : function ( ) { return 0 } , end : function ( ) { return e } , length : 1 } ; a . dispatchEvent ( b . type , b ) } } ;
mejs . MediaElementDefaults = { mode : "auto" , plugins : [ "flash" , "silverlight" , "youtube" , "vimeo" ] , enablePluginDebug : false , type : "" , pluginPath : mejs . Utility . getScriptPath ( [ "mediaelement.js" , "mediaelement.min.js" , "mediaelement-and-player.js" , "mediaelement-and-player.min.js" ] ) , flashName : "flashmediaelement.swf" , flashStreamer : "" , enablePluginSmoothing : false , enablePseudoStreaming : false , pseudoStreamingStartQueryParam : "start" , silverlightName : "silverlightmediaelement.xap" , defaultVideoWidth : 480 , defaultVideoHeight : 270 ,
pluginWidth : - 1 , pluginHeight : - 1 , pluginVars : [ ] , timerRate : 250 , startVolume : 0.8 , success : function ( ) { } , error : function ( ) { } } ; mejs . MediaElement = function ( a , b ) { return mejs . HtmlMediaElementShim . create ( a , b ) } ;
2013-04-12 23:48:16 +02:00
mejs . HtmlMediaElementShim = { create : function ( a , b ) { var c = mejs . MediaElementDefaults , d = typeof a == "string" ? document . getElementById ( a ) : a , e = d . tagName . toLowerCase ( ) , f = e === "audio" || e === "video" , g = f ? d . getAttribute ( "src" ) : d . getAttribute ( "href" ) ; e = d . getAttribute ( "poster" ) ; var h = d . getAttribute ( "autoplay" ) , l = d . getAttribute ( "preload" ) , j = d . getAttribute ( "controls" ) , k ; for ( k in b ) c [ k ] = b [ k ] ; g = typeof g == "undefined" || g === null || g == "" ? null : g ; e = typeof e == "undefined" || e === null ? "" : e ; l = typeof l == "undefined" || l === null || l === "false" ?
"none" : l ; h = ! ( typeof h == "undefined" || h === null || h === "false" ) ; j = ! ( typeof j == "undefined" || j === null || j === "false" ) ; k = this . determinePlayback ( d , c , mejs . MediaFeatures . supportsMediaTag , f , g ) ; k . url = k . url !== null ? mejs . Utility . absolutizeUrl ( k . url ) : "" ; if ( k . method == "native" ) { if ( mejs . MediaFeatures . isBustedAndroid ) { d . src = k . url ; d . addEventListener ( "click" , function ( ) { d . play ( ) } , false ) } return this . updateNative ( k , c , h , l ) } else if ( k . method !== "" ) return this . createPlugin ( k , c , e , h , l , j ) ; else { this . createErrorMessage ( k , c , e ) ; return this } } ,
determinePlayback : function ( a , b , c , d , e ) { var f = [ ] , g , h , l , j = { method : "" , url : "" , htmlMediaElement : a , isVideo : a . tagName . toLowerCase ( ) != "audio" } , k ; if ( typeof b . type != "undefined" && b . type !== "" ) if ( typeof b . type == "string" ) f . push ( { type : b . type , url : e } ) ; else for ( g = 0 ; g < b . type . length ; g ++ ) f . push ( { type : b . type [ g ] , url : e } ) ; else if ( e !== null ) { l = this . formatType ( e , a . getAttribute ( "type" ) ) ; f . push ( { type : l , url : e } ) } else for ( g = 0 ; g < a . childNodes . length ; g ++ ) { h = a . childNodes [ g ] ; if ( h . nodeType == 1 && h . tagName . toLowerCase ( ) == "source" ) { e = h . getAttribute ( "src" ) ;
l = this . formatType ( e , h . getAttribute ( "type" ) ) ; h = h . getAttribute ( "media" ) ; if ( ! h || ! window . matchMedia || window . matchMedia && window . matchMedia ( h ) . matches ) f . push ( { type : l , url : e } ) } } if ( ! d && f . length > 0 && f [ 0 ] . url !== null && this . getTypeFromFile ( f [ 0 ] . url ) . indexOf ( "audio" ) > - 1 ) j . isVideo = false ; if ( mejs . MediaFeatures . isBustedAndroid ) a . canPlayType = function ( m ) { return m . match ( /video\/(mp4|m4v)/gi ) !== null ? "maybe" : "" } ; if ( c && ( b . mode === "auto" || b . mode === "auto_plugin" || b . mode === "native" ) ) { if ( ! d ) { g = document . createElement ( j . isVideo ?
"video" : "audio" ) ; a . parentNode . insertBefore ( g , a ) ; a . style . display = "none" ; j . htmlMediaElement = a = g } for ( g = 0 ; g < f . length ; g ++ ) if ( a . canPlayType ( f [ g ] . type ) . replace ( /no/ , "" ) !== "" || a . canPlayType ( f [ g ] . type . replace ( /mp3/ , "mpeg" ) ) . replace ( /no/ , "" ) !== "" ) { j . method = "native" ; j . url = f [ g ] . url ; break } if ( j . method === "native" ) { if ( j . url !== null ) a . src = j . url ; if ( b . mode !== "auto_plugin" ) return j } } if ( b . mode === "auto" || b . mode === "auto_plugin" || b . mode === "shim" ) for ( g = 0 ; g < f . length ; g ++ ) { l = f [ g ] . type ; for ( a = 0 ; a < b . plugins . length ; a ++ ) { e = b . plugins [ a ] ;
h = mejs . plugins [ e ] ; for ( c = 0 ; c < h . length ; c ++ ) { k = h [ c ] ; if ( k . version == null || mejs . PluginDetector . hasPluginVersion ( e , k . version ) ) for ( d = 0 ; d < k . types . length ; d ++ ) if ( l == k . types [ d ] ) { j . method = e ; j . url = f [ g ] . url ; return j } } } } if ( b . mode === "auto_plugin" && j . method === "native" ) return j ; if ( j . method === "" && f . length > 0 ) j . url = f [ 0 ] . url ; return j } , formatType : function ( a , b ) { return a && ! b ? this . getTypeFromFile ( a ) : b && ~ b . indexOf ( ";" ) ? b . substr ( 0 , b . indexOf ( ";" ) ) : b } , getTypeFromFile : function ( a ) { a = a . split ( "?" ) [ 0 ] ; a = a . substring ( a . lastIndexOf ( "." ) +
1 ) . toLowerCase ( ) ; return ( /(mp4|m4v|ogg|ogv|webm|webmv|flv|wmv|mpeg|mov)/gi . test ( a ) ? "video" : "audio" ) + "/" + this . getTypeFromExtension ( a ) } , getTypeFromExtension : function ( a ) { switch ( a ) { case "mp4" : case "m4v" : return "mp4" ; case "webm" : case "webma" : case "webmv" : return "webm" ; case "ogg" : case "oga" : case "ogv" : return "ogg" ; default : return a } } , createErrorMessage : function ( a , b , c ) { var d = a . htmlMediaElement , e = document . createElement ( "div" ) ; e . className = "me-cannotplay" ; try { e . style . width = d . width + "px" ; e . style . height = d . height + "px" } catch ( f ) { } e . innerHTML =
c !== "" ? '<a href="' + a . url + '"><img src="' + c + '" width="100%" height="100%" /></a>' : '<a href="' + a . url + '"><span>' + mejs . i18n . t ( "Download File" ) + "</span></a>" ; d . parentNode . insertBefore ( e , d ) ; d . style . display = "none" ; b . error ( d ) } , createPlugin : function ( a , b , c , d , e , f ) { c = a . htmlMediaElement ; var g = 1 , h = 1 , l = "me_" + a . method + "_" + mejs . meIndex ++ , j = new mejs . PluginMediaElement ( l , a . method , a . url ) , k = document . createElement ( "div" ) , m ; j . tagName = c . tagName ; for ( m = 0 ; m < c . attributes . length ; m ++ ) { var n = c . attributes [ m ] ; n . specified == true && j . setAttribute ( n . name ,
n . value ) } for ( m = c . parentNode ; m !== null && m . tagName . toLowerCase ( ) != "body" ; ) { if ( m . parentNode . tagName . toLowerCase ( ) == "p" ) { m . parentNode . parentNode . insertBefore ( m , m . parentNode ) ; break } m = m . parentNode } if ( a . isVideo ) { g = b . videoWidth > 0 ? b . videoWidth : c . getAttribute ( "width" ) !== null ? c . getAttribute ( "width" ) : b . defaultVideoWidth ; h = b . videoHeight > 0 ? b . videoHeight : c . getAttribute ( "height" ) !== null ? c . getAttribute ( "height" ) : b . defaultVideoHeight ; g = mejs . Utility . encodeUrl ( g ) ; h = mejs . Utility . encodeUrl ( h ) } else if ( b . enablePluginDebug ) { g =
320 ; h = 240 } j . success = b . success ; mejs . MediaPluginBridge . registerPluginElement ( l , j , c ) ; k . className = "me-plugin" ; k . id = l + "_container" ; a . isVideo ? c . parentNode . insertBefore ( k , c ) : document . body . insertBefore ( k , document . body . childNodes [ 0 ] ) ; d = [ "id=" + l , "isvideo=" + ( a . isVideo ? "true" : "false" ) , "autoplay=" + ( d ? "true" : "false" ) , "preload=" + e , "width=" + g , "startvolume=" + b . startVolume , "timerrate=" + b . timerRate , "flashstreamer=" + b . flashStreamer , "height=" + h , "pseudostreamstart=" + b . pseudoStreamingStartQueryParam ] ; if ( a . url !== null ) a . method ==
"flash" ? d . push ( "file=" + mejs . Utility . encodeUrl ( a . url ) ) : d . push ( "file=" + a . url ) ; b . enablePluginDebug && d . push ( "debug=true" ) ; b . enablePluginSmoothing && d . push ( "smoothing=true" ) ; b . enablePseudoStreaming && d . push ( "pseudostreaming=true" ) ; f && d . push ( "controls=true" ) ; if ( b . pluginVars ) d = d . concat ( b . pluginVars ) ; switch ( a . method ) { case "silverlight" : k . innerHTML = '<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" id="' + l + '" name="' + l + '" width="' + g + '" height="' + h + '" class="mejs-shim"><param name="initParams" value="' +
2013-04-12 00:13:44 +02:00
d . join ( "," ) + '" /><param name="windowless" value="true" /><param name="background" value="black" /><param name="minRuntimeVersion" value="3.0.0.0" /><param name="autoUpgrade" value="true" /><param name="source" value="' + b . pluginPath + b . silverlightName + '" /></object>' ; break ; case "flash" : if ( mejs . MediaFeatures . isIE ) { a = document . createElement ( "div" ) ; k . appendChild ( a ) ; a . outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" id="' +
2013-04-12 23:48:16 +02:00
l + '" width="' + g + '" height="' + h + '" class="mejs-shim"><param name="movie" value="' + b . pluginPath + b . flashName + "?x=" + new Date + '" /><param name="flashvars" value="' + d . join ( "&" ) + '" /><param name="quality" value="high" /><param name="bgcolor" value="#000000" /><param name="wmode" value="transparent" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="true" /></object>' } else k . innerHTML = '<embed id="' + l + '" name="' + l + '" play="true" loop="false" quality="high" bgcolor="#000000" wmode="transparent" allowScriptAccess="always" allowFullScreen="true" type="application/x-shockwave-flash" pluginspage="//www.macromedia.com/go/getflashplayer" src="' +
b . pluginPath + b . flashName + '" flashvars="' + d . join ( "&" ) + '" width="' + g + '" height="' + h + '" class="mejs-shim"></embed>' ; break ; case "youtube" : b = a . url . substr ( a . url . lastIndexOf ( "=" ) + 1 ) ; youtubeSettings = { container : k , containerId : k . id , pluginMediaElement : j , pluginId : l , videoId : b , height : h , width : g } ; mejs . PluginDetector . hasPluginVersion ( "flash" , [ 10 , 0 , 0 ] ) ? mejs . YouTubeApi . createFlash ( youtubeSettings ) : mejs . YouTubeApi . enqueueIframe ( youtubeSettings ) ; break ; case "vimeo" : j . vimeoid = a . url . substr ( a . url . lastIndexOf ( "/" ) + 1 ) ; k . innerHTML =
'<iframe src="http://player.vimeo.com/video/' + j . vimeoid + '?portrait=0&byline=0&title=0" width="' + g + '" height="' + h + '" frameborder="0" class="mejs-shim"></iframe>' } c . style . display = "none" ; return j } , updateNative : function ( a , b ) { var c = a . htmlMediaElement , d ; for ( d in mejs . HtmlMediaElement ) c [ d ] = mejs . HtmlMediaElement [ d ] ; b . success ( c , c ) ; return c } } ;
mejs . YouTubeApi = { isIframeStarted : false , isIframeLoaded : false , loadIframeApi : function ( ) { if ( ! this . isIframeStarted ) { var a = document . createElement ( "script" ) ; a . src = "//www.youtube.com/player_api" ; var b = document . getElementsByTagName ( "script" ) [ 0 ] ; b . parentNode . insertBefore ( a , b ) ; this . isIframeStarted = true } } , iframeQueue : [ ] , enqueueIframe : function ( a ) { if ( this . isLoaded ) this . createIframe ( a ) ; else { this . loadIframeApi ( ) ; this . iframeQueue . push ( a ) } } , createIframe : function ( a ) { var b = a . pluginMediaElement , c = new YT . Player ( a . containerId ,
2013-04-12 00:13:44 +02:00
{ height : a . height , width : a . width , videoId : a . videoId , playerVars : { controls : 0 } , events : { onReady : function ( ) { a . pluginMediaElement . pluginApi = c ; mejs . MediaPluginBridge . initPlugin ( a . pluginId ) ; setInterval ( function ( ) { mejs . YouTubeApi . createEvent ( c , b , "timeupdate" ) } , 250 ) } , onStateChange : function ( d ) { mejs . YouTubeApi . handleStateChange ( d . data , c , b ) } } } ) } , createEvent : function ( a , b , c ) { c = { type : c , target : b } ; if ( a && a . getDuration ) { b . currentTime = c . currentTime = a . getCurrentTime ( ) ; b . duration = c . duration = a . getDuration ( ) ; c . paused = b . paused ;
c . ended = b . ended ; c . muted = a . isMuted ( ) ; c . volume = a . getVolume ( ) / 100 ; c . bytesTotal = a . getVideoBytesTotal ( ) ; c . bufferedBytes = a . getVideoBytesLoaded ( ) ; var d = c . bufferedBytes / c . bytesTotal * c . duration ; c . target . buffered = c . buffered = { start : function ( ) { return 0 } , end : function ( ) { return d } , length : 1 } } b . dispatchEvent ( c . type , c ) } , iFrameReady : function ( ) { for ( this . isIframeLoaded = this . isLoaded = true ; this . iframeQueue . length > 0 ; ) this . createIframe ( this . iframeQueue . pop ( ) ) } , flashPlayers : { } , createFlash : function ( a ) { this . flashPlayers [ a . pluginId ] =
2013-04-12 23:48:16 +02:00
a ; var b , c = "//www.youtube.com/apiplayer?enablejsapi=1&playerapiid=" + a . pluginId + "&version=3&autoplay=0&controls=0&modestbranding=1&loop=0" ; if ( mejs . MediaFeatures . isIE ) { b = document . createElement ( "div" ) ; a . container . appendChild ( b ) ; b . outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" id="' + a . pluginId + '" width="' + a . width + '" height="' + a . height + '" class="mejs-shim"><param name="movie" value="' +
2013-04-12 00:13:44 +02:00
c + '" /><param name="wmode" value="transparent" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="true" /></object>' } else a . container . innerHTML = '<object type="application/x-shockwave-flash" id="' + a . pluginId + '" data="' + c + '" width="' + a . width + '" height="' + a . height + '" style="visibility: visible; " class="mejs-shim"><param name="allowScriptAccess" value="always"><param name="wmode" value="transparent"></object>' } , flashReady : function ( a ) { var b = this . flashPlayers [ a ] , c =
document . getElementById ( a ) , d = b . pluginMediaElement ; d . pluginApi = d . pluginElement = c ; mejs . MediaPluginBridge . initPlugin ( a ) ; c . cueVideoById ( b . videoId ) ; a = b . containerId + "_callback" ; window [ a ] = function ( e ) { mejs . YouTubeApi . handleStateChange ( e , c , d ) } ; c . addEventListener ( "onStateChange" , a ) ; setInterval ( function ( ) { mejs . YouTubeApi . createEvent ( c , d , "timeupdate" ) } , 250 ) } , handleStateChange : function ( a , b , c ) { switch ( a ) { case - 1 : c . paused = true ; c . ended = true ; mejs . YouTubeApi . createEvent ( b , c , "loadedmetadata" ) ; break ; case 0 : c . paused = false ;
c . ended = true ; mejs . YouTubeApi . createEvent ( b , c , "ended" ) ; break ; case 1 : c . paused = false ; c . ended = false ; mejs . YouTubeApi . createEvent ( b , c , "play" ) ; mejs . YouTubeApi . createEvent ( b , c , "playing" ) ; break ; case 2 : c . paused = true ; c . ended = false ; mejs . YouTubeApi . createEvent ( b , c , "pause" ) ; break ; case 3 : mejs . YouTubeApi . createEvent ( b , c , "progress" ) } } } ; function onYouTubePlayerAPIReady ( ) { mejs . YouTubeApi . iFrameReady ( ) } function onYouTubePlayerReady ( a ) { mejs . YouTubeApi . flashReady ( a ) } window . mejs = mejs ; window . MediaElement = mejs . MediaElement ;
2013-04-12 23:48:16 +02:00
( function ( a , b ) { var c = { locale : { strings : { } } , methods : { } } ; c . locale . getLanguage = function ( ) { return { language : navigator . language } } ; c . locale . INIT _LANGUAGE = c . locale . getLanguage ( ) ; c . methods . checkPlain = function ( d ) { var e , f , g = { "&" : "&" , '"' : """ , "<" : "<" , ">" : ">" } ; d = String ( d ) ; for ( e in g ) if ( g . hasOwnProperty ( e ) ) { f = RegExp ( e , "g" ) ; d = d . replace ( f , g [ e ] ) } return d } ; c . methods . formatString = function ( d , e ) { for ( var f in e ) { switch ( f . charAt ( 0 ) ) { case "@" : e [ f ] = c . methods . checkPlain ( e [ f ] ) ; break ; case "!" : break ; default : e [ f ] =
'<em class="placeholder">' + c . methods . checkPlain ( e [ f ] ) + "</em>" } d = d . replace ( f , e [ f ] ) } return d } ; c . methods . t = function ( d , e , f ) { if ( c . locale . strings && c . locale . strings [ f . context ] && c . locale . strings [ f . context ] [ d ] ) d = c . locale . strings [ f . context ] [ d ] ; if ( e ) d = c . methods . formatString ( d , e ) ; return d } ; c . t = function ( d , e , f ) { if ( typeof d === "string" && d . length > 0 ) { var g = c . locale . getLanguage ( ) ; f = f || { context : g . language } ; return c . methods . t ( d , e , f ) } else throw { name : "InvalidArgumentException" , message : "First argument is either not a string or empty." } ;
2013-04-12 00:13:44 +02:00
} ; b . i18n = c } ) ( document , mejs ) ; ( function ( a ) { a . de = { Fullscreen : "Vollbild" , "Go Fullscreen" : "Vollbild an" , "Turn off Fullscreen" : "Vollbild aus" , Close : "Schlie\u00dfen" } } ) ( mejs . i18n . locale . strings ) ; ( function ( a ) { a . zh = { Fullscreen : "\u5168\u87a2\u5e55" , "Go Fullscreen" : "\u5168\u5c4f\u6a21\u5f0f" , "Turn off Fullscreen" : "\u9000\u51fa\u5168\u5c4f\u6a21\u5f0f" , Close : "\u95dc\u9589" } } ) ( mejs . i18n . locale . strings ) ;
2013-03-16 06:25:44 +01:00
/ * !
2013-04-12 00:13:44 +02:00
* MediaElementPlayer
* http : //mediaelementjs.com/
2013-03-16 06:25:44 +01:00
*
2013-04-12 00:13:44 +02:00
* Creates a controller bar for HTML5 < video > add < audio > tags
* using jQuery and MediaElement . js ( HTML5 Flash / Silverlight wrapper )
2013-03-16 06:25:44 +01:00
*
2013-04-12 00:13:44 +02:00
* Copyright 2010 - 2012 , John Dyer ( http : //j.hn/)
* License : MIT
2013-03-16 06:25:44 +01:00
*
2013-04-12 00:13:44 +02:00
* / i f ( t y p e o f j Q u e r y ! = " u n d e f i n e d " ) m e j s . $ = j Q u e r y ; e l s e i f ( t y p e o f e n d e r ! = " u n d e f i n e d " ) m e j s . $ = e n d e r ;
( function ( f ) { mejs . MepDefaults = { poster : "" , defaultVideoWidth : 480 , defaultVideoHeight : 270 , videoWidth : - 1 , videoHeight : - 1 , defaultAudioWidth : 400 , defaultAudioHeight : 30 , defaultSeekBackwardInterval : function ( a ) { return a . duration * 0.05 } , defaultSeekForwardInterval : function ( a ) { return a . duration * 0.05 } , audioWidth : - 1 , audioHeight : - 1 , startVolume : 0.8 , loop : false , autoRewind : true , enableAutosize : true , alwaysShowHours : false , showTimecodeFrameCount : false , framesPerSecond : 25 , autosizeProgress : true , alwaysShowControls : false , hideVideoControlsOnLoad : false ,
clickToPlayPause : true , iPadUseNativeControls : false , iPhoneUseNativeControls : false , AndroidUseNativeControls : false , features : [ "playpause" , "current" , "progress" , "duration" , "tracks" , "volume" , "fullscreen" ] , isVideo : true , enableKeyboard : true , pauseOtherPlayers : true , keyActions : [ { keys : [ 32 , 179 ] , action : function ( a , b ) { b . paused || b . ended ? b . play ( ) : b . pause ( ) } } , { keys : [ 38 ] , action : function ( a , b ) { b . setVolume ( Math . min ( b . volume + 0.1 , 1 ) ) } } , { keys : [ 40 ] , action : function ( a , b ) { b . setVolume ( Math . max ( b . volume - 0.1 , 0 ) ) } } , { keys : [ 37 , 227 ] , action : function ( a ,
b ) { if ( ! isNaN ( b . duration ) && b . duration > 0 ) { if ( a . isVideo ) { a . showControls ( ) ; a . startControlsTimer ( ) } var c = Math . max ( b . currentTime - a . options . defaultSeekBackwardInterval ( b ) , 0 ) ; b . setCurrentTime ( c ) } } } , { keys : [ 39 , 228 ] , action : function ( a , b ) { if ( ! isNaN ( b . duration ) && b . duration > 0 ) { if ( a . isVideo ) { a . showControls ( ) ; a . startControlsTimer ( ) } var c = Math . min ( b . currentTime + a . options . defaultSeekForwardInterval ( b ) , b . duration ) ; b . setCurrentTime ( c ) } } } , { keys : [ 70 ] , action : function ( a ) { if ( typeof a . enterFullScreen != "undefined" ) a . isFullScreen ?
a . exitFullScreen ( ) : a . enterFullScreen ( ) } } ] } ; mejs . mepIndex = 0 ; mejs . players = { } ; mejs . MediaElementPlayer = function ( a , b ) { if ( ! ( this instanceof mejs . MediaElementPlayer ) ) return new mejs . MediaElementPlayer ( a , b ) ; this . $media = this . $node = f ( a ) ; this . node = this . media = this . $media [ 0 ] ; if ( typeof this . node . player != "undefined" ) return this . node . player ; else this . node . player = this ; if ( typeof b == "undefined" ) b = this . $node . data ( "mejsoptions" ) ; this . options = f . extend ( { } , mejs . MepDefaults , b ) ; this . id = "mep_" + mejs . mepIndex ++ ; mejs . players [ this . id ] =
this ; this . init ( ) ; return this } ; mejs . MediaElementPlayer . prototype = { hasFocus : false , controlsAreVisible : true , init : function ( ) { var a = this , b = mejs . MediaFeatures , c = f . extend ( true , { } , a . options , { success : function ( e , g ) { a . meReady ( e , g ) } , error : function ( e ) { a . handleError ( e ) } } ) , d = a . media . tagName . toLowerCase ( ) ; a . isDynamic = d !== "audio" && d !== "video" ; a . isVideo = a . isDynamic ? a . options . isVideo : d !== "audio" && a . options . isVideo ; if ( b . isiPad && a . options . iPadUseNativeControls || b . isiPhone && a . options . iPhoneUseNativeControls ) { a . $media . attr ( "controls" ,
"controls" ) ; if ( b . isiPad && a . media . getAttribute ( "autoplay" ) !== null ) { a . media . load ( ) ; a . media . play ( ) } } else if ( ! ( b . isAndroid && a . options . AndroidUseNativeControls ) ) { a . $media . removeAttr ( "controls" ) ; a . container = f ( '<div id="' + a . id + '" class="mejs-container ' + ( mejs . MediaFeatures . svg ? "svg" : "no-svg" ) + '"><div class="mejs-inner"><div class="mejs-mediaelement"></div><div class="mejs-layers"></div><div class="mejs-controls"></div><div class="mejs-clear"></div></div></div>' ) . addClass ( a . $media [ 0 ] . className ) . insertBefore ( a . $media ) ;
a . container . addClass ( ( b . isAndroid ? "mejs-android " : "" ) + ( b . isiOS ? "mejs-ios " : "" ) + ( b . isiPad ? "mejs-ipad " : "" ) + ( b . isiPhone ? "mejs-iphone " : "" ) + ( a . isVideo ? "mejs-video " : "mejs-audio " ) ) ; if ( b . isiOS ) { b = a . $media . clone ( ) ; a . container . find ( ".mejs-mediaelement" ) . append ( b ) ; a . $media . remove ( ) ; a . $node = a . $media = b ; a . node = a . media = b [ 0 ] } else a . container . find ( ".mejs-mediaelement" ) . append ( a . $media ) ; a . controls = a . container . find ( ".mejs-controls" ) ; a . layers = a . container . find ( ".mejs-layers" ) ; b = a . isVideo ? "video" : "audio" ; d = b . substring ( 0 ,
1 ) . toUpperCase ( ) + b . substring ( 1 ) ; a . width = a . options [ b + "Width" ] > 0 || a . options [ b + "Width" ] . toString ( ) . indexOf ( "%" ) > - 1 ? a . options [ b + "Width" ] : a . media . style . width !== "" && a . media . style . width !== null ? a . media . style . width : a . media . getAttribute ( "width" ) !== null ? a . $media . attr ( "width" ) : a . options [ "default" + d + "Width" ] ; a . height = a . options [ b + "Height" ] > 0 || a . options [ b + "Height" ] . toString ( ) . indexOf ( "%" ) > - 1 ? a . options [ b + "Height" ] : a . media . style . height !== "" && a . media . style . height !== null ? a . media . style . height : a . $media [ 0 ] . getAttribute ( "height" ) !==
null ? a . $media . attr ( "height" ) : a . options [ "default" + d + "Height" ] ; a . setPlayerSize ( a . width , a . height ) ; c . pluginWidth = a . height ; c . pluginHeight = a . width } mejs . MediaElement ( a . $media [ 0 ] , c ) ; typeof a . container != "undefined" && a . container . trigger ( "controlsshown" ) } , showControls : function ( a ) { var b = this ; a = typeof a == "undefined" || a ; if ( ! b . controlsAreVisible ) { if ( a ) { b . controls . css ( "visibility" , "visible" ) . stop ( true , true ) . fadeIn ( 200 , function ( ) { b . controlsAreVisible = true ; b . container . trigger ( "controlsshown" ) } ) ; b . container . find ( ".mejs-control" ) . css ( "visibility" ,
"visible" ) . stop ( true , true ) . fadeIn ( 200 , function ( ) { b . controlsAreVisible = true } ) } else { b . controls . css ( "visibility" , "visible" ) . css ( "display" , "block" ) ; b . container . find ( ".mejs-control" ) . css ( "visibility" , "visible" ) . css ( "display" , "block" ) ; b . controlsAreVisible = true ; b . container . trigger ( "controlsshown" ) } b . setControlsSize ( ) } } , hideControls : function ( a ) { var b = this ; a = typeof a == "undefined" || a ; if ( b . controlsAreVisible ) if ( a ) { b . controls . stop ( true , true ) . fadeOut ( 200 , function ( ) { f ( this ) . css ( "visibility" , "hidden" ) . css ( "display" ,
"block" ) ; b . controlsAreVisible = false ; b . container . trigger ( "controlshidden" ) } ) ; b . container . find ( ".mejs-control" ) . stop ( true , true ) . fadeOut ( 200 , function ( ) { f ( this ) . css ( "visibility" , "hidden" ) . css ( "display" , "block" ) } ) } else { b . controls . css ( "visibility" , "hidden" ) . css ( "display" , "block" ) ; b . container . find ( ".mejs-control" ) . css ( "visibility" , "hidden" ) . css ( "display" , "block" ) ; b . controlsAreVisible = false ; b . container . trigger ( "controlshidden" ) } } , controlsTimer : null , startControlsTimer : function ( a ) { var b = this ; a = typeof a != "undefined" ?
a : 1500 ; b . killControlsTimer ( "start" ) ; b . controlsTimer = setTimeout ( function ( ) { b . hideControls ( ) ; b . killControlsTimer ( "hide" ) } , a ) } , killControlsTimer : function ( ) { if ( this . controlsTimer !== null ) { clearTimeout ( this . controlsTimer ) ; delete this . controlsTimer ; this . controlsTimer = null } } , controlsEnabled : true , disableControls : function ( ) { this . killControlsTimer ( ) ; this . hideControls ( false ) ; this . controlsEnabled = false } , enableControls : function ( ) { this . showControls ( false ) ; this . controlsEnabled = true } , meReady : function ( a , b ) { var c = this ,
d = mejs . MediaFeatures , e = b . getAttribute ( "autoplay" ) ; e = ! ( typeof e == "undefined" || e === null || e === "false" ) ; var g ; if ( ! c . created ) { c . created = true ; c . media = a ; c . domNode = b ; if ( ! ( d . isAndroid && c . options . AndroidUseNativeControls ) && ! ( d . isiPad && c . options . iPadUseNativeControls ) && ! ( d . isiPhone && c . options . iPhoneUseNativeControls ) ) { c . buildposter ( c , c . controls , c . layers , c . media ) ; c . buildkeyboard ( c , c . controls , c . layers , c . media ) ; c . buildoverlays ( c , c . controls , c . layers , c . media ) ; c . findTracks ( ) ; for ( g in c . options . features ) { d = c . options . features [ g ] ;
if ( c [ "build" + d ] ) try { c [ "build" + d ] ( c , c . controls , c . layers , c . media ) } catch ( k ) { } } c . container . trigger ( "controlsready" ) ; c . setPlayerSize ( c . width , c . height ) ; c . setControlsSize ( ) ; if ( c . isVideo ) { if ( mejs . MediaFeatures . hasTouch ) c . $media . bind ( "touchstart" , function ( ) { if ( c . controlsAreVisible ) c . hideControls ( false ) ; else c . controlsEnabled && c . showControls ( false ) } ) ; else { c . media . addEventListener ( "click" , function ( ) { if ( c . options . clickToPlayPause ) c . media . paused ? c . media . play ( ) : c . media . pause ( ) } ) ; c . container . bind ( "mouseenter mouseover" ,
function ( ) { if ( c . controlsEnabled ) if ( ! c . options . alwaysShowControls ) { c . killControlsTimer ( "enter" ) ; c . showControls ( ) ; c . startControlsTimer ( 2500 ) } } ) . bind ( "mousemove" , function ( ) { if ( c . controlsEnabled ) { c . controlsAreVisible || c . showControls ( ) ; c . options . alwaysShowControls || c . startControlsTimer ( 2500 ) } } ) . bind ( "mouseleave" , function ( ) { c . controlsEnabled && ! c . media . paused && ! c . options . alwaysShowControls && c . startControlsTimer ( 1E3 ) } ) } c . options . hideVideoControlsOnLoad && c . hideControls ( false ) ; e && ! c . options . alwaysShowControls &&
c . hideControls ( ) ; c . options . enableAutosize && c . media . addEventListener ( "loadedmetadata" , function ( j ) { if ( c . options . videoHeight <= 0 && c . domNode . getAttribute ( "height" ) === null && ! isNaN ( j . target . videoHeight ) ) { c . setPlayerSize ( j . target . videoWidth , j . target . videoHeight ) ; c . setControlsSize ( ) ; c . media . setVideoSize ( j . target . videoWidth , j . target . videoHeight ) } } , false ) } a . addEventListener ( "play" , function ( ) { for ( var j in mejs . players ) { var l = mejs . players [ j ] ; l . id != c . id && c . options . pauseOtherPlayers && ! l . paused && ! l . ended && l . pause ( ) ;
l . hasFocus = false } c . hasFocus = true } , false ) ; c . media . addEventListener ( "ended" , function ( ) { if ( c . options . autoRewind ) try { c . media . setCurrentTime ( 0 ) } catch ( j ) { } c . media . pause ( ) ; c . setProgressRail && c . setProgressRail ( ) ; c . setCurrentRail && c . setCurrentRail ( ) ; if ( c . options . loop ) c . media . play ( ) ; else ! c . options . alwaysShowControls && c . controlsEnabled && c . showControls ( ) } , false ) ; c . media . addEventListener ( "loadedmetadata" , function ( ) { c . updateDuration && c . updateDuration ( ) ; c . updateCurrent && c . updateCurrent ( ) ; if ( ! c . isFullScreen ) { c . setPlayerSize ( c . width ,
c . height ) ; c . setControlsSize ( ) } } , false ) ; setTimeout ( function ( ) { c . setPlayerSize ( c . width , c . height ) ; c . setControlsSize ( ) } , 50 ) ; c . globalBind ( "resize" , function ( ) { c . isFullScreen || mejs . MediaFeatures . hasTrueNativeFullScreen && document . webkitIsFullScreen || c . setPlayerSize ( c . width , c . height ) ; c . setControlsSize ( ) } ) ; c . media . pluginType == "youtube" && c . container . find ( ".mejs-overlay-play" ) . hide ( ) } if ( e && a . pluginType == "native" ) { a . load ( ) ; a . play ( ) } if ( c . options . success ) typeof c . options . success == "string" ? window [ c . options . success ] ( c . media ,
c . domNode , c ) : c . options . success ( c . media , c . domNode , c ) } } , handleError : function ( a ) { this . controls . hide ( ) ; this . options . error && this . options . error ( a ) } , setPlayerSize : function ( a , b ) { if ( typeof a != "undefined" ) this . width = a ; if ( typeof b != "undefined" ) this . height = b ; if ( this . height . toString ( ) . indexOf ( "%" ) > 0 || this . $node . css ( "max-width" ) === "100%" || this . $node [ 0 ] . currentStyle && this . $node [ 0 ] . currentStyle . maxWidth === "100%" ) { var c = this . isVideo ? this . media . videoWidth && this . media . videoWidth > 0 ? this . media . videoWidth : this . options . defaultVideoWidth :
this . options . defaultAudioWidth , d = this . isVideo ? this . media . videoHeight && this . media . videoHeight > 0 ? this . media . videoHeight : this . options . defaultVideoHeight : this . options . defaultAudioHeight , e = this . container . parent ( ) . closest ( ":visible" ) . width ( ) ; c = this . isVideo || ! this . options . autosizeProgress ? parseInt ( e * d / c , 10 ) : d ; if ( this . container . parent ( ) [ 0 ] . tagName . toLowerCase ( ) === "body" ) { e = f ( window ) . width ( ) ; c = f ( window ) . height ( ) } if ( c != 0 && e != 0 ) { this . container . width ( e ) . height ( c ) ; this . $media . add ( this . container . find ( ".mejs-shim" ) ) . width ( "100%" ) . height ( "100%" ) ;
this . isVideo && this . media . setVideoSize && this . media . setVideoSize ( e , c ) ; this . layers . children ( ".mejs-layer" ) . width ( "100%" ) . height ( "100%" ) } } else { this . container . width ( this . width ) . height ( this . height ) ; this . layers . children ( ".mejs-layer" ) . width ( this . width ) . height ( this . height ) } } , setControlsSize : function ( ) { var a = 0 , b = 0 , c = this . controls . find ( ".mejs-time-rail" ) , d = this . controls . find ( ".mejs-time-total" ) ; this . controls . find ( ".mejs-time-current" ) ; this . controls . find ( ".mejs-time-loaded" ) ; var e = c . siblings ( ) ; if ( this . options &&
! this . options . autosizeProgress ) b = parseInt ( c . css ( "width" ) ) ; if ( b === 0 || ! b ) { e . each ( function ( ) { var g = f ( this ) ; if ( g . css ( "position" ) != "absolute" && g . is ( ":visible" ) ) a += f ( this ) . outerWidth ( true ) } ) ; b = this . controls . width ( ) - a - ( c . outerWidth ( true ) - c . width ( ) ) } c . width ( b ) ; d . width ( b - ( d . outerWidth ( true ) - d . width ( ) ) ) ; this . setProgressRail && this . setProgressRail ( ) ; this . setCurrentRail && this . setCurrentRail ( ) } , buildposter : function ( a , b , c , d ) { var e = f ( '<div class="mejs-poster mejs-layer"></div>' ) . appendTo ( c ) ; b = a . $media . attr ( "poster" ) ;
if ( a . options . poster !== "" ) b = a . options . poster ; b !== "" && b != null ? this . setPoster ( b ) : e . hide ( ) ; d . addEventListener ( "play" , function ( ) { e . hide ( ) } , false ) } , setPoster : function ( a ) { var b = this . container . find ( ".mejs-poster" ) , c = b . find ( "img" ) ; if ( c . length == 0 ) c = f ( '<img width="100%" height="100%" />' ) . appendTo ( b ) ; c . attr ( "src" , a ) } , buildoverlays : function ( a , b , c , d ) { var e = this ; if ( a . isVideo ) { var g = f ( '<div class="mejs-overlay mejs-layer"><div class="mejs-overlay-loading"><span></span></div></div>' ) . hide ( ) . appendTo ( c ) , k = f ( '<div class="mejs-overlay mejs-layer"><div class="mejs-overlay-error"></div></div>' ) . hide ( ) . appendTo ( c ) ,
j = f ( '<div class="mejs-overlay mejs-layer mejs-overlay-play"><div class="mejs-overlay-button"></div></div>' ) . appendTo ( c ) . click ( function ( ) { if ( e . options . clickToPlayPause ) d . paused ? d . play ( ) : d . pause ( ) } ) ; d . addEventListener ( "play" , function ( ) { j . hide ( ) ; g . hide ( ) ; b . find ( ".mejs-time-buffering" ) . hide ( ) ; k . hide ( ) } , false ) ; d . addEventListener ( "playing" , function ( ) { j . hide ( ) ; g . hide ( ) ; b . find ( ".mejs-time-buffering" ) . hide ( ) ; k . hide ( ) } , false ) ; d . addEventListener ( "seeking" , function ( ) { g . show ( ) ; b . find ( ".mejs-time-buffering" ) . show ( ) } ,
false ) ; d . addEventListener ( "seeked" , function ( ) { g . hide ( ) ; b . find ( ".mejs-time-buffering" ) . hide ( ) } , false ) ; d . addEventListener ( "pause" , function ( ) { mejs . MediaFeatures . isiPhone || j . show ( ) } , false ) ; d . addEventListener ( "waiting" , function ( ) { g . show ( ) ; b . find ( ".mejs-time-buffering" ) . show ( ) } , false ) ; d . addEventListener ( "loadeddata" , function ( ) { g . show ( ) ; b . find ( ".mejs-time-buffering" ) . show ( ) } , false ) ; d . addEventListener ( "canplay" , function ( ) { g . hide ( ) ; b . find ( ".mejs-time-buffering" ) . hide ( ) } , false ) ; d . addEventListener ( "error" , function ( ) { g . hide ( ) ;
b . find ( ".mejs-time-buffering" ) . hide ( ) ; k . show ( ) ; k . find ( "mejs-overlay-error" ) . html ( "Error loading this resource" ) } , false ) } } , buildkeyboard : function ( a , b , c , d ) { this . globalBind ( "keydown" , function ( e ) { if ( a . hasFocus && a . options . enableKeyboard ) for ( var g = 0 , k = a . options . keyActions . length ; g < k ; g ++ ) for ( var j = a . options . keyActions [ g ] , l = 0 , q = j . keys . length ; l < q ; l ++ ) if ( e . keyCode == j . keys [ l ] ) { e . preventDefault ( ) ; j . action ( a , d , e . keyCode ) ; return false } return true } ) ; this . globalBind ( "click" , function ( e ) { if ( f ( e . target ) . closest ( ".mejs-container" ) . length ==
0 ) a . hasFocus = false } ) } , findTracks : function ( ) { var a = this , b = a . $media . find ( "track" ) ; a . tracks = [ ] ; b . each ( function ( c , d ) { d = f ( d ) ; a . tracks . push ( { srclang : d . attr ( "srclang" ) ? d . attr ( "srclang" ) . toLowerCase ( ) : "" , src : d . attr ( "src" ) , kind : d . attr ( "kind" ) , label : d . attr ( "label" ) || "" , entries : [ ] , isLoaded : false } ) } ) } , changeSkin : function ( a ) { this . container [ 0 ] . className = "mejs-container " + a ; this . setPlayerSize ( this . width , this . height ) ; this . setControlsSize ( ) } , play : function ( ) { this . media . play ( ) } , pause : function ( ) { this . media . pause ( ) } ,
load : function ( ) { this . media . load ( ) } , setMuted : function ( a ) { this . media . setMuted ( a ) } , setCurrentTime : function ( a ) { this . media . setCurrentTime ( a ) } , getCurrentTime : function ( ) { return this . media . currentTime } , setVolume : function ( a ) { this . media . setVolume ( a ) } , getVolume : function ( ) { return this . media . volume } , setSrc : function ( a ) { this . media . setSrc ( a ) } , remove : function ( ) { var a , b ; for ( a in this . options . features ) { b = this . options . features [ a ] ; if ( this [ "clean" + b ] ) try { this [ "clean" + b ] ( this ) } catch ( c ) { } } this . media . pluginType === "native" ?
this . $media . prop ( "controls" , true ) : this . media . remove ( ) ; this . isDynamic || this . $node . insertBefore ( this . container ) ; delete mejs . players [ this . id ] ; this . container . remove ( ) ; this . globalUnbind ( ) ; delete this . node . player } } ; ( function ( ) { function a ( c , d ) { var e = { d : [ ] , w : [ ] } ; f . each ( ( c || "" ) . split ( " " ) , function ( g , k ) { e [ b . test ( k ) ? "w" : "d" ] . push ( k + "." + d ) } ) ; e . d = e . d . join ( " " ) ; e . w = e . w . join ( " " ) ; return e } var b = /^((after|before)print|(before)?unload|hashchange|message|o(ff|n)line|page(hide|show)|popstate|resize|storage)\b/ ; mejs . MediaElementPlayer . prototype . globalBind =
function ( c , d , e ) { c = a ( c , this . id ) ; c . d && f ( document ) . bind ( c . d , d , e ) ; c . w && f ( window ) . bind ( c . w , d , e ) } ; mejs . MediaElementPlayer . prototype . globalUnbind = function ( c , d ) { c = a ( c , this . id ) ; c . d && f ( document ) . unbind ( c . d , d ) ; c . w && f ( window ) . unbind ( c . w , d ) } } ) ( ) ; if ( typeof jQuery != "undefined" ) jQuery . fn . mediaelementplayer = function ( a ) { a === false ? this . each ( function ( ) { var b = jQuery ( this ) . data ( "mediaelementplayer" ) ; b && b . remove ( ) ; jQuery ( this ) . removeData ( "mediaelementplayer" ) } ) : this . each ( function ( ) { jQuery ( this ) . data ( "mediaelementplayer" ,
new mejs . MediaElementPlayer ( this , a ) ) } ) ; return this } ; f ( document ) . ready ( function ( ) { f ( ".mejs-player" ) . mediaelementplayer ( ) } ) ; window . MediaElementPlayer = mejs . MediaElementPlayer } ) ( mejs . $ ) ;
( function ( f ) { f . extend ( mejs . MepDefaults , { playpauseText : "Play/Pause" } ) ; f . extend ( MediaElementPlayer . prototype , { buildplaypause : function ( a , b , c , d ) { var e = f ( '<div class="mejs-button mejs-playpause-button mejs-play" ><button type="button" aria-controls="' + this . id + '" title="' + this . options . playpauseText + '" aria-label="' + this . options . playpauseText + '"></button></div>' ) . appendTo ( b ) . click ( function ( g ) { g . preventDefault ( ) ; d . paused ? d . play ( ) : d . pause ( ) ; return false } ) ; d . addEventListener ( "play" , function ( ) { e . removeClass ( "mejs-play" ) . addClass ( "mejs-pause" ) } ,
false ) ; d . addEventListener ( "playing" , function ( ) { e . removeClass ( "mejs-play" ) . addClass ( "mejs-pause" ) } , false ) ; d . addEventListener ( "pause" , function ( ) { e . removeClass ( "mejs-pause" ) . addClass ( "mejs-play" ) } , false ) ; d . addEventListener ( "paused" , function ( ) { e . removeClass ( "mejs-pause" ) . addClass ( "mejs-play" ) } , false ) } } ) } ) ( mejs . $ ) ;
( function ( f ) { f . extend ( mejs . MepDefaults , { stopText : "Stop" } ) ; f . extend ( MediaElementPlayer . prototype , { buildstop : function ( a , b , c , d ) { f ( '<div class="mejs-button mejs-stop-button mejs-stop"><button type="button" aria-controls="' + this . id + '" title="' + this . options . stopText + '" aria-label="' + this . options . stopText + '"></button></div>' ) . appendTo ( b ) . click ( function ( ) { d . paused || d . pause ( ) ; if ( d . currentTime > 0 ) { d . setCurrentTime ( 0 ) ; d . pause ( ) ; b . find ( ".mejs-time-current" ) . width ( "0px" ) ; b . find ( ".mejs-time-handle" ) . css ( "left" ,
"0px" ) ; b . find ( ".mejs-time-float-current" ) . html ( mejs . Utility . secondsToTimeCode ( 0 ) ) ; b . find ( ".mejs-currenttime" ) . html ( mejs . Utility . secondsToTimeCode ( 0 ) ) ; c . find ( ".mejs-poster" ) . show ( ) } } ) } } ) } ) ( mejs . $ ) ;
( function ( f ) { f . extend ( MediaElementPlayer . prototype , { buildprogress : function ( a , b , c , d ) { f ( '<div class="mejs-time-rail"><span class="mejs-time-total"><span class="mejs-time-buffering"></span><span class="mejs-time-loaded"></span><span class="mejs-time-current"></span><span class="mejs-time-handle"></span><span class="mejs-time-float"><span class="mejs-time-float-current">00:00</span><span class="mejs-time-float-corner"></span></span></span></div>' ) . appendTo ( b ) ; b . find ( ".mejs-time-buffering" ) . hide ( ) ; var e =
this , g = b . find ( ".mejs-time-total" ) ; c = b . find ( ".mejs-time-loaded" ) ; var k = b . find ( ".mejs-time-current" ) , j = b . find ( ".mejs-time-handle" ) , l = b . find ( ".mejs-time-float" ) , q = b . find ( ".mejs-time-float-current" ) , p = function ( h ) { h = h . pageX ; var m = g . offset ( ) , r = g . outerWidth ( true ) , n = 0 , o = n = 0 ; if ( d . duration ) { if ( h < m . left ) h = m . left ; else if ( h > r + m . left ) h = r + m . left ; o = h - m . left ; n = o / r ; n = n <= 0.02 ? 0 : n * d . duration ; t && n !== d . currentTime && d . setCurrentTime ( n ) ; if ( ! mejs . MediaFeatures . hasTouch ) { l . css ( "left" , o ) ; q . html ( mejs . Utility . secondsToTimeCode ( n ) ) ;
l . show ( ) } } } , t = false ; g . bind ( "mousedown" , function ( h ) { if ( h . which === 1 ) { t = true ; p ( h ) ; e . globalBind ( "mousemove.dur" , function ( m ) { p ( m ) } ) ; e . globalBind ( "mouseup.dur" , function ( ) { t = false ; l . hide ( ) ; e . globalUnbind ( ".dur" ) } ) ; return false } } ) . bind ( "mouseenter" , function ( ) { e . globalBind ( "mousemove.dur" , function ( h ) { p ( h ) } ) ; mejs . MediaFeatures . hasTouch || l . show ( ) } ) . bind ( "mouseleave" , function ( ) { if ( ! t ) { e . globalUnbind ( ".dur" ) ; l . hide ( ) } } ) ; d . addEventListener ( "progress" , function ( h ) { a . setProgressRail ( h ) ; a . setCurrentRail ( h ) } , false ) ;
d . addEventListener ( "timeupdate" , function ( h ) { a . setProgressRail ( h ) ; a . setCurrentRail ( h ) } , false ) ; e . loaded = c ; e . total = g ; e . current = k ; e . handle = j } , setProgressRail : function ( a ) { var b = a != undefined ? a . target : this . media , c = null ; if ( b && b . buffered && b . buffered . length > 0 && b . buffered . end && b . duration ) c = b . buffered . end ( 0 ) / b . duration ; else if ( b && b . bytesTotal != undefined && b . bytesTotal > 0 && b . bufferedBytes != undefined ) c = b . bufferedBytes / b . bytesTotal ; else if ( a && a . lengthComputable && a . total != 0 ) c = a . loaded / a . total ; if ( c !== null ) { c = Math . min ( 1 ,
Math . max ( 0 , c ) ) ; this . loaded && this . total && this . loaded . width ( this . total . width ( ) * c ) } } , setCurrentRail : function ( ) { if ( this . media . currentTime != undefined && this . media . duration ) if ( this . total && this . handle ) { var a = Math . round ( this . total . width ( ) * this . media . currentTime / this . media . duration ) , b = a - Math . round ( this . handle . outerWidth ( true ) / 2 ) ; this . current . width ( a ) ; this . handle . css ( "left" , b ) } } } ) } ) ( mejs . $ ) ;
( function ( f ) { f . extend ( mejs . MepDefaults , { duration : - 1 , timeAndDurationSeparator : " <span> | </span> " } ) ; f . extend ( MediaElementPlayer . prototype , { buildcurrent : function ( a , b , c , d ) { f ( '<div class="mejs-time"><span class="mejs-currenttime">' + ( a . options . alwaysShowHours ? "00:" : "" ) + ( a . options . showTimecodeFrameCount ? "00:00:00" : "00:00" ) + "</span></div>" ) . appendTo ( b ) ; this . currenttime = this . controls . find ( ".mejs-currenttime" ) ; d . addEventListener ( "timeupdate" , function ( ) { a . updateCurrent ( ) } , false ) } , buildduration : function ( a ,
b , c , d ) { if ( b . children ( ) . last ( ) . find ( ".mejs-currenttime" ) . length > 0 ) f ( this . options . timeAndDurationSeparator + '<span class="mejs-duration">' + ( this . options . duration > 0 ? mejs . Utility . secondsToTimeCode ( this . options . duration , this . options . alwaysShowHours || this . media . duration > 3600 , this . options . showTimecodeFrameCount , this . options . framesPerSecond || 25 ) : ( a . options . alwaysShowHours ? "00:" : "" ) + ( a . options . showTimecodeFrameCount ? "00:00:00" : "00:00" ) ) + "</span>" ) . appendTo ( b . find ( ".mejs-time" ) ) ; else { b . find ( ".mejs-currenttime" ) . parent ( ) . addClass ( "mejs-currenttime-container" ) ;
f ( '<div class="mejs-time mejs-duration-container"><span class="mejs-duration">' + ( this . options . duration > 0 ? mejs . Utility . secondsToTimeCode ( this . options . duration , this . options . alwaysShowHours || this . media . duration > 3600 , this . options . showTimecodeFrameCount , this . options . framesPerSecond || 25 ) : ( a . options . alwaysShowHours ? "00:" : "" ) + ( a . options . showTimecodeFrameCount ? "00:00:00" : "00:00" ) ) + "</span></div>" ) . appendTo ( b ) } this . durationD = this . controls . find ( ".mejs-duration" ) ; d . addEventListener ( "timeupdate" , function ( ) { a . updateDuration ( ) } ,
false ) } , updateCurrent : function ( ) { if ( this . currenttime ) this . currenttime . html ( mejs . Utility . secondsToTimeCode ( this . media . currentTime , this . options . alwaysShowHours || this . media . duration > 3600 , this . options . showTimecodeFrameCount , this . options . framesPerSecond || 25 ) ) } , updateDuration : function ( ) { this . container . toggleClass ( "mejs-long-video" , this . media . duration > 3600 ) ; if ( this . durationD && ( this . options . duration > 0 || this . media . duration ) ) this . durationD . html ( mejs . Utility . secondsToTimeCode ( this . options . duration > 0 ? this . options . duration :
this . media . duration , this . options . alwaysShowHours , this . options . showTimecodeFrameCount , this . options . framesPerSecond || 25 ) ) } } ) } ) ( mejs . $ ) ;
( function ( f ) { f . extend ( mejs . MepDefaults , { muteText : "Mute Toggle" , hideVolumeOnTouchDevices : true , audioVolume : "horizontal" , videoVolume : "vertical" } ) ; f . extend ( MediaElementPlayer . prototype , { buildvolume : function ( a , b , c , d ) { if ( ! ( mejs . MediaFeatures . hasTouch && this . options . hideVolumeOnTouchDevices ) ) { var e = this , g = e . isVideo ? e . options . videoVolume : e . options . audioVolume , k = g == "horizontal" ? f ( '<div class="mejs-button mejs-volume-button mejs-mute"><button type="button" aria-controls="' + e . id + '" title="' + e . options . muteText +
'" aria-label="' + e . options . muteText + '"></button></div><div class="mejs-horizontal-volume-slider"><div class="mejs-horizontal-volume-total"></div><div class="mejs-horizontal-volume-current"></div><div class="mejs-horizontal-volume-handle"></div></div>' ) . appendTo ( b ) : f ( '<div class="mejs-button mejs-volume-button mejs-mute"><button type="button" aria-controls="' + e . id + '" title="' + e . options . muteText + '" aria-label="' + e . options . muteText + '"></button><div class="mejs-volume-slider"><div class="mejs-volume-total"></div><div class="mejs-volume-current"></div><div class="mejs-volume-handle"></div></div></div>' ) . appendTo ( b ) ,
j = e . container . find ( ".mejs-volume-slider, .mejs-horizontal-volume-slider" ) , l = e . container . find ( ".mejs-volume-total, .mejs-horizontal-volume-total" ) , q = e . container . find ( ".mejs-volume-current, .mejs-horizontal-volume-current" ) , p = e . container . find ( ".mejs-volume-handle, .mejs-horizontal-volume-handle" ) , t = function ( n , o ) { if ( ! j . is ( ":visible" ) && typeof o == "undefined" ) { j . show ( ) ; t ( n , true ) ; j . hide ( ) } else { n = Math . max ( 0 , n ) ; n = Math . min ( n , 1 ) ; n == 0 ? k . removeClass ( "mejs-mute" ) . addClass ( "mejs-unmute" ) : k . removeClass ( "mejs-unmute" ) . addClass ( "mejs-mute" ) ;
if ( g == "vertical" ) { var s = l . height ( ) , u = l . position ( ) , v = s - s * n ; p . css ( "top" , Math . round ( u . top + v - p . height ( ) / 2 ) ) ; q . height ( s - v ) ; q . css ( "top" , u . top + v ) } else { s = l . width ( ) ; u = l . position ( ) ; s = s * n ; p . css ( "left" , Math . round ( u . left + s - p . width ( ) / 2 ) ) ; q . width ( Math . round ( s ) ) } } } , h = function ( n ) { var o = null , s = l . offset ( ) ; if ( g == "vertical" ) { o = l . height ( ) ; parseInt ( l . css ( "top" ) . replace ( /px/ , "" ) , 10 ) ; o = ( o - ( n . pageY - s . top ) ) / o ; if ( s . top == 0 || s . left == 0 ) return } else { o = l . width ( ) ; o = ( n . pageX - s . left ) / o } o = Math . max ( 0 , o ) ; o = Math . min ( o , 1 ) ; t ( o ) ; o == 0 ? d . setMuted ( true ) :
d . setMuted ( false ) ; d . setVolume ( o ) } , m = false , r = false ; k . hover ( function ( ) { j . show ( ) ; r = true } , function ( ) { r = false ; ! m && g == "vertical" && j . hide ( ) } ) ; j . bind ( "mouseover" , function ( ) { r = true } ) . bind ( "mousedown" , function ( n ) { h ( n ) ; e . globalBind ( "mousemove.vol" , function ( o ) { h ( o ) } ) ; e . globalBind ( "mouseup.vol" , function ( ) { m = false ; e . globalUnbind ( ".vol" ) ; ! r && g == "vertical" && j . hide ( ) } ) ; m = true ; return false } ) ; k . find ( "button" ) . click ( function ( ) { d . setMuted ( ! d . muted ) } ) ; d . addEventListener ( "volumechange" , function ( ) { if ( ! m ) if ( d . muted ) { t ( 0 ) ;
k . removeClass ( "mejs-mute" ) . addClass ( "mejs-unmute" ) } else { t ( d . volume ) ; k . removeClass ( "mejs-unmute" ) . addClass ( "mejs-mute" ) } } , false ) ; if ( e . container . is ( ":visible" ) ) { t ( a . options . startVolume ) ; a . options . startVolume === 0 && d . setMuted ( true ) ; d . pluginType === "native" && d . setVolume ( a . options . startVolume ) } } } } ) } ) ( mejs . $ ) ;
( function ( f ) { f . extend ( mejs . MepDefaults , { usePluginFullScreen : true , newWindowCallback : function ( ) { return "" } , fullscreenText : mejs . i18n . t ( "Fullscreen" ) } ) ; f . extend ( MediaElementPlayer . prototype , { isFullScreen : false , isNativeFullScreen : false , docStyleOverflow : null , isInIframe : false , buildfullscreen : function ( a , b , c , d ) { if ( a . isVideo ) { a . isInIframe = window . location != window . parent . location ; if ( mejs . MediaFeatures . hasTrueNativeFullScreen ) { c = function ( ) { if ( mejs . MediaFeatures . isFullScreen ( ) ) { a . isNativeFullScreen = true ; a . setControlsSize ( ) } else { a . isNativeFullScreen =
false ; a . exitFullScreen ( ) } } ; mejs . MediaFeatures . hasMozNativeFullScreen ? a . globalBind ( mejs . MediaFeatures . fullScreenEventName , c ) : a . container . bind ( mejs . MediaFeatures . fullScreenEventName , c ) } var e = this , g = f ( '<div class="mejs-button mejs-fullscreen-button"><button type="button" aria-controls="' + e . id + '" title="' + e . options . fullscreenText + '" aria-label="' + e . options . fullscreenText + '"></button></div>' ) . appendTo ( b ) ; if ( e . media . pluginType === "native" || ! e . options . usePluginFullScreen && ! mejs . MediaFeatures . isFirefox ) g . click ( function ( ) { mejs . MediaFeatures . hasTrueNativeFullScreen &&
mejs . MediaFeatures . isFullScreen ( ) || a . isFullScreen ? a . exitFullScreen ( ) : a . enterFullScreen ( ) } ) ; else { var k = null ; if ( function ( ) { var h = document . createElement ( "x" ) , m = document . documentElement , r = window . getComputedStyle ; if ( ! ( "pointerEvents" in h . style ) ) return false ; h . style . pointerEvents = "auto" ; h . style . pointerEvents = "x" ; m . appendChild ( h ) ; r = r && r ( h , "" ) . pointerEvents === "auto" ; m . removeChild ( h ) ; return ! ! r } ( ) && ! mejs . MediaFeatures . isOpera ) { var j = false , l = function ( ) { if ( j ) { for ( var h in q ) q [ h ] . hide ( ) ; g . css ( "pointer-events" ,
"" ) ; e . controls . css ( "pointer-events" , "" ) ; j = false } } , q = { } ; b = [ "top" , "left" , "right" , "bottom" ] ; var p , t = function ( ) { var h = g . offset ( ) . left - e . container . offset ( ) . left , m = g . offset ( ) . top - e . container . offset ( ) . top , r = g . outerWidth ( true ) , n = g . outerHeight ( true ) , o = e . container . width ( ) , s = e . container . height ( ) ; for ( p in q ) q [ p ] . css ( { position : "absolute" , top : 0 , left : 0 } ) ; q . top . width ( o ) . height ( m ) ; q . left . width ( h ) . height ( n ) . css ( { top : m } ) ; q . right . width ( o - h - r ) . height ( n ) . css ( { top : m , left : h + r } ) ; q . bottom . width ( o ) . height ( s - n - m ) . css ( { top : m +
n } ) } ; e . globalBind ( "resize" , function ( ) { t ( ) } ) ; p = 0 ; for ( c = b . length ; p < c ; p += 1 ) q [ b [ p ] ] = f ( '<div class="mejs-fullscreen-hover" />' ) . appendTo ( e . container ) . mouseover ( l ) . hide ( ) ; g . mouseover ( function ( ) { if ( ! e . isFullScreen ) { var h = g . offset ( ) , m = a . container . offset ( ) ; d . positionFullscreenButton ( h . left - m . left , h . top - m . top , false ) ; g . css ( "pointer-events" , "none" ) ; e . controls . css ( "pointer-events" , "none" ) ; for ( p in q ) q [ p ] . show ( ) ; t ( ) ; j = true } } ) ; d . addEventListener ( "fullscreenchange" , function ( ) { l ( ) } ) } else g . mouseover ( function ( ) { if ( k !==
null ) { clearTimeout ( k ) ; delete k } var h = g . offset ( ) , m = a . container . offset ( ) ; d . positionFullscreenButton ( h . left - m . left , h . top - m . top , true ) } ) . mouseout ( function ( ) { if ( k !== null ) { clearTimeout ( k ) ; delete k } k = setTimeout ( function ( ) { d . hideFullscreenButton ( ) } , 1500 ) } ) } a . fullscreenBtn = g ; e . globalBind ( "keydown" , function ( h ) { if ( ( mejs . MediaFeatures . hasTrueNativeFullScreen && mejs . MediaFeatures . isFullScreen ( ) || e . isFullScreen ) && h . keyCode == 27 ) a . exitFullScreen ( ) } ) } } , cleanfullscreen : function ( a ) { a . exitFullScreen ( ) } , containerSizeTimeout : null ,
enterFullScreen : function ( ) { var a = this ; if ( ! ( a . media . pluginType !== "native" && ( mejs . MediaFeatures . isFirefox || a . options . usePluginFullScreen ) ) ) { docStyleOverflow = document . documentElement . style . overflow ; document . documentElement . style . overflow = "hidden" ; normalHeight = a . container . height ( ) ; normalWidth = a . container . width ( ) ; if ( a . media . pluginType === "native" ) if ( mejs . MediaFeatures . hasTrueNativeFullScreen ) { mejs . MediaFeatures . requestFullScreen ( a . container [ 0 ] ) ; a . isInIframe && setTimeout ( function c ( ) { if ( a . isNativeFullScreen ) f ( window ) . width ( ) !==
screen . width ? a . exitFullScreen ( ) : setTimeout ( c , 500 ) } , 500 ) } else if ( mejs . MediaFeatures . hasSemiNativeFullScreen ) { a . media . webkitEnterFullscreen ( ) ; return } if ( a . isInIframe ) { var b = a . options . newWindowCallback ( this ) ; if ( b !== "" ) if ( mejs . MediaFeatures . hasTrueNativeFullScreen ) setTimeout ( function ( ) { if ( ! a . isNativeFullScreen ) { a . pause ( ) ; window . open ( b , a . id , "top=0,left=0,width=" + screen . availWidth + ",height=" + screen . availHeight + ",resizable=yes,scrollbars=no,status=no,toolbar=no" ) } } , 250 ) ; else { a . pause ( ) ; window . open ( b , a . id ,
"top=0,left=0,width=" + screen . availWidth + ",height=" + screen . availHeight + ",resizable=yes,scrollbars=no,status=no,toolbar=no" ) ; return } } a . container . addClass ( "mejs-container-fullscreen" ) . width ( "100%" ) . height ( "100%" ) ; a . containerSizeTimeout = setTimeout ( function ( ) { a . container . css ( { width : "100%" , height : "100%" } ) ; a . setControlsSize ( ) } , 500 ) ; if ( a . pluginType === "native" ) a . $media . width ( "100%" ) . height ( "100%" ) ; else { a . container . find ( ".mejs-shim" ) . width ( "100%" ) . height ( "100%" ) ; a . media . setVideoSize ( f ( window ) . width ( ) , f ( window ) . height ( ) ) } a . layers . children ( "div" ) . width ( "100%" ) . height ( "100%" ) ;
a . fullscreenBtn && a . fullscreenBtn . removeClass ( "mejs-fullscreen" ) . addClass ( "mejs-unfullscreen" ) ; a . setControlsSize ( ) ; a . isFullScreen = true } } , exitFullScreen : function ( ) { clearTimeout ( this . containerSizeTimeout ) ; if ( this . media . pluginType !== "native" && mejs . MediaFeatures . isFirefox ) this . media . setFullscreen ( false ) ; else { if ( mejs . MediaFeatures . hasTrueNativeFullScreen && ( mejs . MediaFeatures . isFullScreen ( ) || this . isFullScreen ) ) mejs . MediaFeatures . cancelFullScreen ( ) ; document . documentElement . style . overflow = docStyleOverflow ;
this . container . removeClass ( "mejs-container-fullscreen" ) . width ( normalWidth ) . height ( normalHeight ) ; if ( this . pluginType === "native" ) this . $media . width ( normalWidth ) . height ( normalHeight ) ; else { this . container . find ( "object embed" ) . width ( normalWidth ) . height ( normalHeight ) ; this . media . setVideoSize ( normalWidth , normalHeight ) } this . layers . children ( "div" ) . width ( normalWidth ) . height ( normalHeight ) ; this . fullscreenBtn . removeClass ( "mejs-unfullscreen" ) . addClass ( "mejs-fullscreen" ) ; this . setControlsSize ( ) ; this . isFullScreen = false } } } ) } ) ( mejs . $ ) ;
( function ( f ) { f . extend ( mejs . MepDefaults , { startLanguage : "" , tracksText : "Captions/Subtitles" , hideCaptionsButtonWhenEmpty : true , toggleCaptionsButtonWhenOnlyOne : false , slidesSelector : "" } ) ; f . extend ( MediaElementPlayer . prototype , { hasChapters : false , buildtracks : function ( a , b , c , d ) { if ( a . tracks . length != 0 ) { a . chapters = f ( '<div class="mejs-chapters mejs-layer"></div>' ) . prependTo ( c ) . hide ( ) ; a . captions = f ( '<div class="mejs-captions-layer mejs-layer"><div class="mejs-captions-position mejs-captions-position-hover"><span class="mejs-captions-text"></span></div></div>' ) . prependTo ( c ) . hide ( ) ;
a . captionsText = a . captions . find ( ".mejs-captions-text" ) ; a . captionsButton = f ( '<div class="mejs-button mejs-captions-button"><button type="button" aria-controls="' + this . id + '" title="' + this . options . tracksText + '" aria-label="' + this . options . tracksText + '"></button><div class="mejs-captions-selector"><ul><li><input type="radio" name="' + a . id + '_captions" id="' + a . id + '_captions_none" value="none" checked="checked" /><label for="' + a . id + '_captions_none">None</label></li></ul></div></div>' ) . appendTo ( b ) ; for ( b = c = 0 ; b <
a . tracks . length ; b ++ ) a . tracks [ b ] . kind == "subtitles" && c ++ ; this . options . toggleCaptionsButtonWhenOnlyOne && c == 1 ? a . captionsButton . on ( "click" , function ( ) { a . setTrack ( a . selectedTrack == null ? a . tracks [ 0 ] . srclang : "none" ) } ) : a . captionsButton . hover ( function ( ) { f ( this ) . find ( ".mejs-captions-selector" ) . css ( "visibility" , "visible" ) } , function ( ) { f ( this ) . find ( ".mejs-captions-selector" ) . css ( "visibility" , "hidden" ) } ) . on ( "click" , "input[type=radio]" , function ( ) { lang = this . value ; a . setTrack ( lang ) } ) ; a . options . alwaysShowControls ? a . container . find ( ".mejs-captions-position" ) . addClass ( "mejs-captions-position-hover" ) :
a . container . bind ( "controlsshown" , function ( ) { a . container . find ( ".mejs-captions-position" ) . addClass ( "mejs-captions-position-hover" ) } ) . bind ( "controlshidden" , function ( ) { d . paused || a . container . find ( ".mejs-captions-position" ) . removeClass ( "mejs-captions-position-hover" ) } ) ; a . trackToLoad = - 1 ; a . selectedTrack = null ; a . isLoadingTrack = false ; for ( b = 0 ; b < a . tracks . length ; b ++ ) a . tracks [ b ] . kind == "subtitles" && a . addTrackButton ( a . tracks [ b ] . srclang , a . tracks [ b ] . label ) ; a . loadNextTrack ( ) ; d . addEventListener ( "timeupdate" , function ( ) { a . displayCaptions ( ) } ,
false ) ; if ( a . options . slidesSelector != "" ) { a . slidesContainer = f ( a . options . slidesSelector ) ; d . addEventListener ( "timeupdate" , function ( ) { a . displaySlides ( ) } , false ) } d . addEventListener ( "loadedmetadata" , function ( ) { a . displayChapters ( ) } , false ) ; a . container . hover ( function ( ) { if ( a . hasChapters ) { a . chapters . css ( "visibility" , "visible" ) ; a . chapters . fadeIn ( 200 ) . height ( a . chapters . find ( ".mejs-chapter" ) . outerHeight ( ) ) } } , function ( ) { a . hasChapters && ! d . paused && a . chapters . fadeOut ( 200 , function ( ) { f ( this ) . css ( "visibility" , "hidden" ) ;
f ( this ) . css ( "display" , "block" ) } ) } ) ; a . node . getAttribute ( "autoplay" ) !== null && a . chapters . css ( "visibility" , "hidden" ) } } , setTrack : function ( a ) { var b ; if ( a == "none" ) { this . selectedTrack = null ; this . captionsButton . removeClass ( "mejs-captions-enabled" ) } else for ( b = 0 ; b < this . tracks . length ; b ++ ) if ( this . tracks [ b ] . srclang == a ) { this . selectedTrack == null && this . captionsButton . addClass ( "mejs-captions-enabled" ) ; this . selectedTrack = this . tracks [ b ] ; this . captions . attr ( "lang" , this . selectedTrack . srclang ) ; this . displayCaptions ( ) ; break } } ,
loadNextTrack : function ( ) { this . trackToLoad ++ ; if ( this . trackToLoad < this . tracks . length ) { this . isLoadingTrack = true ; this . loadTrack ( this . trackToLoad ) } else { this . isLoadingTrack = false ; this . checkForTracks ( ) } } , loadTrack : function ( a ) { var b = this , c = b . tracks [ a ] ; f . ajax ( { url : c . src , dataType : "text" , success : function ( d ) { c . entries = typeof d == "string" && /<tt\s+xml/ig . exec ( d ) ? mejs . TrackFormatParser . dfxp . parse ( d ) : mejs . TrackFormatParser . webvvt . parse ( d ) ; c . isLoaded = true ; b . enableTrackButton ( c . srclang , c . label ) ; b . loadNextTrack ( ) ; c . kind ==
"chapters" && b . media . addEventListener ( "play" , function ( ) { b . media . duration > 0 && b . displayChapters ( c ) } , false ) ; c . kind == "slides" && b . setupSlides ( c ) } , error : function ( ) { b . loadNextTrack ( ) } } ) } , enableTrackButton : function ( a , b ) { if ( b === "" ) b = mejs . language . codes [ a ] || a ; this . captionsButton . find ( "input[value=" + a + "]" ) . prop ( "disabled" , false ) . siblings ( "label" ) . html ( b ) ; this . options . startLanguage == a && f ( "#" + this . id + "_captions_" + a ) . click ( ) ; this . adjustLanguageBox ( ) } , addTrackButton : function ( a , b ) { if ( b === "" ) b = mejs . language . codes [ a ] ||
a ; this . captionsButton . find ( "ul" ) . append ( f ( '<li><input type="radio" name="' + this . id + '_captions" id="' + this . id + "_captions_" + a + '" value="' + a + '" disabled="disabled" /><label for="' + this . id + "_captions_" + a + '">' + b + " (loading)</label></li>" ) ) ; this . adjustLanguageBox ( ) ; this . container . find ( ".mejs-captions-translations option[value=" + a + "]" ) . remove ( ) } , adjustLanguageBox : function ( ) { this . captionsButton . find ( ".mejs-captions-selector" ) . height ( this . captionsButton . find ( ".mejs-captions-selector ul" ) . outerHeight ( true ) +
this . captionsButton . find ( ".mejs-captions-translations" ) . outerHeight ( true ) ) } , checkForTracks : function ( ) { var a = false ; if ( this . options . hideCaptionsButtonWhenEmpty ) { for ( i = 0 ; i < this . tracks . length ; i ++ ) if ( this . tracks [ i ] . kind == "subtitles" ) { a = true ; break } if ( ! a ) { this . captionsButton . hide ( ) ; this . setControlsSize ( ) } } } , displayCaptions : function ( ) { if ( typeof this . tracks != "undefined" ) { var a , b = this . selectedTrack ; if ( b != null && b . isLoaded ) for ( a = 0 ; a < b . entries . times . length ; a ++ ) if ( this . media . currentTime >= b . entries . times [ a ] . start &&
this . media . currentTime <= b . entries . times [ a ] . stop ) { this . captionsText . html ( b . entries . text [ a ] ) ; this . captions . show ( ) . height ( 0 ) ; return } this . captions . hide ( ) } } , setupSlides : function ( a ) { this . slides = a ; this . slides . entries . imgs = [ this . slides . entries . text . length ] ; this . showSlide ( 0 ) } , showSlide : function ( a ) { if ( ! ( typeof this . tracks == "undefined" || typeof this . slidesContainer == "undefined" ) ) { var b = this , c = b . slides . entries . text [ a ] , d = b . slides . entries . imgs [ a ] ; if ( typeof d == "undefined" || typeof d . fadeIn == "undefined" ) b . slides . entries . imgs [ a ] =
d = f ( '<img src="' + c + '">' ) . on ( "load" , function ( ) { d . appendTo ( b . slidesContainer ) . hide ( ) . fadeIn ( ) . siblings ( ":visible" ) . fadeOut ( ) } ) ; else if ( ! d . is ( ":visible" ) && ! d . is ( ":animated" ) ) { console . log ( "showing existing slide" ) ; d . fadeIn ( ) . siblings ( ":visible" ) . fadeOut ( ) } } } , displaySlides : function ( ) { if ( typeof this . slides != "undefined" ) { var a = this . slides , b ; for ( b = 0 ; b < a . entries . times . length ; b ++ ) if ( this . media . currentTime >= a . entries . times [ b ] . start && this . media . currentTime <= a . entries . times [ b ] . stop ) { this . showSlide ( b ) ; break } } } ,
displayChapters : function ( ) { var a ; for ( a = 0 ; a < this . tracks . length ; a ++ ) if ( this . tracks [ a ] . kind == "chapters" && this . tracks [ a ] . isLoaded ) { this . drawChapters ( this . tracks [ a ] ) ; this . hasChapters = true ; break } } , drawChapters : function ( a ) { var b = this , c , d , e = d = 0 ; b . chapters . empty ( ) ; for ( c = 0 ; c < a . entries . times . length ; c ++ ) { d = a . entries . times [ c ] . stop - a . entries . times [ c ] . start ; d = Math . floor ( d / b . media . duration * 100 ) ; if ( d + e > 100 || c == a . entries . times . length - 1 && d + e < 100 ) d = 100 - e ; b . chapters . append ( f ( '<div class="mejs-chapter" rel="' + a . entries . times [ c ] . start +
'" style="left: ' + e . toString ( ) + "%;width: " + d . toString ( ) + '%;"><div class="mejs-chapter-block' + ( c == a . entries . times . length - 1 ? " mejs-chapter-block-last" : "" ) + '"><span class="ch-title">' + a . entries . text [ c ] + '</span><span class="ch-time">' + mejs . Utility . secondsToTimeCode ( a . entries . times [ c ] . start ) + "–" + mejs . Utility . secondsToTimeCode ( a . entries . times [ c ] . stop ) + "</span></div></div>" ) ) ; e += d } b . chapters . find ( "div.mejs-chapter" ) . click ( function ( ) { b . media . setCurrentTime ( parseFloat ( f ( this ) . attr ( "rel" ) ) ) ; b . media . paused &&
b . media . play ( ) } ) ; b . chapters . show ( ) } } ) ; mejs . language = { codes : { af : "Afrikaans" , sq : "Albanian" , ar : "Arabic" , be : "Belarusian" , bg : "Bulgarian" , ca : "Catalan" , zh : "Chinese" , "zh-cn" : "Chinese Simplified" , "zh-tw" : "Chinese Traditional" , hr : "Croatian" , cs : "Czech" , da : "Danish" , nl : "Dutch" , en : "English" , et : "Estonian" , tl : "Filipino" , fi : "Finnish" , fr : "French" , gl : "Galician" , de : "German" , el : "Greek" , ht : "Haitian Creole" , iw : "Hebrew" , hi : "Hindi" , hu : "Hungarian" , is : "Icelandic" , id : "Indonesian" , ga : "Irish" , it : "Italian" , ja : "Japanese" , ko : "Korean" ,
lv : "Latvian" , lt : "Lithuanian" , mk : "Macedonian" , ms : "Malay" , mt : "Maltese" , no : "Norwegian" , fa : "Persian" , pl : "Polish" , pt : "Portuguese" , ro : "Romanian" , ru : "Russian" , sr : "Serbian" , sk : "Slovak" , sl : "Slovenian" , es : "Spanish" , sw : "Swahili" , sv : "Swedish" , tl : "Tagalog" , th : "Thai" , tr : "Turkish" , uk : "Ukrainian" , vi : "Vietnamese" , cy : "Welsh" , yi : "Yiddish" } } ; mejs . TrackFormatParser = { webvvt : { pattern _identifier : /^([a-zA-z]+-)?[0-9]+$/ , pattern _timecode : /^([0-9]{2}:[0-9]{2}:[0-9]{2}([,.][0-9]{1,3})?) --\> ([0-9]{2}:[0-9]{2}:[0-9]{2}([,.][0-9]{3})?)(.*)$/ ,
parse : function ( a ) { var b = 0 ; a = mejs . TrackFormatParser . split2 ( a , /\r?\n/ ) ; for ( var c = { text : [ ] , times : [ ] } , d , e ; b < a . length ; b ++ ) if ( this . pattern _identifier . exec ( a [ b ] ) ) { b ++ ; if ( ( d = this . pattern _timecode . exec ( a [ b ] ) ) && b < a . length ) { b ++ ; e = a [ b ] ; for ( b ++ ; a [ b ] !== "" && b < a . length ; ) { e = e + "\n" + a [ b ] ; b ++ } e = f . trim ( e ) . replace ( /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig , "<a href='$1' target='_blank'>$1</a>" ) ; c . text . push ( e ) ; c . times . push ( { start : mejs . Utility . convertSMPTEtoSeconds ( d [ 1 ] ) == 0 ? 0.2 : mejs . Utility . convertSMPTEtoSeconds ( d [ 1 ] ) ,
stop : mejs . Utility . convertSMPTEtoSeconds ( d [ 3 ] ) , settings : d [ 5 ] } ) } } return c } } , dfxp : { parse : function ( a ) { a = f ( a ) . filter ( "tt" ) ; var b = 0 ; b = a . children ( "div" ) . eq ( 0 ) ; var c = b . find ( "p" ) ; b = a . find ( "#" + b . attr ( "style" ) ) ; var d , e ; a = { text : [ ] , times : [ ] } ; if ( b . length ) { e = b . removeAttr ( "id" ) . get ( 0 ) . attributes ; if ( e . length ) { d = { } ; for ( b = 0 ; b < e . length ; b ++ ) d [ e [ b ] . name . split ( ":" ) [ 1 ] ] = e [ b ] . value } } for ( b = 0 ; b < c . length ; b ++ ) { var g ; e = { start : null , stop : null , style : null } ; if ( c . eq ( b ) . attr ( "begin" ) ) e . start = mejs . Utility . convertSMPTEtoSeconds ( c . eq ( b ) . attr ( "begin" ) ) ;
if ( ! e . start && c . eq ( b - 1 ) . attr ( "end" ) ) e . start = mejs . Utility . convertSMPTEtoSeconds ( c . eq ( b - 1 ) . attr ( "end" ) ) ; if ( c . eq ( b ) . attr ( "end" ) ) e . stop = mejs . Utility . convertSMPTEtoSeconds ( c . eq ( b ) . attr ( "end" ) ) ; if ( ! e . stop && c . eq ( b + 1 ) . attr ( "begin" ) ) e . stop = mejs . Utility . convertSMPTEtoSeconds ( c . eq ( b + 1 ) . attr ( "begin" ) ) ; if ( d ) { g = "" ; for ( var k in d ) g += k + ":" + d [ k ] + ";" } if ( g ) e . style = g ; if ( e . start == 0 ) e . start = 0.2 ; a . times . push ( e ) ; e = f . trim ( c . eq ( b ) . html ( ) ) . replace ( /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig ,
"<a href='$1' target='_blank'>$1</a>" ) ; a . text . push ( e ) ; if ( a . times . start == 0 ) a . times . start = 2 } return a } } , split2 : function ( a , b ) { return a . split ( b ) } } ; if ( "x\n\ny" . split ( /\n/gi ) . length != 3 ) mejs . TrackFormatParser . split2 = function ( a , b ) { var c = [ ] , d = "" , e ; for ( e = 0 ; e < a . length ; e ++ ) { d += a . substring ( e , e + 1 ) ; if ( b . test ( d ) ) { c . push ( d . replace ( b , "" ) ) ; d = "" } } c . push ( d ) ; return c } } ) ( mejs . $ ) ;
( function ( f ) { f . extend ( mejs . MepDefaults , { contextMenuItems : [ { render : function ( a ) { if ( typeof a . enterFullScreen == "undefined" ) return null ; return a . isFullScreen ? "Turn off Fullscreen" : "Go Fullscreen" } , click : function ( a ) { a . isFullScreen ? a . exitFullScreen ( ) : a . enterFullScreen ( ) } } , { render : function ( a ) { return a . media . muted ? "Unmute" : "Mute" } , click : function ( a ) { a . media . muted ? a . setMuted ( false ) : a . setMuted ( true ) } } , { isSeparator : true } , { render : function ( ) { return "Download Video" } , click : function ( a ) { window . location . href = a . media . currentSrc } } ] } ) ;
f . extend ( MediaElementPlayer . prototype , { buildcontextmenu : function ( a ) { a . contextMenu = f ( '<div class="mejs-contextmenu"></div>' ) . appendTo ( f ( "body" ) ) . hide ( ) ; a . container . bind ( "contextmenu" , function ( b ) { if ( a . isContextMenuEnabled ) { b . preventDefault ( ) ; a . renderContextMenu ( b . clientX - 1 , b . clientY - 1 ) ; return false } } ) ; a . container . bind ( "click" , function ( ) { a . contextMenu . hide ( ) } ) ; a . contextMenu . bind ( "mouseleave" , function ( ) { a . startContextMenuTimer ( ) } ) } , cleancontextmenu : function ( a ) { a . contextMenu . remove ( ) } , isContextMenuEnabled : true ,
enableContextMenu : function ( ) { this . isContextMenuEnabled = true } , disableContextMenu : function ( ) { this . isContextMenuEnabled = false } , contextMenuTimeout : null , startContextMenuTimer : function ( ) { var a = this ; a . killContextMenuTimer ( ) ; a . contextMenuTimer = setTimeout ( function ( ) { a . hideContextMenu ( ) ; a . killContextMenuTimer ( ) } , 750 ) } , killContextMenuTimer : function ( ) { var a = this . contextMenuTimer ; if ( a != null ) { clearTimeout ( a ) ; delete a } } , hideContextMenu : function ( ) { this . contextMenu . hide ( ) } , renderContextMenu : function ( a , b ) { for ( var c =
this , d = "" , e = c . options . contextMenuItems , g = 0 , k = e . length ; g < k ; g ++ ) if ( e [ g ] . isSeparator ) d += '<div class="mejs-contextmenu-separator"></div>' ; else { var j = e [ g ] . render ( c ) ; if ( j != null ) d += '<div class="mejs-contextmenu-item" data-itemindex="' + g + '" id="element-' + Math . random ( ) * 1E6 + '">' + j + "</div>" } c . contextMenu . empty ( ) . append ( f ( d ) ) . css ( { top : b , left : a } ) . show ( ) ; c . contextMenu . find ( ".mejs-contextmenu-item" ) . each ( function ( ) { var l = f ( this ) , q = parseInt ( l . data ( "itemindex" ) , 10 ) , p = c . options . contextMenuItems [ q ] ; typeof p . show != "undefined" &&
p . show ( l , c ) ; l . click ( function ( ) { typeof p . click != "undefined" && p . click ( c ) ; c . contextMenu . hide ( ) } ) } ) ; setTimeout ( function ( ) { c . killControlsTimer ( "rev3" ) } , 100 ) } } ) } ) ( mejs . $ ) ;
( function ( f ) { f . extend ( mejs . MepDefaults , { postrollCloseText : mejs . i18n . t ( "Close" ) } ) ; f . extend ( MediaElementPlayer . prototype , { buildpostroll : function ( a , b , c ) { var d = this . container . find ( 'link[rel="postroll"]' ) . attr ( "href" ) ; if ( typeof d !== "undefined" ) { a . postroll = f ( '<div class="mejs-postroll-layer mejs-layer"><a class="mejs-postroll-close" onclick="$(this).parent().hide();return false;">' + this . options . postrollCloseText + '</a><div class="mejs-postroll-layer-content"></div></div>' ) . prependTo ( c ) . hide ( ) ; this . media . addEventListener ( "ended" ,
function ( ) { f . ajax ( { dataType : "html" , url : d , success : function ( e ) { c . find ( ".mejs-postroll-layer-content" ) . html ( e ) } } ) ; a . postroll . show ( ) } , false ) } } } ) } ) ( mejs . $ ) ;
2013-04-12 23:48:16 +02:00