webshims.register('mediacontrols', function($, webshims, window){ "use strict"; var pseudoClasses = 'pseudoClasses'; var options = webshims.cfg.mediaelement.jme; var baseSelector = options.selector; var btnStructure = ''; var slideStructure = '
'; var timeStructure = '
00:00
'; var noVolumeClass = (function(){ var audio; var ret = ''; if(typeof window.Audio == 'function'){ audio = new Audio(); audio.volume = 0.55; ret = audio.volume = 0.55 ? '' : ' no-volume-api'; } return ret; })(); var getBarHtml = (function(){ var cache = {}; var regTemplate = /\{\{(.+?)\}\}/igm; return function(template, invalidCache){ if(!template){ template = options.barTemplate; } if(!cache[template] || invalidCache){ cache[template] = template.replace(regTemplate, function(match, matchName){ var plugin = $.jme.plugins[matchName]; if(plugin && plugin.structure){ return plugin.structure.replace('{%class%}', matchName).replace('{%text%}', plugin.text || ''); } return match; }); } return cache[template] || ''; }; })(); var loadLazy = function(){ if(!loadLazy.loaded){ loadLazy.loaded = true; webshims.loader.loadList(['mediacontrols-lazy', 'range-ui']); } }; var lazyLoadPlugin = function(fn){ if(!fn){ fn = '_create'; } var rfn = function(c, media){ var obj = this; var args = arguments; loadLazy(); webshims.ready('mediacontrols-lazy', function(){ if(rfn != obj[fn] && $.data(media[0])){ return obj[fn].apply(obj, args); } else { webshims.error('stop too much recursion'); } }); }; return rfn; }; if(!options.barTemplate){ options.barTemplate = '
{{play-pause}}
{{playlist-prev}}{{playlist-next}}
{{currenttime-display}}
{{time-slider}}
{{duration-display}}
{{mute-unmute}}
{{volume-slider}}
{{captions}}
{{fullscreen}}
'; } if(!options.barStructure){ options.barStructure = '
'; } webshims.loader.addModule('mediacontrols-lazy', { src: 'jme/mediacontrols-lazy' }); var userActivity = { _create: lazyLoadPlugin() }; $.jme.plugins.useractivity = userActivity; $.jme.defineProp('controlbar', { set: function(elem, value){ value = !!value; var controls, playerSize; var data = $.jme.data(elem); var controlBar = $('div.jme-mediaoverlay, div.jme-controlbar', data.player); var structure = ''; if(value && !controlBar[0]){ if(data._controlbar){ data._controlbar.appendTo(data.player); } else { data.media.prop('controls', false); structure = getBarHtml(); data._controlbar = $( options.barStructure ); controlBar = data._controlbar.find('div.jme-cb-box').addClass('media-controls'); controls = data._controlbar.filter('.jme-media-overlay').addClass('play-pause'); controls = controls.add( controlBar ); $(structure).appendTo(controlBar); data._controlbar.appendTo(data.player); data.player.jmeFn('addControls', controls); playerSize = (function(){ var lastSize; var sizes = [ {size: 290, name: 'xx-small'}, {size: 380, name: 'x-small'}, {size: 490, name: 'small'}, {size: 756, name: 'medium'}, {size: 1024, name: 'large'} ]; var len = sizes.length; return function(){ var size = 'x-large'; var i = 0; var width = data.player.outerWidth(); var fSize = Math.max(parseInt(data.player.css('fontSize'), 10) || 16, 13); width = width * (16 / fSize); for(; i < len; i++){ if(sizes[i].size >= width){ size = sizes[i].name; break; } } if(lastSize != size){ lastSize = size; data.player.attr('data-playersize', size); } }; })(); userActivity._create(data.player, data.media, data.player); playerSize(); webshims.ready('dom-support', function(){ data.player.onWSOff('updateshadowdom', playerSize); controls.add(data._controlbar).addClass(webshims.shadowClass); webshims.addShadowDom(); }); } } else if(!value) { controlBar.detach(); } return value; } }); $.jme.registerPlugin('play-pause', { structure: btnStructure, text: 'play / pause', _create: lazyLoadPlugin() }); $.jme.registerPlugin('mute-unmute', { structure: btnStructure, text: 'mute / unmute', _create: lazyLoadPlugin() }); $.jme.registerPlugin('volume-slider', { structure: slideStructure, _create: lazyLoadPlugin() }); $.jme.registerPlugin('time-slider', { structure: slideStructure, options: { format: ['mm', 'ss'] }, _create: lazyLoadPlugin() }); $.jme.defineProp('format', { set: function(elem, format){ if(!$.isArray(format)){ format = format.split(':'); } var data = $.jme.data(elem); data.format = format; $(elem).triggerHandler('updatetimeformat'); data.player.triggerHandler('updatetimeformat'); return 'noDataSet'; } }); $.jme.registerPlugin('duration-display', { structure: timeStructure, options: { format: "mm:ss" }, _create: lazyLoadPlugin() }); $.jme.defineProp('countdown', { set: function(elem, value){ var data = $.jme.data(elem); data.countdown = !!value; $(elem).triggerHandler('updatetimeformat'); data.player.triggerHandler('updatetimeformat'); return 'noDataSet'; } }); $.jme.registerPlugin('currenttime-display', { structure: timeStructure, options: { format: "mm:ss", countdown: false }, _create: lazyLoadPlugin() }); /** * Added Poster Plugin * @author mderting */ /* * the old technique wasn't fully bullet proof * beside this, jme2 adovactes to use the new improved state-classes to handle visual effect on specific state (see CSS change) */ $.jme.registerPlugin('poster-display', { structure: '
', options: { }, _create: lazyLoadPlugin() }); $.jme.registerPlugin('fullscreen', { options: { fullscreen: true, autoplayfs: false }, structure: btnStructure, text: 'enter fullscreen / exit fullscreen', _create: lazyLoadPlugin() }); $.jme.registerPlugin('captions', { structure: btnStructure, text: 'subtitles', _create: function(control, media, base){ var trackElems = media.find('track'); control.wsclonedcheckbox = $(control).clone().attr({role: 'checkbox'}).insertBefore(control); base.attr('data-tracks', trackElems.length > 1 ? 'many' : trackElems.length); control.attr('aria-haspopup', 'true'); lazyLoadPlugin().apply(this, arguments); } }); webshims.ready(webshims.cfg.mediaelement.plugins.concat(['mediaelement']), function(){ webshims.addReady(function(context, insertedElement){ $(baseSelector, context).add(insertedElement.filter(baseSelector)).jmeProp('controlbar', true); }); }); webshims.ready('WINDOWLOAD', loadLazy); });