/ * !
* MediaElementPlayer
* http : //mediaelementjs.com/
*
* Creates a controller bar for HTML5 < video > add < audio > tags
* using jQuery and MediaElement . js ( HTML5 Flash / Silverlight wrapper )
*
* Copyright 2010 - 2013 , John Dyer ( http : //j.hn/)
* License : MIT
*
* / 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 : "" , showPosterWhenEnded : false , 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 ? a . play ( ) : a . 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 ( d , g ) { a . meReady ( d , g ) } , error : function ( d ) { a . handleError ( d ) } } ) , e = a . media . tagName . toLowerCase ( ) ; a . isDynamic = e !== "audio" && e !== "video" ; a . isVideo = a . isDynamic ? a . options . isVideo : e !== "audio" && a . options . isVideo ; if ( b . isiPad && a . options . iPadUseNativeControls || b . isiPhone && a . options . iPhoneUseNativeControls ) { a . $media . attr ( "controls" ,
"controls" ) ; b . isiPad && a . media . getAttribute ( "autoplay" ) !== null && a . 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" ; e = 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" + e + "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" + e + "Height" ] ; a . setPlayerSize ( a . width , a . height ) ; c . pluginWidth = a . width ; c . pluginHeight = a . height } mejs . MediaElement ( a . $media [ 0 ] , c ) ; typeof a . container != "undefined" && a . controlsAreVisible && 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 || b . options . alwaysShowControls ) ) 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 , e = mejs . MediaFeatures , d = b . getAttribute ( "autoplay" ) ; d = ! ( typeof d == "undefined" || d === null || d === "false" ) ; var g ; if ( ! c . created ) { c . created = true ; c . media = a ; c . domNode = b ; if ( ! ( e . isAndroid && c . options . AndroidUseNativeControls ) && ! ( e . isiPad && c . options . iPadUseNativeControls ) && ! ( e . 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 ) { e =
c . options . features [ g ] ; if ( c [ "build" + e ] ) try { c [ "build" + e ] ( 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 { mejs . MediaElementPlayer . prototype . clickToPlayPauseCallback = function ( ) { if ( c . options . clickToPlayPause ) c . media . paused ? c . play ( ) : c . pause ( ) } ;
c . media . addEventListener ( "click" , c . clickToPlayPauseCallback , false ) ; 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 ) ; d && ! 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 m = mejs . players [ j ] ; m . id != c . id &&
c . options . pauseOtherPlayers && ! m . paused && ! m . ended && m . pause ( ) ; m . 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 . 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 ( ) } d && a . pluginType == "native" && c . 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%" || parseInt ( this . $node . css ( "max-width" ) . replace ( /px/ , "" ) , 10 ) / this . $node . offsetParent ( ) . width ( ) === 1 || 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 , e = this . isVideo ? this . media . videoHeight && this . media . videoHeight > 0 ? this . media . videoHeight : this . options . defaultVideoHeight : this . options . defaultAudioHeight , d = this . container . parent ( ) . closest ( ":visible" ) . width ( ) ; c = this . isVideo || ! this . options . autosizeProgress ? parseInt ( d * e / c , 10 ) : e ; if ( this . container . parent ( ) [ 0 ] . tagName . toLowerCase ( ) === "body" ) { d = f ( window ) . width ( ) ;
c = f ( window ) . height ( ) } if ( c != 0 && d != 0 ) { this . container . width ( d ) . height ( c ) ; this . $media . add ( this . container . find ( ".mejs-shim" ) ) . width ( "100%" ) . height ( "100%" ) ; this . isVideo && this . media . setVideoSize && this . media . setVideoSize ( d , 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 ) } d = this . layers . find ( ".mejs-overlay-play" ) ; c = d . find ( ".mejs-overlay-button" ) ; d . height ( this . container . height ( ) -
this . controls . height ( ) ) ; c . css ( "margin-top" , "-" + ( c . height ( ) / 2 - this . controls . height ( ) / 2 ) . toString ( ) + "px" ) } , setControlsSize : function ( ) { var a = 0 , b = 0 , c = this . controls . find ( ".mejs-time-rail" ) , e = this . controls . find ( ".mejs-time-total" ) ; this . controls . find ( ".mejs-time-current" ) ; this . controls . find ( ".mejs-time-loaded" ) ; var d = c . siblings ( ) ; if ( this . options && ! this . options . autosizeProgress ) b = parseInt ( c . css ( "width" ) ) ; if ( b === 0 || ! b ) { d . 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 ) ; e . width ( b - ( e . outerWidth ( true ) - e . width ( ) ) ) ; this . setProgressRail && this . setProgressRail ( ) ; this . setCurrentRail && this . setCurrentRail ( ) } , buildposter : function ( a , b , c , e ) { var d = 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 ) : d . hide ( ) ; e . addEventListener ( "play" , function ( ) { d . hide ( ) } , false ) ; a . options . showPosterWhenEnded && a . options . autoRewind &&
e . addEventListener ( "ended" , function ( ) { d . show ( ) } , 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 ) ; b . css ( { "background-image" : "url(" + a + ")" } ) } , buildoverlays : function ( a , b , c , e ) { var d = 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 ) . bind ( "click touchstart" , function ( ) { d . options . clickToPlayPause && e . paused && d . play ( ) } ) ; e . addEventListener ( "play" , function ( ) { j . hide ( ) ; g . hide ( ) ; b . find ( ".mejs-time-buffering" ) . hide ( ) ; k . hide ( ) } , false ) ; e . addEventListener ( "playing" , function ( ) { j . hide ( ) ; g . hide ( ) ; b . find ( ".mejs-time-buffering" ) . hide ( ) ; k . hide ( ) } , false ) ; e . addEventListener ( "seeking" , function ( ) { g . show ( ) ; b . find ( ".mejs-time-buffering" ) . show ( ) } ,
false ) ; e . addEventListener ( "seeked" , function ( ) { g . hide ( ) ; b . find ( ".mejs-time-buffering" ) . hide ( ) } , false ) ; e . addEventListener ( "pause" , function ( ) { mejs . MediaFeatures . isiPhone || j . show ( ) } , false ) ; e . addEventListener ( "waiting" , function ( ) { g . show ( ) ; b . find ( ".mejs-time-buffering" ) . show ( ) } , false ) ; e . addEventListener ( "loadeddata" , function ( ) { g . show ( ) ; b . find ( ".mejs-time-buffering" ) . show ( ) } , false ) ; e . addEventListener ( "canplay" , function ( ) { g . hide ( ) ; b . find ( ".mejs-time-buffering" ) . hide ( ) } , false ) ; e . 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 , e ) { this . globalBind ( "keydown" , function ( d ) { 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 ] , m = 0 , q = j . keys . length ; m < q ; m ++ ) if ( d . keyCode == j . keys [ m ] ) { d . preventDefault ( ) ; j . action ( a , e , d . keyCode ) ; return false } return true } ) ; this . globalBind ( "click" , function ( d ) { if ( f ( d . 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 , e ) { e = f ( e ) ; a . tracks . push ( { srclang : e . attr ( "srclang" ) ? e . attr ( "srclang" ) . toLowerCase ( ) : "" , src : e . attr ( "src" ) , kind : e . attr ( "kind" ) , label : e . 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 . load ( ) ; this . media . play ( ) } , pause : function ( ) { try { this . media . pause ( ) } catch ( a ) { } } ,
load : function ( ) { this . isLoaded || this . media . load ( ) ; this . isLoaded = true } , 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 ) { } } if ( this . isDynamic ) this . $node . insertBefore ( this . container ) ;
else { this . $media . prop ( "controls" , true ) ; this . $node . clone ( ) . show ( ) . insertBefore ( this . container ) ; this . $node . remove ( ) } this . media . pluginType !== "native" && this . media . remove ( ) ; delete mejs . players [ this . id ] ; this . container . remove ( ) ; this . globalUnbind ( ) ; delete this . node . player } } ; ( function ( ) { function a ( c , e ) { var d = { d : [ ] , w : [ ] } ; f . each ( ( c || "" ) . split ( " " ) , function ( g , k ) { var j = k + "." + e ; if ( j . indexOf ( "." ) === 0 ) { d . d . push ( j ) ; d . w . push ( j ) } else d [ b . test ( k ) ? "w" : "d" ] . push ( j ) } ) ; d . d = d . d . join ( " " ) ; d . w = d . w . join ( " " ) ; return d } 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 , e , d ) { c = a ( c , this . id ) ; c . d && f ( document ) . bind ( c . d , e , d ) ; c . w && f ( window ) . bind ( c . w , e , d ) } ; mejs . MediaElementPlayer . prototype . globalUnbind = function ( c , e ) { c = a ( c , this . id ) ; c . d && f ( document ) . unbind ( c . d , e ) ; c . w && f ( window ) . unbind ( c . w , e ) } } ) ( ) ; 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 : mejs . i18n . t ( "Play/Pause" ) } ) ; f . extend ( MediaElementPlayer . prototype , { buildplaypause : function ( a , b , c , e ) { var d = 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 ( ) ; e . paused ? e . play ( ) : e . pause ( ) ; return false } ) ; e . addEventListener ( "play" , function ( ) { d . removeClass ( "mejs-play" ) . addClass ( "mejs-pause" ) } ,
false ) ; e . addEventListener ( "playing" , function ( ) { d . removeClass ( "mejs-play" ) . addClass ( "mejs-pause" ) } , false ) ; e . addEventListener ( "pause" , function ( ) { d . removeClass ( "mejs-pause" ) . addClass ( "mejs-play" ) } , false ) ; e . addEventListener ( "paused" , function ( ) { d . 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 , e ) { 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 ( ) { e . paused || e . pause ( ) ; if ( e . currentTime > 0 ) { e . setCurrentTime ( 0 ) ; e . 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 , e ) { 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 d =
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" ) , m = b . find ( ".mejs-time-float" ) , q = b . find ( ".mejs-time-float-current" ) , p = function ( h ) { h = h . pageX ; var l = g . offset ( ) , r = g . outerWidth ( true ) , n = 0 , o = n = 0 ; if ( e . duration ) { if ( h < l . left ) h = l . left ; else if ( h > r + l . left ) h = r + l . left ; o = h - l . left ; n = o / r ; n = n <= 0.02 ? 0 : n * e . duration ; t && n !== e . currentTime && e . setCurrentTime ( n ) ; if ( ! mejs . MediaFeatures . hasTouch ) { m . css ( "left" , o ) ; q . html ( mejs . Utility . secondsToTimeCode ( n ) ) ;
m . show ( ) } } } , t = false ; g . bind ( "mousedown" , function ( h ) { if ( h . which === 1 ) { t = true ; p ( h ) ; d . globalBind ( "mousemove.dur" , function ( l ) { p ( l ) } ) ; d . globalBind ( "mouseup.dur" , function ( ) { t = false ; m . hide ( ) ; d . globalUnbind ( ".dur" ) } ) ; return false } } ) . bind ( "mouseenter" , function ( ) { d . globalBind ( "mousemove.dur" , function ( h ) { p ( h ) } ) ; mejs . MediaFeatures . hasTouch || m . show ( ) } ) . bind ( "mouseleave" , function ( ) { if ( ! t ) { d . globalUnbind ( ".dur" ) ; m . hide ( ) } } ) ; e . addEventListener ( "progress" , function ( h ) { a . setProgressRail ( h ) ; a . setCurrentRail ( h ) } , false ) ;
e . addEventListener ( "timeupdate" , function ( h ) { a . setProgressRail ( h ) ; a . setCurrentRail ( h ) } , false ) ; d . loaded = c ; d . total = g ; d . current = k ; d . 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 , e ) { 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" ) ; e . addEventListener ( "timeupdate" , function ( ) { a . updateCurrent ( ) } , false ) } , buildduration : function ( a , b ,
c , e ) { 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" ) ; e . 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 : mejs . i18n . t ( "Mute Toggle" ) , hideVolumeOnTouchDevices : true , audioVolume : "horizontal" , videoVolume : "vertical" } ) ; f . extend ( MediaElementPlayer . prototype , { buildvolume : function ( a , b , c , e ) { if ( ! ( mejs . MediaFeatures . hasTouch && this . options . hideVolumeOnTouchDevices ) ) { var d = this , g = d . isVideo ? d . options . videoVolume : d . options . audioVolume , k = g == "horizontal" ? f ( '<div class="mejs-button mejs-volume-button mejs-mute"><button type="button" aria-controls="' + d . id + '" title="' + d . options . muteText +
'" aria-label="' + d . 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="' + d . id + '" title="' + d . options . muteText + '" aria-label="' + d . 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 = d . container . find ( ".mejs-volume-slider, .mejs-horizontal-volume-slider" ) , m = d . container . find ( ".mejs-volume-total, .mejs-horizontal-volume-total" ) , q = d . container . find ( ".mejs-volume-current, .mejs-horizontal-volume-current" ) , p = d . 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 = m . height ( ) , u = m . 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 = m . width ( ) ; u = m . 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 = m . offset ( ) ; if ( g == "vertical" ) { o = m . height ( ) ; parseInt ( m . css ( "top" ) . replace ( /px/ , "" ) , 10 ) ; o = ( o - ( n . pageY - s . top ) ) / o ; if ( s . top == 0 || s . left == 0 ) return } else { o = m . width ( ) ; o = ( n . pageX - s . left ) / o } o = Math . max ( 0 , o ) ; o = Math . min ( o , 1 ) ; t ( o ) ; o == 0 ? e . setMuted ( true ) :
e . setMuted ( false ) ; e . setVolume ( o ) } , l = false , r = false ; k . hover ( function ( ) { j . show ( ) ; r = true } , function ( ) { r = false ; ! l && g == "vertical" && j . hide ( ) } ) ; j . bind ( "mouseover" , function ( ) { r = true } ) . bind ( "mousedown" , function ( n ) { h ( n ) ; d . globalBind ( "mousemove.vol" , function ( o ) { h ( o ) } ) ; d . globalBind ( "mouseup.vol" , function ( ) { l = false ; d . globalUnbind ( ".vol" ) ; ! r && g == "vertical" && j . hide ( ) } ) ; l = true ; return false } ) ; k . find ( "button" ) . click ( function ( ) { e . setMuted ( ! e . muted ) } ) ; e . addEventListener ( "volumechange" , function ( ) { if ( ! l ) if ( e . muted ) { t ( 0 ) ;
k . removeClass ( "mejs-mute" ) . addClass ( "mejs-unmute" ) } else { t ( e . volume ) ; k . removeClass ( "mejs-unmute" ) . addClass ( "mejs-mute" ) } } , false ) ; if ( d . container . is ( ":visible" ) ) { t ( a . options . startVolume ) ; a . options . startVolume === 0 && e . setMuted ( true ) ; e . pluginType === "native" && e . 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 , isInIframe : false , buildfullscreen : function ( a , b , c , e ) { if ( a . isVideo ) { a . isInIframe = window . location != window . parent . location ; if ( mejs . MediaFeatures . hasTrueNativeFullScreen ) { c = function ( ) { if ( a . isFullScreen ) 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 d = this , g = f ( '<div class="mejs-button mejs-fullscreen-button"><button type="button" aria-controls="' + d . id + '" title="' + d . options . fullscreenText + '" aria-label="' + d . options . fullscreenText + '"></button></div>' ) . appendTo ( b ) ; if ( d . media . pluginType === "native" || ! d . 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" ) , l = document . documentElement , r = window . getComputedStyle ; if ( ! ( "pointerEvents" in h . style ) ) return false ; h . style . pointerEvents = "auto" ; h . style . pointerEvents = "x" ; l . appendChild ( h ) ; r = r && r ( h , "" ) . pointerEvents === "auto" ; l . removeChild ( h ) ; return ! ! r } ( ) && ! mejs . MediaFeatures . isOpera ) { var j = false , m = function ( ) { if ( j ) { for ( var h in q ) q [ h ] . hide ( ) ; g . css ( "pointer-events" ,
"" ) ; d . controls . css ( "pointer-events" , "" ) ; d . media . removeEventListener ( "click" , d . clickToPlayPauseCallback ) ; j = false } } , q = { } ; b = [ "top" , "left" , "right" , "bottom" ] ; var p , t = function ( ) { var h = g . offset ( ) . left - d . container . offset ( ) . left , l = g . offset ( ) . top - d . container . offset ( ) . top , r = g . outerWidth ( true ) , n = g . outerHeight ( true ) , o = d . container . width ( ) , s = d . container . height ( ) ; for ( p in q ) q [ p ] . css ( { position : "absolute" , top : 0 , left : 0 } ) ; q . top . width ( o ) . height ( l ) ; q . left . width ( h ) . height ( n ) . css ( { top : l } ) ; q . right . width ( o - h - r ) . height ( n ) . css ( { top : l ,
left : h + r } ) ; q . bottom . width ( o ) . height ( s - n - l ) . css ( { top : l + n } ) } ; d . globalBind ( "resize" , function ( ) { t ( ) } ) ; p = 0 ; for ( c = b . length ; p < c ; p ++ ) q [ b [ p ] ] = f ( '<div class="mejs-fullscreen-hover" />' ) . appendTo ( d . container ) . mouseover ( m ) . hide ( ) ; g . on ( "mouseover" , function ( ) { if ( ! d . isFullScreen ) { var h = g . offset ( ) , l = a . container . offset ( ) ; e . positionFullscreenButton ( h . left - l . left , h . top - l . top , false ) ; g . css ( "pointer-events" , "none" ) ; d . controls . css ( "pointer-events" , "none" ) ; d . media . addEventListener ( "click" , d . clickToPlayPauseCallback ) ; for ( p in q ) q [ p ] . show ( ) ;
t ( ) ; j = true } } ) ; e . addEventListener ( "fullscreenchange" , function ( ) { d . isFullScreen = ! d . isFullScreen ; d . isFullScreen ? d . media . removeEventListener ( "click" , d . clickToPlayPauseCallback ) : d . media . addEventListener ( "click" , d . clickToPlayPauseCallback ) ; m ( ) } ) ; d . globalBind ( "mousemove" , function ( h ) { if ( j ) { var l = g . offset ( ) ; if ( h . pageY < l . top || h . pageY > l . top + g . outerHeight ( true ) || h . pageX < l . left || h . pageX > l . left + g . outerWidth ( true ) ) { g . css ( "pointer-events" , "" ) ; d . controls . css ( "pointer-events" , "" ) ; j = false } } } ) } else g . on ( "mouseover" ,
function ( ) { if ( k !== null ) { clearTimeout ( k ) ; delete k } var h = g . offset ( ) , l = a . container . offset ( ) ; e . positionFullscreenButton ( h . left - l . left , h . top - l . top , true ) } ) . on ( "mouseout" , function ( ) { if ( k !== null ) { clearTimeout ( k ) ; delete k } k = setTimeout ( function ( ) { e . hideFullscreenButton ( ) } , 1500 ) } ) } a . fullscreenBtn = g ; d . globalBind ( "keydown" , function ( h ) { if ( ( mejs . MediaFeatures . hasTrueNativeFullScreen && mejs . MediaFeatures . isFullScreen ( ) || d . 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 ) ) ) { f ( document . documentElement ) . addClass ( "mejs-fullscreen" ) ; 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 . media . 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 ( ) ;
f ( document . documentElement ) . removeClass ( "mejs-fullscreen" ) ; this . container . removeClass ( "mejs-container-fullscreen" ) . width ( normalWidth ) . height ( normalHeight ) ; if ( this . media . pluginType === "native" ) this . $media . width ( normalWidth ) . height ( normalHeight ) ; else { this . container . find ( ".mejs-shim" ) . 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 : mejs . i18n . t ( "Captions/Subtitles" ) , hideCaptionsButtonWhenEmpty : true , toggleCaptionsButtonWhenOnlyOne : false , slidesSelector : "" } ) ; f . extend ( MediaElementPlayer . prototype , { hasChapters : false , buildtracks : function ( a , b , c , e ) { if ( a . tracks . length != 0 ) { var d ; if ( this . domNode . textTracks ) for ( d = this . domNode . textTracks . length - 1 ; d >= 0 ; d -- ) this . domNode . textTracks [ d ] . mode = "hidden" ; 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">' + mejs . i18n . t ( "None" ) + "</label></li></ul></div></div>" ) . appendTo ( b ) ; for ( d = b = 0 ; d < a . tracks . length ; d ++ ) a . tracks [ d ] . kind == "subtitles" && b ++ ; this . options . toggleCaptionsButtonWhenOnlyOne && b == 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 ( ) { e . paused || a . container . find ( ".mejs-captions-position" ) . removeClass ( "mejs-captions-position-hover" ) } ) ;
a . trackToLoad = - 1 ; a . selectedTrack = null ; a . isLoadingTrack = false ; for ( d = 0 ; d < a . tracks . length ; d ++ ) a . tracks [ d ] . kind == "subtitles" && a . addTrackButton ( a . tracks [ d ] . srclang , a . tracks [ d ] . label ) ; a . loadNextTrack ( ) ; e . addEventListener ( "timeupdate" , function ( ) { a . displayCaptions ( ) } , false ) ; if ( a . options . slidesSelector != "" ) { a . slidesContainer = f ( a . options . slidesSelector ) ; e . addEventListener ( "timeupdate" , function ( ) { a . displaySlides ( ) } , false ) } e . 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 && ! e . 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 ( e ) { c . entries = typeof e == "string" &&
/<tt\s+xml/ig . exec ( e ) ? mejs . TrackFormatParser . dfxp . parse ( e ) : mejs . TrackFormatParser . webvvt . parse ( e ) ; 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 ] , e = b . slides . entries . imgs [ a ] ; if ( typeof e == "undefined" || typeof e . fadeIn == "undefined" ) b . slides . entries . imgs [ a ] = e = f ( '<img src="' + c + '">' ) . on ( "load" , function ( ) { e . appendTo ( b . slidesContainer ) . hide ( ) . fadeIn ( ) . siblings ( ":visible" ) . fadeOut ( ) } ) ; else ! e . is ( ":visible" ) && ! e . is ( ":animated" ) && e . 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 , e , d = e = 0 ; b . chapters . empty ( ) ; for ( c = 0 ; c < a . entries . times . length ; c ++ ) { e = a . entries . times [ c ] . stop - a . entries . times [ c ] . start ; e = Math . floor ( e / b . media . duration * 100 ) ; if ( e + d > 100 || c == a . entries . times . length -
1 && e + d < 100 ) e = 100 - d ; b . chapters . append ( f ( '<div class="mejs-chapter" rel="' + a . entries . times [ c ] . start + '" style="left: ' + d . toString ( ) + "%;width: " + e . 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>" ) ) ; d += e } 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 : [ ] } , e , d ; b < a . length ; b ++ ) if ( this . pattern _identifier . exec ( a [ b ] ) ) { b ++ ; if ( ( e = this . pattern _timecode . exec ( a [ b ] ) ) && b < a . length ) { b ++ ; d = a [ b ] ; for ( b ++ ; a [ b ] !== "" && b < a . length ; ) { d = d + "\n" + a [ b ] ; b ++ } d = f . trim ( d ) . replace ( /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig , "<a href='$1' target='_blank'>$1</a>" ) ; c . text . push ( d ) ; c . times . push ( { start : mejs . Utility . convertSMPTEtoSeconds ( e [ 1 ] ) == 0 ? 0.2 : mejs . Utility . convertSMPTEtoSeconds ( e [ 1 ] ) ,
stop : mejs . Utility . convertSMPTEtoSeconds ( e [ 3 ] ) , settings : e [ 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 e , d ; a = { text : [ ] , times : [ ] } ; if ( b . length ) { d = b . removeAttr ( "id" ) . get ( 0 ) . attributes ; if ( d . length ) { e = { } ; for ( b = 0 ; b < d . length ; b ++ ) e [ d [ b ] . name . split ( ":" ) [ 1 ] ] = d [ b ] . value } } for ( b = 0 ; b < c . length ; b ++ ) { var g ; d = { start : null , stop : null , style : null } ; if ( c . eq ( b ) . attr ( "begin" ) ) d . start = mejs . Utility . convertSMPTEtoSeconds ( c . eq ( b ) . attr ( "begin" ) ) ;
if ( ! d . start && c . eq ( b - 1 ) . attr ( "end" ) ) d . start = mejs . Utility . convertSMPTEtoSeconds ( c . eq ( b - 1 ) . attr ( "end" ) ) ; if ( c . eq ( b ) . attr ( "end" ) ) d . stop = mejs . Utility . convertSMPTEtoSeconds ( c . eq ( b ) . attr ( "end" ) ) ; if ( ! d . stop && c . eq ( b + 1 ) . attr ( "begin" ) ) d . stop = mejs . Utility . convertSMPTEtoSeconds ( c . eq ( b + 1 ) . attr ( "begin" ) ) ; if ( e ) { g = "" ; for ( var k in e ) g += k + ":" + e [ k ] + ";" } if ( g ) d . style = g ; if ( d . start == 0 ) d . start = 0.2 ; a . times . push ( d ) ; d = 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 ( d ) ; 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 = [ ] , e = "" , d ; for ( d = 0 ; d < a . length ; d ++ ) { e += a . substring ( d , d + 1 ) ; if ( b . test ( e ) ) { c . push ( e . replace ( b , "" ) ) ; e = "" } } c . push ( e ) ; return c } } ) ( mejs . $ ) ;
( function ( f ) { f . extend ( mejs . MepDefaults , { contextMenuItems : [ { render : function ( a ) { if ( typeof a . enterFullScreen == "undefined" ) return null ; return a . isFullScreen ? mejs . i18n . t ( "Turn off Fullscreen" ) : mejs . i18n . t ( "Go Fullscreen" ) } , click : function ( a ) { a . isFullScreen ? a . exitFullScreen ( ) : a . enterFullScreen ( ) } } , { render : function ( a ) { return a . media . muted ? mejs . i18n . t ( "Unmute" ) : mejs . i18n . t ( "Mute" ) } , click : function ( a ) { a . media . muted ? a . setMuted ( false ) : a . setMuted ( true ) } } , { isSeparator : true } , { render : function ( ) { return mejs . i18n . t ( "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 , e = "" , d = c . options . contextMenuItems , g = 0 , k = d . length ; g < k ; g ++ ) if ( d [ g ] . isSeparator ) e += '<div class="mejs-contextmenu-separator"></div>' ; else { var j = d [ g ] . render ( c ) ; if ( j != null ) e += '<div class="mejs-contextmenu-item" data-itemindex="' + g + '" id="element-' + Math . random ( ) * 1E6 + '">' + j + "</div>" } c . contextMenu . empty ( ) . append ( f ( e ) ) . css ( { top : b , left : a } ) . show ( ) ; c . contextMenu . find ( ".mejs-contextmenu-item" ) . each ( function ( ) { var m = f ( this ) , q = parseInt ( m . data ( "itemindex" ) , 10 ) , p = c . options . contextMenuItems [ q ] ; typeof p . show !=
"undefined" && p . show ( m , c ) ; m . 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 e = this . container . find ( 'link[rel="postroll"]' ) . attr ( "href" ) ; if ( typeof e !== "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 : e , success : function ( d ) { c . find ( ".mejs-postroll-layer-content" ) . html ( d ) } } ) ; a . postroll . show ( ) } , false ) } } } ) } ) ( mejs . $ ) ;