WordPress.org

Make WordPress Core

Ticket #24015: 24015.diff

File 24015.diff, 271.2 KB (added by wonderboymusic, 5 years ago)
  • wp-includes/js/mediaelement/mediaelement-and-player.js

    diff --git wp-includes/js/mediaelement/mediaelement-and-player.js wp-includes/js/mediaelement/mediaelement-and-player.js
    index 3601e4c..bb49d60 100644
     
    88* Can play MP4 (H.264), Ogg, WebM, FLV, WMV, WMA, ACC, and MP3
    99*
    1010* Copyright 2010-2012, John Dyer (http://j.hn)
    11 * Dual licensed under the MIT or GPL Version 2 licenses.
     11* License: MIT
    1212*
    1313*/
    1414// Namespace
    1515var mejs = mejs || {};
    1616
    1717// version number
    18 mejs.version = '2.10.1';
     18mejs.version = '2.11.0';
    1919
    2020// player number (for missing, same id attr)
    2121mejs.meIndex = 0;
    mejs.plugins = { 
    3030                //,{version: [12,0], types: ['video/webm']} // for future reference (hopefully!)
    3131        ],
    3232        youtube: [
    33                 {version: null, types: ['video/youtube', 'video/x-youtube']}
     33                {version: null, types: ['video/youtube', 'video/x-youtube', 'audio/youtube', 'audio/x-youtube']}
    3434        ],
    3535        vimeo: [
    3636                {version: null, types: ['video/vimeo', 'video/x-vimeo']}
    3737        ]
    3838};
    3939
     40
    4041/*
    4142Utility methods
    4243*/
    mejs.Utility = { 
    8586                } else if(typeof fps == 'undefined') {
    8687                    fps = 25;
    8788                }
    88        
     89
    8990                var hours = Math.floor(time / 3600) % 24,
    9091                        minutes = Math.floor(time / 60) % 60,
    9192                        seconds = Math.floor(time % 60),
    9293                        frames = Math.floor(((time % 1)*fps).toFixed(3)),
    93                         result = 
     94                        result =
    9495                                        ( (forceHours || hours > 0) ? (hours < 10 ? '0' + hours : hours) + ':' : '')
    9596                                                + (minutes < 10 ? '0' + minutes : minutes) + ':'
    9697                                                + (seconds < 10 ? '0' + seconds : seconds)
    9798                                                + ((showFrameCount) ? ':' + (frames < 10 ? '0' + frames : frames) : '');
    98        
     99
    99100                return result;
    100101        },
    101        
     102
    102103        timeCodeToSeconds: function(hh_mm_ss_ff, forceHours, showFrameCount, fps){
    103104                if (typeof showFrameCount == 'undefined') {
    104105                    showFrameCount=false;
    105106                } else if(typeof fps == 'undefined') {
    106107                    fps = 25;
    107108                }
    108        
     109
    109110                var tc_array = hh_mm_ss_ff.split(":"),
    110111                        tc_hh = parseInt(tc_array[0], 10),
    111112                        tc_mm = parseInt(tc_array[1], 10),
    112113                        tc_ss = parseInt(tc_array[2], 10),
    113114                        tc_ff = 0,
    114115                        tc_in_seconds = 0;
    115                
     116
    116117                if (showFrameCount) {
    117118                    tc_ff = parseInt(tc_array[3])/fps;
    118119                }
    119                
     120
    120121                tc_in_seconds = ( tc_hh * 3600 ) + ( tc_mm * 60 ) + tc_ss + tc_ff;
    121                
     122
    122123                return tc_in_seconds;
    123124        },
    124        
     125
    125126
    126127        convertSMPTEtoSeconds: function (SMPTE) {
    127                 if (typeof SMPTE != 'string') 
     128                if (typeof SMPTE != 'string')
    128129                        return false;
    129130
    130131                SMPTE = SMPTE.replace(',', '.');
    131                
     132
    132133                var secs = 0,
    133134                        decimalLen = (SMPTE.indexOf('.') != -1) ? SMPTE.split('.')[1].length : 0,
    134135                        multiplier = 1;
    135                
     136
    136137                SMPTE = SMPTE.split(':').reverse();
    137                
     138
    138139                for (var i = 0; i < SMPTE.length; i++) {
    139140                        multiplier = 1;
    140141                        if (i > 0) {
    141                                 multiplier = Math.pow(60, i); 
     142                                multiplier = Math.pow(60, i);
    142143                        }
    143144                        secs += Number(SMPTE[i]) * multiplier;
    144145                }
    145146                return Number(secs.toFixed(decimalLen));
    146         },     
    147        
     147        },
     148
    148149        /* borrowed from SWFObject: http://code.google.com/p/swfobject/source/browse/trunk/swfobject/src/swfobject.js#474 */
    149150        removeSwf: function(id) {
    150151                var obj = document.getElementById(id);
    151                 if (obj && obj.nodeName == "OBJECT") {
     152                if (obj && /object|embed/i.test(obj.nodeName)) {
    152153                        if (mejs.MediaFeatures.isIE) {
    153154                                obj.style.display = "none";
    154155                                (function(){
    mejs.Utility = { 
    172173                                }
    173174                        }
    174175                        obj.parentNode.removeChild(obj);
    175                 }               
     176                }
    176177        }
    177178};
    178179
    mejs.MediaFeatures = { 
    303304                t.isGecko = (ua.match(/gecko/gi) !== null) && !t.isWebkit;
    304305                t.isOpera = (ua.match(/opera/gi) !== null);
    305306                t.hasTouch = ('ontouchstart' in window);
    306                
     307
    307308                // borrowed from Modernizr
    308309                t.svg = !! document.createElementNS &&
    309310                                !! document.createElementNS('http://www.w3.org/2000/svg','svg').createSVGRect;
    mejs.MediaFeatures = { 
    312313                for (i=0; i<html5Elements.length; i++) {
    313314                        v = document.createElement(html5Elements[i]);
    314315                }
    315                
     316
    316317                t.supportsMediaTag = (typeof v.canPlayType !== 'undefined' || t.isBustedAndroid);
    317318
    318319                // detect native JavaScript fullscreen (Safari/Firefox only, Chrome still fails)
    319                
     320
    320321                // iOS
    321322                t.hasSemiNativeFullScreen = (typeof v.webkitEnterFullscreen !== 'undefined');
    322                
     323
    323324                // Webkit/firefox
    324325                t.hasWebkitNativeFullScreen = (typeof v.webkitRequestFullScreen !== 'undefined');
    325326                t.hasMozNativeFullScreen = (typeof v.mozRequestFullScreen !== 'undefined');
    326                
     327
    327328                t.hasTrueNativeFullScreen = (t.hasWebkitNativeFullScreen || t.hasMozNativeFullScreen);
    328329                t.nativeFullScreenEnabled = t.hasTrueNativeFullScreen;
    329330                if (t.hasMozNativeFullScreen) {
    330331                        t.nativeFullScreenEnabled = v.mozFullScreenEnabled;
    331332                }
    332                
    333                
     333
     334
    334335                if (this.isChrome) {
    335336                        t.hasSemiNativeFullScreen = false;
    336337                }
    337                
     338
    338339                if (t.hasTrueNativeFullScreen) {
    339340                        t.fullScreenEventName = (t.hasWebkitNativeFullScreen) ? 'webkitfullscreenchange' : 'mozfullscreenchange';
    340                        
    341                        
     341
     342
    342343                        t.isFullScreen = function() {
    343344                                if (v.mozRequestFullScreen) {
    344345                                        return d.mozFullScreen;
    mejs.MediaFeatures = { 
    346347                                        return d.webkitIsFullScreen;
    347348                                }
    348349                        }
    349                                        
     350
    350351                        t.requestFullScreen = function(el) {
    351                
     352
    352353                                if (t.hasWebkitNativeFullScreen) {
    353354                                        el.webkitRequestFullScreen();
    354355                                } else if (t.hasMozNativeFullScreen) {
    355356                                        el.mozRequestFullScreen();
    356357                                }
    357358                        }
    358                        
    359                         t.cancelFullScreen = function() {                               
     359
     360                        t.cancelFullScreen = function() {
    360361                                if (t.hasWebkitNativeFullScreen) {
    361362                                        document.webkitCancelFullScreen();
    362363                                } else if (t.hasMozNativeFullScreen) {
    363364                                        document.mozCancelFullScreen();
    364365                                }
    365                         }       
    366                        
     366                        }
     367
    367368                }
    368                
    369                
     369
     370
    370371                // OS X 10.5 can't do this even if it says it can :(
    371372                if (t.hasSemiNativeFullScreen && ua.match(/mac os x 10_5/i)) {
    372373                        t.hasNativeFullScreen = false;
    373374                        t.hasSemiNativeFullScreen = false;
    374375                }
    375                
     376
    376377        }
    377378};
    378379mejs.MediaFeatures.init();
    379380
    380 
    381381/*
    382382extension methods to <video> or <audio> object to bring it into parity with PluginMediaElement (see below)
    383383*/
    mejs.HtmlMediaElement = { 
    405405        // This can be a url string
    406406        // or an array [{src:'file.mp4',type:'video/mp4'},{src:'file.webm',type:'video/webm'}]
    407407        setSrc: function (url) {
    408                
     408
    409409                // Fix for IE9 which can't set .src when there are <source> elements. Awesome, right?
    410                 var 
     410                var
    411411                        existingSources = this.getElementsByTagName('source');
    412412                while (existingSources.length > 0){
    413413                        this.removeChild(existingSources[0]);
    414414                }
    415        
     415
    416416                if (typeof url == 'string') {
    417417                        this.src = url;
    418418                } else {
    mejs.PluginMediaElement = function (pluginid, pluginType, mediaUrl) { 
    442442        this.pluginType = pluginType;
    443443        this.src = mediaUrl;
    444444        this.events = {};
     445        this.attributes = {};
    445446};
    446447
    447448// JavaScript values and ExternalInterface methods that match HTML5 video properties methods
    mejs.PluginMediaElement.prototype = { 
    490491                        } else {
    491492                                this.pluginApi.loadMedia();
    492493                        }
    493                        
     494
    494495                        this.paused = false;
    495496                }
    496497        },
    mejs.PluginMediaElement.prototype = { 
    500501                                this.pluginApi.pauseVideo();
    501502                        } else {
    502503                                this.pluginApi.pauseMedia();
    503                         }                       
    504                        
    505                        
     504                        }
     505
     506
    506507                        this.paused = true;
    507508                }
    508509        },
    mejs.PluginMediaElement.prototype = { 
    512513                                this.pluginApi.stopVideo();
    513514                        } else {
    514515                                this.pluginApi.stopMedia();
    515                         }       
     516                        }
    516517                        this.paused = true;
    517518                }
    518519        },
    mejs.PluginMediaElement.prototype = { 
    532533                                for (j=0; j<pluginInfo.types.length; j++) {
    533534                                        // find plugin that can play the type
    534535                                        if (type == pluginInfo.types[j]) {
    535                                                 return true;
     536                                                return 'probably';
    536537                                        }
    537538                                }
    538539                        }
    539540                }
    540541
    541                 return false;
     542                return '';
    542543        },
    543        
     544
    544545        positionFullscreenButton: function(x,y,visibleAndAbove) {
    545546                if (this.pluginApi != null && this.pluginApi.positionFullscreenButton) {
    546547                        this.pluginApi.positionFullscreenButton(x,y,visibleAndAbove);
    547548                }
    548549        },
    549        
     550
    550551        hideFullscreenButton: function() {
    551552                if (this.pluginApi != null && this.pluginApi.hideFullscreenButton) {
    552553                        this.pluginApi.hideFullscreenButton();
    553                 }               
    554         },     
    555        
     554                }
     555        },
     556
    556557
    557558        // custom methods since not all JavaScript implementations support get/set
    558559
    mejs.PluginMediaElement.prototype = { 
    582583                                this.pluginApi.seekTo(time);
    583584                        } else {
    584585                                this.pluginApi.setCurrentTime(time);
    585                         }                               
    586                        
    587                        
    588                        
     586                        }
     587
     588
     589
    589590                        this.currentTime = time;
    590591                }
    591592        },
    mejs.PluginMediaElement.prototype = { 
    619620
    620621        // additional non-HTML5 methods
    621622        setVideoSize: function (width, height) {
    622                
     623
    623624                //if (this.pluginType == 'flash' || this.pluginType == 'silverlight') {
    624625                        if ( this.pluginElement.style) {
    625626                                this.pluginElement.style.width = width + 'px';
    mejs.PluginMediaElement.prototype = { 
    636637                        this.pluginApi.setFullscreen(fullscreen);
    637638                }
    638639        },
    639        
     640
    640641        enterFullScreen: function() {
    641642                if (this.pluginApi != null && this.pluginApi.setFullscreen) {
    642643                        this.setFullscreen(true);
    643                 }               
    644                
     644                }
     645
    645646        },
    646        
     647
    647648        exitFullScreen: function() {
    648649                if (this.pluginApi != null && this.pluginApi.setFullscreen) {
    649650                        this.setFullscreen(false);
    650651                }
    651         },     
     652        },
    652653
    653654        // start: fake events
    654655        addEventListener: function (eventName, callback, bubble) {
    mejs.PluginMediaElement.prototype = { 
    667668                        }
    668669                }
    669670                return false;
    670         },     
     671        },
    671672        dispatchEvent: function (eventName) {
    672673                var i,
    673674                        args,
    mejs.PluginMediaElement.prototype = { 
    681682                }
    682683        },
    683684        // end: fake events
    684        
     685
    685686        // fake DOM attribute methods
    686         attributes: {},
    687687        hasAttribute: function(name){
    688                 return (name in this.attributes); 
     688                return (name in this.attributes);
    689689        },
    690690        removeAttribute: function(name){
    691691                delete this.attributes[name];
    mejs.PluginMediaElement.prototype = { 
    702702
    703703        remove: function() {
    704704                mejs.Utility.removeSwf(this.pluginElement.id);
     705                mejs.MediaPluginBridge.unregisterPluginElement(this.pluginElement.id);
    705706        }
    706707};
    707708
    mejs.MediaPluginBridge = { 
    716717                this.htmlMediaElements[id] = htmlMediaElement;
    717718        },
    718719
     720        unregisterPluginElement: function (id) {
     721                delete this.pluginMediaElements[id];
     722                delete this.htmlMediaElements[id];
     723        },
     724
    719725        // when Flash/Silverlight is ready, it calls out to this method
    720726        initPlugin: function (id) {
    721727
    mejs.MediaPluginBridge = { 
    733739                                        pluginMediaElement.pluginApi = pluginMediaElement.pluginElement.Content.MediaElementJS;
    734740                                        break;
    735741                        }
    736        
     742
    737743                        if (pluginMediaElement.pluginApi != null && pluginMediaElement.success) {
    738744                                pluginMediaElement.success(pluginMediaElement, htmlMediaElement);
    739745                        }
    mejs.MediaElementDefaults = { 
    815821        // overrides <video height>
    816822        pluginHeight: -1,
    817823        // additional plugin variables in 'key=value' form
    818         pluginVars: [], 
     824        pluginVars: [],
    819825        // rate in milliseconds for Flash and Silverlight to fire the timeupdate event
    820826        // larger number is less accurate, but less strain on plugin->JavaScript bridge
    821827        timerRate: 250,
    mejs.HtmlMediaElementShim = { 
    856862                }
    857863
    858864                // clean up attributes
    859                 src =           (typeof src == 'undefined'      || src === null || src == '') ? null : src;             
     865                src =           (typeof src == 'undefined'      || src === null || src == '') ? null : src;
    860866                poster =        (typeof poster == 'undefined'   || poster === null) ? '' : poster;
    861867                preload =       (typeof preload == 'undefined'  || preload === null || preload === 'false') ? 'none' : preload;
    862868                autoplay =      !(typeof autoplay == 'undefined' || autoplay === null || autoplay === 'false');
    mejs.HtmlMediaElementShim = { 
    874880                                        htmlMediaElement.play();
    875881                                }, false);
    876882                        }
    877                
     883
    878884                        // add methods to native HTMLMediaElement
    879885                        return this.updateNative(playback, options, autoplay, preload);
    880886                } else if (playback.method !== '') {
    881887                        // create plugin to mimic HTMLMediaElement
    882                        
     888
    883889                        return this.createPlugin( playback,  options, poster, autoplay, preload, controls);
    884890                } else {
    885891                        // boo, no HTML5, no Flash, no Silverlight.
    886892                        this.createErrorMessage( playback, options, poster );
    887                        
     893
    888894                        return this;
    889895                }
    890896        },
    891        
     897
    892898        determinePlayback: function(htmlMediaElement, options, supportsMediaTag, isMediaTag, src) {
    893899                var
    894900                        mediaFiles = [],
    mejs.HtmlMediaElementShim = { 
    904910                        pluginInfo,
    905911                        dummy,
    906912                        media;
    907                        
     913
    908914                // STEP 1: Get URL and type from <video src> or <source src>
    909915
    910916                // supplied type overrides <video type> and <source type>
    911917                if (typeof options.type != 'undefined' && options.type !== '') {
    912                        
     918
    913919                        // accept either string or array of types
    914920                        if (typeof options.type == 'string') {
    915921                                mediaFiles.push({type:options.type, url:src});
    916922                        } else {
    917                                
     923
    918924                                for (i=0; i<options.type.length; i++) {
    919925                                        mediaFiles.push({type:options.type[i], url:src});
    920926                                }
    mejs.HtmlMediaElementShim = { 
    941947                                }
    942948                        }
    943949                }
    944                
     950
    945951                // in the case of dynamicly created players
    946952                // check for audio types
    947953                if (!isMediaTag && mediaFiles.length > 0 && mediaFiles[0].url !== null && this.getTypeFromFile(mediaFiles[0].url).indexOf('audio') > -1) {
    948954                        result.isVideo = false;
    949955                }
    950                
     956
    951957
    952958                // STEP 2: Test for playback method
    953                
     959
    954960                // special case for Android which sadly doesn't implement the canPlayType function (always returns '')
    955961                if (mejs.MediaFeatures.isBustedAndroid) {
    956962                        htmlMediaElement.canPlayType = function(type) {
    957963                                return (type.match(/video\/(mp4|m4v)/gi) !== null) ? 'maybe' : '';
    958964                        };
    959                 }               
    960                
     965                }
     966
    961967
    962968                // test for native playback first
    963969                if (supportsMediaTag && (options.mode === 'auto' || options.mode === 'auto_plugin' || options.mode === 'native')) {
    964                                                
     970
    965971                        if (!isMediaTag) {
    966972
    967                                 // create a real HTML5 Media Element 
    968                                 dummy = document.createElement( result.isVideo ? 'video' : 'audio');                   
     973                                // create a real HTML5 Media Element
     974                                dummy = document.createElement( result.isVideo ? 'video' : 'audio');
    969975                                htmlMediaElement.parentNode.insertBefore(dummy, htmlMediaElement);
    970976                                htmlMediaElement.style.display = 'none';
    971                                
     977
    972978                                // use this one from now on
    973979                                result.htmlMediaElement = htmlMediaElement = dummy;
    974980                        }
    975                                
     981
    976982                        for (i=0; i<mediaFiles.length; i++) {
    977983                                // normal check
    978                                 if (htmlMediaElement.canPlayType(mediaFiles[i].type).replace(/no/, '') !== '' 
     984                                if (htmlMediaElement.canPlayType(mediaFiles[i].type).replace(/no/, '') !== ''
    979985                                        // special case for Mac/Safari 5.0.3 which answers '' to canPlayType('audio/mp3') but 'maybe' to canPlayType('audio/mpeg')
    980986                                        || htmlMediaElement.canPlayType(mediaFiles[i].type.replace(/mp3/,'mpeg')).replace(/no/, '') !== '') {
    981987                                        result.method = 'native';
    982988                                        result.url = mediaFiles[i].url;
    983989                                        break;
    984990                                }
    985                         }                       
    986                        
     991                        }
     992
    987993                        if (result.method === 'native') {
    988994                                if (result.url !== null) {
    989995                                        htmlMediaElement.src = result.url;
    990996                                }
    991                        
     997
    992998                                // if `auto_plugin` mode, then cache the native result but try plugins.
    993999                                if (options.mode !== 'auto_plugin') {
    9941000                                        return result;
    mejs.HtmlMediaElementShim = { 
    10051011                                for (j=0; j<options.plugins.length; j++) {
    10061012
    10071013                                        pluginName = options.plugins[j];
    1008                        
     1014
    10091015                                        // test version of plugin (for future features)
    1010                                         pluginVersions = mejs.plugins[pluginName];                             
    1011                                        
     1016                                        pluginVersions = mejs.plugins[pluginName];
     1017
    10121018                                        for (k=0; k<pluginVersions.length; k++) {
    10131019                                                pluginInfo = pluginVersions[k];
    1014                                        
     1020
    10151021                                                // test if user has the correct plugin version
    1016                                                
     1022
    10171023                                                // for youtube/vimeo
    1018                                                 if (pluginInfo.version == null || 
    1019                                                        
     1024                                                if (pluginInfo.version == null ||
     1025
    10201026                                                        mejs.PluginDetector.hasPluginVersion(pluginName, pluginInfo.version)) {
    10211027
    10221028                                                        // test for plugin playback types
    mejs.HtmlMediaElementShim = { 
    10331039                                }
    10341040                        }
    10351041                }
    1036                
     1042
    10371043                // at this point, being in 'auto_plugin' mode implies that we tried plugins but failed.
    10381044                // if we have native support then return that.
    10391045                if (options.mode === 'auto_plugin' && result.method === 'native') {
    mejs.HtmlMediaElementShim = { 
    10521058                var ext;
    10531059
    10541060                // if no type is supplied, fake it with the extension
    1055                 if (url && !type) {             
     1061                if (url && !type) {
    10561062                        return this.getTypeFromFile(url);
    10571063                } else {
    10581064                        // only return the mime part of the type in case the attribute contains the codec
    10591065                        // see http://www.whatwg.org/specs/web-apps/current-work/multipage/video.html#the-source-element
    10601066                        // `video/mp4; codecs="avc1.42E01E, mp4a.40.2"` becomes `video/mp4`
    1061                        
     1067
    10621068                        if (type && ~type.indexOf(';')) {
    1063                                 return type.substr(0, type.indexOf(';')); 
     1069                                return type.substr(0, type.indexOf(';'));
    10641070                        } else {
    10651071                                return type;
    10661072                        }
    10671073                }
    10681074        },
    1069        
     1075
    10701076        getTypeFromFile: function(url) {
    10711077                url = url.split('?')[0];
    10721078                var ext = url.substring(url.lastIndexOf('.') + 1);
    10731079                return (/(mp4|m4v|ogg|ogv|webm|webmv|flv|wmv|mpeg|mov)/gi.test(ext) ? 'video' : 'audio') + '/' + this.getTypeFromExtension(ext);
    10741080        },
    1075        
     1081
    10761082        getTypeFromExtension: function(ext) {
    1077                
     1083
    10781084                switch (ext) {
    10791085                        case 'mp4':
    10801086                        case 'm4v':
    10811087                                return 'mp4';
    10821088                        case 'webm':
    10831089                        case 'webma':
    1084                         case 'webmv':   
     1090                        case 'webmv':
    10851091                                return 'webm';
    10861092                        case 'ogg':
    10871093                        case 'oga':
    1088                         case 'ogv':     
     1094                        case 'ogv':
    10891095                                return 'ogg';
    10901096                        default:
    10911097                                return ext;
    mejs.HtmlMediaElementShim = { 
    10931099        },
    10941100
    10951101        createErrorMessage: function(playback, options, poster) {
    1096                 var 
     1102                var
    10971103                        htmlMediaElement = playback.htmlMediaElement,
    10981104                        errorContainer = document.createElement('div');
    1099                        
     1105
    11001106                errorContainer.className = 'me-cannotplay';
    11011107
    11021108                try {
    mejs.HtmlMediaElementShim = { 
    11151121        },
    11161122
    11171123        createPlugin:function(playback, options, poster, autoplay, preload, controls) {
    1118                 var 
     1124                var
    11191125                        htmlMediaElement = playback.htmlMediaElement,
    11201126                        width = 1,
    11211127                        height = 1,
    mejs.HtmlMediaElementShim = { 
    11501156                if (playback.isVideo) {
    11511157                        width = (options.videoWidth > 0) ? options.videoWidth : (htmlMediaElement.getAttribute('width') !== null) ? htmlMediaElement.getAttribute('width') : options.defaultVideoWidth;
    11521158                        height = (options.videoHeight > 0) ? options.videoHeight : (htmlMediaElement.getAttribute('height') !== null) ? htmlMediaElement.getAttribute('height') : options.defaultVideoHeight;
    1153                
     1159
    11541160                        // in case of '%' make sure it's encoded
    11551161                        width = mejs.Utility.encodeUrl(width);
    11561162                        height = mejs.Utility.encodeUrl(height);
    1157                
     1163
    11581164                } else {
    11591165                        if (options.enablePluginDebug) {
    11601166                                width = 320;
    mejs.HtmlMediaElementShim = { 
    11691175                // add container (must be added to DOM before inserting HTML for IE)
    11701176                container.className = 'me-plugin';
    11711177                container.id = pluginid + '_container';
    1172                
     1178
    11731179                if (playback.isVideo) {
    11741180                                htmlMediaElement.parentNode.insertBefore(container, htmlMediaElement);
    11751181                } else {
    mejs.HtmlMediaElementShim = { 
    12061212                }
    12071213                if (options.pluginVars) {
    12081214                        initVars = initVars.concat(options.pluginVars);
    1209                 }               
     1215                }
    12101216
    12111217                switch (playback.method) {
    12121218                        case 'silverlight':
    12131219                                container.innerHTML =
    1214 '<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" id="' + pluginid + '" name="' + pluginid + '" width="' + width + '" height="' + height + '">' +
     1220'<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" id="' + pluginid + '" name="' + pluginid + '" width="' + width + '" height="' + height + '" class="mejs-shim">' +
    12151221'<param name="initParams" value="' + initVars.join(',') + '" />' +
    12161222'<param name="windowless" value="true" />' +
    12171223'<param name="background" value="black" />' +
    mejs.HtmlMediaElementShim = { 
    12281234                                        container.appendChild(specialIEContainer);
    12291235                                        specialIEContainer.outerHTML =
    12301236'<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" ' +
    1231 'id="' + pluginid + '" width="' + width + '" height="' + height + '">' +
     1237'id="' + pluginid + '" width="' + width + '" height="' + height + '" class="mejs-shim">' +
    12321238'<param name="movie" value="' + options.pluginPath + options.flashName + '?x=' + (new Date()) + '" />' +
    12331239'<param name="flashvars" value="' + initVars.join('&amp;') + '" />' +
    12341240'<param name="quality" value="high" />' +
    mejs.HtmlMediaElementShim = { 
    12531259'src="' + options.pluginPath + options.flashName + '" ' +
    12541260'flashvars="' + initVars.join('&') + '" ' +
    12551261'width="' + width + '" ' +
    1256 'height="' + height + '"></embed>';
     1262'height="' + height + '" ' +
     1263'class="mejs-shim"></embed>';
    12571264                                }
    12581265                                break;
    1259                        
     1266
    12601267                        case 'youtube':
    1261                        
    1262                                
     1268
     1269
    12631270                                var
    12641271                                        videoId = playback.url.substr(playback.url.lastIndexOf('=')+1);
    12651272                                        youtubeSettings = {
    mejs.HtmlMediaElementShim = { 
    12691276                                                pluginId: pluginid,
    12701277                                                videoId: videoId,
    12711278                                                height: height,
    1272                                                 width: width   
    1273                                         };                             
    1274                                
     1279                                                width: width
     1280                                        };
     1281
    12751282                                if (mejs.PluginDetector.hasPluginVersion('flash', [10,0,0]) ) {
    12761283                                        mejs.YouTubeApi.createFlash(youtubeSettings);
    12771284                                } else {
    1278                                         mejs.YouTubeApi.enqueueIframe(youtubeSettings);         
     1285                                        mejs.YouTubeApi.enqueueIframe(youtubeSettings);
    12791286                                }
    1280                                
     1287
    12811288                                break;
    1282                        
     1289
    12831290                        // DEMO Code. Does NOT work.
    12841291                        case 'vimeo':
    12851292                                //console.log('vimeoid');
    1286                                
     1293
    12871294                                pluginMediaElement.vimeoid = playback.url.substr(playback.url.lastIndexOf('/')+1);
    1288                                
    1289                                 container.innerHTML ='<iframe src="http://player.vimeo.com/video/' + pluginMediaElement.vimeoid + '?portrait=0&byline=0&title=0" width="' + width +'" height="' + height +'" frameborder="0"></iframe>';
    1290                                
     1295
     1296                                container.innerHTML ='<iframe src="http://player.vimeo.com/video/' + pluginMediaElement.vimeoid + '?portrait=0&byline=0&title=0" width="' + width +'" height="' + height +'" frameborder="0" class="mejs-shim"></iframe>';
     1297
    12911298                                /*
    12921299                                container.innerHTML =
    1293                                         '<object width="' + width + '" height="' + height + '">' +
     1300                                        '<object width="' + width + '" height="' + height + '" class="mejs-shim">' +
    12941301                                                '<param name="allowfullscreen" value="true" />' +
    12951302                                                '<param name="allowscriptaccess" value="always" />' +
    1296                                                 '<param name="flashvars" value="api=1" />' + 
     1303                                                '<param name="flashvars" value="api=1" />' +
    12971304                                                '<param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=' + pluginMediaElement.vimeoid  + '&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" />' +
    1298                                                 '<embed src="//vimeo.com/moogaloop.swf?api=1&amp;clip_id=' + pluginMediaElement.vimeoid + '&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="' + width + '" height="' + height + '"></embed>' +
     1305                                                '<embed src="//vimeo.com/moogaloop.swf?api=1&amp;clip_id=' + pluginMediaElement.vimeoid + '&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=00adef&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="' + width + '" height="' + height + '" class="mejs-shim"></embed>' +
    12991306                                        '</object>';
    13001307                                        */
    1301                                                                        
    1302                                 break;                 
     1308
     1309                                break;
    13031310                }
    13041311                // hide original element
    13051312                htmlMediaElement.style.display = 'none';
    13061313
    13071314                // FYI: options.success will be fired by the MediaPluginBridge
    1308                
     1315
    13091316                return pluginMediaElement;
    13101317        },
    13111318
    13121319        updateNative: function(playback, options, autoplay, preload) {
    1313                
     1320
    13141321                var htmlMediaElement = playback.htmlMediaElement,
    13151322                        m;
    1316                
    1317                
     1323
     1324
    13181325                // add methods to video object to bring it into parity with Flash Object
    13191326                for (m in mejs.HtmlMediaElement) {
    13201327                        htmlMediaElement[m] = mejs.HtmlMediaElement[m];
    mejs.HtmlMediaElementShim = { 
    13231330                /*
    13241331                Chrome now supports preload="none"
    13251332                if (mejs.MediaFeatures.isChrome) {
    1326                
     1333
    13271334                        // special case to enforce preload attribute (Chrome doesn't respect this)
    13281335                        if (preload === 'none' && !autoplay) {
    1329                        
     1336
    13301337                                // forces the browser to stop loading (note: fails in IE9)
    13311338                                htmlMediaElement.src = '';
    13321339                                htmlMediaElement.load();
    mejs.HtmlMediaElementShim = { 
    13501357
    13511358                // fire success code
    13521359                options.success(htmlMediaElement, htmlMediaElement);
    1353                
     1360
    13541361                return htmlMediaElement;
    13551362        }
    13561363};
    mejs.YouTubeApi = { 
    13761383        },
    13771384        iframeQueue: [],
    13781385        enqueueIframe: function(yt) {
    1379                
     1386
    13801387                if (this.isLoaded) {
    13811388                        this.createIframe(yt);
    13821389                } else {
    mejs.YouTubeApi = { 
    13851392                }
    13861393        },
    13871394        createIframe: function(settings) {
    1388                
     1395
    13891396                var
    1390                 pluginMediaElement = settings.pluginMediaElement,       
     1397                pluginMediaElement = settings.pluginMediaElement,
    13911398                player = new YT.Player(settings.containerId, {
    13921399                        height: settings.height,
    13931400                        width: settings.width,
    mejs.YouTubeApi = { 
    13951402                        playerVars: {controls:0},
    13961403                        events: {
    13971404                                'onReady': function() {
    1398                                        
     1405
    13991406                                        // hook up iframe object to MEjs
    14001407                                        settings.pluginMediaElement.pluginApi = player;
    1401                                        
     1408
    14021409                                        // init mejs
    14031410                                        mejs.MediaPluginBridge.initPlugin(settings.pluginId);
    1404                                        
     1411
    14051412                                        // create timer
    14061413                                        setInterval(function() {
    14071414                                                mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'timeupdate');
    1408                                         }, 250);                                       
     1415                                        }, 250);
    14091416                                },
    14101417                                'onStateChange': function(e) {
    1411                                        
     1418
    14121419                                        mejs.YouTubeApi.handleStateChange(e.data, player, pluginMediaElement);
    1413                                        
     1420
    14141421                                }
    14151422                        }
    14161423                });
    14171424        },
    1418        
     1425
    14191426        createEvent: function (player, pluginMediaElement, eventName) {
    14201427                var obj = {
    14211428                        type: eventName,
    mejs.YouTubeApi = { 
    14231430                };
    14241431
    14251432                if (player && player.getDuration) {
    1426                        
    1427                         // time 
     1433
     1434                        // time
    14281435                        pluginMediaElement.currentTime = obj.currentTime = player.getCurrentTime();
    14291436                        pluginMediaElement.duration = obj.duration = player.getDuration();
    1430                        
     1437
    14311438                        // state
    14321439                        obj.paused = pluginMediaElement.paused;
    1433                         obj.ended = pluginMediaElement.ended;                   
    1434                        
     1440                        obj.ended = pluginMediaElement.ended;
     1441
    14351442                        // sound
    14361443                        obj.muted = player.isMuted();
    14371444                        obj.volume = player.getVolume() / 100;
    1438                        
     1445
    14391446                        // progress
    14401447                        obj.bytesTotal = player.getVideoBytesTotal();
    14411448                        obj.bufferedBytes = player.getVideoBytesLoaded();
    1442                        
     1449
    14431450                        // fake the W3C buffered TimeRange
    14441451                        var bufferedTime = obj.bufferedBytes / obj.bytesTotal * obj.duration;
    1445                        
     1452
    14461453                        obj.target.buffered = obj.buffered = {
    14471454                                start: function(index) {
    14481455                                        return 0;
    mejs.YouTubeApi = { 
    14521459                                },
    14531460                                length: 1
    14541461                        };
    1455                        
     1462
    14561463                }
    1457                
     1464
    14581465                // send event up the chain
    14591466                pluginMediaElement.dispatchEvent(obj.type, obj);
    1460         },     
    1461        
     1467        },
     1468
    14621469        iFrameReady: function() {
    1463                
     1470
    14641471                this.isLoaded = true;
    14651472                this.isIframeLoaded = true;
    1466                
     1473
    14671474                while (this.iframeQueue.length > 0) {
    14681475                        var settings = this.iframeQueue.pop();
    14691476                        this.createIframe(settings);
    1470                 }       
     1477                }
    14711478        },
    1472        
     1479
    14731480        // FLASH!
    14741481        flashPlayers: {},
    14751482        createFlash: function(settings) {
    1476                
     1483
    14771484                this.flashPlayers[settings.pluginId] = settings;
    1478                
     1485
    14791486                /*
    14801487                settings.container.innerHTML =
    14811488                        '<object type="application/x-shockwave-flash" id="' + settings.pluginId + '" data="//www.youtube.com/apiplayer?enablejsapi=1&amp;playerapiid=' + settings.pluginId  + '&amp;version=3&amp;autoplay=0&amp;controls=0&amp;modestbranding=1&loop=0" ' +
    1482                                 'width="' + settings.width + '" height="' + settings.height + '" style="visibility: visible; ">' +
     1489                                'width="' + settings.width + '" height="' + settings.height + '" style="visibility: visible; " class="mejs-shim">' +
    14831490                                '<param name="allowScriptAccess" value="always">' +
    14841491                                '<param name="wmode" value="transparent">' +
    14851492                        '</object>';
    mejs.YouTubeApi = { 
    14871494
    14881495                var specialIEContainer,
    14891496                        youtubeUrl = 'http://www.youtube.com/apiplayer?enablejsapi=1&amp;playerapiid=' + settings.pluginId  + '&amp;version=3&amp;autoplay=0&amp;controls=0&amp;modestbranding=1&loop=0';
    1490                        
     1497
    14911498                if (mejs.MediaFeatures.isIE) {
    1492                        
     1499
    14931500                        specialIEContainer = document.createElement('div');
    14941501                        settings.container.appendChild(specialIEContainer);
    14951502                        specialIEContainer.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" ' +
    1496 'id="' + settings.pluginId + '" width="' + settings.width + '" height="' + settings.height + '">' +
     1503'id="' + settings.pluginId + '" width="' + settings.width + '" height="' + settings.height + '" class="mejs-shim">' +
    14971504        '<param name="movie" value="' + youtubeUrl + '" />' +
    14981505        '<param name="wmode" value="transparent" />' +
    14991506        '<param name="allowScriptAccess" value="always" />' +
    mejs.YouTubeApi = { 
    15021509                } else {
    15031510                settings.container.innerHTML =
    15041511                        '<object type="application/x-shockwave-flash" id="' + settings.pluginId + '" data="' + youtubeUrl + '" ' +
    1505                                 'width="' + settings.width + '" height="' + settings.height + '" style="visibility: visible; ">' +
     1512                                'width="' + settings.width + '" height="' + settings.height + '" style="visibility: visible; " class="mejs-shim">' +
    15061513                                '<param name="allowScriptAccess" value="always">' +
    15071514                                '<param name="wmode" value="transparent">' +
    15081515                        '</object>';
    1509                 }               
    1510                
     1516                }
     1517
    15111518        },
    1512        
     1519
    15131520        flashReady: function(id) {
    15141521                var
    15151522                        settings = this.flashPlayers[id],
    15161523                        player = document.getElementById(id),
    15171524                        pluginMediaElement = settings.pluginMediaElement;
    1518                
    1519                 // hook up and return to MediaELementPlayer.success     
    1520                 pluginMediaElement.pluginApi = 
     1525
     1526                // hook up and return to MediaELementPlayer.success
     1527                pluginMediaElement.pluginApi =
    15211528                pluginMediaElement.pluginElement = player;
    15221529                mejs.MediaPluginBridge.initPlugin(id);
    1523                
     1530
    15241531                // load the youtube video
    15251532                player.cueVideoById(settings.videoId);
    1526                
    1527                 var callbackName = settings.containerId + '_callback'
    1528                
     1533
     1534                var callbackName = settings.containerId + '_callback';
     1535
    15291536                window[callbackName] = function(e) {
    15301537                        mejs.YouTubeApi.handleStateChange(e, player, pluginMediaElement);
    15311538                }
    1532                
     1539
    15331540                player.addEventListener('onStateChange', callbackName);
    1534                
     1541
    15351542                setInterval(function() {
    15361543                        mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'timeupdate');
    15371544                }, 250);
    15381545        },
    1539        
     1546
    15401547        handleStateChange: function(youTubeState, player, pluginMediaElement) {
    15411548                switch (youTubeState) {
    15421549                        case -1: // not started
    mejs.YouTubeApi = { 
    15521559                                break;
    15531560                        case 1:
    15541561                                pluginMediaElement.paused = false;
    1555                                 pluginMediaElement.ended = false;                               
     1562                                pluginMediaElement.ended = false;
    15561563                                mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'play');
    15571564                                mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'playing');
    15581565                                break;
    15591566                        case 2:
    15601567                                pluginMediaElement.paused = true;
    1561                                 pluginMediaElement.ended = false;                               
     1568                                pluginMediaElement.ended = false;
    15621569                                mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'pause');
    15631570                                break;
    15641571                        case 3: // buffering
    mejs.YouTubeApi = { 
    15661573                                break;
    15671574                        case 5:
    15681575                                // cued?
    1569                                 break;                                         
    1570                        
    1571                 }                       
    1572                
     1576                                break;
     1577
     1578                }
     1579
    15731580        }
    15741581}
    15751582// IFRAME
    window.MediaElement = mejs.MediaElement; 
    18141821 * using jQuery and MediaElement.js (HTML5 Flash/Silverlight wrapper)
    18151822 *
    18161823 * Copyright 2010-2012, John Dyer (http://j.hn/)
    1817  * Dual licensed under the MIT or GPL Version 2 licenses.
     1824 * License: MIT
    18181825 *
    18191826 */
    18201827if (typeof jQuery != 'undefined') {
    if (typeof jQuery != 'undefined') { 
    18411848                // default if the user doesn't specify
    18421849                defaultAudioHeight: 30,
    18431850
    1844                 // default amount to move back when back key is pressed         
     1851                // default amount to move back when back key is pressed
    18451852                defaultSeekBackwardInterval: function(media) {
    18461853                        return (media.duration * 0.05);
    1847                 },             
    1848                 // default amount to move forward when forward key is pressed                           
     1854                },
     1855                // default amount to move forward when forward key is pressed
    18491856                defaultSeekForwardInterval: function(media) {
    18501857                        return (media.duration * 0.05);
    1851                 },             
    1852                
     1858                },
     1859
    18531860                // width of audio player
    18541861                audioWidth: -1,
    18551862                // height of audio player
    1856                 audioHeight: -1,               
     1863                audioHeight: -1,
    18571864                // initial volume when the player starts (overrided by user cookie)
    18581865                startVolume: 0.8,
    18591866                // useful for <audio> player loops
    18601867                loop: false,
     1868                // rewind to beginning when media ends
     1869                autoRewind: true,
    18611870                // resize to media dimensions
    18621871                enableAutosize: true,
    18631872                // forces the hour marker (##:00:00)
    if (typeof jQuery != 'undefined') { 
    18671876                showTimecodeFrameCount: false,
    18681877                // used when showTimecodeFrameCount is set to true
    18691878                framesPerSecond: 25,
    1870                
     1879
    18711880                // automatically calculate the width of the progress bar based on the sizes of other elements
    18721881                autosizeProgress : true,
    18731882                // Hide controls when playing and mouse is not over the video
    18741883                alwaysShowControls: false,
     1884                // Display the video control
     1885                hideVideoControlsOnLoad: false,
     1886        // Enable click video element to toggle play/pause
     1887        clickToPlayPause: true,
    18751888                // force iPad's native controls
    18761889                iPadUseNativeControls: false,
    18771890                // force iPhone's native controls
    1878                 iPhoneUseNativeControls: false, 
     1891                iPhoneUseNativeControls: false,
    18791892                // force Android's native controls
    1880                 AndroidUseNativeControls: false,                       
     1893                AndroidUseNativeControls: false,
    18811894                // features to show
    18821895                features: ['playpause','current','progress','duration','tracks','volume','fullscreen'],
    18831896                // only for dynamic
    18841897                isVideo: true,
    1885                
     1898
    18861899                // turns keyboard support on and off for this instance
    18871900                enableKeyboard: true,
    1888                
     1901
    18891902                // whenthis player starts, it will pause other players
    18901903                pauseOtherPlayers: true,
    1891                
     1904
    18921905                // array of keyboard actions such as play pause
    18931906                keyActions: [
    18941907                                {
    if (typeof jQuery != 'undefined') { 
    18981911                                                          ],
    18991912                                                action: function(player, media) {
    19001913                                                                if (media.paused || media.ended) {
    1901                                                                                 media.play();   
     1914                                                                                media.play();
    19021915                                                                } else {
    19031916                                                                                media.pause();
    1904                                                                 }                                                                               
     1917                                                                }
    19051918                                                }
    19061919                                },
    19071920                                {
    if (typeof jQuery != 'undefined') { 
    19291942                                                                                                player.showControls();
    19301943                                                                                                player.startControlsTimer();
    19311944                                                                                }
    1932                                                                                
     1945
    19331946                                                                                // 5%
    19341947                                                                                var newTime = Math.max(media.currentTime - player.options.defaultSeekBackwardInterval(media), 0);
    19351948                                                                                media.setCurrentTime(newTime);
    if (typeof jQuery != 'undefined') { 
    19401953                                                keys: [
    19411954                                                                39, // RIGHT
    19421955                                                                228 // Google TV forward
    1943                                                 ], 
     1956                                                ],
    19441957                                                action: function(player, media) {
    19451958                                                                if (!isNaN(media.duration) && media.duration > 0) {
    19461959                                                                                if (player.isVideo) {
    19471960                                                                                                player.showControls();
    19481961                                                                                                player.startControlsTimer();
    19491962                                                                                }
    1950                                                                                
     1963
    19511964                                                                                // 5%
    1952                                                                                 var newTime = Math.min(media.currentTime + player.options.defaultSeekForwardInterval(media), media.duration);                                                                           
     1965                                                                                var newTime = Math.min(media.currentTime + player.options.defaultSeekForwardInterval(media), media.duration);
    19531966                                                                                media.setCurrentTime(newTime);
    19541967                                                                }
    19551968                                                }
    if (typeof jQuery != 'undefined') { 
    19651978                                                                                }
    19661979                                                                }
    19671980                                                }
    1968                                 }                                       
    1969                 ]               
     1981                                }
     1982                ]
    19701983        };
    19711984
    19721985        mejs.mepIndex = 0;
    1973        
    1974         mejs.players = [];
     1986
     1987        mejs.players = {};
    19751988
    19761989        // wraps a MediaElement object in player controls
    19771990        mejs.MediaElementPlayer = function(node, o) {
    19781991                // enforce object, even without "new" (via John Resig)
    19791992                if ( !(this instanceof mejs.MediaElementPlayer) ) {
    19801993                        return new mejs.MediaElementPlayer(node, o);
    1981                 } 
     1994                }
    19821995
    19831996                var t = this;
    1984                
     1997
    19851998                // these will be reset after the MediaElement.success fires
    19861999                t.$media = t.$node = $(node);
    1987                 t.node = t.media = t.$media[0];         
    1988                
     2000                t.node = t.media = t.$media[0];
     2001
    19892002                // check for existing player
    19902003                if (typeof t.node.player != 'undefined') {
    19912004                        return t.node.player;
    if (typeof jQuery != 'undefined') { 
    19932006                        // attach player to DOM node for reference
    19942007                        t.node.player = t;
    19952008                }
    1996                                
    1997                                
     2009
     2010
    19982011                // try to get options from data-mejsoptions
    19992012                if (typeof o == 'undefined') {
    2000                         o = t.$node.data('mejsoptions');       
     2013                        o = t.$node.data('mejsoptions');
    20012014                }
    2002                        
     2015
    20032016                // extend default options
    20042017                t.options = $.extend({},mejs.MepDefaults,o);
    2005                
     2018
     2019                // unique ID
     2020                t.id = 'mep_' + mejs.mepIndex++;
     2021
    20062022                // add to player array (for focus events)
    2007                 mejs.players.push(t);
    2008                
     2023                mejs.players[t.id] = t;
     2024
    20092025                // start up
    20102026                t.init();
    20112027
    if (typeof jQuery != 'undefined') { 
    20142030
    20152031        // actual player
    20162032        mejs.MediaElementPlayer.prototype = {
    2017                
     2033
    20182034                hasFocus: false,
    2019                
     2035
    20202036                controlsAreVisible: true,
    2021                
     2037
    20222038                init: function() {
    20232039
    20242040                        var
    if (typeof jQuery != 'undefined') { 
    20302046                                        error: function(e) { t.handleError(e);}
    20312047                                }),
    20322048                                tagName = t.media.tagName.toLowerCase();
    2033                
     2049
    20342050                        t.isDynamic = (tagName !== 'audio' && tagName !== 'video');
    2035                        
    2036                         if (t.isDynamic) {     
    2037                                 // get video from src or href?                         
    2038                                 t.isVideo = t.options.isVideo;                                         
     2051
     2052                        if (t.isDynamic) {
     2053                                // get video from src or href?
     2054                                t.isVideo = t.options.isVideo;
    20392055                        } else {
    20402056                                t.isVideo = (tagName !== 'audio' && t.options.isVideo);
    20412057                        }
    2042                
    2043                         // use native controls in iPad, iPhone, and Android     
     2058
     2059                        // use native controls in iPad, iPhone, and Android
    20442060                        if ((mf.isiPad && t.options.iPadUseNativeControls) || (mf.isiPhone && t.options.iPhoneUseNativeControls)) {
    2045                                
     2061
    20462062                                // add controls and stop
    20472063                                t.$media.attr('controls', 'controls');
    20482064
    if (typeof jQuery != 'undefined') { 
    20552071                                        t.media.load();
    20562072                                        t.media.play();
    20572073                                }
    2058                                        
    2059                         } else if (mf.isAndroid && t.AndroidUseNativeControls) {
    2060                                
     2074
     2075                        } else if (mf.isAndroid && t.options.AndroidUseNativeControls) {
     2076
    20612077                                // leave default player
    20622078
    20632079                        } else {
    20642080
    20652081                                // DESKTOP: use MediaElementPlayer controls
    2066                                
    2067                                 // remove native controls                       
    2068                                 t.$media.removeAttr('controls');                                       
    2069                                
    2070                                 // unique ID
    2071                                 t.id = 'mep_' + mejs.mepIndex++;
     2082
     2083                                // remove native controls
     2084                                t.$media.removeAttr('controls');
    20722085
    20732086                                // build container
    20742087                                t.container =
    if (typeof jQuery != 'undefined') { 
    20812094                                                '</div>' +
    20822095                                        '</div>')
    20832096                                        .addClass(t.$media[0].className)
    2084                                         .insertBefore(t.$media);       
    2085                                        
     2097                                        .insertBefore(t.$media);
     2098
    20862099                                // add classes for user and content
    20872100                                t.container.addClass(
    20882101                                        (mf.isAndroid ? 'mejs-android ' : '') +
    if (typeof jQuery != 'undefined') { 
    20902103                                        (mf.isiPad ? 'mejs-ipad ' : '') +
    20912104                                        (mf.isiPhone ? 'mejs-iphone ' : '') +
    20922105                                        (t.isVideo ? 'mejs-video ' : 'mejs-audio ')
    2093                                 );     
    2094                                        
     2106                                );
     2107
    20952108
    20962109                                // move the <video/video> tag into the right spot
    20972110                                if (mf.isiOS) {
    2098                                
     2111
    20992112                                        // sadly, you can't move nodes in iOS, so we have to destroy and recreate it!
    21002113                                        var $newMedia = t.$media.clone();
    2101                                        
     2114
    21022115                                        t.container.find('.mejs-mediaelement').append($newMedia);
    2103                                        
     2116
    21042117                                        t.$media.remove();
    21052118                                        t.$node = t.$media = $newMedia;
    21062119                                        t.node = t.media = $newMedia[0]
    2107                                        
     2120
    21082121                                } else {
    2109                                        
     2122
    21102123                                        // normal way of moving it into place (doesn't work on iOS)
    21112124                                        t.container.find('.mejs-mediaelement').append(t.$media);
    21122125                                }
    2113                                
     2126
    21142127                                // find parts
    21152128                                t.controls = t.container.find('.mejs-controls');
    21162129                                t.layers = t.container.find('.mejs-layers');
    21172130
    21182131                                // determine the size
    2119                                
     2132
    21202133                                /* size priority:
    2121                                         (1) videoWidth (forced), 
     2134                                        (1) videoWidth (forced),
    21222135                                        (2) style="width;height;"
    21232136                                        (3) width attribute,
    21242137                                        (4) defaultVideoWidth (for unspecified cases)
    21252138                                */
    2126                                
     2139
    21272140                                var tagType = (t.isVideo ? 'video' : 'audio'),
    21282141                                        capsTagName = tagType.substring(0,1).toUpperCase() + tagType.substring(1);
    2129                                        
    2130                                
     2142
     2143
    21312144                                if (t.options[tagType + 'Width'] > 0 || t.options[tagType + 'Width'].toString().indexOf('%') > -1) {
    21322145                                        t.width = t.options[tagType + 'Width'];
    21332146                                } else if (t.media.style.width !== '' && t.media.style.width !== null) {
    2134                                         t.width = t.media.style.width;                                         
     2147                                        t.width = t.media.style.width;
    21352148                                } else if (t.media.getAttribute('width') !== null) {
    21362149                                        t.width = t.$media.attr('width');
    21372150                                } else {
    21382151                                        t.width = t.options['default' + capsTagName + 'Width'];
    21392152                                }
    2140                                
     2153
    21412154                                if (t.options[tagType + 'Height'] > 0 || t.options[tagType + 'Height'].toString().indexOf('%') > -1) {
    21422155                                        t.height = t.options[tagType + 'Height'];
    21432156                                } else if (t.media.style.height !== '' && t.media.style.height !== null) {
    21442157                                        t.height = t.media.style.height;
    21452158                                } else if (t.$media[0].getAttribute('height') !== null) {
    2146                                         t.height = t.$media.attr('height');     
     2159                                        t.height = t.$media.attr('height');
    21472160                                } else {
    21482161                                        t.height = t.options['default' + capsTagName + 'Height'];
    21492162                                }
    21502163
    21512164                                // set the size, while we wait for the plugins to load below
    21522165                                t.setPlayerSize(t.width, t.height);
    2153                                
     2166
    21542167                                // create MediaElementShim
    21552168                                meOptions.pluginWidth = t.height;
    2156                                 meOptions.pluginHeight = t.width;                               
     2169                                meOptions.pluginHeight = t.width;
    21572170                        }
    2158                        
    2159                        
     2171
     2172
    21602173
    21612174                        // create MediaElement shim
    21622175                        mejs.MediaElement(t.$media[0], meOptions);
     2176
     2177                        // controls are shown when loaded
     2178                        t.container.trigger('controlsshown');
    21632179                },
    2164                
     2180
    21652181                showControls: function(doAnimation) {
    21662182                        var t = this;
    2167                        
     2183
    21682184                        doAnimation = typeof doAnimation == 'undefined' || doAnimation;
    2169                        
     2185
    21702186                        if (t.controlsAreVisible)
    21712187                                return;
    2172                        
     2188
    21732189                        if (doAnimation) {
    21742190                                t.controls
    21752191                                        .css('visibility','visible')
    2176                                         .stop(true, true).fadeIn(200, function() {t.controlsAreVisible = true;});       
    2177        
     2192                                        .stop(true, true).fadeIn(200, function() {
     2193                                              t.controlsAreVisible = true;
     2194                                              t.container.trigger('controlsshown');
     2195                                        });
     2196
    21782197                                // any additional controls people might add and want to hide
    21792198                                t.container.find('.mejs-control')
    21802199                                        .css('visibility','visible')
    2181                                         .stop(true, true).fadeIn(200, function() {t.controlsAreVisible = true;});       
    2182                                        
     2200                                        .stop(true, true).fadeIn(200, function() {t.controlsAreVisible = true;});
     2201
    21832202                        } else {
    21842203                                t.controls
    21852204                                        .css('visibility','visible')
    21862205                                        .css('display','block');
    2187        
     2206
    21882207                                // any additional controls people might add and want to hide
    21892208                                t.container.find('.mejs-control')
    21902209                                        .css('visibility','visible')
    21912210                                        .css('display','block');
    2192                                        
     2211
    21932212                                t.controlsAreVisible = true;
     2213                                t.container.trigger('controlsshown');
    21942214                        }
    2195                        
     2215
    21962216                        t.setControlsSize();
    2197                        
     2217
    21982218                },
    21992219
    22002220                hideControls: function(doAnimation) {
    22012221                        var t = this;
    2202                        
     2222
    22032223                        doAnimation = typeof doAnimation == 'undefined' || doAnimation;
    2204                        
     2224
    22052225                        if (!t.controlsAreVisible)
    22062226                                return;
    2207                        
     2227
    22082228                        if (doAnimation) {
    22092229                                // fade out main controls
    22102230                                t.controls.stop(true, true).fadeOut(200, function() {
    22112231                                        $(this)
    22122232                                                .css('visibility','hidden')
    22132233                                                .css('display','block');
    2214                                                
     2234
    22152235                                        t.controlsAreVisible = false;
    2216                                 });     
    2217        
     2236                                        t.container.trigger('controlshidden');
     2237                                });
     2238
    22182239                                // any additional controls people might add and want to hide
    22192240                                t.container.find('.mejs-control').stop(true, true).fadeOut(200, function() {
    22202241                                        $(this)
    22212242                                                .css('visibility','hidden')
    22222243                                                .css('display','block');
    2223                                 });     
     2244                                });
    22242245                        } else {
    2225                                
     2246
    22262247                                // hide main controls
    22272248                                t.controls
    22282249                                        .css('visibility','hidden')
    2229                                         .css('display','block');               
    2230                                
     2250                                        .css('display','block');
     2251
    22312252                                // hide others
    22322253                                t.container.find('.mejs-control')
    22332254                                        .css('visibility','hidden')
    22342255                                        .css('display','block');
    2235                                        
     2256
    22362257                                t.controlsAreVisible = false;
     2258                                t.container.trigger('controlshidden');
    22372259                        }
    2238                 },             
     2260                },
    22392261
    22402262                controlsTimer: null,
    22412263
    22422264                startControlsTimer: function(timeout) {
    22432265
    22442266                        var t = this;
    2245                        
     2267
    22462268                        timeout = typeof timeout != 'undefined' ? timeout : 1500;
    22472269
    22482270                        t.killControlsTimer('start');
    if (typeof jQuery != 'undefined') { 
    22632285                                delete t.controlsTimer;
    22642286                                t.controlsTimer = null;
    22652287                        }
    2266                 },             
    2267                
     2288                },
     2289
    22682290                controlsEnabled: true,
    2269                
     2291
    22702292                disableControls: function() {
    22712293                        var t= this;
    2272                        
     2294
    22732295                        t.killControlsTimer();
    22742296                        t.hideControls(false);
    22752297                        this.controlsEnabled = false;
    22762298                },
    2277                
     2299
    22782300                enableControls: function() {
    22792301                        var t= this;
    2280                        
     2302
    22812303                        t.showControls(false);
    2282                        
     2304
    22832305                        t.controlsEnabled = true;
    2284                 },             
    2285                
     2306                },
     2307
    22862308
    22872309                // Sets up all controls and events
    2288                 meReady: function(media, domNode) {                     
    2289                
    2290                
     2310                meReady: function(media, domNode) {
     2311
     2312
    22912313                        var t = this,
    22922314                                mf = mejs.MediaFeatures,
    22932315                                autoplayAttr = domNode.getAttribute('autoplay'),
    if (typeof jQuery != 'undefined') { 
    22992321                        if (t.created)
    23002322                                return;
    23012323                        else
    2302                                 t.created = true;                       
     2324                                t.created = true;
    23032325
    23042326                        t.media = media;
    23052327                        t.domNode = domNode;
    2306                        
    2307                         if (!(mf.isAndroid && t.options.AndroidUseNativeControls) && !(mf.isiPad && t.options.iPadUseNativeControls) && !(mf.isiPhone && t.options.iPhoneUseNativeControls)) {                         
    2308                                
     2328
     2329                        if (!(mf.isAndroid && t.options.AndroidUseNativeControls) && !(mf.isiPad && t.options.iPadUseNativeControls) && !(mf.isiPhone && t.options.iPhoneUseNativeControls)) {
     2330
    23092331                                // two built in features
    23102332                                t.buildposter(t, t.controls, t.layers, t.media);
    23112333                                t.buildkeyboard(t, t.controls, t.layers, t.media);
    if (typeof jQuery != 'undefined') { 
    23302352                                }
    23312353
    23322354                                t.container.trigger('controlsready');
    2333                                
     2355
    23342356                                // reset all layers and controls
    23352357                                t.setPlayerSize(t.width, t.height);
    23362358                                t.setControlsSize();
    2337                                
     2359
    23382360
    23392361                                // controls fade
    23402362                                if (t.isVideo) {
    2341                                
     2363
    23422364                                        if (mejs.MediaFeatures.hasTouch) {
    2343                                                
     2365
    23442366                                                // for touch devices (iOS, Android)
    23452367                                                // show/hide without animation on touch
    2346                                                
     2368
    23472369                                                t.$media.bind('touchstart', function() {
    2348                                                        
    2349                                                        
     2370
     2371
    23502372                                                        // toggle controls
    23512373                                                        if (t.controlsAreVisible) {
    23522374                                                                t.hideControls(false);
    if (typeof jQuery != 'undefined') { 
    23552377                                                                        t.showControls(false);
    23562378                                                                }
    23572379                                                        }
    2358                                                 });                                     
    2359                                        
     2380                                                });
     2381
    23602382                                        } else {
    23612383            // click to play/pause
    23622384            t.media.addEventListener('click', function() {
    2363               if (t.media.paused) {
    2364                 t.media.play();
    2365               } else {
    2366                 t.media.pause();
     2385              if (t.options.clickToPlayPause) {
     2386                  if (t.media.paused) {
     2387                    t.media.play();
     2388                  } else {
     2389                    t.media.pause();
     2390                  }
    23672391              }
    23682392            });
    2369                                        
     2393
    23702394                                                // show/hide controls
    23712395                                                t.container
    23722396                                                        .bind('mouseenter mouseover', function () {
    23732397                                                                if (t.controlsEnabled) {
    2374                                                                         if (!t.options.alwaysShowControls) {                                                           
     2398                                                                        if (!t.options.alwaysShowControls) {
    23752399                                                                                t.killControlsTimer('enter');
    23762400                                                                                t.showControls();
    2377                                                                                 t.startControlsTimer(2500);             
     2401                                                                                t.startControlsTimer(2500);
    23782402                                                                        }
    23792403                                                                }
    23802404                                                        })
    if (typeof jQuery != 'undefined') { 
    23922416                                                        .bind('mouseleave', function () {
    23932417                                                                if (t.controlsEnabled) {
    23942418                                                                        if (!t.media.paused && !t.options.alwaysShowControls) {
    2395                                                                                 t.startControlsTimer(1000);                                                             
     2419                                                                                t.startControlsTimer(1000);
    23962420                                                                        }
    23972421                                                                }
    23982422                                                        });
    23992423                                        }
    2400                                        
     2424
     2425                                        if(t.options.hideVideoControlsOnLoad) {
     2426                                                t.hideControls(false);
     2427                                        }
     2428
    24012429                                        // check for autoplay
    24022430                                        if (autoplay && !t.options.alwaysShowControls) {
    24032431                                                t.hideControls();
    if (typeof jQuery != 'undefined') { 
    24162444                                                }, false);
    24172445                                        }
    24182446                                }
    2419                                
     2447
    24202448                                // EVENTS
    24212449
    24222450                                // FOCUS: when a video starts playing, it takes focus from other players (possibily pausing them)
    24232451                                media.addEventListener('play', function() {
    2424                                                
     2452                                                var playerIndex;
     2453
    24252454                                                // go through all other players
    2426                                                 for (var i=0, il=mejs.players.length; i<il; i++) {
    2427                                                         var p = mejs.players[i];
     2455                                                for (playerIndex in mejs.players) {
     2456                                                        var p = mejs.players[playerIndex];
    24282457                                                        if (p.id != t.id && t.options.pauseOtherPlayers && !p.paused && !p.ended) {
    24292458                                                                p.pause();
    24302459                                                        }
    24312460                                                        p.hasFocus = false;
    24322461                                                }
    2433                                                
     2462
    24342463                                                t.hasFocus = true;
    24352464                                },false);
    2436                                                                
     2465
    24372466
    24382467                                // ended for all
    24392468                                t.media.addEventListener('ended', function (e) {
    2440                                         try{
    2441                                                 t.media.setCurrentTime(0);
    2442                                         } catch (exp) {
    2443                                                
     2469                                        if(t.options.autoRewind) {
     2470                                                try{
     2471                                                        t.media.setCurrentTime(0);
     2472                                                } catch (exp) {
     2473
     2474                                                }
    24442475                                        }
    24452476                                        t.media.pause();
    2446                                        
     2477
    24472478                                        if (t.setProgressRail)
    24482479                                                t.setProgressRail();
    24492480                                        if (t.setCurrentRail)
    2450                                                 t.setCurrentRail();                                             
     2481                                                t.setCurrentRail();
    24512482
    24522483                                        if (t.options.loop) {
    24532484                                                t.media.play();
    if (typeof jQuery != 'undefined') { 
    24552486                                                t.showControls();
    24562487                                        }
    24572488                                }, false);
    2458                                
     2489
    24592490                                // resize on the first play
    24602491                                t.media.addEventListener('loadedmetadata', function(e) {
    24612492                                        if (t.updateDuration) {
    if (typeof jQuery != 'undefined') { 
    24642495                                        if (t.updateCurrent) {
    24652496                                                t.updateCurrent();
    24662497                                        }
    2467                                        
     2498
    24682499                                        if (!t.isFullScreen) {
    24692500                                                t.setPlayerSize(t.width, t.height);
    24702501                                                t.setControlsSize();
    if (typeof jQuery != 'undefined') { 
    24772508                                        t.setPlayerSize(t.width, t.height);
    24782509                                        t.setControlsSize();
    24792510                                }, 50);
    2480                                
     2511
    24812512                                // adjust controls whenever window sizes (used to be in fullscreen only)
    2482                                 $(window).resize(function() {
    2483                                        
    2484                                         // don't resize for fullscreen mode                             
     2513                                t.globalBind('resize', function() {
     2514
     2515                                        // don't resize for fullscreen mode
    24852516                                        if ( !(t.isFullScreen || (mejs.MediaFeatures.hasTrueNativeFullScreen && document.webkitIsFullScreen)) ) {
    24862517                                                t.setPlayerSize(t.width, t.height);
    24872518                                        }
    2488                                        
     2519
    24892520                                        // always adjust controls
    24902521                                        t.setControlsSize();
    2491                                 });                             
     2522                                });
    24922523
    24932524                                // TEMP: needs to be moved somewhere else
    24942525                                if (t.media.pluginType == 'youtube') {
    2495                                         t.container.find('.mejs-overlay-play').hide(); 
     2526                                        t.container.find('.mejs-overlay-play').hide();
    24962527                                }
    24972528                        }
    2498                        
     2529
    24992530                        // force autoplay for HTML5
    25002531                        if (autoplay && media.pluginType == 'native') {
    25012532                                media.load();
    if (typeof jQuery != 'undefined') { 
    25042535
    25052536
    25062537                        if (t.options.success) {
    2507                                
     2538
    25082539                                if (typeof t.options.success == 'string') {
    25092540                                                window[t.options.success](t.media, t.domNode, t);
    25102541                                } else {
    if (typeof jQuery != 'undefined') { 
    25152546
    25162547                handleError: function(e) {
    25172548                        var t = this;
    2518                        
     2549
    25192550                        t.controls.hide();
    2520                
     2551
    25212552                        // Tell user that the file cannot be played
    25222553                        if (t.options.error) {
    25232554                                t.options.error(e);
    if (typeof jQuery != 'undefined') { 
    25292560
    25302561                        if (typeof width != 'undefined')
    25312562                                t.width = width;
    2532                                
     2563
    25332564                        if (typeof height != 'undefined')
    25342565                                t.height = height;
    25352566
    25362567      // detect 100% mode - use currentStyle for IE since css() doesn't return percentages
    25372568      if (t.height.toString().indexOf('%') > 0 || t.$node.css('max-width') === '100%' || (t.$node[0].currentStyle && t.$node[0].currentStyle.maxWidth === '100%')) {
    2538                        
     2569
    25392570                                // do we have the native dimensions yet?
    2540                                 var 
     2571                                var
    25412572                                        nativeWidth = t.isVideo ? ((t.media.videoWidth && t.media.videoWidth > 0) ? t.media.videoWidth : t.options.defaultVideoWidth) : t.options.defaultAudioWidth,
    25422573                                        nativeHeight = t.isVideo ? ((t.media.videoHeight && t.media.videoHeight > 0) ? t.media.videoHeight : t.options.defaultVideoHeight) : t.options.defaultAudioHeight,
    25432574                                        parentWidth = t.container.parent().closest(':visible').width(),
    2544                                         newHeight = parseInt(parentWidth * nativeHeight/nativeWidth, 10);
    2545                                        
     2575                                        newHeight = t.isVideo || !t.options.autosizeProgress ? parseInt(parentWidth * nativeHeight/nativeWidth, 10) : nativeHeight;
     2576
    25462577                                if (t.container.parent()[0].tagName.toLowerCase() === 'body') { // && t.container.siblings().count == 0) {
    25472578                                        parentWidth = $(window).width();
    25482579                                        newHeight = $(window).height();
    25492580                                }
    2550                                
    2551                                 if ( newHeight != 0 ) {
     2581
     2582                                if ( newHeight != 0 && parentWidth != 0 ) {
    25522583                                        // set outer container size
    25532584                                        t.container
    25542585                                                .width(parentWidth)
    25552586                                                .height(newHeight);
    2556                                                
    2557                                         // set native <video> or <audio>
    2558                                         t.$media
    2559                                                 .width('100%')
    2560                                                 .height('100%');
    2561                                                
    2562                                         // set shims
    2563                                         t.container.find('object, embed, iframe')
     2587
     2588                                        // set native <video> or <audio> and shims
     2589                                        t.$media.add(t.container.find('.mejs-shim'))
    25642590                                                .width('100%')
    25652591                                                .height('100%');
    2566                                                
    2567                                         // if shim is ready, send the size to the embeded plugin       
     2592
     2593                                        // if shim is ready, send the size to the embeded plugin
    25682594                                        if (t.isVideo) {
    25692595                                                if (t.media.setVideoSize) {
    25702596                                                        t.media.setVideoSize(parentWidth, newHeight);
    25712597                                                }
    25722598                                        }
    2573                                        
     2599
    25742600                                        // set the layers
    25752601                                        t.layers.children('.mejs-layer')
    25762602                                                .width('100%')
    25772603                                                .height('100%');
    25782604                                }
    2579                        
    2580                        
     2605
     2606
    25812607                        } else {
    25822608
    25832609                                t.container
    25842610                                        .width(t.width)
    25852611                                        .height(t.height);
    2586        
     2612
    25872613                                t.layers.children('.mejs-layer')
    25882614                                        .width(t.width)
    25892615                                        .height(t.height);
    2590                                        
     2616
    25912617                        }
    25922618                },
    25932619
    if (typeof jQuery != 'undefined') { 
    26002626                                current = t.controls.find('.mejs-time-current'),
    26012627                                loaded = t.controls.find('.mejs-time-loaded'),
    26022628                                others = rail.siblings();
    2603                        
     2629
    26042630
    26052631                        // allow the size to come from custom CSS
    26062632                        if (t.options && !t.options.autosizeProgress) {
    2607                                 // Also, frontends devs can be more flexible 
     2633                                // Also, frontends devs can be more flexible
    26082634                                // due the opportunity of absolute positioning.
    26092635                                railWidth = parseInt(rail.css('width'));
    26102636                        }
    2611                        
     2637
    26122638                        // attempt to autosize
    26132639                        if (railWidth === 0 || !railWidth) {
    2614                                
     2640
    26152641                                // find the size of all the other controls besides the rail
    26162642                                others.each(function() {
    2617                                         if ($(this).css('position') != 'absolute') {
     2643                                        var $this = $(this);
     2644                                        if ($this.css('position') != 'absolute' && $this.is(':visible')) {
    26182645                                                usedWidth += $(this).outerWidth(true);
    26192646                                        }
    26202647                                });
    2621                                
     2648
    26222649                                // fit the rail into the remaining space
    26232650                                railWidth = t.controls.width() - usedWidth - (rail.outerWidth(true) - rail.width());
    26242651                        }
    if (typeof jQuery != 'undefined') { 
    26272654                        rail.width(railWidth);
    26282655                        // dark space
    26292656                        total.width(railWidth - (total.outerWidth(true) - total.width()));
    2630                        
     2657
    26312658                        if (t.setProgressRail)
    26322659                                t.setProgressRail();
    26332660                        if (t.setCurrentRail)
    2634                                 t.setCurrentRail();                             
     2661                                t.setCurrentRail();
    26352662                },
    26362663
    26372664
    26382665                buildposter: function(player, controls, layers, media) {
    26392666                        var t = this,
    2640                                 poster = 
     2667                                poster =
    26412668                                $('<div class="mejs-poster mejs-layer">' +
    26422669                                '</div>')
    26432670                                        .appendTo(layers),
    if (typeof jQuery != 'undefined') { 
    26462673                        // prioriy goes to option (this is useful if you need to support iOS 3.x (iOS completely fails with poster)
    26472674                        if (player.options.poster !== '') {
    26482675                                posterUrl = player.options.poster;
    2649                         }       
    2650                                
     2676                        }
     2677
    26512678                        // second, try the real poster
    26522679                        if (posterUrl !== '' && posterUrl != null) {
    26532680                                t.setPoster(posterUrl);
    if (typeof jQuery != 'undefined') { 
    26592686                                poster.hide();
    26602687                        }, false);
    26612688                },
    2662                
     2689
    26632690                setPoster: function(url) {
    26642691                        var t = this,
    26652692                                posterDiv = t.container.find('.mejs-poster'),
    26662693                                posterImg = posterDiv.find('img');
    2667                                
     2694
    26682695                        if (posterImg.length == 0) {
    26692696                                posterImg = $('<img width="100%" height="100%" />').appendTo(posterDiv);
    2670                         }       
    2671                        
     2697                        }
     2698
    26722699                        posterImg.attr('src', url);
    26732700                },
    26742701
    26752702                buildoverlays: function(player, controls, layers, media) {
     2703            var t = this;
    26762704                        if (!player.isVideo)
    26772705                                return;
    26782706
    2679                         var 
    2680                         loading = 
     2707                        var
     2708                        loading =
    26812709                                $('<div class="mejs-overlay mejs-layer">'+
    26822710                                        '<div class="mejs-overlay-loading"><span></span></div>'+
    26832711                                '</div>')
    26842712                                .hide() // start out hidden
    26852713                                .appendTo(layers),
    2686                         error = 
     2714                        error =
    26872715                                $('<div class="mejs-overlay mejs-layer">'+
    26882716                                        '<div class="mejs-overlay-error"></div>'+
    26892717                                '</div>')
    26902718                                .hide() // start out hidden
    26912719                                .appendTo(layers),
    26922720                        // this needs to come last so it's on top
    2693                         bigPlay = 
     2721                        bigPlay =
    26942722                                $('<div class="mejs-overlay mejs-layer mejs-overlay-play">'+
    26952723                                        '<div class="mejs-overlay-button"></div>'+
    26962724                                '</div>')
    26972725                                .appendTo(layers)
    26982726                                .click(function() {
    2699                                         if (media.paused) {
    2700                                                 media.play();
    2701                                         } else {
    2702                                                 media.pause();
    2703                                         }
     2727                    if (t.options.clickToPlayPause) {
     2728                        if (media.paused) {
     2729                            media.play();
     2730                        } else {
     2731                            media.pause();
     2732                        }
     2733                    }
    27042734                                });
    2705                        
     2735
    27062736                        /*
    27072737                        if (mejs.MediaFeatures.isiOS || mejs.MediaFeatures.isAndroid) {
    27082738                                bigPlay.remove();
    27092739                                loading.remove();
    27102740                        }
    27112741                        */
    2712        
     2742
    27132743
    27142744                        // show/hide big play button
    27152745                        media.addEventListener('play',function() {
    if (typeof jQuery != 'undefined') { 
    27172747                                loading.hide();
    27182748                                controls.find('.mejs-time-buffering').hide();
    27192749                                error.hide();
    2720                         }, false);     
    2721                        
     2750                        }, false);
     2751
    27222752                        media.addEventListener('playing', function() {
    27232753                                bigPlay.hide();
    27242754                                loading.hide();
    27252755                                controls.find('.mejs-time-buffering').hide();
    2726                                 error.hide();                   
     2756                                error.hide();
    27272757                        }, false);
    27282758
    27292759                        media.addEventListener('seeking', function() {
    if (typeof jQuery != 'undefined') { 
    27352765                                loading.hide();
    27362766                                controls.find('.mejs-time-buffering').hide();
    27372767                        }, false);
    2738        
     2768
    27392769                        media.addEventListener('pause',function() {
    27402770                                if (!mejs.MediaFeatures.isiPhone) {
    27412771                                        bigPlay.show();
    27422772                                }
    27432773                        }, false);
    2744                        
     2774
    27452775                        media.addEventListener('waiting', function() {
    2746                                 loading.show(); 
     2776                                loading.show();
    27472777                                controls.find('.mejs-time-buffering').show();
    2748                         }, false);                     
    2749                        
    2750                        
    2751                         // show/hide loading                   
     2778                        }, false);
     2779
     2780
     2781                        // show/hide loading
    27522782                        media.addEventListener('loadeddata',function() {
    27532783                                // for some reason Chrome is firing this event
    27542784                                //if (mejs.MediaFeatures.isChrome && media.getAttribute && media.getAttribute('preload') === 'none')
    27552785                                //      return;
    2756                                        
     2786
    27572787                                loading.show();
    27582788                                controls.find('.mejs-time-buffering').show();
    2759                         }, false);     
     2789                        }, false);
    27602790                        media.addEventListener('canplay',function() {
    27612791                                loading.hide();
    27622792                                controls.find('.mejs-time-buffering').hide();
    2763                         }, false);     
     2793                        }, false);
    27642794
    27652795                        // error handling
    27662796                        media.addEventListener('error',function() {
    if (typeof jQuery != 'undefined') { 
    27682798                                controls.find('.mejs-time-buffering').hide();
    27692799                                error.show();
    27702800                                error.find('mejs-overlay-error').html("Error loading this resource");
    2771                         }, false);                             
     2801                        }, false);
    27722802                },
    2773                
     2803
    27742804                buildkeyboard: function(player, controls, layers, media) {
    27752805
    27762806                                var t = this;
    2777                                
     2807
    27782808                                // listen for key presses
    2779                                 $(document).keydown(function(e) {
    2780                                                
     2809                                t.globalBind('keydown', function(e) {
     2810
    27812811                                                if (player.hasFocus && player.options.enableKeyboard) {
    2782                                                                                
     2812
    27832813                                                                // find a matching key
    27842814                                                                for (var i=0, il=player.options.keyActions.length; i<il; i++) {
    27852815                                                                                var keyAction = player.options.keyActions[i];
    2786                                                                                
     2816
    27872817                                                                                for (var j=0, jl=keyAction.keys.length; j<jl; j++) {
    27882818                                                                                                if (e.keyCode == keyAction.keys[j]) {
    27892819                                                                                                                e.preventDefault();
    27902820                                                                                                                keyAction.action(player, media, e.keyCode);
    27912821                                                                                                                return false;
    2792                                                                                                 }                                                                                               
     2822                                                                                                }
    27932823                                                                                }
    27942824                                                                }
    27952825                                                }
    2796                                                
     2826
    27972827                                                return true;
    27982828                                });
    2799                                
     2829
    28002830                                // check if someone clicked outside a player region, then kill its focus
    2801                                 $(document).click(function(event) {
     2831                                t.globalBind('click', function(event) {
    28022832                                                if ($(event.target).closest('.mejs-container').length == 0) {
    28032833                                                                player.hasFocus = false;
    28042834                                                }
    28052835                                });
    2806                        
     2836
    28072837                },
    28082838
    28092839                findTracks: function() {
    if (typeof jQuery != 'undefined') { 
    28132843                        // store for use by plugins
    28142844                        t.tracks = [];
    28152845                        tracktags.each(function(index, track) {
    2816                                
     2846
    28172847                                track = $(track);
    2818                                
     2848
    28192849                                t.tracks.push({
    2820                                         srclang: track.attr('srclang').toLowerCase(),
     2850                                        srclang: (track.attr('srclang')) ? track.attr('srclang').toLowerCase() : '',
    28212851                                        src: track.attr('src'),
    28222852                                        kind: track.attr('kind'),
    28232853                                        label: track.attr('label') || '',
    if (typeof jQuery != 'undefined') { 
    28592889                        this.media.setSrc(src);
    28602890                },
    28612891                remove: function() {
    2862                         var t = this;
    2863                        
    2864                         if (t.media.pluginType === 'flash') {
    2865                                 t.media.remove();
    2866                         } else if (t.media.pluginType === 'native') {
     2892                        var t = this, featureIndex, feature;
     2893
     2894                        // invoke features cleanup
     2895                        for (featureIndex in t.options.features) {
     2896                                feature = t.options.features[featureIndex];
     2897                                if (t['clean' + feature]) {
     2898                                        try {
     2899                                                t['clean' + feature](t);
     2900                                        } catch (e) {
     2901                                                // TODO: report control error
     2902                                                //throw e;
     2903                                                //console.log('error building ' + feature);
     2904                                                //console.log(e);
     2905                                        }
     2906                                }
     2907                        }
     2908
     2909                        if (t.media.pluginType === 'native') {
    28672910                                t.$media.prop('controls', true);
     2911                        } else {
     2912                                t.media.remove();
    28682913                        }
    2869                        
     2914
    28702915                        // grab video and put it back in place
    28712916                        if (!t.isDynamic) {
    2872                                 t.$node.insertBefore(t.container)
     2917                                if (t.media.pluginType === 'native') {
     2918                                        // detach events from the video
     2919                                        // TODO: detach event listeners better than this;
     2920                                        //       also detach ONLY the events attached by this plugin!
     2921                                        //t.$node.clone().insertBefore(t.container);
     2922                                        //t.$node.remove();
     2923                                }
     2924                                /*else*/ t.$node.insertBefore(t.container)
    28732925                        }
    2874                        
     2926
     2927                        // Remove the player from the mejs.players array so that pauseOtherPlayers doesn't blow up when trying to pause a non existance flash api.
     2928                        mejs.players.splice( $.inArray( t, mejs.players ), 1);
     2929
    28752930                        t.container.remove();
     2931                        t.globalUnbind();
     2932                        delete t.node.player;
     2933                        delete mejs.players[t.id];
    28762934                }
    28772935        };
    28782936
     2937        (function(){
     2938                var rwindow = /^((after|before)print|(before)?unload|hashchange|message|o(ff|n)line|page(hide|show)|popstate|resize|storage)\b/;
     2939
     2940                function splitEvents(events, id) {
     2941                        // add player ID as an event namespace so it's easier to unbind them all later
     2942                        var ret = {d: [], w: []};
     2943                        $.each((events || '').split(' '), function(k, v){
     2944                                ret[rwindow.test(v) ? 'w' : 'd'].push(v + '.' + id);
     2945                        });
     2946                        ret.d = ret.d.join(' ');
     2947                        ret.w = ret.w.join(' ');
     2948                        return ret;
     2949                }
     2950
     2951                mejs.MediaElementPlayer.prototype.globalBind = function(events, data, callback) {
     2952                        var t = this;
     2953                        events = splitEvents(events, t.id);
     2954                        if (events.d) $(document).bind(events.d, data, callback);
     2955                        if (events.w) $(window).bind(events.w, data, callback);
     2956                };
     2957
     2958                mejs.MediaElementPlayer.prototype.globalUnbind = function(events, callback) {
     2959                        var t = this;
     2960                        events = splitEvents(events, t.id);
     2961                        if (events.d) $(document).unbind(events.d, callback);
     2962                        if (events.w) $(window).unbind(events.w, callback);
     2963                };
     2964        })();
     2965
    28792966        // turn into jQuery plugin
    28802967        if (typeof jQuery != 'undefined') {
    28812968                jQuery.fn.mediaelementplayer = function (options) {
    2882                         return this.each(function () {
    2883                                 new mejs.MediaElementPlayer(this, options);
    2884                         });
     2969                        if (options === false) {
     2970                                this.each(function () {
     2971                                        var player = jQuery(this).data('mediaelementplayer');
     2972                                        if (player) {
     2973                                                player.remove();
     2974                                        }
     2975                                        jQuery(this).removeData('mediaelementplayer');
     2976                                });
     2977                        }
     2978                        else {
     2979                                this.each(function () {
     2980                                        jQuery(this).data('mediaelementplayer', new mejs.MediaElementPlayer(this, options));
     2981                                });
     2982                        }
     2983                        return this;
    28852984                };
    28862985        }
    2887        
     2986
    28882987        $(document).ready(function() {
    28892988                // auto enable using JSON attribute
    28902989                $('.mejs-player').mediaelementplayer();
    28912990        });
    2892        
     2991
    28932992        // push out to window
    28942993        window.MediaElementPlayer = mejs.MediaElementPlayer;
    28952994
    if (typeof jQuery != 'undefined') { 
    29043003        // PLAY/pause BUTTON
    29053004        $.extend(MediaElementPlayer.prototype, {
    29063005                buildplaypause: function(player, controls, layers, media) {
    2907                         var 
     3006                        var
    29083007                                t = this,
    2909                                 play = 
     3008                                play =
    29103009                                $('<div class="mejs-button mejs-playpause-button mejs-play" >' +
    29113010                                        '<button type="button" aria-controls="' + t.id + '" title="' + t.options.playpauseText + '"></button>' +
    29123011                                '</div>')
    29133012                                .appendTo(controls)
    29143013                                .click(function(e) {
    29153014                                        e.preventDefault();
    2916                                
     3015
    29173016                                        if (media.paused) {
    29183017                                                media.play();
    29193018                                        } else {
    29203019                                                media.pause();
    29213020                                        }
    2922                                        
     3021
    29233022                                        return false;
    29243023                                });
    29253024
    if (typeof jQuery != 'undefined') { 
    29393038                        }, false);
    29403039                }
    29413040        });
    2942        
     3041
    29433042})(mejs.$);
    29443043(function($) {
    29453044
    if (typeof jQuery != 'undefined') { 
    29513050        $.extend(MediaElementPlayer.prototype, {
    29523051                buildstop: function(player, controls, layers, media) {
    29533052                        var t = this,
    2954                                 stop = 
     3053                                stop =
    29553054                                $('<div class="mejs-button mejs-stop-button mejs-stop">' +
    29563055                                        '<button type="button" aria-controls="' + t.id + '" title="' + t.options.stopText + '"></button>' +
    29573056                                '</div>')
    if (typeof jQuery != 'undefined') { 
    29663065                                                controls.find('.mejs-time-current').width('0px');
    29673066                                                controls.find('.mejs-time-handle').css('left', '0px');
    29683067                                                controls.find('.mejs-time-float-current').html( mejs.Utility.secondsToTimeCode(0) );
    2969                                                 controls.find('.mejs-currenttime').html( mejs.Utility.secondsToTimeCode(0) );                                   
     3068                                                controls.find('.mejs-currenttime').html( mejs.Utility.secondsToTimeCode(0) );
    29703069                                                layers.find('.mejs-poster').show();
    29713070                                        }
    29723071                                });
    29733072                }
    29743073        });
    2975        
     3074
    29763075})(mejs.$);
    29773076(function($) {
    29783077        // progress/loaded bar
    if (typeof jQuery != 'undefined') { 
    29853084                                        '<span class="mejs-time-loaded"></span>'+
    29863085                                        '<span class="mejs-time-current"></span>'+
    29873086                                        '<span class="mejs-time-handle"></span>'+
    2988                                         '<span class="mejs-time-float">' + 
    2989                                                 '<span class="mejs-time-float-current">00:00</span>' + 
    2990                                                 '<span class="mejs-time-float-corner"></span>' + 
     3087                                        '<span class="mejs-time-float">' +
     3088                                                '<span class="mejs-time-float-current">00:00</span>' +
     3089                                                '<span class="mejs-time-float-corner"></span>' +
    29913090                                        '</span>'+
    29923091                                '</span>'+
    29933092                        '</div>')
    29943093                                .appendTo(controls);
    29953094                                controls.find('.mejs-time-buffering').hide();
    29963095
    2997                         var 
     3096                        var
    29983097                                t = this,
    29993098                                total = controls.find('.mejs-time-total'),
    30003099                                loaded  = controls.find('.mejs-time-loaded'),
    if (typeof jQuery != 'undefined') { 
    30093108                                                width = total.outerWidth(true),
    30103109                                                percentage = 0,
    30113110                                                newTime = 0,
    3012                                                 pos = x - offset.left;
     3111                                                pos = 0;
    30133112
    30143113
    3015                                         if (x > offset.left && x <= width + offset.left && media.duration) {
    3016                                                 percentage = ((x - offset.left) / width);
     3114                                        if (media.duration) {
     3115                                                if (x < offset.left) {
     3116                                                        x = offset.left;
     3117                                                } else if (x > width + offset.left) {
     3118                                                        x = width + offset.left;
     3119                                                }
     3120
     3121                                                pos = x - offset.left;
     3122                                                percentage = (pos / width);
    30173123                                                newTime = (percentage <= 0.02) ? 0 : percentage * media.duration;
    30183124
    30193125                                                // seek to where the mouse is
    3020                                                 if (mouseIsDown) {
     3126                                                if (mouseIsDown && newTime !== media.currentTime) {
    30213127                                                        media.setCurrentTime(newTime);
    30223128                                                }
    30233129
    if (typeof jQuery != 'undefined') { 
    30403146                                        if (e.which === 1) {
    30413147                                                mouseIsDown = true;
    30423148                                                handleMouseMove(e);
    3043                                                 $(document)
    3044                                                         .bind('mousemove.dur', function(e) {
    3045                                                                 handleMouseMove(e);
    3046                                                         })
    3047                                                         .bind('mouseup.dur', function (e) {
    3048                                                                 mouseIsDown = false;
    3049                                                                 timefloat.hide();
    3050                                                                 $(document).unbind('.dur');
    3051                                                         });
     3149                                                t.globalBind('mousemove.dur', function(e) {
     3150                                                        handleMouseMove(e);
     3151                                                });
     3152                                                t.globalBind('mouseup.dur', function (e) {
     3153                                                        mouseIsDown = false;
     3154                                                        timefloat.hide();
     3155                                                        t.globalUnbind('.dur');
     3156                                                });
    30523157                                                return false;
    30533158                                        }
    30543159                                })
    30553160                                .bind('mouseenter', function(e) {
    30563161                                        mouseIsOver = true;
    3057                                         $(document).bind('mousemove.dur', function(e) {
     3162                                        t.globalBind('mousemove.dur', function(e) {
    30583163                                                handleMouseMove(e);
    30593164                                        });
    30603165                                        if (!mejs.MediaFeatures.hasTouch) {
    if (typeof jQuery != 'undefined') { 
    30643169                                .bind('mouseleave',function(e) {
    30653170                                        mouseIsOver = false;
    30663171                                        if (!mouseIsDown) {
    3067                                                 $(document).unbind('.dur');
     3172                                                t.globalUnbind('.dur');
    30683173                                                timefloat.hide();
    30693174                                        }
    30703175                                });
    if (typeof jQuery != 'undefined') { 
    30803185                                player.setProgressRail(e);
    30813186                                player.setCurrentRail(e);
    30823187                        }, false);
    3083                        
    3084                        
     3188
     3189
    30853190                        // store for later use
    30863191                        t.loaded = loaded;
    30873192                        t.total = total;
    if (typeof jQuery != 'undefined') { 
    30933198                        var
    30943199                                t = this,
    30953200                                target = (e != undefined) ? e.target : t.media,
    3096                                 percent = null;                 
     3201                                percent = null;
    30973202
    30983203                        // newest HTML5 spec has buffered array (FF4, Webkit)
    30993204                        if (target && target.buffered && target.buffered.length > 0 && target.buffered.end && target.duration) {
    3100                                 // TODO: account for a real array with multiple values (only Firefox 4 has this so far) 
     3205                                // TODO: account for a real array with multiple values (only Firefox 4 has this so far)
    31013206                                percent = target.buffered.end(0) / target.duration;
    3102                         } 
     3207                        }
    31033208                        // Some browsers (e.g., FF3.6 and Safari 5) cannot calculate target.bufferered.end()
    31043209                        // to be anything other than 0. If the byte count is available we use this instead.
    31053210                        // Browsers that support the else if do not seem to have the bufferedBytes value and
    if (typeof jQuery != 'undefined') { 
    31243229                setCurrentRail: function() {
    31253230
    31263231                        var t = this;
    3127                
     3232
    31283233                        if (t.media.currentTime != undefined && t.media.duration) {
    31293234
    31303235                                // update bar and handle
    31313236                                if (t.total && t.handle) {
    3132                                         var 
    3133                                                 newWidth = t.total.width() * t.media.currentTime / t.media.duration,
    3134                                                 handlePos = newWidth - (t.handle.outerWidth(true) / 2);
     3237                                        var
     3238                                                newWidth = Math.round(t.total.width() * t.media.currentTime / t.media.duration),
     3239                                                handlePos = newWidth - Math.round(t.handle.outerWidth(true) / 2);
    31353240
    31363241                                        t.current.width(newWidth);
    31373242                                        t.handle.css('left', handlePos);
    31383243                                }
    31393244                        }
    31403245
    3141                 }       
     3246                }
    31423247        });
    31433248})(mejs.$);
     3249
    31443250(function($) {
    3145        
     3251
    31463252        // options
    31473253        $.extend(mejs.MepDefaults, {
    31483254                duration: -1,
    if (typeof jQuery != 'undefined') { 
    31543260        $.extend(MediaElementPlayer.prototype, {
    31553261                buildcurrent: function(player, controls, layers, media) {
    31563262                        var t = this;
    3157                        
     3263
    31583264                        $('<div class="mejs-time">'+
    31593265                                        '<span class="mejs-currenttime">' + (player.options.alwaysShowHours ? '00:' : '')
    31603266                                        + (player.options.showTimecodeFrameCount? '00:00:00':'00:00')+ '</span>'+
    31613267                                        '</div>')
    31623268                                        .appendTo(controls);
    3163                        
     3269
    31643270                        t.currenttime = t.controls.find('.mejs-currenttime');
    31653271
    31663272                        media.addEventListener('timeupdate',function() {
    if (typeof jQuery != 'undefined') { 
    31713277
    31723278                buildduration: function(player, controls, layers, media) {
    31733279                        var t = this;
    3174                        
     3280
    31753281                        if (controls.children().last().find('.mejs-currenttime').length > 0) {
    31763282                                $(t.options.timeAndDurationSeparator +
    3177                                         '<span class="mejs-duration">' + 
    3178                                                 (t.options.duration > 0 ? 
     3283                                        '<span class="mejs-duration">' +
     3284                                                (t.options.duration > 0 ?
    31793285                                                        mejs.Utility.secondsToTimeCode(t.options.duration, t.options.alwaysShowHours || t.media.duration > 3600, t.options.showTimecodeFrameCount,  t.options.framesPerSecond || 25) :
    3180                                                         ((player.options.alwaysShowHours ? '00:' : '') + (player.options.showTimecodeFrameCount? '00:00:00':'00:00')) 
    3181                                                 ) + 
     3286                                                        ((player.options.alwaysShowHours ? '00:' : '') + (player.options.showTimecodeFrameCount? '00:00:00':'00:00'))
     3287                                                ) +
    31823288                                        '</span>')
    31833289                                        .appendTo(controls.find('.mejs-time'));
    31843290                        } else {
    31853291
    31863292                                // add class to current time
    31873293                                controls.find('.mejs-currenttime').parent().addClass('mejs-currenttime-container');
    3188                                
     3294
    31893295                                $('<div class="mejs-time mejs-duration-container">'+
    3190                                         '<span class="mejs-duration">' + 
    3191                                                 (t.options.duration > 0 ? 
     3296                                        '<span class="mejs-duration">' +
     3297                                                (t.options.duration > 0 ?
    31923298                                                        mejs.Utility.secondsToTimeCode(t.options.duration, t.options.alwaysShowHours || t.media.duration > 3600, t.options.showTimecodeFrameCount,  t.options.framesPerSecond || 25) :
    3193                                                         ((player.options.alwaysShowHours ? '00:' : '') + (player.options.showTimecodeFrameCount? '00:00:00':'00:00')) 
    3194                                                 ) + 
     3299                                                        ((player.options.alwaysShowHours ? '00:' : '') + (player.options.showTimecodeFrameCount? '00:00:00':'00:00'))
     3300                                                ) +
    31953301                                        '</span>' +
    31963302                                '</div>')
    31973303                                .appendTo(controls);
    31983304                        }
    3199                        
     3305
    32003306                        t.durationD = t.controls.find('.mejs-duration');
    32013307
    32023308                        media.addEventListener('timeupdate',function() {
    32033309                                player.updateDuration();
    32043310                        }, false);
    32053311                },
    3206                
     3312
    32073313                updateCurrent:  function() {
    32083314                        var t = this;
    32093315
    if (typeof jQuery != 'undefined') { 
    32113317                                t.currenttime.html(mejs.Utility.secondsToTimeCode(t.media.currentTime, t.options.alwaysShowHours || t.media.duration > 3600, t.options.showTimecodeFrameCount,  t.options.framesPerSecond || 25));
    32123318                        }
    32133319                },
    3214                
    3215                 updateDuration: function() {   
     3320
     3321                updateDuration: function() {
    32163322                        var t = this;
    3217                        
    3218                         if (t.media.duration && t.durationD) {
    3219                                 t.durationD.html(mejs.Utility.secondsToTimeCode(t.media.duration, t.options.alwaysShowHours, t.options.showTimecodeFrameCount, t.options.framesPerSecond || 25));
    3220                         }               
     3323
     3324                        //Toggle the long video class if the video is longer than an hour.
     3325                        t.container.toggleClass("mejs-long-video", t.media.duration > 3600);
     3326
     3327                        if (t.durationD && (t.options.duration > 0 || t.media.duration)) {
     3328                                t.durationD.html(mejs.Utility.secondsToTimeCode(t.options.duration > 0 ? t.options.duration : t.media.duration, t.options.alwaysShowHours, t.options.showTimecodeFrameCount, t.options.framesPerSecond || 25));
     3329                        }
    32213330                }
    32223331        });
    32233332
    if (typeof jQuery != 'undefined') { 
    32273336        $.extend(mejs.MepDefaults, {
    32283337                muteText: 'Mute Toggle',
    32293338                hideVolumeOnTouchDevices: true,
    3230                
     3339
    32313340                audioVolume: 'horizontal',
    32323341                videoVolume: 'vertical'
    32333342        });
    32343343
    32353344        $.extend(MediaElementPlayer.prototype, {
    32363345                buildvolume: function(player, controls, layers, media) {
    3237                                
     3346
    32383347                        // Android and iOS don't support volume controls
    32393348                        if (mejs.MediaFeatures.hasTouch && this.options.hideVolumeOnTouchDevices)
    32403349                                return;
    3241                        
     3350
    32423351                        var t = this,
    32433352                                mode = (t.isVideo) ? t.options.videoVolume : t.options.audioVolume,
    32443353                                mute = (mode == 'horizontal') ?
    3245                                
     3354
    32463355                                // horizontal version
    32473356                                $('<div class="mejs-button mejs-volume-button mejs-mute">'+
    32483357                                        '<button type="button" aria-controls="' + t.id + '" title="' + t.options.muteText + '"></button>'+
    if (typeof jQuery != 'undefined') { 
    32543363                                '</div>'
    32553364                                )
    32563365                                        .appendTo(controls) :
    3257                                
     3366
    32583367                                // vertical version
    32593368                                $('<div class="mejs-button mejs-volume-button mejs-mute">'+
    32603369                                        '<button type="button" aria-controls="' + t.id + '" title="' + t.options.muteText + '"></button>'+
    if (typeof jQuery != 'undefined') { 
    32783387                                        volumeSlider.hide()
    32793388                                        return;
    32803389                                }
    3281                        
     3390
    32823391                                // correct to 0-1
    32833392                                volume = Math.max(0,volume);
    3284                                 volume = Math.min(volume,1);                                   
    3285                                
     3393                                volume = Math.min(volume,1);
     3394
    32863395                                // ajust mute button style
    32873396                                if (volume == 0) {
    32883397                                        mute.removeClass('mejs-mute').addClass('mejs-unmute');
    32893398                                } else {
    32903399                                        mute.removeClass('mejs-unmute').addClass('mejs-mute');
    3291                                 }                               
     3400                                }
    32923401
    3293                                 // position slider 
     3402                                // position slider
    32943403                                if (mode == 'vertical') {
    3295                                         var 
    3296                                        
     3404                                        var
     3405
    32973406                                                // height of the full size volume slider background
    32983407                                                totalHeight = volumeTotal.height(),
    3299                                                
     3408
    33003409                                                // top/left of full size volume slider background
    33013410                                                totalPosition = volumeTotal.position(),
    3302                                                
     3411
    33033412                                                // the new top position based on the current volume
    33043413                                                // 70% volume on 100px height == top:30px
    33053414                                                newTop = totalHeight - (totalHeight * volume);
    3306        
     3415
    33073416                                        // handle
    33083417                                        volumeHandle.css('top', Math.round(totalPosition.top + newTop - (volumeHandle.height() / 2)));
    3309        
     3418
    33103419                                        // show the current visibility
    33113420                                        volumeCurrent.height(totalHeight - newTop );
    33123421                                        volumeCurrent.css('top', totalPosition.top + newTop);
    33133422                                } else {
    3314                                         var 
    3315                                        
     3423                                        var
     3424
    33163425                                                // height of the full size volume slider background
    33173426                                                totalWidth = volumeTotal.width(),
    3318                                                
     3427
    33193428                                                // top/left of full size volume slider background
    33203429                                                totalPosition = volumeTotal.position(),
    3321                                                
     3430
    33223431                                                // the new left position based on the current volume
    33233432                                                newLeft = totalWidth * volume;
    3324        
     3433
    33253434                                        // handle
    33263435                                        volumeHandle.css('left', Math.round(totalPosition.left + newLeft - (volumeHandle.width() / 2)));
    3327        
     3436
    33283437                                        // rezize the current part of the volume bar
    33293438                                        volumeCurrent.width( Math.round(newLeft) );
    33303439                                }
    33313440                        },
    33323441                        handleVolumeMove = function(e) {
    3333                                
     3442
    33343443                                var volume = null,
    33353444                                        totalOffset = volumeTotal.offset();
    3336                                
     3445
    33373446                                // calculate the new volume based on the moust position
    33383447                                if (mode == 'vertical') {
    3339                                
     3448
    33403449                                        var
    33413450                                                railHeight = volumeTotal.height(),
    33423451                                                totalTop = parseInt(volumeTotal.css('top').replace(/px/,''),10),
    33433452                                                newY = e.pageY - totalOffset.top;
    3344                                                
     3453
    33453454                                        volume = (railHeight - newY) / railHeight;
    3346                                                
     3455
    33473456                                        // the controls just hide themselves (usually when mouse moves too far up)
    33483457                                        if (totalOffset.top == 0 || totalOffset.left == 0)
    33493458                                                return;
    3350                                        
     3459
    33513460                                } else {
    33523461                                        var
    33533462                                                railWidth = volumeTotal.width(),
    33543463                                                newX = e.pageX - totalOffset.left;
    3355                                                
     3464
    33563465                                        volume = newX / railWidth;
    33573466                                }
    3358                                
     3467
    33593468                                // ensure the volume isn't outside 0-1
    33603469                                volume = Math.max(0,volume);
    33613470                                volume = Math.min(volume,1);
    3362                                
    3363                                 // position the slider and handle                       
     3471
     3472                                // position the slider and handle
    33643473                                positionVolumeHandle(volume);
    3365                                
     3474
    33663475                                // set the media object (this will trigger the volumechanged event)
    33673476                                if (volume == 0) {
    33683477                                        media.setMuted(true);
    33693478                                } else {
    33703479                                        media.setMuted(false);
    33713480                                }
    3372                                 media.setVolume(volume);                       
     3481                                media.setVolume(volume);
    33733482                        },
    33743483                        mouseIsDown = false,
    33753484                        mouseIsOver = false;
    33763485
    33773486                        // SLIDER
    3378                        
     3487
    33793488                        mute
    33803489                                .hover(function() {
    33813490                                        volumeSlider.show();
    33823491                                        mouseIsOver = true;
    33833492                                }, function() {
    3384                                         mouseIsOver = false;   
    3385                                                
     3493                                        mouseIsOver = false;
     3494
    33863495                                        if (!mouseIsDown && mode == 'vertical') {
    33873496                                                volumeSlider.hide();
    33883497                                        }
    33893498                                });
    3390                        
     3499
    33913500                        volumeSlider
    33923501                                .bind('mouseover', function() {
    3393                                         mouseIsOver = true;     
     3502                                        mouseIsOver = true;
    33943503                                })
    33953504                                .bind('mousedown', function (e) {
    33963505                                        handleVolumeMove(e);
    3397                                         $(document)
    3398                                                 .bind('mousemove.vol', function(e) {
    3399                                                         handleVolumeMove(e);
    3400                                                 })
    3401                                                 .bind('mouseup.vol', function () {
    3402                                                         mouseIsDown = false;
    3403                                                         $(document).unbind('.vol');
     3506                                        t.globalBind('mousemove.vol', function(e) {
     3507                                                handleVolumeMove(e);
     3508                                        });
     3509                                        t.globalBind('mouseup.vol', function () {
     3510                                                mouseIsDown = false;
     3511                                                t.globalUnbind('.vol');
    34043512
    3405                                                         if (!mouseIsOver && mode == 'vertical') {
    3406                                                                 volumeSlider.hide();
    3407                                                         }
    3408                                                 });
     3513                                                if (!mouseIsOver && mode == 'vertical') {
     3514                                                        volumeSlider.hide();
     3515                                                }
     3516                                        });
    34093517                                        mouseIsDown = true;
    3410                                                
     3518
    34113519                                        return false;
    34123520                                });
    34133521
    if (typeof jQuery != 'undefined') { 
    34333541                        if (t.container.is(':visible')) {
    34343542                                // set initial volume
    34353543                                positionVolumeHandle(player.options.startVolume);
    3436                                
     3544
     3545                                // mutes the media and sets the volume icon muted if the initial volume is set to 0
     3546        if (player.options.startVolume === 0) {
     3547          media.setMuted(true);
     3548        }
     3549
    34373550                                // shim gets the startvolume as a parameter, but we have to set it on the native <video> and <audio> elements
    34383551                                if (media.pluginType === 'native') {
    34393552                                        media.setVolume(player.options.startVolume);
    if (typeof jQuery != 'undefined') { 
    34413554                        }
    34423555                }
    34433556        });
    3444        
     3557
    34453558})(mejs.$);
    34463559
    34473560(function($) {
    if (typeof jQuery != 'undefined') { 
    34733586                        if (mejs.MediaFeatures.hasTrueNativeFullScreen) {
    34743587
    34753588                                // chrome doesn't alays fire this in an iframe
    3476                                 var target = null;
    3477 
    3478                                 if (mejs.MediaFeatures.hasMozNativeFullScreen) {
    3479                                         target = $(document);
    3480                                 } else {
    3481                                         target = player.container;
    3482                                 }
    3483 
    3484                                 target.bind(mejs.MediaFeatures.fullScreenEventName, function(e) {
     3589                                var func = function(e) {
    34853590
    34863591                                        if (mejs.MediaFeatures.isFullScreen()) {
    34873592                                                player.isNativeFullScreen = true;
    if (typeof jQuery != 'undefined') { 
    34933598                                                // make sure to put the player back into place
    34943599                                                player.exitFullScreen();
    34953600                                        }
    3496                                 });
     3601                                };
     3602
     3603                                if (mejs.MediaFeatures.hasMozNativeFullScreen) {
     3604                                        player.globalBind(mejs.MediaFeatures.fullScreenEventName, func);
     3605                                } else {
     3606                                        player.container.bind(mejs.MediaFeatures.fullScreenEventName, func);
     3607                                }
    34973608                        }
    34983609
    34993610                        var t = this,
    if (typeof jQuery != 'undefined') { 
    35993710                                                                                 left: fullScreenBtnOffset + fullScreenBtnWidth});
    36003711                                                        };
    36013712
    3602                                                 $(document).resize(function() {
     3713                                                t.globalBind('resize', function() {
    36033714                                                        positionHoverDivs();
    36043715                                                });
    36053716
    if (typeof jQuery != 'undefined') { 
    36393750                                                // the mouseout event doesn't work on the fullscren button, because we already killed the pointer-events
    36403751                                                // so we use the document.mousemove event to restore controls when the mouse moves outside the fullscreen button
    36413752                                                /*
    3642                                                 $(document).mousemove(function(e) {
     3753                                                t.globalBind('mousemove', function(e) {
    36433754
    36443755                                                        // if the mouse is anywhere but the fullsceen button, then restore it all
    36453756                                                        if (fullscreenIsDisabled) {
    if (typeof jQuery != 'undefined') { 
    36973808
    36983809                        player.fullscreenBtn = fullscreenBtn;
    36993810
    3700                         $(document).bind('keydown',function (e) {
     3811                        t.globalBind('keydown',function (e) {
    37013812                                if (((mejs.MediaFeatures.hasTrueNativeFullScreen && mejs.MediaFeatures.isFullScreen()) || t.isFullScreen) && e.keyCode == 27) {
    37023813                                        player.exitFullScreen();
    37033814                                }
    37043815                        });
    37053816
    37063817                },
     3818
     3819                cleanfullscreen: function(player) {
     3820                        player.exitFullScreen();
     3821                },
     3822
    37073823                enterFullScreen: function() {
    37083824
    37093825                        var t = this;
    if (typeof jQuery != 'undefined') { 
    38073923                                        .width('100%')
    38083924                                        .height('100%');
    38093925                        } else {
    3810                                 t.container.find('object, embed, iframe')
     3926                                t.container.find('.mejs-shim')
    38113927                                        .width('100%')
    38123928                                        .height('100%');
    38133929
    if (typeof jQuery != 'undefined') { 
    38844000
    38854001(function($) {
    38864002
    3887         // add extra default options 
     4003        // add extra default options
    38884004        $.extend(mejs.MepDefaults, {
    38894005                // this will automatically turn on a <track>
    38904006                startLanguage: '',
    3891                
    3892                 tracksText: 'Captions/Subtitles'
     4007
     4008                tracksText: 'Captions/Subtitles',
     4009
     4010                // option to remove the [cc] button when no <track kind="subtitles"> are present
     4011                hideCaptionsButtonWhenEmpty: true,
     4012
     4013                // If true and we only have one track, change captions to popup
     4014                toggleCaptionsButtonWhenOnlyOne: false,
     4015
     4016                // #id or .class
     4017                slidesSelector: ''
    38934018        });
    38944019
    38954020        $.extend(MediaElementPlayer.prototype, {
    3896        
     4021
    38974022                hasChapters: false,
    38984023
    38994024                buildtracks: function(player, controls, layers, media) {
    if (typeof jQuery != 'undefined') { 
    39034028                        if (player.tracks.length == 0)
    39044029                                return;
    39054030
    3906                         var t= this, i, options = '';
     4031                        var t = this,
     4032                                i,
     4033                                options = '';
    39074034
    3908                         player.chapters = 
     4035                        player.chapters =
    39094036                                        $('<div class="mejs-chapters mejs-layer"></div>')
    39104037                                                .prependTo(layers).hide();
    3911                         player.captions = 
    3912                                         $('<div class="mejs-captions-layer mejs-layer"><div class="mejs-captions-position"><span class="mejs-captions-text"></span></div></div>')
     4038                        player.captions =
     4039                                        $('<div class="mejs-captions-layer mejs-layer"><div class="mejs-captions-position mejs-captions-position-hover"><span class="mejs-captions-text"></span></div></div>')
    39134040                                                .prependTo(layers).hide();
    39144041                        player.captionsText = player.captions.find('.mejs-captions-text');
    3915                         player.captionsButton = 
     4042                        player.captionsButton =
    39164043                                        $('<div class="mejs-button mejs-captions-button">'+
    39174044                                                '<button type="button" aria-controls="' + t.id + '" title="' + t.options.tracksText + '"></button>'+
    39184045                                                '<div class="mejs-captions-selector">'+
    if (typeof jQuery != 'undefined') { 
    39244051                                                        '</ul>'+
    39254052                                                '</div>'+
    39264053                                        '</div>')
    3927                                                 .appendTo(controls)
    3928                                                
    3929                                                 // hover
    3930                                                 .hover(function() {
    3931                                                         $(this).find('.mejs-captions-selector').css('visibility','visible');
    3932                                                 }, function() {
    3933                                                         $(this).find('.mejs-captions-selector').css('visibility','hidden');
    3934                                                 })                                     
    3935                                                
    3936                                                 // handle clicks to the language radio buttons
    3937                                                 .delegate('input[type=radio]','click',function() {
    3938                                                         lang = this.value;
    3939 
    3940                                                         if (lang == 'none') {
    3941                                                                 player.selectedTrack = null;
    3942                                                         } else {
    3943                                                                 for (i=0; i<player.tracks.length; i++) {
    3944                                                                         if (player.tracks[i].srclang == lang) {
    3945                                                                                 player.selectedTrack = player.tracks[i];
    3946                                                                                 player.captions.attr('lang', player.selectedTrack.srclang);
    3947                                                                                 player.displayCaptions();
    3948                                                                                 break;
    3949                                                                         }
    3950                                                                 }
    3951                                                         }
    3952                                                 });
    3953                                                 //.bind('mouseenter', function() {
    3954                                                 //      player.captionsButton.find('.mejs-captions-selector').css('visibility','visible')
    3955                                                 //});
     4054                                                .appendTo(controls);
     4055
     4056
     4057                        var subtitleCount = 0;
     4058                        for (i=0; i<player.tracks.length; i++) {
     4059                                if (player.tracks[i].kind == 'subtitles') {
     4060                                        subtitleCount++;
     4061                                }
     4062                        }
     4063
     4064                        // if only one language then just make the button a toggle
     4065                        if (t.options.toggleCaptionsButtonWhenOnlyOne && subtitleCount == 1){
     4066                                // click
     4067                                player.captionsButton.on('click',function() {
     4068                                        if (player.selectedTrack == null) {
     4069                                                var lang = player.tracks[0].srclang;
     4070                                        } else {
     4071                                                var lang = 'none';
     4072                                        }
     4073                                        player.setTrack(lang);
     4074                                });
     4075                        } else {
     4076                                // hover
     4077                                player.captionsButton.hover(function() {
     4078                                        $(this).find('.mejs-captions-selector').css('visibility','visible');
     4079                                }, function() {
     4080                                        $(this).find('.mejs-captions-selector').css('visibility','hidden');
     4081                                })
     4082
     4083                                // handle clicks to the language radio buttons
     4084                                .on('click','input[type=radio]',function() {
     4085                                        lang = this.value;
     4086                                        player.setTrack(lang);
     4087                                });
     4088
     4089                        }
    39564090
    39574091                        if (!player.options.alwaysShowControls) {
    39584092                                // move with controls
    39594093                                player.container
    3960                                         .bind('mouseenter', function () {
     4094                                        .bind('controlsshown', function () {
    39614095                                                // push captions above controls
    39624096                                                player.container.find('.mejs-captions-position').addClass('mejs-captions-position-hover');
    39634097
    39644098                                        })
    3965                                         .bind('mouseleave', function () {
     4099                                        .bind('controlshidden', function () {
    39664100                                                if (!media.paused) {
    39674101                                                        // move back to normal place
    39684102                                                        player.container.find('.mejs-captions-position').removeClass('mejs-captions-position-hover');
    if (typeof jQuery != 'undefined') { 
    39764110                        player.selectedTrack = null;
    39774111                        player.isLoadingTrack = false;
    39784112
    3979                        
     4113
    39804114
    39814115                        // add to list
    39824116                        for (i=0; i<player.tracks.length; i++) {
    if (typeof jQuery != 'undefined') { 
    39854119                                }
    39864120                        }
    39874121
     4122                        // start loading tracks
    39884123                        player.loadNextTrack();
    39894124
    39904125
    if (typeof jQuery != 'undefined') { 
    39924127                                player.displayCaptions();
    39934128                        }, false);
    39944129
     4130                        if (player.options.slidesSelector != '') {
     4131                                player.slidesContainer = $(player.options.slidesSelector);
     4132
     4133                                media.addEventListener('timeupdate',function(e) {
     4134                                        player.displaySlides();
     4135                                }, false);
     4136
     4137                        }
     4138
    39954139                        media.addEventListener('loadedmetadata', function(e) {
    39964140                                player.displayChapters();
    39974141                        }, false);
    if (typeof jQuery != 'undefined') { 
    40124156                                                });
    40134157                                        }
    40144158                                });
    4015                                
     4159
    40164160                        // check for autoplay
    40174161                        if (player.node.getAttribute('autoplay') !== null) {
    40184162                                player.chapters.css('visibility','hidden');
    40194163                        }
    40204164                },
    40214165
     4166                setTrack: function(lang){
     4167
     4168                        var t = this,
     4169                                i;
     4170
     4171                        if (lang == 'none') {
     4172                                t.selectedTrack = null;
     4173                                t.captionsButton.removeClass('mejs-captions-enabled');
     4174                        } else {
     4175                                for (i=0; i<t.tracks.length; i++) {
     4176                                        if (t.tracks[i].srclang == lang) {
     4177                                                if (t.selectedTrack == null)
     4178                                                    t.captionsButton.addClass('mejs-captions-enabled');
     4179                                                t.selectedTrack = t.tracks[i];
     4180                                                t.captions.attr('lang', t.selectedTrack.srclang);
     4181                                                t.displayCaptions();
     4182                                                break;
     4183                                        }
     4184                                }
     4185                        }
     4186                },
     4187
    40224188                loadNextTrack: function() {
    40234189                        var t = this;
    40244190
    if (typeof jQuery != 'undefined') { 
    40294195                        } else {
    40304196                                // add done?
    40314197                                t.isLoadingTrack = false;
     4198
     4199                                t.checkForTracks();
    40324200                        }
    40334201                },
    40344202
    if (typeof jQuery != 'undefined') { 
    40564224
    40574225                                        // parse the loaded file
    40584226                                        if (typeof d == "string" && (/<tt\s+xml/ig).exec(d)) {
    4059                                                 track.entries = mejs.TrackFormatParser.dfxp.parse(d);                                   
    4060                                         } else {       
     4227                                                track.entries = mejs.TrackFormatParser.dfxp.parse(d);
     4228                                        } else {
    40614229                                                track.entries = mejs.TrackFormatParser.webvvt.parse(d);
    40624230                                        }
    4063                                        
     4231
    40644232                                        after();
    40654233
    40664234                                        if (track.kind == 'chapters') {
    if (typeof jQuery != 'undefined') { 
    40704238                                                        }
    40714239                                                }, false);
    40724240                                        }
     4241
     4242                                        if (track.kind == 'slides') {
     4243                                                t.setupSlides(track);
     4244                                        }
    40734245                                },
    40744246                                error: function() {
    40754247                                        t.loadNextTrack();
    if (typeof jQuery != 'undefined') { 
    40794251
    40804252                enableTrackButton: function(lang, label) {
    40814253                        var t = this;
    4082                        
     4254
    40834255                        if (label === '') {
    40844256                                label = mejs.language.codes[lang] || lang;
    4085                         }                       
     4257                        }
    40864258
    40874259                        t.captionsButton
    40884260                                .find('input[value=' + lang + ']')
    if (typeof jQuery != 'undefined') { 
    41264298                        );
    41274299                },
    41284300
     4301                checkForTracks: function() {
     4302                        var
     4303                                t = this,
     4304                                hasSubtitles = false;
     4305
     4306                        // check if any subtitles
     4307                        if (t.options.hideCaptionsButtonWhenEmpty) {
     4308                                for (i=0; i<t.tracks.length; i++) {
     4309                                        if (t.tracks[i].kind == 'subtitles') {
     4310                                                hasSubtitles = true;
     4311                                                break;
     4312                                        }
     4313                                }
     4314
     4315                                if (!hasSubtitles) {
     4316                                        t.captionsButton.hide();
     4317                                        t.setControlsSize();
     4318                                }
     4319                        }
     4320                },
     4321
    41294322                displayCaptions: function() {
    41304323
    41314324                        if (typeof this.tracks == 'undefined')
    if (typeof jQuery != 'undefined') { 
    41504343                        }
    41514344                },
    41524345
     4346                setupSlides: function(track) {
     4347                        var t = this;
     4348
     4349                        t.slides = track;
     4350                        t.slides.entries.imgs = [t.slides.entries.text.length];
     4351                        t.showSlide(0);
     4352
     4353                },
     4354
     4355                showSlide: function(index) {
     4356                        if (typeof this.tracks == 'undefined' || typeof this.slidesContainer == 'undefined') {
     4357                                return;
     4358                        }
     4359
     4360                        var t = this,
     4361                                url = t.slides.entries.text[index],
     4362                                img = t.slides.entries.imgs[index];
     4363
     4364                        if (typeof img == 'undefined' || typeof img.fadeIn == 'undefined') {
     4365
     4366                                t.slides.entries.imgs[index] = img = $('<img src="' + url + '">')
     4367                                                .on('load', function() {
     4368                                                        img.appendTo(t.slidesContainer)
     4369                                                                .hide()
     4370                                                                .fadeIn()
     4371                                                                .siblings(':visible')
     4372                                                                        .fadeOut();
     4373
     4374                                                });
     4375
     4376                        } else {
     4377
     4378                                if (!img.is(':visible') && !img.is(':animated')) {
     4379
     4380                                        console.log('showing existing slide');
     4381
     4382                                        img.fadeIn()
     4383                                                .siblings(':visible')
     4384                                                        .fadeOut();
     4385                                }
     4386                        }
     4387
     4388                },
     4389
     4390                displaySlides: function() {
     4391
     4392                        if (typeof this.slides == 'undefined')
     4393                                return;
     4394
     4395                        var
     4396                                t = this,
     4397                                slides = t.slides,
     4398                                i;
     4399
     4400                        for (i=0; i<slides.entries.times.length; i++) {
     4401                                if (t.media.currentTime >= slides.entries.times[i].start && t.media.currentTime <= slides.entries.times[i].stop){
     4402
     4403                                        t.showSlide(i);
     4404
     4405                                        return; // exit out if one is visible;
     4406                                }
     4407                        }
     4408                },
     4409
    41534410                displayChapters: function() {
    4154                         var 
     4411                        var
    41554412                                t = this,
    41564413                                i;
    41574414
    if (typeof jQuery != 'undefined') { 
    41654422                },
    41664423
    41674424                drawChapters: function(chapters) {
    4168                         var 
     4425                        var
    41694426                                t = this,
    41704427                                i,
    41714428                                dur,
    if (typeof jQuery != 'undefined') { 
    41914448                                //}
    41924449
    41934450                                t.chapters.append( $(
    4194                                         '<div class="mejs-chapter" rel="' + chapters.entries.times[i].start + '" style="left: ' + usedPercent.toString() + '%;width: ' + percent.toString() + '%;">' + 
    4195                                                 '<div class="mejs-chapter-block' + ((i==chapters.entries.times.length-1) ? ' mejs-chapter-block-last' : '') + '">' + 
    4196                                                         '<span class="ch-title">' + chapters.entries.text[i] + '</span>' + 
    4197                                                         '<span class="ch-time">' + mejs.Utility.secondsToTimeCode(chapters.entries.times[i].start) + '&ndash;' + mejs.Utility.secondsToTimeCode(chapters.entries.times[i].stop) + '</span>' + 
     4451                                        '<div class="mejs-chapter" rel="' + chapters.entries.times[i].start + '" style="left: ' + usedPercent.toString() + '%;width: ' + percent.toString() + '%;">' +
     4452                                                '<div class="mejs-chapter-block' + ((i==chapters.entries.times.length-1) ? ' mejs-chapter-block-last' : '') + '">' +
     4453                                                        '<span class="ch-title">' + chapters.entries.text[i] + '</span>' +
     4454                                                        '<span class="ch-time">' + mejs.Utility.secondsToTimeCode(chapters.entries.times[i].start) + '&ndash;' + mejs.Utility.secondsToTimeCode(chapters.entries.times[i].stop) + '</span>' +
    41984455                                                '</div>' +
    41994456                                        '</div>'));
    42004457                                usedPercent += percent;
    if (typeof jQuery != 'undefined') { 
    42034460                        t.chapters.find('div.mejs-chapter').click(function() {
    42044461                                t.media.setCurrentTime( parseFloat( $(this).attr('rel') ) );
    42054462                                if (t.media.paused) {
    4206                                         t.media.play(); 
     4463                                        t.media.play();
    42074464                                }
    42084465                        });
    42094466
    if (typeof jQuery != 'undefined') { 
    42784535        Parses WebVVT format which should be formatted as
    42794536        ================================
    42804537        WEBVTT
    4281        
     4538
    42824539        1
    42834540        00:00:01,1 --> 00:00:05,000
    42844541        A line of text
    if (typeof jQuery != 'undefined') { 
    42864543        2
    42874544        00:01:15,1 --> 00:02:05,000
    42884545        A second line of text
    4289        
     4546
    42904547        ===============================
    42914548
    42924549        Adapted from: http://www.delphiki.com/html5/playr
    if (typeof jQuery != 'undefined') { 
    42984555                        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})?)(.*)$/,
    42994556
    43004557                        parse: function(trackText) {
    4301                                 var 
     4558                                var
    43024559                                        i = 0,
    43034560                                        lines = mejs.TrackFormatParser.split2(trackText, /\r?\n/),
    43044561                                        entries = {text:[], times:[]},
    if (typeof jQuery != 'undefined') { 
    43094566                                        if (this.pattern_identifier.exec(lines[i])){
    43104567                                                // skip to the next line where the start --> end time code should be
    43114568                                                i++;
    4312                                                 timecode = this.pattern_timecode.exec(lines[i]);                               
     4569                                                timecode = this.pattern_timecode.exec(lines[i]);
    43134570
    43144571                                                if (timecode && i<lines.length){
    43154572                                                        i++;
    if (typeof jQuery != 'undefined') { 
    43394596                dfxp: {
    43404597                        parse: function(trackText) {
    43414598                                trackText = $(trackText).filter("tt");
    4342                                 var 
     4599                                var
    43434600                                        i = 0,
    43444601                                        container = trackText.children("div").eq(0),
    43454602                                        lines = container.find("p"),
    if (typeof jQuery != 'undefined') { 
    43754632                                        if (styles) {
    43764633                                                style = "";
    43774634                                                for (var _style in styles) {
    4378                                                         style += _style + ":" + styles[_style] + ";";                                   
     4635                                                        style += _style + ":" + styles[_style] + ";";
    43794636                                                }
    43804637                                        }
    43814638                                        if (style) _temp_times.style = style;
    if (typeof jQuery != 'undefined') { 
    43944651                        return text.split(regex);
    43954652                }
    43964653        };
    4397        
     4654
    43984655        // test for browsers with bad String.split method.
    43994656        if ('x\n\ny'.split(/\n/gi).length != 3) {
    44004657                // add super slow IE8 and below version
    44014658                mejs.TrackFormatParser.split2 = function(text, regex) {
    4402                         var 
    4403                                 parts = [], 
     4659                        var
     4660                                parts = [],
    44044661                                chunk = '',
    44054662                                i;
    44064663
    if (typeof jQuery != 'undefined') { 
    44144671                        parts.push(chunk);
    44154672                        return parts;
    44164673                }
    4417         }       
     4674        }
    44184675
    44194676})(mejs.$);
    44204677
    44214678/*
    44224679* ContextMenu Plugin
    4423 * 
     4680*
    44244681*
    44254682*/
    44264683
    if (typeof jQuery != 'undefined') { 
    44294686$.extend(mejs.MepDefaults,
    44304687        { 'contextMenuItems': [
    44314688                // demo of a fullscreen option
    4432                 { 
     4689                {
    44334690                        render: function(player) {
    4434                                
     4691
    44354692                                // check for fullscreen plugin
    44364693                                if (typeof player.enterFullScreen == 'undefined')
    44374694                                        return null;
    4438                        
     4695
    44394696                                if (player.isFullScreen) {
    44404697                                        return "Turn off Fullscreen";
    44414698                                } else {
    $.extend(mejs.MepDefaults, 
    44524709                }
    44534710                ,
    44544711                // demo of a mute/unmute button
    4455                 { 
     4712                {
    44564713                        render: function(player) {
    44574714                                if (player.media.muted) {
    44584715                                        return "Unmute";
    $.extend(mejs.MepDefaults, 
    44744731                }
    44754732                ,
    44764733                // demo of simple download video
    4477                 { 
     4734                {
    44784735                        render: function(player) {
    44794736                                return "Download Video";
    44804737                        },
    44814738                        click: function(player) {
    44824739                                window.location.href = player.media.currentSrc;
    44834740                        }
    4484                 }       
     4741                }
    44854742        ]}
    44864743);
    44874744
    44884745
    44894746        $.extend(MediaElementPlayer.prototype, {
    44904747                buildcontextmenu: function(player, controls, layers, media) {
    4491                        
     4748
    44924749                        // create context menu
    44934750                        player.contextMenu = $('<div class="mejs-contextmenu"></div>')
    44944751                                                                .appendTo($('body'))
    44954752                                                                .hide();
    4496                        
     4753
    44974754                        // create events for showing context menu
    44984755                        player.container.bind('contextmenu', function(e) {
    44994756                                if (player.isContextMenuEnabled) {
    $.extend(mejs.MepDefaults, 
    45044761                        });
    45054762                        player.container.bind('click', function() {
    45064763                                player.contextMenu.hide();
    4507                         });     
     4764                        });
    45084765                        player.contextMenu.bind('mouseleave', function() {
    45094766
    45104767                                //console.log('context hover out');
    45114768                                player.startContextMenuTimer();
    4512                                
    4513                         });             
     4769
     4770                        });
    45144771                },
    4515                
     4772
     4773                cleancontextmenu: function(player) {
     4774                        player.contextMenu.remove();
     4775                },
     4776
    45164777                isContextMenuEnabled: true,
    45174778                enableContextMenu: function() {
    45184779                        this.isContextMenuEnabled = true;
    $.extend(mejs.MepDefaults, 
    45204781                disableContextMenu: function() {
    45214782                        this.isContextMenuEnabled = false;
    45224783                },
    4523                
     4784
    45244785                contextMenuTimeout: null,
    45254786                startContextMenuTimer: function() {
    45264787                        //console.log('startContextMenuTimer');
    4527                        
     4788
    45284789                        var t = this;
    4529                        
     4790
    45304791                        t.killContextMenuTimer();
    4531                        
     4792
    45324793                        t.contextMenuTimer = setTimeout(function() {
    45334794                                t.hideContextMenu();
    45344795                                t.killContextMenuTimer();
    $.extend(mejs.MepDefaults, 
    45364797                },
    45374798                killContextMenuTimer: function() {
    45384799                        var timer = this.contextMenuTimer;
    4539                        
     4800
    45404801                        //console.log('killContextMenuTimer', timer);
    4541                        
    4542                         if (timer != null) {                           
     4802
     4803                        if (timer != null) {
    45434804                                clearTimeout(timer);
    45444805                                delete timer;
    45454806                                timer = null;
    45464807                        }
    4547                 },             
    4548                
     4808                },
     4809
    45494810                hideContextMenu: function() {
    45504811                        this.contextMenu.hide();
    45514812                },
    4552                
     4813
    45534814                renderContextMenu: function(x,y) {
    4554                        
     4815
    45554816                        // alway re-render the items so that things like "turn fullscreen on" and "turn fullscreen off" are always written correctly
    45564817                        var t = this,
    45574818                                html = '',
    45584819                                items = t.options.contextMenuItems;
    4559                        
     4820
    45604821                        for (var i=0, il=items.length; i<il; i++) {
    4561                                
     4822
    45624823                                if (items[i].isSeparator) {
    45634824                                        html += '<div class="mejs-contextmenu-separator"></div>';
    45644825                                } else {
    4565                                
     4826
    45664827                                        var rendered = items[i].render(t);
    4567                                
     4828
    45684829                                        // render can return null if the item doesn't need to be used at the moment
    45694830                                        if (rendered != null) {
    45704831                                                html += '<div class="mejs-contextmenu-item" data-itemindex="' + i + '" id="element-' + (Math.random()*1000000) + '">' + rendered + '</div>';
    45714832                                        }
    45724833                                }
    45734834                        }
    4574                        
     4835
    45754836                        // position and show the context menu
    45764837                        t.contextMenu
    45774838                                .empty()
    45784839                                .append($(html))
    45794840                                .css({top:y, left:x})
    45804841                                .show();
    4581                                
     4842
    45824843                        // bind events
    45834844                        t.contextMenu.find('.mejs-contextmenu-item').each(function() {
    4584                                                        
     4845
    45854846                                // which one is this?
    45864847                                var $dom = $(this),
    45874848                                        itemIndex = parseInt( $dom.data('itemindex'), 10 ),
    45884849                                        item = t.options.contextMenuItems[itemIndex];
    4589                                
     4850
    45904851                                // bind extra functionality?
    45914852                                if (typeof item.show != 'undefined')
    45924853                                        item.show( $dom , t);
    4593                                
     4854
    45944855                                // bind click action
    4595                                 $dom.click(function() {                 
     4856                                $dom.click(function() {
    45964857                                        // perform click action
    45974858                                        if (typeof item.click != 'undefined')
    45984859                                                item.click(t);
    4599                                        
     4860
    46004861                                        // close
    4601                                         t.contextMenu.hide();                           
    4602                                 });                             
    4603                         });     
    4604                        
     4862                                        t.contextMenu.hide();
     4863                                });
     4864                        });
     4865
    46054866                        // stop the controls from hiding
    46064867                        setTimeout(function() {
    4607                                 t.killControlsTimer('rev3');   
     4868                                t.killControlsTimer('rev3');
    46084869                        }, 100);
    4609                                                
     4870
    46104871                }
    46114872        });
    4612        
     4873
    46134874})(mejs.$);
    46144875/**
    46154876 * Postroll plugin
  • wp-includes/js/mediaelement/mediaelement-and-player.min.js

    diff --git wp-includes/js/mediaelement/mediaelement-and-player.min.js wp-includes/js/mediaelement/mediaelement-and-player.min.js
    index dfd11c7..6f38e1b 100644
     
    88* Can play MP4 (H.264), Ogg, WebM, FLV, WMV, WMA, ACC, and MP3
    99*
    1010* Copyright 2010-2012, John Dyer (http://j.hn)
    11 * Dual licensed under the MIT or GPL Version 2 licenses.
     11* License: MIT
    1212*
    13 */
    14 var mejs=mejs||{};mejs.version="2.10.1";mejs.meIndex=0;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"]}],vimeo:[{version:null,types:["video/vimeo","video/x-vimeo"]}]};mejs.Utility={encodeUrl:function(a){return encodeURIComponent(a)},escapeHTML:function(a){return a.toString().split("&").join("&amp;").split("<").join("&lt;").split('"').join("&quot;")},absolutizeUrl:function(a){var b=document.createElement("div");b.innerHTML='<a href="'+this.escapeHTML(a)+'">x</a>';return b.firstChild.href},getScriptPath:function(h){var e=0,c,k="",a="",f,b=document.getElementsByTagName("script"),g=b.length,d=h.length;for(;e<g;e++){f=b[e].src;for(c=0;c<d;c++){a=h[c];if(f.indexOf(a)>-1){k=f.substring(0,f.indexOf(a));break}}if(k!==""){break}}return k},secondsToTimeCode:function(c,g,a,b){if(typeof a=="undefined"){a=false}else{if(typeof b=="undefined"){b=25}}var f=Math.floor(c/3600)%24,d=Math.floor(c/60)%60,h=Math.floor(c%60),e=Math.floor(((c%1)*b).toFixed(3)),j=((g||f>0)?(f<10?"0"+f:f)+":":"")+(d<10?"0"+d:d)+":"+(h<10?"0"+h:h)+((a)?":"+(e<10?"0"+e:e):"");return j},timeCodeToSeconds:function(c,k,d,e){if(typeof d=="undefined"){d=false}else{if(typeof e=="undefined"){e=25}}var f=c.split(":"),a=parseInt(f[0],10),b=parseInt(f[1],10),h=parseInt(f[2],10),j=0,g=0;if(d){j=parseInt(f[3])/e}g=(a*3600)+(b*60)+h+j;return g},convertSMPTEtoSeconds:function(a){if(typeof a!="string"){return false}a=a.replace(",",".");var d=0,b=(a.indexOf(".")!=-1)?a.split(".")[1].length:0,e=1;a=a.split(":").reverse();for(var c=0;c<a.length;c++){e=1;if(c>0){e=Math.pow(60,c)}d+=Number(a[c])*e}return Number(d.toFixed(b))},removeSwf:function(b){var a=document.getElementById(b);if(a&&a.nodeName=="OBJECT"){if(mejs.MediaFeatures.isIE){a.style.display="none";(function(){if(a.readyState==4){mejs.Utility.removeObjectInIE(b)}else{setTimeout(arguments.callee,10)}})()}else{a.parentNode.removeChild(a)}}},removeObjectInIE:function(c){var b=document.getElementById(c);if(b){for(var a in b){if(typeof b[a]=="function"){b[a]=null}}b.parentNode.removeChild(b)}}};mejs.PluginDetector={hasPluginVersion:function(c,a){var b=this.plugins[c];a[1]=a[1]||0;a[2]=a[2]||0;return(b[0]>a[0]||(b[0]==a[0]&&b[1]>a[1])||(b[0]==a[0]&&b[1]==a[1]&&b[2]>=a[2]))?true:false},nav:window.navigator,ua:window.navigator.userAgent.toLowerCase(),plugins:[],addPlugin:function(d,c,e,a,b){this.plugins[d]=this.detectPlugin(c,e,a,b)},detectPlugin:function(g,b,c,k){var h=[0,0,0],j,d,a;if(typeof(this.nav.plugins)!="undefined"&&typeof this.nav.plugins[g]=="object"){j=this.nav.plugins[g].description;if(j&&!(typeof this.nav.mimeTypes!="undefined"&&this.nav.mimeTypes[b]&&!this.nav.mimeTypes[b].enabledPlugin)){h=j.replace(g,"").replace(/^\s+/,"").replace(/\sr/gi,".").split(".");for(d=0;d<h.length;d++){h[d]=parseInt(h[d].match(/\d+/),10)}}}else{if(typeof(window.ActiveXObject)!="undefined"){try{a=new ActiveXObject(c);if(a){h=k(a)}}catch(f){}}}return h}};mejs.PluginDetector.addPlugin("flash","Shockwave Flash","application/x-shockwave-flash","ShockwaveFlash.ShockwaveFlash",function(b){var a=[],c=b.GetVariable("$version");if(c){c=c.split(" ")[1].split(",");a=[parseInt(c[0],10),parseInt(c[1],10),parseInt(c[2],10)]}return a});mejs.PluginDetector.addPlugin("silverlight","Silverlight Plug-In","application/x-silverlight-2","AgControl.AgControl",function(b){var a=[0,0,0,0],c=function(f,d,e,g){while(f.isVersionSupported(d[0]+"."+d[1]+"."+d[2]+"."+d[3])){d[e]+=g}d[e]-=g};c(b,a,0,1);c(b,a,1,1);c(b,a,2,10000);c(b,a,2,1000);c(b,a,2,100);c(b,a,2,10);c(b,a,2,1);c(b,a,3,1);return a});mejs.MediaFeatures={init:function(){var e=this,h=document,g=mejs.PluginDetector.nav,c=mejs.PluginDetector.ua.toLowerCase(),b,a,f=["source","track","audio","video"];e.isiPad=(c.match(/ipad/i)!==null);e.isiPhone=(c.match(/iphone/i)!==null);e.isiOS=e.isiPhone||e.isiPad;e.isAndroid=(c.match(/android/i)!==null);e.isBustedAndroid=(c.match(/android 2\.[12]/)!==null);e.isIE=(g.appName.toLowerCase().indexOf("microsoft")!=-1);e.isChrome=(c.match(/chrome/gi)!==null);e.isFirefox=(c.match(/firefox/gi)!==null);e.isWebkit=(c.match(/webkit/gi)!==null);e.isGecko=(c.match(/gecko/gi)!==null)&&!e.isWebkit;e.isOpera=(c.match(/opera/gi)!==null);e.hasTouch=("ontouchstart" in window);e.svg=!!document.createElementNS&&!!document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect;for(b=0;b<f.length;b++){a=document.createElement(f[b])}e.supportsMediaTag=(typeof a.canPlayType!=="undefined"||e.isBustedAndroid);e.hasSemiNativeFullScreen=(typeof a.webkitEnterFullscreen!=="undefined");e.hasWebkitNativeFullScreen=(typeof a.webkitRequestFullScreen!=="undefined");e.hasMozNativeFullScreen=(typeof a.mozRequestFullScreen!=="undefined");e.hasTrueNativeFullScreen=(e.hasWebkitNativeFullScreen||e.hasMozNativeFullScreen);e.nativeFullScreenEnabled=e.hasTrueNativeFullScreen;if(e.hasMozNativeFullScreen){e.nativeFullScreenEnabled=a.mozFullScreenEnabled}if(this.isChrome){e.hasSemiNativeFullScreen=false}if(e.hasTrueNativeFullScreen){e.fullScreenEventName=(e.hasWebkitNativeFullScreen)?"webkitfullscreenchange":"mozfullscreenchange";e.isFullScreen=function(){if(a.mozRequestFullScreen){return h.mozFullScreen}else{if(a.webkitRequestFullScreen){return h.webkitIsFullScreen}}};e.requestFullScreen=function(d){if(e.hasWebkitNativeFullScreen){d.webkitRequestFullScreen()}else{if(e.hasMozNativeFullScreen){d.mozRequestFullScreen()}}};e.cancelFullScreen=function(){if(e.hasWebkitNativeFullScreen){document.webkitCancelFullScreen()}else{if(e.hasMozNativeFullScreen){document.mozCancelFullScreen()}}}}if(e.hasSemiNativeFullScreen&&c.match(/mac os x 10_5/i)){e.hasNativeFullScreen=false;e.hasSemiNativeFullScreen=false}}};mejs.MediaFeatures.init();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){var c=this.getElementsByTagName("source");while(c.length>0){this.removeChild(c[0])}if(typeof a=="string"){this.src=a}else{var b,d;for(b=0;b<a.length;b++){d=a[b];if(this.canPlayType(d.type)){this.src=d.src;break}}}},setVideoSize:function(b,a){this.width=b;this.height=a}};mejs.PluginMediaElement=function(b,c,a){this.id=b;this.pluginType=c;this.src=a;this.events={}};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){if(this.pluginType=="youtube"){this.pluginApi.playVideo()}else{this.pluginApi.playMedia()}this.paused=false}},load:function(){if(this.pluginApi!=null){if(this.pluginType=="youtube"){}else{this.pluginApi.loadMedia()}this.paused=false}},pause:function(){if(this.pluginApi!=null){if(this.pluginType=="youtube"){this.pluginApi.pauseVideo()}else{this.pluginApi.pauseMedia()}this.paused=true}},stop:function(){if(this.pluginApi!=null){if(this.pluginType=="youtube"){this.pluginApi.stopVideo()}else{this.pluginApi.stopMedia()}this.paused=true}},canPlayType:function(e){var d,c,a,b=mejs.plugins[this.pluginType];for(d=0;d<b.length;d++){a=b[d];if(mejs.PluginDetector.hasPluginVersion(this.pluginType,a.version)){for(c=0;c<a.types.length;c++){if(e==a.types[c]){return true}}}}return false},positionFullscreenButton:function(a,c,b){if(this.pluginApi!=null&&this.pluginApi.positionFullscreenButton){this.pluginApi.positionFullscreenButton(a,c,b)}},hideFullscreenButton:function(){if(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){if(this.pluginType=="youtube"){this.pluginApi.seekTo(a)}else{this.pluginApi.setCurrentTime(a)}this.currentTime=a}},setVolume:function(a){if(this.pluginApi!=null){if(this.pluginType=="youtube"){this.pluginApi.setVolume(a*100)}else{this.pluginApi.setVolume(a)}this.volume=a}},setMuted:function(a){if(this.pluginApi!=null){if(this.pluginType=="youtube"){if(a){this.pluginApi.mute()}else{this.pluginApi.unMute()}this.muted=a;this.dispatchEvent("volumechange")}else{this.pluginApi.setMuted(a)}this.muted=a}},setVideoSize:function(b,a){if(this.pluginElement.style){this.pluginElement.style.width=b+"px";this.pluginElement.style.height=a+"px"}if(this.pluginApi!=null&&this.pluginApi.setVideoSize){this.pluginApi.setVideoSize(b,a)}},setFullscreen:function(a){if(this.pluginApi!=null&&this.pluginApi.setFullscreen){this.pluginApi.setFullscreen(a)}},enterFullScreen:function(){if(this.pluginApi!=null&&this.pluginApi.setFullscreen){this.setFullscreen(true)}},exitFullScreen:function(){if(this.pluginApi!=null&&this.pluginApi.setFullscreen){this.setFullscreen(false)}},addEventListener:function(b,c,a){this.events[b]=this.events[b]||[];this.events[b].push(c)},removeEventListener:function(a,c){if(!a){this.events={};return true}var b=this.events[a];if(!b){return true}if(!c){this.events[a]=[];return true}for(i=0;i<b.length;i++){if(b[i]===c){this.events[a].splice(i,1);return true}}return false},dispatchEvent:function(a){var c,b,d=this.events[a];if(d){b=Array.prototype.slice.call(arguments,1);for(c=0;c<d.length;c++){d[c].apply(null,b)}}},attributes:{},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={pluginMediaElements:{},htmlMediaElements:{},registerPluginElement:function(c,a,b){this.pluginMediaElements[c]=a;this.htmlMediaElements[c]=b},initPlugin:function(c){var a=this.pluginMediaElements[c],b=this.htmlMediaElements[c];if(a){switch(a.pluginType){case"flash":a.pluginElement=a.pluginApi=document.getElementById(c);break;case"silverlight":a.pluginElement=document.getElementById(a.id);a.pluginApi=a.pluginElement.Content.MediaElementJS;break}if(a.pluginApi!=null&&a.success){a.success(a,b)}}},fireEvent:function(h,c,b){var g,f,a,d=this.pluginMediaElements[h];g={type:c,target:d};for(f in b){d[f]=b[f];g[f]=b[f]}a=b.bufferedTime||0;g.target.buffered=g.buffered={start:function(e){return 0},end:function(e){return a},length:1};d.dispatchEvent(g.type,g)}};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,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)};mejs.HtmlMediaElementShim={create:function(e,d){var n=mejs.MediaElementDefaults,k=(typeof(e)=="string")?document.getElementById(e):e,h=k.tagName.toLowerCase(),g=(h==="audio"||h==="video"),b=(g)?k.getAttribute("src"):k.getAttribute("href"),l=k.getAttribute("poster"),f=k.getAttribute("autoplay"),j=k.getAttribute("preload"),m=k.getAttribute("controls"),a,c;for(c in d){n[c]=d[c]}b=(typeof b=="undefined"||b===null||b=="")?null:b;l=(typeof l=="undefined"||l===null)?"":l;j=(typeof j=="undefined"||j===null||j==="false")?"none":j;f=!(typeof f=="undefined"||f===null||f==="false");m=!(typeof m=="undefined"||m===null||m==="false");a=this.determinePlayback(k,n,mejs.MediaFeatures.supportsMediaTag,g,b);a.url=(a.url!==null)?mejs.Utility.absolutizeUrl(a.url):"";if(a.method=="native"){if(mejs.MediaFeatures.isBustedAndroid){k.src=a.url;k.addEventListener("click",function(){k.play()},false)}return this.updateNative(a,n,f,j)}else{if(a.method!==""){return this.createPlugin(a,n,l,f,j,m)}else{this.createErrorMessage(a,n,l);return this}}},determinePlayback:function(t,c,h,v,f){var o=[],s,r,q,p,m,d,g={method:"",url:"",htmlMediaElement:t,isVideo:(t.tagName.toLowerCase()!="audio")},a,b,u,w,e;if(typeof c.type!="undefined"&&c.type!==""){if(typeof c.type=="string"){o.push({type:c.type,url:f})}else{for(s=0;s<c.type.length;s++){o.push({type:c.type[s],url:f})}}}else{if(f!==null){d=this.formatType(f,t.getAttribute("type"));o.push({type:d,url:f})}else{for(s=0;s<t.childNodes.length;s++){m=t.childNodes[s];if(m.nodeType==1&&m.tagName.toLowerCase()=="source"){f=m.getAttribute("src");d=this.formatType(f,m.getAttribute("type"));e=m.getAttribute("media");if(!e||!window.matchMedia||(window.matchMedia&&window.matchMedia(e).matches)){o.push({type:d,url:f})}}}}}if(!v&&o.length>0&&o[0].url!==null&&this.getTypeFromFile(o[0].url).indexOf("audio")>-1){g.isVideo=false}if(mejs.MediaFeatures.isBustedAndroid){t.canPlayType=function(j){return(j.match(/video\/(mp4|m4v)/gi)!==null)?"maybe":""}}if(h&&(c.mode==="auto"||c.mode==="auto_plugin"||c.mode==="native")){if(!v){w=document.createElement(g.isVideo?"video":"audio");t.parentNode.insertBefore(w,t);t.style.display="none";g.htmlMediaElement=t=w}for(s=0;s<o.length;s++){if(t.canPlayType(o[s].type).replace(/no/,"")!==""||t.canPlayType(o[s].type.replace(/mp3/,"mpeg")).replace(/no/,"")!==""){g.method="native";g.url=o[s].url;break}}if(g.method==="native"){if(g.url!==null){t.src=g.url}if(c.mode!=="auto_plugin"){return g}}}if(c.mode==="auto"||c.mode==="auto_plugin"||c.mode==="shim"){for(s=0;s<o.length;s++){d=o[s].type;for(r=0;r<c.plugins.length;r++){a=c.plugins[r];b=mejs.plugins[a];for(q=0;q<b.length;q++){u=b[q];if(u.version==null||mejs.PluginDetector.hasPluginVersion(a,u.version)){for(p=0;p<u.types.length;p++){if(d==u.types[p]){g.method=a;g.url=o[s].url;return g}}}}}}}if(c.mode==="auto_plugin"&&g.method==="native"){return g}if(g.method===""&&o.length>0){g.url=o[0].url}return g},formatType:function(a,c){var b;if(a&&!c){return this.getTypeFromFile(a)}else{if(c&&~c.indexOf(";")){return c.substr(0,c.indexOf(";"))}else{return c}}},getTypeFromFile:function(a){a=a.split("?")[0];var b=a.substring(a.lastIndexOf(".")+1);return(/(mp4|m4v|ogg|ogv|webm|webmv|flv|wmv|mpeg|mov)/gi.test(b)?"video":"audio")+"/"+this.getTypeFromExtension(b)},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(c,b,g){var d=c.htmlMediaElement,a=document.createElement("div");a.className="me-cannotplay";try{a.style.width=d.width+"px";a.style.height=d.height+"px"}catch(f){}a.innerHTML=(g!=="")?'<a href="'+c.url+'"><img src="'+g+'" width="100%" height="100%" /></a>':'<a href="'+c.url+'"><span>'+mejs.i18n.t("Download File")+"</span></a>";d.parentNode.insertBefore(a,d);d.style.display="none";b.error(d)},createPlugin:function(n,a,c,e,d,h){var r=n.htmlMediaElement,m=1,l=1,s="me_"+n.method+"_"+(mejs.meIndex++),o=new mejs.PluginMediaElement(s,n.method,n.url),g=document.createElement("div"),b,p,j;o.tagName=r.tagName;for(var q=0;q<r.attributes.length;q++){var f=r.attributes[q];if(f.specified==true){o.setAttribute(f.name,f.value)}}p=r.parentNode;while(p!==null&&p.tagName.toLowerCase()!="body"){if(p.parentNode.tagName.toLowerCase()=="p"){p.parentNode.parentNode.insertBefore(p,p.parentNode);break}p=p.parentNode}if(n.isVideo){m=(a.videoWidth>0)?a.videoWidth:(r.getAttribute("width")!==null)?r.getAttribute("width"):a.defaultVideoWidth;l=(a.videoHeight>0)?a.videoHeight:(r.getAttribute("height")!==null)?r.getAttribute("height"):a.defaultVideoHeight;m=mejs.Utility.encodeUrl(m);l=mejs.Utility.encodeUrl(l)}else{if(a.enablePluginDebug){m=320;l=240}}o.success=a.success;mejs.MediaPluginBridge.registerPluginElement(s,o,r);g.className="me-plugin";g.id=s+"_container";if(n.isVideo){r.parentNode.insertBefore(g,r)}else{document.body.insertBefore(g,document.body.childNodes[0])}j=["id="+s,"isvideo="+((n.isVideo)?"true":"false"),"autoplay="+((e)?"true":"false"),"preload="+d,"width="+m,"startvolume="+a.startVolume,"timerrate="+a.timerRate,"flashstreamer="+a.flashStreamer,"height="+l];if(n.url!==null){if(n.method=="flash"){j.push("file="+mejs.Utility.encodeUrl(n.url))}else{j.push("file="+n.url)}}if(a.enablePluginDebug){j.push("debug=true")}if(a.enablePluginSmoothing){j.push("smoothing=true")}if(h){j.push("controls=true")}if(a.pluginVars){j=j.concat(a.pluginVars)}switch(n.method){case"silverlight":g.innerHTML='<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" id="'+s+'" name="'+s+'" width="'+m+'" height="'+l+'"><param name="initParams" value="'+j.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="'+a.pluginPath+a.silverlightName+'" /></object>';break;case"flash":if(mejs.MediaFeatures.isIE){b=document.createElement("div");g.appendChild(b);b.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" id="'+s+'" width="'+m+'" height="'+l+'"><param name="movie" value="'+a.pluginPath+a.flashName+"?x="+(new Date())+'" /><param name="flashvars" value="'+j.join("&amp;")+'" /><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{g.innerHTML='<embed id="'+s+'" name="'+s+'" 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="'+a.pluginPath+a.flashName+'" flashvars="'+j.join("&")+'" width="'+m+'" height="'+l+'"></embed>'}break;case"youtube":var k=n.url.substr(n.url.lastIndexOf("=")+1);youtubeSettings={container:g,containerId:g.id,pluginMediaElement:o,pluginId:s,videoId:k,height:l,width:m};if(mejs.PluginDetector.hasPluginVersion("flash",[10,0,0])){mejs.YouTubeApi.createFlash(youtubeSettings)}else{mejs.YouTubeApi.enqueueIframe(youtubeSettings)}break;case"vimeo":o.vimeoid=n.url.substr(n.url.lastIndexOf("/")+1);g.innerHTML='<iframe src="http://player.vimeo.com/video/'+o.vimeoid+'?portrait=0&byline=0&title=0" width="'+m+'" height="'+l+'" frameborder="0"></iframe>';break}r.style.display="none";return o},updateNative:function(d,c,f,b){var e=d.htmlMediaElement,a;for(a in mejs.HtmlMediaElement){e[a]=mejs.HtmlMediaElement[a]}c.success(e,e);return e}};mejs.YouTubeApi={isIframeStarted:false,isIframeLoaded:false,loadIframeApi:function(){if(!this.isIframeStarted){var a=document.createElement("script");a.src="http://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(c){var b=c.pluginMediaElement,a=new YT.Player(c.containerId,{height:c.height,width:c.width,videoId:c.videoId,playerVars:{controls:0},events:{onReady:function(){c.pluginMediaElement.pluginApi=a;mejs.MediaPluginBridge.initPlugin(c.pluginId);setInterval(function(){mejs.YouTubeApi.createEvent(a,b,"timeupdate")},250)},onStateChange:function(d){mejs.YouTubeApi.handleStateChange(d.data,a,b)}}})},createEvent:function(d,c,b){var e={type:b,target:c};if(d&&d.getDuration){c.currentTime=e.currentTime=d.getCurrentTime();c.duration=e.duration=d.getDuration();e.paused=c.paused;e.ended=c.ended;e.muted=d.isMuted();e.volume=d.getVolume()/100;e.bytesTotal=d.getVideoBytesTotal();e.bufferedBytes=d.getVideoBytesLoaded();var a=e.bufferedBytes/e.bytesTotal*e.duration;e.target.buffered=e.buffered={start:function(f){return 0},end:function(f){return a},length:1}}c.dispatchEvent(e.type,e)},iFrameReady:function(){this.isLoaded=true;this.isIframeLoaded=true;while(this.iframeQueue.length>0){var a=this.iframeQueue.pop();this.createIframe(a)}},flashPlayers:{},createFlash:function(c){this.flashPlayers[c.pluginId]=c;var b,a="http://www.youtube.com/apiplayer?enablejsapi=1&amp;playerapiid="+c.pluginId+"&amp;version=3&amp;autoplay=0&amp;controls=0&amp;modestbranding=1&loop=0";if(mejs.MediaFeatures.isIE){b=document.createElement("div");c.container.appendChild(b);b.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" id="'+c.pluginId+'" width="'+c.width+'" height="'+c.height+'"><param name="movie" value="'+a+'" /><param name="wmode" value="transparent" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="true" /></object>'}else{c.container.innerHTML='<object type="application/x-shockwave-flash" id="'+c.pluginId+'" data="'+a+'" width="'+c.width+'" height="'+c.height+'" style="visibility: visible; "><param name="allowScriptAccess" value="always"><param name="wmode" value="transparent"></object>'}},flashReady:function(e){var c=this.flashPlayers[e],b=document.getElementById(e),a=c.pluginMediaElement;a.pluginApi=a.pluginElement=b;mejs.MediaPluginBridge.initPlugin(e);b.cueVideoById(c.videoId);var d=c.containerId+"_callback";window[d]=function(f){mejs.YouTubeApi.handleStateChange(f,b,a)};b.addEventListener("onStateChange",d);setInterval(function(){mejs.YouTubeApi.createEvent(b,a,"timeupdate")},250)},handleStateChange:function(c,b,a){switch(c){case -1:a.paused=true;a.ended=true;mejs.YouTubeApi.createEvent(b,a,"loadedmetadata");break;case 0:a.paused=false;a.ended=true;mejs.YouTubeApi.createEvent(b,a,"ended");break;case 1:a.paused=false;a.ended=false;mejs.YouTubeApi.createEvent(b,a,"play");mejs.YouTubeApi.createEvent(b,a,"playing");break;case 2:a.paused=true;a.ended=false;mejs.YouTubeApi.createEvent(b,a,"pause");break;case 3:mejs.YouTubeApi.createEvent(b,a,"progress");break;case 5:break}}};function onYouTubePlayerAPIReady(){mejs.YouTubeApi.iFrameReady()}function onYouTubePlayerReady(a){mejs.YouTubeApi.flashReady(a)}window.mejs=mejs;window.MediaElement=mejs.MediaElement;
    15 /*!
    16  * Adds Internationalization and localization to objects.
    17  *
    18  * What is the concept beyond i18n?
    19  *   http://en.wikipedia.org/wiki/Internationalization_and_localization
    20  *
    21  *
    22  * This file both i18n methods and locale which is used to translate
    23  * strings into other languages.
    24  *
    25  * Default translations are not available, you have to add them
    26  * through locale objects which are named exactly as the langcode
    27  * they stand for. The default language is always english (en).
    28  *
    29  *
    30  * Wrapper built to be able to attach the i18n object to
    31  * other objects without changing more than one line.
    32  *
    33  *
    34  * LICENSE:
    35  *
    36  *   The i18n file uses methods from the Drupal project (drupal.js):
    37  *     - i18n.methods.t() (modified)
    38  *     - i18n.methods.checkPlain() (full copy)
    39  *     - i18n.methods.formatString() (full copy)
    40  *
    41  *   The Drupal project is (like mediaelementjs) licensed under GPLv2.
    42  *    - http://drupal.org/licensing/faq/#q1
    43  *    - https://github.com/johndyer/mediaelement
    44  *    - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
    45  *
    46  *
    47  * @author
    48  *   Tim Latz (latz.tim@gmail.com)
    49  *
    50  * @see
    51  *   me-i18n-locale.js
    52  *
    53  * @params
    54  *  - $       - zepto || jQuery  ..
    55  *  - context - document, iframe ..
    56  *  - exports - CommonJS, window ..
    57  *
    58  */
    59 (function(d,b,a,e){var c={locale:{strings:{}},methods:{}};c.locale.getLanguage=function(){return{language:navigator.language}};c.locale.INIT_LANGUAGE=c.locale.getLanguage();c.methods.checkPlain=function(j){var h,g,f={"&":"&amp;",'"':"&quot;","<":"&lt;",">":"&gt;"};j=String(j);for(h in f){if(f.hasOwnProperty(h)){g=new RegExp(h,"g");j=j.replace(g,f[h])}}return j};c.methods.formatString=function(h,f){for(var g in f){switch(g.charAt(0)){case"@":f[g]=c.methods.checkPlain(f[g]);break;case"!":break;case"%":default:f[g]='<em class="placeholder">'+c.methods.checkPlain(f[g])+"</em>";break}h=h.replace(g,f[g])}return h};c.methods.t=function(h,g,f){if(c.locale.strings&&c.locale.strings[f.context]&&c.locale.strings[f.context][h]){h=c.locale.strings[f.context][h]}if(g){h=c.methods.formatString(h,g)}return h};c.t=function(j,g,f){if(typeof j==="string"&&j.length>0){var h=c.locale.getLanguage();f=f||{context:h.language};return c.methods.t(j,g,f)}else{throw {name:"InvalidArgumentException",message:"First argument is either not a string or empty."}}};a.i18n=c}(jQuery,document,mejs));
    60 /*!
    61  * This is a i18n.locale language object.
    62  *
    63  *<de> German translation by Tim Latz, latz.tim@gmail.com
    64  *
    65  * @author
    66  *   Tim Latz (latz.tim@gmail.com)
    67  *
    68  * @see
    69  *   me-i18n.js
    70  *
    71  * @params
    72  *  - exports - CommonJS, window ..
    73  */
    74 (function(a,b){a.de={Fullscreen:"Vollbild","Go Fullscreen":"Vollbild an","Turn off Fullscreen":"Vollbild aus",Close:"Schließen"}}(mejs.i18n.locale.strings));
     13*/var mejs=mejs||{};mejs.version="2.11.0";mejs.meIndex=0;
     14mejs.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",
     15"video/x-vimeo"]}]};
     16mejs.Utility={encodeUrl:function(a){return encodeURIComponent(a)},escapeHTML:function(a){return a.toString().split("&").join("&amp;").split("<").join("&lt;").split('"').join("&quot;")},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="",g,f=document.getElementsByTagName("script"),h=f.length,l=a.length;b<h;b++){g=f[b].src;for(c=0;c<l;c++){e=a[c];if(g.indexOf(e)>
     17-1){d=g.substring(0,g.indexOf(e));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,g=Math.floor(a/60)%60,f=Math.floor(a%60);a=Math.floor((a%1*d).toFixed(3));return(b||e>0?(e<10?"0"+e:e)+":":"")+(g<10?"0"+g:g)+":"+(f<10?"0"+f:f)+(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],
     1810);var e=parseInt(a[1],10),g=parseInt(a[2],10),f=0,h=0;if(c)f=parseInt(a[3])/d;return h=b*3600+e*60+g+f},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=
     19"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)}}};
     20mejs.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],g;if(typeof this.nav.plugins!="undefined"&&typeof this.nav.plugins[a]=="object"){if((c=this.nav.plugins[a].description)&&
     21!(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(g=new ActiveXObject(c))e=d(g)}catch(f){}return e}};
     22mejs.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});
     23mejs.PluginDetector.addPlugin("silverlight","Silverlight Plug-In","application/x-silverlight-2","AgControl.AgControl",function(a){var b=[0,0,0,0],c=function(d,e,g,f){for(;d.isVersionSupported(e[0]+"."+e[1]+"."+e[2]+"."+e[3]);)e[g]+=f;e[g]-=f};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});
     24mejs.MediaFeatures={init:function(){var a=this,b=document,c=mejs.PluginDetector.nav,d=mejs.PluginDetector.ua.toLowerCase(),e,g=["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)!==
     25null;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<g.length;c++)e=document.createElement(g[c]);a.supportsMediaTag=typeof e.canPlayType!=="undefined"||a.isBustedAndroid;a.hasSemiNativeFullScreen=typeof e.webkitEnterFullscreen!=="undefined";a.hasWebkitNativeFullScreen=typeof e.webkitRequestFullScreen!=="undefined";
     26a.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;
     27else if(e.webkitRequestFullScreen)return b.webkitIsFullScreen};a.requestFullScreen=function(f){if(a.hasWebkitNativeFullScreen)f.webkitRequestFullScreen();else a.hasMozNativeFullScreen&&f.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();
     28mejs.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}};
     29mejs.PluginMediaElement=function(a,b,c){this.id=a;this.pluginType=b;this.src=c;this.events={};this.attributes={}};
     30mejs.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=
     31false}},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""},
     32positionFullscreenButton: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));
     33this.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);
     34this.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&&
     35this.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
     36this.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)}};
     37mejs.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);
     38b.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)}};
     39mejs.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,silverlightName:"silverlightmediaelement.xap",defaultVideoWidth:480,defaultVideoHeight:270,pluginWidth:-1,pluginHeight:-1,pluginVars:[],timerRate:250,startVolume:0.8,
     40success:function(){},error:function(){}};mejs.MediaElement=function(a,b){return mejs.HtmlMediaElementShim.create(a,b)};
     41mejs.HtmlMediaElementShim={create:function(a,b){var c=mejs.MediaElementDefaults,d=typeof a=="string"?document.getElementById(a):a,e=d.tagName.toLowerCase(),g=e==="audio"||e==="video",f=g?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];f=typeof f=="undefined"||f===null||f==""?null:f;e=typeof e=="undefined"||e===null?"":e;l=typeof l=="undefined"||l===null||l==="false"?
     42"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,g,f);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}},
     43determinePlayback:function(a,b,c,d,e){var g=[],f,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")g.push({type:b.type,url:e});else for(f=0;f<b.type.length;f++)g.push({type:b.type[f],url:e});else if(e!==null){l=this.formatType(e,a.getAttribute("type"));g.push({type:l,url:e})}else for(f=0;f<a.childNodes.length;f++){h=a.childNodes[f];if(h.nodeType==1&&h.tagName.toLowerCase()=="source"){e=h.getAttribute("src");
     44l=this.formatType(e,h.getAttribute("type"));h=h.getAttribute("media");if(!h||!window.matchMedia||window.matchMedia&&window.matchMedia(h).matches)g.push({type:l,url:e})}}if(!d&&g.length>0&&g[0].url!==null&&this.getTypeFromFile(g[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){f=document.createElement(j.isVideo?
     45"video":"audio");a.parentNode.insertBefore(f,a);a.style.display="none";j.htmlMediaElement=a=f}for(f=0;f<g.length;f++)if(a.canPlayType(g[f].type).replace(/no/,"")!==""||a.canPlayType(g[f].type.replace(/mp3/,"mpeg")).replace(/no/,"")!==""){j.method="native";j.url=g[f].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(f=0;f<g.length;f++){l=g[f].type;for(a=0;a<b.plugins.length;a++){e=b.plugins[a];
     46h=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=g[f].url;return j}}}}if(b.mode==="auto_plugin"&&j.method==="native")return j;if(j.method===""&&g.length>0)j.url=g[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(".")+
     471);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(g){}e.innerHTML=
     48c!==""?'<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,g){c=a.htmlMediaElement;var f=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,
     49n.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){f=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;f=mejs.Utility.encodeUrl(f);h=mejs.Utility.encodeUrl(h)}else if(b.enablePluginDebug){f=
     50320;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="+f,"startvolume="+b.startVolume,"timerrate="+b.timerRate,"flashstreamer="+b.flashStreamer,"height="+h];if(a.url!==null)a.method=="flash"?d.push("file="+mejs.Utility.encodeUrl(a.url)):
     51d.push("file="+a.url);b.enablePluginDebug&&d.push("debug=true");b.enablePluginSmoothing&&d.push("smoothing=true");g&&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="'+f+'" height="'+h+'" class="mejs-shim"><param name="initParams" value="'+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="'+
     52b.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="'+l+'" width="'+f+'" height="'+h+'" class="mejs-shim"><param name="movie" value="'+b.pluginPath+b.flashName+"?x="+new Date+'" /><param name="flashvars" value="'+d.join("&amp;")+'" /><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=
     53'<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="'+f+'" 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,
     54videoId:b,height:h,width:f};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="'+f+'" height="'+h+'" frameborder="0" class="mejs-shim"></iframe>'}c.style.display="none";return j},updateNative:function(a,b){var c=a.htmlMediaElement,
     55d;for(d in mejs.HtmlMediaElement)c[d]=mejs.HtmlMediaElement[d];b.success(c,c);return c}};
     56mejs.YouTubeApi={isIframeStarted:false,isIframeLoaded:false,loadIframeApi:function(){if(!this.isIframeStarted){var a=document.createElement("script");a.src="http://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,
     57{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;
     58c.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]=
     59a;var b,c="http://www.youtube.com/apiplayer?enablejsapi=1&amp;playerapiid="+a.pluginId+"&amp;version=3&amp;autoplay=0&amp;controls=0&amp;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="'+
     60c+'" /><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=
     61document.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;
     62c.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;
     63(function(a,b,c){var d={locale:{strings:{}},methods:{}};d.locale.getLanguage=function(){return{language:navigator.language}};d.locale.INIT_LANGUAGE=d.locale.getLanguage();d.methods.checkPlain=function(e){var g,f,h={"&":"&amp;",'"':"&quot;","<":"&lt;",">":"&gt;"};e=String(e);for(g in h)if(h.hasOwnProperty(g)){f=RegExp(g,"g");e=e.replace(f,h[g])}return e};d.methods.formatString=function(e,g){for(var f in g){switch(f.charAt(0)){case "@":g[f]=d.methods.checkPlain(g[f]);break;case "!":break;default:g[f]=
     64'<em class="placeholder">'+d.methods.checkPlain(g[f])+"</em>"}e=e.replace(f,g[f])}return e};d.methods.t=function(e,g,f){if(d.locale.strings&&d.locale.strings[f.context]&&d.locale.strings[f.context][e])e=d.locale.strings[f.context][e];if(g)e=d.methods.formatString(e,g);return e};d.t=function(e,g,f){if(typeof e==="string"&&e.length>0){var h=d.locale.getLanguage();f=f||{context:h.language};return d.methods.t(e,g,f)}else throw{name:"InvalidArgumentException",message:"First argument is either not a string or empty."};
     65};c.i18n=d})(jQuery,document,mejs);(function(a){a.de={Fullscreen:"Vollbild","Go Fullscreen":"Vollbild an","Turn off Fullscreen":"Vollbild aus",Close:"Schlie\u00dfen"}})(mejs.i18n.locale.strings);
     66
    7567/*!
    7668 * MediaElementPlayer
    7769 * http://mediaelementjs.com/
    var mejs=mejs||{};mejs.version="2.10.1";mejs.meIndex=0;mejs.plugins={silverlight 
    8072 * using jQuery and MediaElement.js (HTML5 Flash/Silverlight wrapper)
    8173 *
    8274 * Copyright 2010-2012, John Dyer (http://j.hn/)
    83  * Dual licensed under the MIT or GPL Version 2 licenses.
    84  *
    85  */
    86 if(typeof jQuery!="undefined"){mejs.$=jQuery}else{if(typeof ender!="undefined"){mejs.$=ender}}(function(a){mejs.MepDefaults={poster:"",defaultVideoWidth:480,defaultVideoHeight:270,videoWidth:-1,videoHeight:-1,defaultAudioWidth:400,defaultAudioHeight:30,defaultSeekBackwardInterval:function(b){return(b.duration*0.05)},defaultSeekForwardInterval:function(b){return(b.duration*0.05)},audioWidth:-1,audioHeight:-1,startVolume:0.8,loop:false,enableAutosize:true,alwaysShowHours:false,showTimecodeFrameCount:false,framesPerSecond:25,autosizeProgress:true,alwaysShowControls:false,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(b,c){if(c.paused||c.ended){c.play()}else{c.pause()}}},{keys:[38],action:function(b,d){var c=Math.min(d.volume+0.1,1);d.setVolume(c)}},{keys:[40],action:function(b,d){var c=Math.max(d.volume-0.1,0);d.setVolume(c)}},{keys:[37,227],action:function(b,d){if(!isNaN(d.duration)&&d.duration>0){if(b.isVideo){b.showControls();b.startControlsTimer()}var c=Math.max(d.currentTime-b.options.defaultSeekBackwardInterval(d),0);d.setCurrentTime(c)}}},{keys:[39,228],action:function(b,d){if(!isNaN(d.duration)&&d.duration>0){if(b.isVideo){b.showControls();b.startControlsTimer()}var c=Math.min(d.currentTime+b.options.defaultSeekForwardInterval(d),d.duration);d.setCurrentTime(c)}}},{keys:[70],action:function(b,c){if(typeof b.enterFullScreen!="undefined"){if(b.isFullScreen){b.exitFullScreen()}else{b.enterFullScreen()}}}}]};mejs.mepIndex=0;mejs.players=[];mejs.MediaElementPlayer=function(c,d){if(!(this instanceof mejs.MediaElementPlayer)){return new mejs.MediaElementPlayer(c,d)}var b=this;b.$media=b.$node=a(c);b.node=b.media=b.$media[0];if(typeof b.node.player!="undefined"){return b.node.player}else{b.node.player=b}if(typeof d=="undefined"){d=b.$node.data("mejsoptions")}b.options=a.extend({},mejs.MepDefaults,d);mejs.players.push(b);b.init();return b};mejs.MediaElementPlayer.prototype={hasFocus:false,controlsAreVisible:true,init:function(){var d=this,e=mejs.MediaFeatures,h=a.extend(true,{},d.options,{success:function(k,j){d.meReady(k,j)},error:function(j){d.handleError(j)}}),c=d.media.tagName.toLowerCase();d.isDynamic=(c!=="audio"&&c!=="video");if(d.isDynamic){d.isVideo=d.options.isVideo}else{d.isVideo=(c!=="audio"&&d.options.isVideo)}if((e.isiPad&&d.options.iPadUseNativeControls)||(e.isiPhone&&d.options.iPhoneUseNativeControls)){d.$media.attr("controls","controls");if(e.isiPad&&d.media.getAttribute("autoplay")!==null){d.media.load();d.media.play()}}else{if(e.isAndroid&&d.AndroidUseNativeControls){}else{d.$media.removeAttr("controls");d.id="mep_"+mejs.mepIndex++;d.container=a('<div id="'+d.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(d.$media[0].className).insertBefore(d.$media);d.container.addClass((e.isAndroid?"mejs-android ":"")+(e.isiOS?"mejs-ios ":"")+(e.isiPad?"mejs-ipad ":"")+(e.isiPhone?"mejs-iphone ":"")+(d.isVideo?"mejs-video ":"mejs-audio "));if(e.isiOS){var g=d.$media.clone();d.container.find(".mejs-mediaelement").append(g);d.$media.remove();d.$node=d.$media=g;d.node=d.media=g[0]}else{d.container.find(".mejs-mediaelement").append(d.$media)}d.controls=d.container.find(".mejs-controls");d.layers=d.container.find(".mejs-layers");var f=(d.isVideo?"video":"audio"),b=f.substring(0,1).toUpperCase()+f.substring(1);if(d.options[f+"Width"]>0||d.options[f+"Width"].toString().indexOf("%")>-1){d.width=d.options[f+"Width"]}else{if(d.media.style.width!==""&&d.media.style.width!==null){d.width=d.media.style.width}else{if(d.media.getAttribute("width")!==null){d.width=d.$media.attr("width")}else{d.width=d.options["default"+b+"Width"]}}}if(d.options[f+"Height"]>0||d.options[f+"Height"].toString().indexOf("%")>-1){d.height=d.options[f+"Height"]}else{if(d.media.style.height!==""&&d.media.style.height!==null){d.height=d.media.style.height}else{if(d.$media[0].getAttribute("height")!==null){d.height=d.$media.attr("height")}else{d.height=d.options["default"+b+"Height"]}}}d.setPlayerSize(d.width,d.height);h.pluginWidth=d.height;h.pluginHeight=d.width}}mejs.MediaElement(d.$media[0],h)},showControls:function(b){var c=this;b=typeof b=="undefined"||b;if(c.controlsAreVisible){return}if(b){c.controls.css("visibility","visible").stop(true,true).fadeIn(200,function(){c.controlsAreVisible=true});c.container.find(".mejs-control").css("visibility","visible").stop(true,true).fadeIn(200,function(){c.controlsAreVisible=true})}else{c.controls.css("visibility","visible").css("display","block");c.container.find(".mejs-control").css("visibility","visible").css("display","block");c.controlsAreVisible=true}c.setControlsSize()},hideControls:function(b){var c=this;b=typeof b=="undefined"||b;if(!c.controlsAreVisible){return}if(b){c.controls.stop(true,true).fadeOut(200,function(){a(this).css("visibility","hidden").css("display","block");c.controlsAreVisible=false});c.container.find(".mejs-control").stop(true,true).fadeOut(200,function(){a(this).css("visibility","hidden").css("display","block")})}else{c.controls.css("visibility","hidden").css("display","block");c.container.find(".mejs-control").css("visibility","hidden").css("display","block");c.controlsAreVisible=false}},controlsTimer:null,startControlsTimer:function(c){var b=this;c=typeof c!="undefined"?c:1500;b.killControlsTimer("start");b.controlsTimer=setTimeout(function(){b.hideControls();b.killControlsTimer("hide")},c)},killControlsTimer:function(c){var b=this;if(b.controlsTimer!==null){clearTimeout(b.controlsTimer);delete b.controlsTimer;b.controlsTimer=null}},controlsEnabled:true,disableControls:function(){var b=this;b.killControlsTimer();b.hideControls(false);this.controlsEnabled=false},enableControls:function(){var b=this;b.showControls(false);b.controlsEnabled=true},meReady:function(c,f){var k=this,j=mejs.MediaFeatures,g=f.getAttribute("autoplay"),d=!(typeof g=="undefined"||g===null||g==="false"),b,l;if(k.created){return}else{k.created=true}k.media=c;k.domNode=f;if(!(j.isAndroid&&k.options.AndroidUseNativeControls)&&!(j.isiPad&&k.options.iPadUseNativeControls)&&!(j.isiPhone&&k.options.iPhoneUseNativeControls)){k.buildposter(k,k.controls,k.layers,k.media);k.buildkeyboard(k,k.controls,k.layers,k.media);k.buildoverlays(k,k.controls,k.layers,k.media);k.findTracks();for(b in k.options.features){l=k.options.features[b];if(k["build"+l]){try{k["build"+l](k,k.controls,k.layers,k.media)}catch(h){}}}k.container.trigger("controlsready");k.setPlayerSize(k.width,k.height);k.setControlsSize();if(k.isVideo){if(mejs.MediaFeatures.hasTouch){k.$media.bind("touchstart",function(){if(k.controlsAreVisible){k.hideControls(false)}else{if(k.controlsEnabled){k.showControls(false)}}})}else{k.media.addEventListener("click",function(){if(k.media.paused){k.media.play()}else{k.media.pause()}});k.container.bind("mouseenter mouseover",function(){if(k.controlsEnabled){if(!k.options.alwaysShowControls){k.killControlsTimer("enter");k.showControls();k.startControlsTimer(2500)}}}).bind("mousemove",function(){if(k.controlsEnabled){if(!k.controlsAreVisible){k.showControls()}if(!k.options.alwaysShowControls){k.startControlsTimer(2500)}}}).bind("mouseleave",function(){if(k.controlsEnabled){if(!k.media.paused&&!k.options.alwaysShowControls){k.startControlsTimer(1000)}}})}if(d&&!k.options.alwaysShowControls){k.hideControls()}if(k.options.enableAutosize){k.media.addEventListener("loadedmetadata",function(m){if(k.options.videoHeight<=0&&k.domNode.getAttribute("height")===null&&!isNaN(m.target.videoHeight)){k.setPlayerSize(m.target.videoWidth,m.target.videoHeight);k.setControlsSize();k.media.setVideoSize(m.target.videoWidth,m.target.videoHeight)}},false)}}c.addEventListener("play",function(){for(var m=0,e=mejs.players.length;m<e;m++){var n=mejs.players[m];if(n.id!=k.id&&k.options.pauseOtherPlayers&&!n.paused&&!n.ended){n.pause()}n.hasFocus=false}k.hasFocus=true},false);k.media.addEventListener("ended",function(m){try{k.media.setCurrentTime(0)}catch(n){}k.media.pause();if(k.setProgressRail){k.setProgressRail()}if(k.setCurrentRail){k.setCurrentRail()}if(k.options.loop){k.media.play()}else{if(!k.options.alwaysShowControls&&k.controlsEnabled){k.showControls()}}},false);k.media.addEventListener("loadedmetadata",function(m){if(k.updateDuration){k.updateDuration()}if(k.updateCurrent){k.updateCurrent()}if(!k.isFullScreen){k.setPlayerSize(k.width,k.height);k.setControlsSize()}},false);setTimeout(function(){k.setPlayerSize(k.width,k.height);k.setControlsSize()},50);a(window).resize(function(){if(!(k.isFullScreen||(mejs.MediaFeatures.hasTrueNativeFullScreen&&document.webkitIsFullScreen))){k.setPlayerSize(k.width,k.height)}k.setControlsSize()});if(k.media.pluginType=="youtube"){k.container.find(".mejs-overlay-play").hide()}}if(d&&c.pluginType=="native"){c.load();c.play()}if(k.options.success){if(typeof k.options.success=="string"){window[k.options.success](k.media,k.domNode,k)}else{k.options.success(k.media,k.domNode,k)}}},handleError:function(c){var b=this;b.controls.hide();if(b.options.error){b.options.error(c)}},setPlayerSize:function(g,b){var e=this;if(typeof g!="undefined"){e.width=g}if(typeof b!="undefined"){e.height=b}if(e.height.toString().indexOf("%")>0||e.$node.css("max-width")==="100%"||(e.$node[0].currentStyle&&e.$node[0].currentStyle.maxWidth==="100%")){var h=e.isVideo?((e.media.videoWidth&&e.media.videoWidth>0)?e.media.videoWidth:e.options.defaultVideoWidth):e.options.defaultAudioWidth,d=e.isVideo?((e.media.videoHeight&&e.media.videoHeight>0)?e.media.videoHeight:e.options.defaultVideoHeight):e.options.defaultAudioHeight,f=e.container.parent().closest(":visible").width(),c=parseInt(f*d/h,10);if(e.container.parent()[0].tagName.toLowerCase()==="body"){f=a(window).width();c=a(window).height()}if(c!=0){e.container.width(f).height(c);e.$media.width("100%").height("100%");e.container.find("object, embed, iframe").width("100%").height("100%");if(e.isVideo){if(e.media.setVideoSize){e.media.setVideoSize(f,c)}}e.layers.children(".mejs-layer").width("100%").height("100%")}}else{e.container.width(e.width).height(e.height);e.layers.children(".mejs-layer").width(e.width).height(e.height)}},setControlsSize:function(){var c=this,g=0,j=0,h=c.controls.find(".mejs-time-rail"),e=c.controls.find(".mejs-time-total"),f=c.controls.find(".mejs-time-current"),b=c.controls.find(".mejs-time-loaded"),d=h.siblings();if(c.options&&!c.options.autosizeProgress){j=parseInt(h.css("width"))}if(j===0||!j){d.each(function(){if(a(this).css("position")!="absolute"){g+=a(this).outerWidth(true)}});j=c.controls.width()-g-(h.outerWidth(true)-h.width())}h.width(j);e.width(j-(e.outerWidth(true)-e.width()));if(c.setProgressRail){c.setProgressRail()}if(c.setCurrentRail){c.setCurrentRail()}},buildposter:function(e,b,g,f){var d=this,h=a('<div class="mejs-poster mejs-layer"></div>').appendTo(g),c=e.$media.attr("poster");if(e.options.poster!==""){c=e.options.poster}if(c!==""&&c!=null){d.setPoster(c)}else{h.hide()}f.addEventListener("play",function(){h.hide()},false)},setPoster:function(c){var d=this,e=d.container.find(".mejs-poster"),b=e.find("img");if(b.length==0){b=a('<img width="100%" height="100%" />').appendTo(e)}b.attr("src",c)},buildoverlays:function(e,b,g,f){if(!e.isVideo){return}var h=a('<div class="mejs-overlay mejs-layer"><div class="mejs-overlay-loading"><span></span></div></div>').hide().appendTo(g),c=a('<div class="mejs-overlay mejs-layer"><div class="mejs-overlay-error"></div></div>').hide().appendTo(g),d=a('<div class="mejs-overlay mejs-layer mejs-overlay-play"><div class="mejs-overlay-button"></div></div>').appendTo(g).click(function(){if(f.paused){f.play()}else{f.pause()}});f.addEventListener("play",function(){d.hide();h.hide();b.find(".mejs-time-buffering").hide();c.hide()},false);f.addEventListener("playing",function(){d.hide();h.hide();b.find(".mejs-time-buffering").hide();c.hide()},false);f.addEventListener("seeking",function(){h.show();b.find(".mejs-time-buffering").show()},false);f.addEventListener("seeked",function(){h.hide();b.find(".mejs-time-buffering").hide()},false);f.addEventListener("pause",function(){if(!mejs.MediaFeatures.isiPhone){d.show()}},false);f.addEventListener("waiting",function(){h.show();b.find(".mejs-time-buffering").show()},false);f.addEventListener("loadeddata",function(){h.show();b.find(".mejs-time-buffering").show()},false);f.addEventListener("canplay",function(){h.hide();b.find(".mejs-time-buffering").hide()},false);f.addEventListener("error",function(){h.hide();b.find(".mejs-time-buffering").hide();c.show();c.find("mejs-overlay-error").html("Error loading this resource")},false)},buildkeyboard:function(d,b,f,e){var c=this;a(document).keydown(function(n){if(d.hasFocus&&d.options.enableKeyboard){for(var m=0,g=d.options.keyActions.length;m<g;m++){var l=d.options.keyActions[m];for(var h=0,k=l.keys.length;h<k;h++){if(n.keyCode==l.keys[h]){n.preventDefault();l.action(d,e,n.keyCode);return false}}}}return true});a(document).click(function(g){if(a(g.target).closest(".mejs-container").length==0){d.hasFocus=false}})},findTracks:function(){var b=this,c=b.$media.find("track");b.tracks=[];c.each(function(e,d){d=a(d);b.tracks.push({srclang:d.attr("srclang").toLowerCase(),src:d.attr("src"),kind:d.attr("kind"),label:d.attr("label")||"",entries:[],isLoaded:false})})},changeSkin:function(b){this.container[0].className="mejs-container "+b;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(b){this.media.setMuted(b)},setCurrentTime:function(b){this.media.setCurrentTime(b)},getCurrentTime:function(){return this.media.currentTime},setVolume:function(b){this.media.setVolume(b)},getVolume:function(){return this.media.volume},setSrc:function(b){this.media.setSrc(b)},remove:function(){var b=this;if(b.media.pluginType==="flash"){b.media.remove()}else{if(b.media.pluginType==="native"){b.$media.prop("controls",true)}}if(!b.isDynamic){b.$node.insertBefore(b.container)}b.container.remove()}};if(typeof jQuery!="undefined"){jQuery.fn.mediaelementplayer=function(b){return this.each(function(){new mejs.MediaElementPlayer(this,b)})}}a(document).ready(function(){a(".mejs-player").mediaelementplayer()});window.MediaElementPlayer=mejs.MediaElementPlayer})(mejs.$);(function(a){a.extend(mejs.MepDefaults,{playpauseText:"Play/Pause"});a.extend(MediaElementPlayer.prototype,{buildplaypause:function(d,b,g,f){var c=this,e=a('<div class="mejs-button mejs-playpause-button mejs-play" ><button type="button" aria-controls="'+c.id+'" title="'+c.options.playpauseText+'"></button></div>').appendTo(b).click(function(h){h.preventDefault();if(f.paused){f.play()}else{f.pause()}return false});f.addEventListener("play",function(){e.removeClass("mejs-play").addClass("mejs-pause")},false);f.addEventListener("playing",function(){e.removeClass("mejs-play").addClass("mejs-pause")},false);f.addEventListener("pause",function(){e.removeClass("mejs-pause").addClass("mejs-play")},false);f.addEventListener("paused",function(){e.removeClass("mejs-pause").addClass("mejs-play")},false)}})})(mejs.$);(function(a){a.extend(mejs.MepDefaults,{stopText:"Stop"});a.extend(MediaElementPlayer.prototype,{buildstop:function(e,b,g,f){var d=this,c=a('<div class="mejs-button mejs-stop-button mejs-stop"><button type="button" aria-controls="'+d.id+'" title="'+d.options.stopText+'"></button></div>').appendTo(b).click(function(){if(!f.paused){f.pause()}if(f.currentTime>0){f.setCurrentTime(0);f.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));g.find(".mejs-poster").show()}})}})})(mejs.$);(function(a){a.extend(MediaElementPlayer.prototype,{buildprogress:function(n,o,f,c){a('<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(o);o.find(".mejs-time-buffering").hide();var p=this,l=o.find(".mejs-time-total"),g=o.find(".mejs-time-loaded"),k=o.find(".mejs-time-current"),j=o.find(".mejs-time-handle"),m=o.find(".mejs-time-float"),b=o.find(".mejs-time-float-current"),e=function(u){var q=u.pageX,v=l.offset(),s=l.outerWidth(true),r=0,t=0,w=q-v.left;if(q>v.left&&q<=s+v.left&&c.duration){r=((q-v.left)/s);t=(r<=0.02)?0:r*c.duration;if(h){c.setCurrentTime(t)}if(!mejs.MediaFeatures.hasTouch){m.css("left",w);b.html(mejs.Utility.secondsToTimeCode(t));m.show()}}},h=false,d=false;l.bind("mousedown",function(q){if(q.which===1){h=true;e(q);a(document).bind("mousemove.dur",function(r){e(r)}).bind("mouseup.dur",function(r){h=false;m.hide();a(document).unbind(".dur")});return false}}).bind("mouseenter",function(q){d=true;a(document).bind("mousemove.dur",function(r){e(r)});if(!mejs.MediaFeatures.hasTouch){m.show()}}).bind("mouseleave",function(q){d=false;if(!h){a(document).unbind(".dur");m.hide()}});c.addEventListener("progress",function(q){n.setProgressRail(q);n.setCurrentRail(q)},false);c.addEventListener("timeupdate",function(q){n.setProgressRail(q);n.setCurrentRail(q)},false);p.loaded=g;p.total=l;p.current=k;p.handle=j},setProgressRail:function(f){var b=this,d=(f!=undefined)?f.target:b.media,c=null;if(d&&d.buffered&&d.buffered.length>0&&d.buffered.end&&d.duration){c=d.buffered.end(0)/d.duration}else{if(d&&d.bytesTotal!=undefined&&d.bytesTotal>0&&d.bufferedBytes!=undefined){c=d.bufferedBytes/d.bytesTotal}else{if(f&&f.lengthComputable&&f.total!=0){c=f.loaded/f.total}}}if(c!==null){c=Math.min(1,Math.max(0,c));if(b.loaded&&b.total){b.loaded.width(b.total.width()*c)}}},setCurrentRail:function(){var b=this;if(b.media.currentTime!=undefined&&b.media.duration){if(b.total&&b.handle){var d=b.total.width()*b.media.currentTime/b.media.duration,c=d-(b.handle.outerWidth(true)/2);b.current.width(d);b.handle.css("left",c)}}}})})(mejs.$);(function(a){a.extend(mejs.MepDefaults,{duration:-1,timeAndDurationSeparator:" <span> | </span> "});a.extend(MediaElementPlayer.prototype,{buildcurrent:function(d,b,f,e){var c=this;a('<div class="mejs-time"><span class="mejs-currenttime">'+(d.options.alwaysShowHours?"00:":"")+(d.options.showTimecodeFrameCount?"00:00:00":"00:00")+"</span></div>").appendTo(b);c.currenttime=c.controls.find(".mejs-currenttime");e.addEventListener("timeupdate",function(){d.updateCurrent()},false)},buildduration:function(d,b,f,e){var c=this;if(b.children().last().find(".mejs-currenttime").length>0){a(c.options.timeAndDurationSeparator+'<span class="mejs-duration">'+(c.options.duration>0?mejs.Utility.secondsToTimeCode(c.options.duration,c.options.alwaysShowHours||c.media.duration>3600,c.options.showTimecodeFrameCount,c.options.framesPerSecond||25):((d.options.alwaysShowHours?"00:":"")+(d.options.showTimecodeFrameCount?"00:00:00":"00:00")))+"</span>").appendTo(b.find(".mejs-time"))}else{b.find(".mejs-currenttime").parent().addClass("mejs-currenttime-container");a('<div class="mejs-time mejs-duration-container"><span class="mejs-duration">'+(c.options.duration>0?mejs.Utility.secondsToTimeCode(c.options.duration,c.options.alwaysShowHours||c.media.duration>3600,c.options.showTimecodeFrameCount,c.options.framesPerSecond||25):((d.options.alwaysShowHours?"00:":"")+(d.options.showTimecodeFrameCount?"00:00:00":"00:00")))+"</span></div>").appendTo(b)}c.durationD=c.controls.find(".mejs-duration");e.addEventListener("timeupdate",function(){d.updateDuration()},false)},updateCurrent:function(){var b=this;if(b.currenttime){b.currenttime.html(mejs.Utility.secondsToTimeCode(b.media.currentTime,b.options.alwaysShowHours||b.media.duration>3600,b.options.showTimecodeFrameCount,b.options.framesPerSecond||25))}},updateDuration:function(){var b=this;if(b.media.duration&&b.durationD){b.durationD.html(mejs.Utility.secondsToTimeCode(b.media.duration,b.options.alwaysShowHours,b.options.showTimecodeFrameCount,b.options.framesPerSecond||25))}}})})(mejs.$);(function(a){a.extend(mejs.MepDefaults,{muteText:"Mute Toggle",hideVolumeOnTouchDevices:true,audioVolume:"horizontal",videoVolume:"vertical"});a.extend(MediaElementPlayer.prototype,{buildvolume:function(n,o,j,d){if(mejs.MediaFeatures.hasTouch&&this.options.hideVolumeOnTouchDevices){return}var p=this,l=(p.isVideo)?p.options.videoVolume:p.options.audioVolume,f=(l=="horizontal")?a('<div class="mejs-button mejs-volume-button mejs-mute"><button type="button" aria-controls="'+p.id+'" title="'+p.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(o):a('<div class="mejs-button mejs-volume-button mejs-mute"><button type="button" aria-controls="'+p.id+'" title="'+p.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(o),q=p.container.find(".mejs-volume-slider, .mejs-horizontal-volume-slider"),b=p.container.find(".mejs-volume-total, .mejs-horizontal-volume-total"),h=p.container.find(".mejs-volume-current, .mejs-horizontal-volume-current"),g=p.container.find(".mejs-volume-handle, .mejs-horizontal-volume-handle"),m=function(w,x){if(!q.is(":visible")&&typeof x=="undefined"){q.show();m(w,true);q.hide();return}w=Math.max(0,w);w=Math.min(w,1);if(w==0){f.removeClass("mejs-mute").addClass("mejs-unmute")}else{f.removeClass("mejs-unmute").addClass("mejs-mute")}if(l=="vertical"){var u=b.height(),t=b.position(),s=u-(u*w);g.css("top",Math.round(t.top+s-(g.height()/2)));h.height(u-s);h.css("top",t.top+s)}else{var r=b.width(),t=b.position(),v=r*w;g.css("left",Math.round(t.left+v-(g.width()/2)));h.width(Math.round(v))}},c=function(w){var u=null,s=b.offset();if(l=="vertical"){var t=b.height(),r=parseInt(b.css("top").replace(/px/,""),10),v=w.pageY-s.top;u=(t-v)/t;if(s.top==0||s.left==0){return}}else{var y=b.width(),x=w.pageX-s.left;u=x/y}u=Math.max(0,u);u=Math.min(u,1);m(u);if(u==0){d.setMuted(true)}else{d.setMuted(false)}d.setVolume(u)},k=false,e=false;f.hover(function(){q.show();e=true},function(){e=false;if(!k&&l=="vertical"){q.hide()}});q.bind("mouseover",function(){e=true}).bind("mousedown",function(r){c(r);a(document).bind("mousemove.vol",function(s){c(s)}).bind("mouseup.vol",function(){k=false;a(document).unbind(".vol");if(!e&&l=="vertical"){q.hide()}});k=true;return false});f.find("button").click(function(){d.setMuted(!d.muted)});d.addEventListener("volumechange",function(r){if(!k){if(d.muted){m(0);f.removeClass("mejs-mute").addClass("mejs-unmute")}else{m(d.volume);f.removeClass("mejs-unmute").addClass("mejs-mute")}}},false);if(p.container.is(":visible")){m(n.options.startVolume);if(d.pluginType==="native"){d.setVolume(n.options.startVolume)}}}})})(mejs.$);(function(a){a.extend(mejs.MepDefaults,{usePluginFullScreen:true,newWindowCallback:function(){return""},fullscreenText:mejs.i18n.t("Fullscreen")});a.extend(MediaElementPlayer.prototype,{isFullScreen:false,isNativeFullScreen:false,docStyleOverflow:null,isInIframe:false,buildfullscreen:function(q,p,g,f){if(!q.isVideo){return}q.isInIframe=(window.location!=window.parent.location);if(mejs.MediaFeatures.hasTrueNativeFullScreen){var u=null;if(mejs.MediaFeatures.hasMozNativeFullScreen){u=a(document)}else{u=q.container}u.bind(mejs.MediaFeatures.fullScreenEventName,function(t){if(mejs.MediaFeatures.isFullScreen()){q.isNativeFullScreen=true;q.setControlsSize()}else{q.isNativeFullScreen=false;q.exitFullScreen()}})}var o=this,e=0,c=0,n=q.container,b=a('<div class="mejs-button mejs-fullscreen-button"><button type="button" aria-controls="'+o.id+'" title="'+o.options.fullscreenText+'"></button></div>').appendTo(p);if(o.media.pluginType==="native"||(!o.options.usePluginFullScreen&&!mejs.MediaFeatures.isFirefox)){b.click(function(){var t=(mejs.MediaFeatures.hasTrueNativeFullScreen&&mejs.MediaFeatures.isFullScreen())||q.isFullScreen;if(t){q.exitFullScreen()}else{q.enterFullScreen()}})}else{var m=null,h=(function(){var v=document.createElement("x"),w=document.documentElement,x=window.getComputedStyle,t;if(!("pointerEvents" in v.style)){return false}v.style.pointerEvents="auto";v.style.pointerEvents="x";w.appendChild(v);t=x&&x(v,"").pointerEvents==="auto";w.removeChild(v);return !!t})();if(h&&!mejs.MediaFeatures.isOpera){var l=false,r=function(){if(l){j.hide();d.hide();k.hide();b.css("pointer-events","");o.controls.css("pointer-events","");l=false}},j=a('<div class="mejs-fullscreen-hover" />').appendTo(o.container).mouseover(r),d=a('<div class="mejs-fullscreen-hover"  />').appendTo(o.container).mouseover(r),k=a('<div class="mejs-fullscreen-hover"  />').appendTo(o.container).mouseover(r),s=function(){var v={position:"absolute",top:0,left:0};j.css(v);d.css(v);k.css(v);j.width(o.container.width()).height(o.container.height()-o.controls.height());var t=b.offset().left-o.container.offset().left;fullScreenBtnWidth=b.outerWidth(true);d.width(t).height(o.controls.height()).css({top:o.container.height()-o.controls.height()});k.width(o.container.width()-t-fullScreenBtnWidth).height(o.controls.height()).css({top:o.container.height()-o.controls.height(),left:t+fullScreenBtnWidth})};a(document).resize(function(){s()});b.mouseover(function(){if(!o.isFullScreen){var t=b.offset(),v=q.container.offset();f.positionFullscreenButton(t.left-v.left,t.top-v.top,false);b.css("pointer-events","none");o.controls.css("pointer-events","none");j.show();k.show();d.show();s();l=true}});f.addEventListener("fullscreenchange",function(t){r()})}else{b.mouseover(function(){if(m!==null){clearTimeout(m);delete m}var t=b.offset(),v=q.container.offset();f.positionFullscreenButton(t.left-v.left,t.top-v.top,true)}).mouseout(function(){if(m!==null){clearTimeout(m);delete m}m=setTimeout(function(){f.hideFullscreenButton()},1500)})}}q.fullscreenBtn=b;a(document).bind("keydown",function(t){if(((mejs.MediaFeatures.hasTrueNativeFullScreen&&mejs.MediaFeatures.isFullScreen())||o.isFullScreen)&&t.keyCode==27){q.exitFullScreen()}})},enterFullScreen:function(){var c=this;if(c.media.pluginType!=="native"&&(mejs.MediaFeatures.isFirefox||c.options.usePluginFullScreen)){return}docStyleOverflow=document.documentElement.style.overflow;document.documentElement.style.overflow="hidden";normalHeight=c.container.height();normalWidth=c.container.width();if(c.media.pluginType==="native"){if(mejs.MediaFeatures.hasTrueNativeFullScreen){mejs.MediaFeatures.requestFullScreen(c.container[0]);if(c.isInIframe){setTimeout(function d(){if(c.isNativeFullScreen){if(a(window).width()!==screen.width){c.exitFullScreen()}else{setTimeout(d,500)}}},500)}}else{if(mejs.MediaFeatures.hasSemiNativeFullScreen){c.media.webkitEnterFullscreen();return}}}if(c.isInIframe){var b=c.options.newWindowCallback(this);if(b!==""){if(!mejs.MediaFeatures.hasTrueNativeFullScreen){c.pause();window.open(b,c.id,"top=0,left=0,width="+screen.availWidth+",height="+screen.availHeight+",resizable=yes,scrollbars=no,status=no,toolbar=no");return}else{setTimeout(function(){if(!c.isNativeFullScreen){c.pause();window.open(b,c.id,"top=0,left=0,width="+screen.availWidth+",height="+screen.availHeight+",resizable=yes,scrollbars=no,status=no,toolbar=no")}},250)}}}c.container.addClass("mejs-container-fullscreen").width("100%").height("100%");setTimeout(function(){c.container.css({width:"100%",height:"100%"});c.setControlsSize()},500);if(c.pluginType==="native"){c.$media.width("100%").height("100%")}else{c.container.find("object, embed, iframe").width("100%").height("100%");c.media.setVideoSize(a(window).width(),a(window).height())}c.layers.children("div").width("100%").height("100%");if(c.fullscreenBtn){c.fullscreenBtn.removeClass("mejs-fullscreen").addClass("mejs-unfullscreen")}c.setControlsSize();c.isFullScreen=true},exitFullScreen:function(){var b=this;if(b.media.pluginType!=="native"&&mejs.MediaFeatures.isFirefox){b.media.setFullscreen(false);return}if(mejs.MediaFeatures.hasTrueNativeFullScreen&&(mejs.MediaFeatures.isFullScreen()||b.isFullScreen)){mejs.MediaFeatures.cancelFullScreen()}document.documentElement.style.overflow=docStyleOverflow;b.container.removeClass("mejs-container-fullscreen").width(normalWidth).height(normalHeight);if(b.pluginType==="native"){b.$media.width(normalWidth).height(normalHeight)}else{b.container.find("object embed").width(normalWidth).height(normalHeight);b.media.setVideoSize(normalWidth,normalHeight)}b.layers.children("div").width(normalWidth).height(normalHeight);b.fullscreenBtn.removeClass("mejs-unfullscreen").addClass("mejs-fullscreen");b.setControlsSize();b.isFullScreen=false}})})(mejs.$);(function(a){a.extend(mejs.MepDefaults,{startLanguage:"",tracksText:"Captions/Subtitles"});a.extend(MediaElementPlayer.prototype,{hasChapters:false,buildtracks:function(f,b,h,g){if(!f.isVideo){return}if(f.tracks.length==0){return}var e=this,d,c="";f.chapters=a('<div class="mejs-chapters mejs-layer"></div>').prependTo(h).hide();f.captions=a('<div class="mejs-captions-layer mejs-layer"><div class="mejs-captions-position"><span class="mejs-captions-text"></span></div></div>').prependTo(h).hide();f.captionsText=f.captions.find(".mejs-captions-text");f.captionsButton=a('<div class="mejs-button mejs-captions-button"><button type="button" aria-controls="'+e.id+'" title="'+e.options.tracksText+'"></button><div class="mejs-captions-selector"><ul><li><input type="radio" name="'+f.id+'_captions" id="'+f.id+'_captions_none" value="none" checked="checked" /><label for="'+f.id+'_captions_none">None</label></li></ul></div></div>').appendTo(b).hover(function(){a(this).find(".mejs-captions-selector").css("visibility","visible")},function(){a(this).find(".mejs-captions-selector").css("visibility","hidden")}).delegate("input[type=radio]","click",function(){lang=this.value;if(lang=="none"){f.selectedTrack=null}else{for(d=0;d<f.tracks.length;d++){if(f.tracks[d].srclang==lang){f.selectedTrack=f.tracks[d];f.captions.attr("lang",f.selectedTrack.srclang);f.displayCaptions();break}}}});if(!f.options.alwaysShowControls){f.container.bind("mouseenter",function(){f.container.find(".mejs-captions-position").addClass("mejs-captions-position-hover")}).bind("mouseleave",function(){if(!g.paused){f.container.find(".mejs-captions-position").removeClass("mejs-captions-position-hover")}})}else{f.container.find(".mejs-captions-position").addClass("mejs-captions-position-hover")}f.trackToLoad=-1;f.selectedTrack=null;f.isLoadingTrack=false;for(d=0;d<f.tracks.length;d++){if(f.tracks[d].kind=="subtitles"){f.addTrackButton(f.tracks[d].srclang,f.tracks[d].label)}}f.loadNextTrack();g.addEventListener("timeupdate",function(j){f.displayCaptions()},false);g.addEventListener("loadedmetadata",function(j){f.displayChapters()},false);f.container.hover(function(){if(f.hasChapters){f.chapters.css("visibility","visible");f.chapters.fadeIn(200).height(f.chapters.find(".mejs-chapter").outerHeight())}},function(){if(f.hasChapters&&!g.paused){f.chapters.fadeOut(200,function(){a(this).css("visibility","hidden");a(this).css("display","block")})}});if(f.node.getAttribute("autoplay")!==null){f.chapters.css("visibility","hidden")}},loadNextTrack:function(){var b=this;b.trackToLoad++;if(b.trackToLoad<b.tracks.length){b.isLoadingTrack=true;b.loadTrack(b.trackToLoad)}else{b.isLoadingTrack=false}},loadTrack:function(c){var d=this,b=d.tracks[c],e=function(){b.isLoaded=true;d.enableTrackButton(b.srclang,b.label);d.loadNextTrack()};a.ajax({url:b.src,dataType:"text",success:function(f){if(typeof f=="string"&&(/<tt\s+xml/ig).exec(f)){b.entries=mejs.TrackFormatParser.dfxp.parse(f)}else{b.entries=mejs.TrackFormatParser.webvvt.parse(f)}e();if(b.kind=="chapters"){d.media.addEventListener("play",function(g){if(d.media.duration>0){d.displayChapters(b)}},false)}},error:function(){d.loadNextTrack()}})},enableTrackButton:function(d,b){var c=this;if(b===""){b=mejs.language.codes[d]||d}c.captionsButton.find("input[value="+d+"]").prop("disabled",false).siblings("label").html(b);if(c.options.startLanguage==d){a("#"+c.id+"_captions_"+d).click()}c.adjustLanguageBox()},addTrackButton:function(d,b){var c=this;if(b===""){b=mejs.language.codes[d]||d}c.captionsButton.find("ul").append(a('<li><input type="radio" name="'+c.id+'_captions" id="'+c.id+"_captions_"+d+'" value="'+d+'" disabled="disabled" /><label for="'+c.id+"_captions_"+d+'">'+b+" (loading)</label></li>"));c.adjustLanguageBox();c.container.find(".mejs-captions-translations option[value="+d+"]").remove()},adjustLanguageBox:function(){var b=this;b.captionsButton.find(".mejs-captions-selector").height(b.captionsButton.find(".mejs-captions-selector ul").outerHeight(true)+b.captionsButton.find(".mejs-captions-translations").outerHeight(true))},displayCaptions:function(){if(typeof this.tracks=="undefined"){return}var d=this,c,b=d.selectedTrack;if(b!=null&&b.isLoaded){for(c=0;c<b.entries.times.length;c++){if(d.media.currentTime>=b.entries.times[c].start&&d.media.currentTime<=b.entries.times[c].stop){d.captionsText.html(b.entries.text[c]);d.captions.show().height(0);return}}d.captions.hide()}else{d.captions.hide()}},displayChapters:function(){var c=this,b;for(b=0;b<c.tracks.length;b++){if(c.tracks[b].kind=="chapters"&&c.tracks[b].isLoaded){c.drawChapters(c.tracks[b]);c.hasChapters=true;break}}},drawChapters:function(f){var c=this,b,d,e=0,g=0;c.chapters.empty();for(b=0;b<f.entries.times.length;b++){d=f.entries.times[b].stop-f.entries.times[b].start;e=Math.floor(d/c.media.duration*100);if(e+g>100||b==f.entries.times.length-1&&e+g<100){e=100-g}c.chapters.append(a('<div class="mejs-chapter" rel="'+f.entries.times[b].start+'" style="left: '+g.toString()+"%;width: "+e.toString()+'%;"><div class="mejs-chapter-block'+((b==f.entries.times.length-1)?" mejs-chapter-block-last":"")+'"><span class="ch-title">'+f.entries.text[b]+'</span><span class="ch-time">'+mejs.Utility.secondsToTimeCode(f.entries.times[b].start)+"&ndash;"+mejs.Utility.secondsToTimeCode(f.entries.times[b].stop)+"</span></div></div>"));g+=e}c.chapters.find("div.mejs-chapter").click(function(){c.media.setCurrentTime(parseFloat(a(this).attr("rel")));if(c.media.paused){c.media.play()}});c.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(g){var e=0,d=mejs.TrackFormatParser.split2(g,/\r?\n/),c={text:[],times:[]},b,f;for(;e<d.length;e++){if(this.pattern_identifier.exec(d[e])){e++;b=this.pattern_timecode.exec(d[e]);if(b&&e<d.length){e++;f=d[e];e++;while(d[e]!==""&&e<d.length){f=f+"\n"+d[e];e++}f=a.trim(f).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig,"<a href='$1' target='_blank'>$1</a>");c.text.push(f);c.times.push({start:(mejs.Utility.convertSMPTEtoSeconds(b[1])==0)?0.2:mejs.Utility.convertSMPTEtoSeconds(b[1]),stop:mejs.Utility.convertSMPTEtoSeconds(b[3]),settings:b[5]})}}}return c}},dfxp:{parse:function(l){l=a(l).filter("tt");var j=0,c=l.children("div").eq(0),p=c.find("p"),h=l.find("#"+c.attr("style")),o,d,f,n,k={text:[],times:[]};if(h.length){var g=h.removeAttr("id").get(0).attributes;if(g.length){o={};for(j=0;j<g.length;j++){o[g[j].name.split(":")[1]]=g[j].value}}}for(j=0;j<p.length;j++){var b;var m={start:null,stop:null,style:null};if(p.eq(j).attr("begin")){m.start=mejs.Utility.convertSMPTEtoSeconds(p.eq(j).attr("begin"))}if(!m.start&&p.eq(j-1).attr("end")){m.start=mejs.Utility.convertSMPTEtoSeconds(p.eq(j-1).attr("end"))}if(p.eq(j).attr("end")){m.stop=mejs.Utility.convertSMPTEtoSeconds(p.eq(j).attr("end"))}if(!m.stop&&p.eq(j+1).attr("begin")){m.stop=mejs.Utility.convertSMPTEtoSeconds(p.eq(j+1).attr("begin"))}if(o){b="";for(var e in o){b+=e+":"+o[e]+";"}}if(b){m.style=b}if(m.start==0){m.start=0.2}k.times.push(m);n=a.trim(p.eq(j).html()).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig,"<a href='$1' target='_blank'>$1</a>");k.text.push(n);if(k.times.start==0){k.times.start=2}}return k}},split2:function(c,b){return c.split(b)}};if("x\n\ny".split(/\n/gi).length!=3){mejs.TrackFormatParser.split2=function(f,d){var e=[],b="",c;for(c=0;c<f.length;c++){b+=f.substring(c,c+1);if(d.test(b)){e.push(b.replace(d,""));b=""}}e.push(b);return e}}})(mejs.$);(function(a){a.extend(mejs.MepDefaults,{contextMenuItems:[{render:function(b){if(typeof b.enterFullScreen=="undefined"){return null}if(b.isFullScreen){return"Turn off Fullscreen"}else{return"Go Fullscreen"}},click:function(b){if(b.isFullScreen){b.exitFullScreen()}else{b.enterFullScreen()}}},{render:function(b){if(b.media.muted){return"Unmute"}else{return"Mute"}},click:function(b){if(b.media.muted){b.setMuted(false)}else{b.setMuted(true)}}},{isSeparator:true},{render:function(b){return"Download Video"},click:function(b){window.location.href=b.media.currentSrc}}]});a.extend(MediaElementPlayer.prototype,{buildcontextmenu:function(c,b,e,d){c.contextMenu=a('<div class="mejs-contextmenu"></div>').appendTo(a("body")).hide();c.container.bind("contextmenu",function(f){if(c.isContextMenuEnabled){f.preventDefault();c.renderContextMenu(f.clientX-1,f.clientY-1);return false}});c.container.bind("click",function(){c.contextMenu.hide()});c.contextMenu.bind("mouseleave",function(){c.startContextMenuTimer()})},isContextMenuEnabled:true,enableContextMenu:function(){this.isContextMenuEnabled=true},disableContextMenu:function(){this.isContextMenuEnabled=false},contextMenuTimeout:null,startContextMenuTimer:function(){var b=this;b.killContextMenuTimer();b.contextMenuTimer=setTimeout(function(){b.hideContextMenu();b.killContextMenuTimer()},750)},killContextMenuTimer:function(){var b=this.contextMenuTimer;if(b!=null){clearTimeout(b);delete b;b=null}},hideContextMenu:function(){this.contextMenu.hide()},renderContextMenu:function(b,j){var g=this,f="",d=g.options.contextMenuItems;for(var e=0,c=d.length;e<c;e++){if(d[e].isSeparator){f+='<div class="mejs-contextmenu-separator"></div>'}else{var h=d[e].render(g);if(h!=null){f+='<div class="mejs-contextmenu-item" data-itemindex="'+e+'" id="element-'+(Math.random()*1000000)+'">'+h+"</div>"}}}g.contextMenu.empty().append(a(f)).css({top:j,left:b}).show();g.contextMenu.find(".mejs-contextmenu-item").each(function(){var k=a(this),l=parseInt(k.data("itemindex"),10),m=g.options.contextMenuItems[l];if(typeof m.show!="undefined"){m.show(k,g)}k.click(function(){if(typeof m.click!="undefined"){m.click(g)}g.contextMenu.hide()})});setTimeout(function(){g.killControlsTimer("rev3")},100)}})})(mejs.$);(function(a){a.extend(mejs.MepDefaults,{postrollCloseText:mejs.i18n.t("Close")});a.extend(MediaElementPlayer.prototype,{buildpostroll:function(e,c,g,f){var d=this,b=d.container.find('link[rel="postroll"]').attr("href");if(typeof b!=="undefined"){e.postroll=a('<div class="mejs-postroll-layer mejs-layer"><a class="mejs-postroll-close" onclick="$(this).parent().hide();return false;">'+d.options.postrollCloseText+'</a><div class="mejs-postroll-layer-content"></div></div>').prependTo(g).hide();d.media.addEventListener("ended",function(h){a.ajax({dataType:"html",url:b,success:function(j,k){g.find(".mejs-postroll-layer-content").html(j)}});e.postroll.show()},false)}}})})(mejs.$);
    87  No newline at end of file
     75 * License: MIT
     76 *
     77 */if(typeof jQuery!="undefined")mejs.$=jQuery;else if(typeof ender!="undefined")mejs.$=ender;
     78(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,
     79clickToPlayPause: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,
     80b){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?
     81a.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]=
     82this;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",
     83"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);
     84a.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,
     851).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")!==
     86null?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);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,
     87true).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=
     88false;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");
     89b.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");
     90e=!(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,
     91c.controls,c.layers,c.media)}catch(l){}}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");
     92c.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<=
     930&&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 k=mejs.players[j];k.id!=c.id&&c.options.pauseOtherPlayers&&!k.paused&&!k.ended&&k.pause();k.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();
     94c.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||
     95mejs.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,
     96b){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:
     97this.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);
     98this.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()-
     99a-(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"),
     100c=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),l=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?
     101d.play():d.pause()});d.addEventL