From ff2d27f8e5bacdc26792b7d7aed46a3377c0ea89 Mon Sep 17 00:00:00 2001 From: Sam Potts Date: Sun, 16 Apr 2017 13:00:57 +1000 Subject: [PATCH] Cleanup events and references --- demo/src/js/main.js | 12 +- dist/plyr.js | 4 +- src/js/plyr.js | 272 +++++++++++++++++++++++++++----------------- 3 files changed, 181 insertions(+), 107 deletions(-) diff --git a/demo/src/js/main.js b/demo/src/js/main.js index 2dfdeb20..b1d689f6 100644 --- a/demo/src/js/main.js +++ b/demo/src/js/main.js @@ -21,7 +21,17 @@ captions: { defaultActive: true }, - controls: ['play-large', 'play', 'progress', 'current-time', 'mute', 'volume', 'captions', 'settings', 'fullscreen'] + controls: [ + 'play-large', + 'play', + 'progress', + 'current-time', + 'mute', + 'volume', + 'captions', + 'settings', + 'fullscreen' + ] }); plyr.loadSprite('dist/demo.svg'); diff --git a/dist/plyr.js b/dist/plyr.js index 6aceb5d3..f9333bee 100644 --- a/dist/plyr.js +++ b/dist/plyr.js @@ -1,2 +1,2 @@ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=t(e,document):"function"==typeof define&&define.amd?define([],function(){return t(e,document)}):e.plyr=t(e,document)}("undefined"!=typeof window?window:this,function(e,t){"use strict";function n(){var e,n,a,s=navigator.userAgent,l=navigator.appName,i=""+parseFloat(navigator.appVersion),r=parseInt(navigator.appVersion,10),o=!1,u=!1,c=!1,d=!1;return navigator.appVersion.indexOf("Windows NT")!==-1&&navigator.appVersion.indexOf("rv:11")!==-1?(o=!0,l="IE",i="11"):(n=s.indexOf("MSIE"))!==-1?(o=!0,l="IE",i=s.substring(n+5)):(n=s.indexOf("Chrome"))!==-1?(c=!0,l="Chrome",i=s.substring(n+7)):(n=s.indexOf("Safari"))!==-1?(d=!0,l="Safari",i=s.substring(n+7),(n=s.indexOf("Version"))!==-1&&(i=s.substring(n+8))):(n=s.indexOf("Firefox"))!==-1?(u=!0,l="Firefox",i=s.substring(n+8)):(e=s.lastIndexOf(" ")+1)<(n=s.lastIndexOf("/"))&&(l=s.substring(e,n),i=s.substring(n+1),l.toLowerCase()===l.toUpperCase()&&(l=navigator.appName)),(a=i.indexOf(";"))!==-1&&(i=i.substring(0,a)),(a=i.indexOf(" "))!==-1&&(i=i.substring(0,a)),r=parseInt(""+i,10),isNaN(r)&&(i=""+parseFloat(navigator.appVersion),r=parseInt(navigator.appVersion,10)),{name:l,version:r,isIE:o,isFirefox:u,isChrome:c,isSafari:d,isIos:/(iPad|iPhone|iPod)/g.test(navigator.platform),isTouch:"ontouchstart"in t.documentElement}}function a(e){if(!t.querySelectorAll('script[src="'+e+'"]').length){var n=t.createElement("script");n.src=e;var a=t.getElementsByTagName("script")[0];a.parentNode.insertBefore(n,a)}}function s(e,t){return Array.prototype.indexOf&&e.indexOf(t)!==-1}function l(e,t){e.length||(e=[e]);for(var n=e.length-1;n>=0;n--){var a=n>0?t.cloneNode(!0):t,s=e[n],l=s.parentNode,i=s.nextSibling;return a.appendChild(s),i?l.insertBefore(a,i):l.appendChild(a),a}}function i(e){e&&e.parentNode.removeChild(e)}function r(e,t){e.insertBefore(t,e.firstChild)}function o(e,t){for(var n in t)e.setAttribute(n,t[n])}function u(e,t){if(!j.string(e)||j.empty(e))return{};var n={};return e.split(",").forEach(function(e){e=e.trim();var a=e.charAt(0);switch(a){case".":var s=e.replace(".","");j.object(t)&&j.string(t.class)&&(t.class+=" "+s),n.class=s;break;case"#":n.id=e.replace("#","");break;case"[":e=e.replace(/[\[\]]/g,"");var l=e.split("="),i=l[0],r=l.length>1?l[1].replace(/[\"\']/g,""):"";n[i]=r}}),n}function c(e,n,a){var s=t.createElement(e);return j.object(n)&&o(s,n),j.string(a)&&(s.textContent=a),s}function d(e,t,n,a){var s=c(e,n,a);r(t,s)}function p(e){for(var t=e.childNodes.length;t--;)e.removeChild(e.lastChild)}function m(e){return e.replace(".","")}function f(e,t,n){if(e)if(e.classList)e.classList[n?"add":"remove"](t);else{var a=(" "+e.className+" ").replace(/\s+/g," ").replace(" "+t+" ","");e.className=a+(n?" "+t:"")}}function y(e,t){return!!e&&(e.classList?e.classList.contains(t):new RegExp("(\\s|^)"+t+"(\\s|$)").test(e.className))}function b(e,n){var a=Element.prototype,s=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.msMatchesSelector||function(e){return[].indexOf.call(t.querySelectorAll(e),this)!==-1};return s.call(e,n)}function v(e,t,n,a,s){h(e,t,function(t){n&&n.apply(e,[t]),a.apply(e,[t])},s)}function g(e,t,n,a,s){var l=t.split(" ");if(j.boolean(s)||(s=!1),e instanceof NodeList)for(var i=0;i',''+t+"",""].join(""):""}function a(e){switch(e){case"hd2160":return"2160P";case"hd1440":return"1440P";case"hd1080":return"1080P";case"hd720":return"720P";case"large":return"480P";case"medium":return"360P";case"small":return"240P";default:return"Auto"}}if(!j.object(at.quality)&&(at.quality={available:e,current:t},j.array(e)&&e.length)){var s=e.filter(function(e){return["tiny","small"].indexOf(e)===-1}),l=s.map(function(e){return["
  • ",'","
  • "].join("")});l.unshift(['
  • ','","
  • "].join("")),V(E.selectors.menu.quality).innerHTML=l.join("")}}function G(){if(at.supported.full&&("audio"!==at.type||E.fullscreen.allowAudio)&&E.fullscreen.enabled){var e=q.fullscreen;e||E.fullscreen.fallback&&!D()?(it((e?"Native":"Fallback")+" fullscreen enabled"),f(at.elements.container,E.classes.fullscreen.enabled,!0)):it("Fullscreen not supported and fallback disabled"),at.elements.buttons&&at.elements.buttons.fullscreen&&C(at.elements.buttons.fullscreen,!1),W()}}function Z(e){j.event(e)&&(e=e.target),e.activeCues[0]&&"text"in e.activeCues[0]?ne(e.activeCues[0].getCueAsHTML()):ne()}function ee(){if("video"===at.type){V(E.selectors.captions)||at.elements.wrapper.insertAdjacentHTML("afterbegin",'
    '),at.captions.textTracks=!1,at.elements.media.textTracks&&(at.captions.textTracks=!0);var e=[],t="";if(at.elements.media.childNodes.forEach(function(t){"track"===t.nodeName.toLowerCase()&&("captions"!==t.kind&&"subtitles"!==t.kind||e.push(t.getAttribute("src")))}),at.captions.exist=!0,0===e.length?(at.captions.exist=!1,it("No caption track found")):Number(E.captions.selectedIndex)+1>e.length?(at.captions.exist=!1,it("Caption index out of bound")):(t=e[E.captions.selectedIndex],it("Caption track found; URI: "+t)),at.captions.exist){var n=at.elements.media.textTracks;if([].forEach.call(n,function(e){k(e,"cuechange",Z),e.mode="hidden"}),se(at),(at.browser.isIE&&at.browser.version>=10||at.browser.isFirefox&&at.browser.version>=31)&&(it("Detected browser with known TextTrack issues - using manual fallback"),at.captions.textTracks=!1),at.captions.textTracks){it("TextTracks supported");var a=n[E.captions.selectedIndex];"captions"!==a.kind&&"subtitles"!==a.kind||(h(a,"cuechange",Z),a.activeCues&&a.activeCues.length>0&&Z(a))}else if(it("TextTracks not supported so rendering captions manually"),at.captions.current="",at.captions.captions=[],""!==t){var s=new XMLHttpRequest;s.onreadystatechange=function(){if(4===s.readyState)if(200===s.status){var e=s.responseText,t="\r\n";e.indexOf(t+t)===-1&&(t=e.indexOf("\r\r")!==-1?"\r":"\n");var n=e.split(t+t);at.captions.captions=n.map(function(e){var n=e.split(t),a=0;return n[a].indexOf(":")!==-1&&(a=1),[n[a],n[a+1]]}),at.captions.captions.shift(),it("Successfully loaded the caption file via AJAX")}else rt(E.logPrefix+"There was a problem loading the caption file via AJAX")},s.open("get",t,!0),s.send()}}else f(at.elements.container,E.classes.captions.enabled)}}function te(e){E.captions.selectedIndex=e||E.captions.selectedIndex,ne(),ee()}function ne(e){var t=V(E.selectors.captions);if(j.htmlElement(t)){var n=c("span");p(t),j.undefined(e)&&(e=""),j.string(e)?n.innerHTML=e.trim():n.appendChild(e),t.appendChild(n)}}function ae(e){function t(e,t){var n=[];n=e.split(" --> ");for(var a=0;aat.captions.captions.length-1){at.captions.count=at.captions.captions.length-1;break}at.elements.media.currentTime.toFixed(1)>=n(at.captions[at.subcount][0])&&at.elements.media.currentTime.toFixed(1)<=a(at.captions[at.subcount][0])?(at.captions.current=at.captions.captions[at.captions.count][1],ne(at.captions.current)):ne()}}function se(){if(at.elements.buttons.captions){f(at.elements.container,E.classes.captions.enabled,!0);var e=at.storage.captions;j.boolean(e)||(e=E.captions.defaultActive),e&&(f(at.elements.container,E.classes.captions.active,!0),C(at.elements.buttons.captions,!0))}}function le(e){at.supported.full&&at.elements.buttons.captions&&(j.boolean(e)||(e=at.elements.container.className.indexOf(E.classes.captions.active)===-1),at.captions.enabled=e,C(at.elements.buttons.captions,at.captions.enabled),f(at.elements.container,E.classes.captions.active,at.captions.enabled),M(at.elements.container,at.captions.enabled?"captionsenabled":"captionsdisabled",!0),de({captions:at.captions.enabled}))}function ie(){if(E.loadSprite){var e=B();e.absolute?(it("AJAX loading absolute SVG sprite"+(at.browser.isIE?" (due to IE)":"")),A(e.url,"sprite-plyr")):it("Sprite will be used as external resource directly")}s(E.controls,"play-large")&&(at.elements.buttons.playLarge=U("play-large"),at.elements.container.appendChild(at.elements.buttons.playLarge)),at.id=Math.floor(1e4*Math.random());var n,a=z({id:at.id,seektime:E.seekTime,speed:xe(),quality:"HD",captions:"English",loop:"None"});if(j.string(E.selectors.controls.container)&&(n=t.querySelector(E.selectors.controls.container)),j.htmlElement(n)||(n=at.elements.container),n.appendChild(a),E.tooltips.controls)for(var l=R([E.selectors.controls.wrapper," ",E.selectors.labels," .",E.classes.hidden].join("")),i=l.length-1;i>=0;i--){var r=l[i];f(r,E.classes.hidden,!1),f(r,E.classes.tooltip,!0)}}function re(){f(at.elements.container,E.selectors.container.replace(".",""),at.supported.full)}function oe(e){e&&s(E.types.html5,at.type)?at.elements.media.setAttribute("controls",""):at.elements.media.removeAttribute("controls")}function ue(e){var t=E.i18n.play;j.string(E.title)&&E.title.length&&(t+=", "+E.title,at.elements.container.setAttribute("aria-label",E.title)),at.supported.full&&(j.htmlElement(at.elements.buttons.play)&&at.elements.buttons.play.setAttribute("aria-label",t),j.htmlElement(at.elements.buttons.playLarge)&&at.elements.buttons.playLarge.setAttribute("aria-label",t)),j.htmlElement(e)&&e.setAttribute("title",E.i18n.frameTitle.replace("{title}",E.title))}function ce(){var t=null;at.storage={},q.storage&&E.storage.enabled&&(e.localStorage.removeItem("plyr-volume"),t=e.localStorage.getItem(E.storage.key),t&&(/^\d+(\.\d+)?$/.test(t)?de({volume:parseFloat(t)}):at.storage=JSON.parse(t)))}function de(t){q.storage&&E.storage.enabled&&(T(at.storage,t),e.localStorage.setItem(E.storage.key,JSON.stringify(at.storage)))}function pe(){if(!at.elements.media)return void rt("No media element found!");if(at.supported.full&&(f(at.elements.container,E.classes.type.replace("{0}",at.type),!0),s(E.types.embed,at.type)&&f(at.elements.container,E.classes.type.replace("{0}","video"),!0),f(at.elements.container,E.classes.pip.enabled,q.pip),f(at.elements.container,E.classes.stopped,E.autoplay),f(at.elements.container,E.classes.isIos,at.browser.isIos),f(at.elements.container,E.classes.isTouch,at.browser.isTouch),"video"===at.type)){var e=c("div");e.setAttribute("class",E.classes.videoWrapper),l(at.elements.media,e),at.elements.wrapper=e}s(E.types.embed,at.type)&&me()}function me(){var t,n=c("div"),s=at.type+"-"+Math.floor(1e4*Math.random());switch(at.type){case"youtube":t=S(at.embedId);break;case"vimeo":t=_(at.embedId);break;default:t=at.embedId}for(var l=R('[id^="'+at.type+'-"]'),r=l.length-1;r>=0;r--)i(l[r]);if(f(at.elements.media,E.classes.videoWrapper,!0),f(at.elements.media,E.classes.embedWrapper,!0),"youtube"===at.type)at.elements.media.appendChild(n),n.setAttribute("id",s),j.object(e.YT)?ye(t,n):(a(E.urls.youtube.api),e.onYouTubeReadyCallbacks=e.onYouTubeReadyCallbacks||[],e.onYouTubeReadyCallbacks.push(function(){ye(t,n)}),e.onYouTubeIframeAPIReady=function(){e.onYouTubeReadyCallbacks.forEach(function(e){e()})});else if("vimeo"===at.type)if(at.supported.full?at.elements.media.appendChild(n):n=at.elements.media,n.setAttribute("id",s),j.object(e.Vimeo))be(t,n);else{a(E.urls.vimeo.api);var u=e.setInterval(function(){j.object(e.Vimeo)&&(e.clearInterval(u),be(t,n))},50)}else if("soundcloud"===at.type){var d=c("iframe");d.loaded=!1,h(d,"load",function(){d.loaded=!0}),o(d,{src:"https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/"+t,id:s}),n.appendChild(d),at.elements.media.appendChild(n),e.SC||a(E.urls.soundcloud.api);var p=e.setInterval(function(){e.SC&&d.loaded&&(e.clearInterval(p),ve.call(d))},50)}}function fe(){at.supported.full&&(et(),tt()),ue(V("iframe"))}function ye(t,n){at.embed=new e.YT.Player(n.id,{videoId:t,playerVars:{autoplay:E.autoplay?1:0,controls:at.supported.full?0:1,rel:0,showinfo:0,iv_load_policy:3,cc_load_policy:E.captions.defaultActive?1:0,cc_lang_pref:"en",wmode:"transparent",modestbranding:1,disablekb:1,origin:"*"},events:{onError:function(e){M(at.elements.container,"error",!0,{code:e.data,embed:e.target})},onPlaybackQualityChange:function(e){var t=(e.target,at.getPlaybackQuality());console.warn(t)},onReady:function(t){t.target;at.elements.media.play=function(){at.playVideo(),at.elements.media.paused=!1},at.elements.media.pause=function(){at.pauseVideo(),at.elements.media.paused=!0},at.elements.media.stop=function(){at.stopVideo(),at.elements.media.paused=!0},at.elements.media.duration=at.getDuration(),at.elements.media.paused=!0,at.elements.media.currentTime=0,at.elements.media.muted=at.isMuted();var n=at.getPlaybackRate(),a=at.getAvailablePlaybackRates();console.warn(n,a),E.title=at.getVideoData().title,at.supported.full&&at.elements.media.querySelector("iframe").setAttribute("tabindex","-1"),fe(),M(at.elements.media,"timeupdate"),M(at.elements.media,"durationchange"),e.clearInterval(st.buffering),st.buffering=e.setInterval(function(){at.elements.media.buffered=at.getVideoLoadedFraction(),(null===at.elements.media.lastBuffered||at.elements.media.lastBuffered=n)return;E.loop.end=n,E.loop.indicator.end=at.elements.display.played.value;break;case"all":E.loop.start=0,E.loop.end=at.elements.media.duration-2,E.loop.indicator.start=0,E.loop.indicator.end=100;break;case"toggle":E.loop.active?(E.loop.start=0,E.loop.end=null):(E.loop.start=0,E.loop.end=at.elements.media.duration-2);break;default:E.loop.start=0,E.loop.end=null}E.loop.active=j.number(E.loop.start)&&j.number(E.loop.end);var a=(De(E.loop.start,V('[data-plyr-loop="start"]')),null);j.number(E.loop.end)&&(a=De(E.loop.end,t.querySelector('[data-loop__value="loopout"]'))),E.loop.active}function Ce(e){if(j.undefined(e)&&(e=at.storage.speed||E.defaultSpeed),!j.array(E.speeds))return void rt("Invalid speeds format");if(!j.number(e)){var t=E.speeds.indexOf(E.currentSpeed);if(t!==-1){var n=t+1;n>=E.speeds.length&&(n=0),e=E.speeds[n]}else e=E.defaultSpeed}E.currentSpeed=e,at.elements.media.playbackRate=e,de({speed:e})}function xe(){return E.currentSpeed.toFixed(1).toString().replace(".0","")+"×"}function Te(e){j.number(e)||(e=E.seekTime),_e(at.elements.media.currentTime-e)}function Se(e){j.number(e)||(e=E.seekTime),_e(at.elements.media.currentTime+e)}function _e(e){var t=0,n=at.elements.media.paused,a=Ee();j.number(e)?t=e:j.event(e)&&s(["input","change"],e.type)&&(t=e.target.value/e.target.max*a),t<0?t=0:t>a&&(t=a),Be(t);try{at.elements.media.currentTime=t.toFixed(4)}catch(e){}if(s(E.types.embed,at.type)){switch(at.type){case"youtube":at.embed.seekTo(t);break;case"vimeo":at.embed.setCurrentTime(t.toFixed(0));break;case"soundcloud":at.embed.seekTo(1e3*t)}n&&he(),M(at.elements.media,"timeupdate"),at.elements.media.seeking=!0,M(at.elements.media,"seeking")}it("Seeking to "+at.elements.media.currentTime+" seconds"),ae(t)}function Ee(){var e=parseInt(E.duration),t=0;return null===at.elements.media.duration||isNaN(at.elements.media.duration)||(t=at.elements.media.duration),isNaN(e)?t:e}function Ae(){f(at.elements.container,E.classes.playing,!at.elements.media.paused),f(at.elements.container,E.classes.stopped,at.elements.media.paused),Xe(at.elements.media.paused)}function Ie(){F={x:e.pageXOffset||0,y:e.pageYOffset||0}}function Pe(){e.scrollTo(F.x,F.y)}function Ne(e){var n=q.fullscreen;if(n){if(!e||e.type!==O.eventType)return O.isFullScreen(at.elements.container)?O.cancelFullScreen():(Ie(),O.requestFullScreen(at.elements.container)),void(at.fullscreen.active=O.isFullScreen(at.elements.container));at.fullscreen.active=O.isFullScreen(at.elements.container)}else at.fullscreen.active=!at.fullscreen.active,t.body.style.overflow=at.fullscreen.active?"hidden":"";f(at.elements.container,E.classes.fullscreen.active,at.fullscreen.active),W(at.fullscreen.active),at.elements.buttons&&at.elements.buttons.fullscreen&&C(at.elements.buttons.fullscreen,at.fullscreen.active),M(at.elements.container,at.fullscreen.active?"enterfullscreen":"exitfullscreen",!0),!at.fullscreen.active&&n&&Pe()}function Fe(e){if(j.boolean(e)||(e=!at.elements.media.muted),C(at.elements.buttons.mute,e),at.elements.media.muted=e,0===at.elements.media.volume&&Le(E.volume),s(E.types.embed,at.type)){switch(at.type){case"youtube":at.embed[at.elements.media.muted?"mute":"unMute"]();break;case"vimeo":case"soundcloud":at.embed.setVolume(at.elements.media.muted?0:parseFloat(E.volume/10))}M(at.elements.media,"volumechange")}}function Le(e){var t=10,n=0;if(j.undefined(e)&&(e=at.storage.volume),(null===e||isNaN(e))&&(e=E.volume),e>t&&(e=t),e0&&Fe()}function je(e){var t=at.elements.media.muted?0:10*at.elements.media.volume;j.number(e)||(e=1),Le(t+e)}function Oe(e){var t=at.elements.media.muted?0:10*at.elements.media.volume;j.number(e)||(e=1),Le(t-e)}function qe(){var e=at.elements.media.muted?0:10*at.elements.media.volume;at.supported.full&&(at.elements.inputs.volume&&(at.elements.inputs.volume.value=e),at.elements.display.volume&&(at.elements.display.volume.value=e)),de({volume:e}),f(at.elements.container,E.classes.muted,0===e),at.supported.full&&at.elements.buttons.mute&&C(at.elements.buttons.mute,0===e)}function Me(e){var t="waiting"===e.type;clearTimeout(st.loading),st.loading=setTimeout(function(){f(at.elements.container,E.classes.loading,t),Xe(t)},t?250:0)}function Re(e){if(at.supported.full){var t=at.elements.display.played,n=0,a=Ee();if(e)switch(e.type){case"timeupdate":case"seeking":if(at.elements.controls.pressed)return;n=x(at.elements.media.currentTime,a),"timeupdate"===e.type&&at.elements.inputs.seek&&(at.elements.inputs.seek.value=n);break;case"playing":case"progress":t=at.elements.display.buffer,n=function(){var e=at.elements.media.buffered;return e&&e.length?x(e.end(0),a):j.number(e)?100*e:0}()}j.number(E.loop.start)&&j.number(E.loop.end)&&at.elements.media.currentTime>=E.loop.end&&_e(E.loop.start),Ve(t,n)}}function Ve(e,t){if(at.supported.full){if(j.undefined(t)&&(t=0),j.undefined(e)){if(!j.htmlElement(at.elements.display.buffer))return;e=at.elements.display.buffer}if(j.htmlElement(e)){e.value=t;var n=e.getElementsByTagName("span")[0];j.htmlElement(n)&&(n.childNodes[0].nodeValue=t)}}}function De(e,t){if(t){isNaN(e)&&(e=0);var n=parseInt(e%60),a=parseInt(e/60%60);parseInt(e/60/60%60),parseInt(Ee()/60/60%60)>0;n=("0"+n).slice(-2),a=("0"+a).slice(-2);return t.textContent=display,display}}function We(){if(at.supported.full){var e=Ee()||0;!at.elements.display.duration&&E.displayDuration&&at.elements.media.paused&&De(e,at.elements.display.currentTime),at.elements.display.duration&&De(e,at.elements.display.duration),Ye()}}function He(e){De(at.elements.media.currentTime,at.elements.display.currentTime),e&&"timeupdate"===e.type&&at.elements.media.seeking||Re(e)}function Be(e){j.number(e)||(e=0);var t=Ee(),n=x(e,t);at.elements.progress&&at.elements.display.played&&(at.elements.display.played.value=n),at.elements.buttons&&at.elements.inputs.seek&&(at.elements.inputs.seek.value=n)}function Ye(e){var t=Ee();if(E.tooltips.seek&&at.elements.progress.container&&0!==t){var n=at.elements.progress.container.getBoundingClientRect(),a=0,l=E.classes.tooltip+"--visible";if(e)a=100/n.width*(e.pageX-n.left);else{if(!y(at.elements.display.seekTooltip,l))return;a=at.elements.display.seekTooltip.style.left.replace("%","")}a<0?a=0:a>100&&(a=100),De(t/100*a,at.elements.display.seekTooltip),at.elements.display.seekTooltip.style.left=a+"%",e&&s(["mouseenter","mouseleave"],e.type)&&f(at.elements.display.seekTooltip,l,"mouseenter"===e.type)}}function Xe(t){if(E.hideControls&&"audio"!==at.type){ -var n=0,a=!1,l=t,i=y(at.elements.container,E.classes.loading);if(j.boolean(t)||(t&&t.type?(a="enterfullscreen"===t.type,l=s(["mousemove","touchstart","mouseenter","focus"],t.type),s(["mousemove","touchmove"],t.type)&&(n=2e3),"focus"===t.type&&(n=3e3)):l=y(at.elements.container,E.classes.hideControls)),e.clearTimeout(st.hover),l||at.elements.media.paused||i){if(f(at.elements.container,E.classes.hideControls,!1),at.elements.media.paused||i)return;at.browser.isTouch&&(n=3e3)}l&&at.elements.media.paused||(st.hover=e.setTimeout(function(){(!at.elements.controls.pressed&&!at.elements.controls.hover||a)&&f(at.elements.container,E.classes.hideControls,!0)},n))}}function Ue(e){if(!j.undefined(e))return void Je(e);var t;switch(at.type){case"youtube":t=at.embed.getVideoUrl();break;case"vimeo":at.embed.getVideoUrl.then(function(e){t=e});break;case"soundcloud":at.embed.getCurrentSound(function(e){t=e.permalink_url});break;default:t=at.elements.media.currentSrc}return t||""}function Je(e){function t(){if(at.embed=null,i(at.elements.media),"video"===at.type&&at.elements.wrapper&&i(at.elements.wrapper),at.elements.container&&at.elements.container.removeAttribute("class"),"type"in e&&(at.type=e.type,"video"===at.type)){var t=e.sources[0];"type"in t&&s(E.types.embed,t.type)&&(at.type=t.type)}switch(at.supported=I(at.type),at.type){case"video":at.elements.media=c("video");break;case"audio":at.elements.media=c("audio");break;case"youtube":case"vimeo":case"soundcloud":at.elements.media=c("div"),at.embedId=e.sources[0].src}r(at.elements.container,at.elements.media),j.boolean(e.autoplay)&&(E.autoplay=e.autoplay),s(E.types.html5,at.type)&&(E.crossorigin&&at.elements.media.setAttribute("crossorigin",""),E.autoplay&&at.elements.media.setAttribute("autoplay",""),"poster"in e&&at.elements.media.setAttribute("poster",e.poster),E.loop.active&&at.elements.media.setAttribute("loop","")),f(at.elements.container,E.classes.fullscreen.active,at.fullscreen.active),f(at.elements.container,E.classes.captions.active,at.captions.enabled),re(),s(E.types.html5,at.type)&&H("source",e.sources),pe(),s(E.types.html5,at.type)&&("tracks"in e&&H("track",e.tracks),at.elements.media.load()),(s(E.types.html5,at.type)||s(E.types.embed,at.type)&&!at.supported.full)&&(et(),tt()),E.title=e.title,ue()}return j.object(e)&&"sources"in e&&e.sources.length?(f(at.elements.container,E.classes.ready,!1),he(),Be(),Ve(),$e(),void Ge(t,!1)):void rt("Invalid source format")}function Ke(e){"video"===at.type&&at.elements.media.setAttribute("poster",e)}function Qe(){function n(){var e=ke(),t=at.elements.buttons[e?"play":"pause"],n=at.elements.buttons[e?"pause":"play"];if(n=n&&n.length>1?n[n.length-1]:n[0]){var a=y(t,E.classes.tabFocus);setTimeout(function(){n.focus(),a&&(f(t,E.classes.tabFocus,!1),f(n,E.classes.tabFocus,!0))},100)}}function a(){var e=t.activeElement;return e=e&&e!==t.body?t.querySelector(":focus"):null}function l(e){return e.keyCode?e.keyCode:e.which}function r(e){for(var t in at.elements.buttons){var n=at.elements.buttons[t];if(j.nodeList(n))for(var a=0;a0)&&(t?Oe(n):je(n)),(e.deltaY>0||e.deltaX<0)&&(t?je(n):Oe(n))})}function ze(){if(h(at.elements.media,"timeupdate seeking",He),h(at.elements.media,"timeupdate",ae),h(at.elements.media,"durationchange loadedmetadata",We),h(at.elements.media,"ended",function(){"video"===at.type&&E.showPosterOnEnd&&("video"===at.type&&ne(),_e(),at.elements.media.load())}),h(at.elements.media,"progress playing",Re),h(at.elements.media,"volumechange",qe),h(at.elements.media,"play pause ended",Ae),h(at.elements.media,"waiting canplay seeked",Me),E.clickToPlay&&"audio"!==at.type){var e=V("."+E.classes.videoWrapper);if(!e)return;e.style.cursor="pointer",h(e,"click",function(){E.hideControls&&at.browser.isTouch&&!at.elements.media.paused||(at.elements.media.paused?ge():at.elements.media.ended?(_e(),ge()):he())})}E.disableContextMenu&&h(at.elements.media,"contextmenu",function(e){e.preventDefault()}),h(at.elements.media,E.events.concat(["keyup","keydown"]).join(" "),function(e){M(at.elements.container,e.type,!0)})}function $e(){if(s(E.types.html5,at.type)){for(var e=at.elements.media.querySelectorAll("source"),t=0;t=0;n--){var a=n>0?t.cloneNode(!0):t,s=e[n],l=s.parentNode,i=s.nextSibling;return a.appendChild(s),i?l.insertBefore(a,i):l.appendChild(a),a}}function i(e){e&&e.parentNode.removeChild(e)}function r(e,t){e.insertBefore(t,e.firstChild)}function o(e,t){for(var n in t)e.setAttribute(n,t[n])}function u(e,t){if(!L.string(e)||L.empty(e))return{};var n={};return e.split(",").forEach(function(e){e=e.trim();var a=e.charAt(0);switch(a){case".":var s=e.replace(".","");L.object(t)&&L.string(t.class)&&(t.class+=" "+s),n.class=s;break;case"#":n.id=e.replace("#","");break;case"[":e=e.replace(/[\[\]]/g,"");var l=e.split("="),i=l[0],r=l.length>1?l[1].replace(/[\"\']/g,""):"";n[i]=r}}),n}function c(e,n,a){var s=t.createElement(e);return L.object(n)&&o(s,n),L.string(a)&&(s.textContent=a),s}function d(e,t,n,a){var s=c(e,n,a);r(t,s)}function p(e){for(var t=e.childNodes.length;t--;)e.removeChild(e.lastChild)}function m(e){return e.replace(".","")}function f(e,t,n){if(e)if(e.classList)e.classList[n?"add":"remove"](t);else{var a=(" "+e.className+" ").replace(/\s+/g," ").replace(" "+t+" ","");e.className=a+(n?" "+t:"")}}function y(e,t){return!!e&&(e.classList?e.classList.contains(t):new RegExp("(\\s|^)"+t+"(\\s|$)").test(e.className))}function b(e,n){var a=Element.prototype,s=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.msMatchesSelector||function(e){return[].indexOf.call(t.querySelectorAll(e),this)!==-1};return s.call(e,n)}function v(e,t,n,a,s){h(e,t,function(t){n&&n.apply(e,[t]),a.apply(e,[t])},s)}function g(e,t,n,a,s){var l=t.split(" ");if(L.boolean(s)||(s=!1),e instanceof NodeList)for(var i=0;i',''+t+"",""].join(""):""}function a(e){switch(e){case"hd2160":return"2160P";case"hd1440":return"1440P";case"hd1080":return"1080P";case"hd720":return"720P";case"large":return"480P";case"medium":return"360P";case"small":return"240P";default:return"Auto"}}if(!L.object(at.quality)&&(at.quality={available:e,current:t},L.array(e)&&e.length)){var s=e.filter(function(e){return["tiny","small"].indexOf(e)===-1}),l=s.map(function(e){return["
  • ",'","
  • "].join("")});l.unshift(['
  • ','","
  • "].join("")),at.elements.settings.panes.quality.innerHTML=l.join("")}}function G(){if(at.supported.full&&("audio"!==at.type||E.fullscreen.allowAudio)&&E.fullscreen.enabled){var e=O.fullscreen;e||E.fullscreen.fallback&&!D()?(it((e?"Native":"Fallback")+" fullscreen enabled"),f(at.elements.container,E.classes.fullscreen.enabled,!0)):it("Fullscreen not supported and fallback disabled"),at.elements.buttons&&at.elements.buttons.fullscreen&&C(at.elements.buttons.fullscreen,!1),W()}}function Z(e){L.event(e)&&(e=e.target),e.activeCues[0]&&"text"in e.activeCues[0]?ne(e.activeCues[0].getCueAsHTML()):ne()}function ee(){if("video"===at.type){V(E.selectors.captions)||at.elements.wrapper.insertAdjacentHTML("afterbegin",'
    '),at.captions.textTracks=!1,at.elements.media.textTracks&&(at.captions.textTracks=!0);var e=[],t="";if(at.elements.media.childNodes.forEach(function(t){"track"===t.nodeName.toLowerCase()&&("captions"!==t.kind&&"subtitles"!==t.kind||e.push(t.getAttribute("src")))}),at.captions.exist=!0,0===e.length?(at.captions.exist=!1,it("No caption track found")):Number(E.captions.selectedIndex)+1>e.length?(at.captions.exist=!1,it("Caption index out of bound")):(t=e[E.captions.selectedIndex],it("Caption track found; URI: "+t)),at.captions.exist){var n=at.elements.media.textTracks;if([].forEach.call(n,function(e){k(e,"cuechange",Z),e.mode="hidden"}),se(at),(at.browser.isIE&&at.browser.version>=10||at.browser.isFirefox&&at.browser.version>=31)&&(it("Detected browser with known TextTrack issues - using manual fallback"),at.captions.textTracks=!1),at.captions.textTracks){it("TextTracks supported");var a=n[E.captions.selectedIndex];"captions"!==a.kind&&"subtitles"!==a.kind||(h(a,"cuechange",Z),a.activeCues&&a.activeCues.length>0&&Z(a))}else if(it("TextTracks not supported so rendering captions manually"),at.captions.current="",at.captions.captions=[],""!==t){var s=new XMLHttpRequest;s.onreadystatechange=function(){if(4===s.readyState)if(200===s.status){var e=s.responseText,t="\r\n";e.indexOf(t+t)===-1&&(t=e.indexOf("\r\r")!==-1?"\r":"\n");var n=e.split(t+t);at.captions.captions=n.map(function(e){var n=e.split(t),a=0;return n[a].indexOf(":")!==-1&&(a=1),[n[a],n[a+1]]}),at.captions.captions.shift(),it("Successfully loaded the caption file via AJAX")}else rt(E.logPrefix+"There was a problem loading the caption file via AJAX")},s.open("get",t,!0),s.send()}}else f(at.elements.container,E.classes.captions.enabled)}}function te(e){E.captions.selectedIndex=e||E.captions.selectedIndex,ne(),ee()}function ne(e){var t=V(E.selectors.captions);if(L.htmlElement(t)){var n=c("span");p(t),L.undefined(e)&&(e=""),L.string(e)?n.innerHTML=e.trim():n.appendChild(e),t.appendChild(n)}}function ae(e){function t(e,t){var n=[];n=e.split(" --> ");for(var a=0;aat.captions.captions.length-1){at.captions.count=at.captions.captions.length-1;break}at.elements.media.currentTime.toFixed(1)>=n(at.captions[at.subcount][0])&&at.elements.media.currentTime.toFixed(1)<=a(at.captions[at.subcount][0])?(at.captions.current=at.captions.captions[at.captions.count][1],ne(at.captions.current)):ne()}}function se(){if(at.elements.buttons.captions){f(at.elements.container,E.classes.captions.enabled,!0);var e=at.storage.captions;L.boolean(e)||(e=E.captions.defaultActive),e&&(f(at.elements.container,E.classes.captions.active,!0),C(at.elements.buttons.captions,!0))}}function le(e){at.supported.full&&at.elements.buttons.captions&&(L.boolean(e)||(e=at.elements.container.className.indexOf(E.classes.captions.active)===-1),at.captions.enabled=e,C(at.elements.buttons.captions,at.captions.enabled),f(at.elements.container,E.classes.captions.active,at.captions.enabled),M(at.elements.container,at.captions.enabled?"captionsenabled":"captionsdisabled",!0),de({captions:at.captions.enabled}))}function ie(){if(E.loadSprite){var e=B();e.absolute?(it("AJAX loading absolute SVG sprite"+(at.browser.isIE?" (due to IE)":"")),A(e.url,"sprite-plyr")):it("Sprite will be used as external resource directly")}s(E.controls,"play-large")&&(at.elements.buttons.playLarge=U("play-large"),at.elements.container.appendChild(at.elements.buttons.playLarge)),at.id=Math.floor(1e4*Math.random());var n,a=z({id:at.id,seektime:E.seekTime,speed:xe(),quality:"HD",captions:"English",loop:"None"});if(L.string(E.selectors.controls.container)&&(n=t.querySelector(E.selectors.controls.container)),L.htmlElement(n)||(n=at.elements.container),n.appendChild(a),E.tooltips.controls)for(var l=R([E.selectors.controls.wrapper," ",E.selectors.labels," .",E.classes.hidden].join("")),i=l.length-1;i>=0;i--){var r=l[i];f(r,E.classes.hidden,!1),f(r,E.classes.tooltip,!0)}}function re(){f(at.elements.container,E.selectors.container.replace(".",""),at.supported.full)}function oe(e){e&&s(E.types.html5,at.type)?at.elements.media.setAttribute("controls",""):at.elements.media.removeAttribute("controls")}function ue(e){var t=E.i18n.play;L.string(E.title)&&E.title.length&&(t+=", "+E.title,at.elements.container.setAttribute("aria-label",E.title)),at.supported.full&&(L.htmlElement(at.elements.buttons.play)&&at.elements.buttons.play.setAttribute("aria-label",t),L.htmlElement(at.elements.buttons.playLarge)&&at.elements.buttons.playLarge.setAttribute("aria-label",t)),L.htmlElement(e)&&e.setAttribute("title",E.i18n.frameTitle.replace("{title}",E.title))}function ce(){var t=null;at.storage={},O.storage&&E.storage.enabled&&(e.localStorage.removeItem("plyr-volume"),t=e.localStorage.getItem(E.storage.key),t&&(/^\d+(\.\d+)?$/.test(t)?de({volume:parseFloat(t)}):at.storage=JSON.parse(t)))}function de(t){O.storage&&E.storage.enabled&&(T(at.storage,t),e.localStorage.setItem(E.storage.key,JSON.stringify(at.storage)))}function pe(){if(!at.elements.media)return void rt("No media element found!");if(at.supported.full&&(f(at.elements.container,E.classes.type.replace("{0}",at.type),!0),s(E.types.embed,at.type)&&f(at.elements.container,E.classes.type.replace("{0}","video"),!0),f(at.elements.container,E.classes.pip.enabled,O.pip),f(at.elements.container,E.classes.stopped,E.autoplay),f(at.elements.container,E.classes.isIos,at.browser.isIos),f(at.elements.container,E.classes.isTouch,at.browser.isTouch),"video"===at.type)){var e=c("div");e.setAttribute("class",E.classes.videoWrapper),l(at.elements.media,e),at.elements.wrapper=e}s(E.types.embed,at.type)&&me()}function me(){var t,n=c("div"),s=at.type+"-"+Math.floor(1e4*Math.random());switch(at.type){case"youtube":t=S(at.embedId);break;case"vimeo":t=_(at.embedId);break;default:t=at.embedId}for(var l=R('[id^="'+at.type+'-"]'),r=l.length-1;r>=0;r--)i(l[r]);if(f(at.elements.media,E.classes.videoWrapper,!0),f(at.elements.media,E.classes.embedWrapper,!0),"youtube"===at.type)at.elements.media.appendChild(n),n.setAttribute("id",s),L.object(e.YT)?ye(t,n):(a(E.urls.youtube.api),e.onYouTubeReadyCallbacks=e.onYouTubeReadyCallbacks||[],e.onYouTubeReadyCallbacks.push(function(){ye(t,n)}),e.onYouTubeIframeAPIReady=function(){e.onYouTubeReadyCallbacks.forEach(function(e){e()})});else if("vimeo"===at.type)if(at.supported.full?at.elements.media.appendChild(n):n=at.elements.media,n.setAttribute("id",s),L.object(e.Vimeo))be(t,n);else{a(E.urls.vimeo.api);var u=e.setInterval(function(){L.object(e.Vimeo)&&(e.clearInterval(u),be(t,n))},50)}else if("soundcloud"===at.type){var d=c("iframe");d.loaded=!1,h(d,"load",function(){d.loaded=!0}),o(d,{src:"https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/"+t,id:s}),n.appendChild(d),at.elements.media.appendChild(n),e.SC||a(E.urls.soundcloud.api);var p=e.setInterval(function(){e.SC&&d.loaded&&(e.clearInterval(p),ve.call(d))},50)}}function fe(){at.supported.full&&(et(),tt()),ue(V("iframe"))}function ye(t,n){at.embed=new e.YT.Player(n.id,{videoId:t,playerVars:{autoplay:E.autoplay?1:0,controls:at.supported.full?0:1,rel:0,showinfo:0,iv_load_policy:3,cc_load_policy:E.captions.defaultActive?1:0,cc_lang_pref:"en",wmode:"transparent",modestbranding:1,disablekb:1,origin:"*"},events:{onError:function(e){M(at.elements.container,"error",!0,{code:e.data,embed:e.target})},onPlaybackQualityChange:function(e){var t=e.target,n=t.getPlaybackQuality();console.warn(n)},onReady:function(t){var n=t.target;at.elements.media.play=function(){n.playVideo(),at.elements.media.paused=!1},at.elements.media.pause=function(){n.pauseVideo(),at.elements.media.paused=!0},at.elements.media.stop=function(){n.stopVideo(),at.elements.media.paused=!0},at.elements.media.duration=n.getDuration(),at.elements.media.paused=!0,at.elements.media.currentTime=0,at.elements.media.muted=n.isMuted();var a=n.getPlaybackRate(),s=n.getAvailablePlaybackRates();console.warn(a,s),E.title=n.getVideoData().title,at.supported.full&&at.elements.media.querySelector("iframe").setAttribute("tabindex","-1"),fe(),M(at.elements.media,"timeupdate"),M(at.elements.media,"durationchange"),e.clearInterval(st.buffering),st.buffering=e.setInterval(function(){at.elements.media.buffered=n.getVideoLoadedFraction(),(null===at.elements.media.lastBuffered||at.elements.media.lastBuffered=n)return;E.loop.end=n,E.loop.indicator.end=at.elements.display.played.value;break;case"all":E.loop.start=0,E.loop.end=at.elements.media.duration-2,E.loop.indicator.start=0,E.loop.indicator.end=100;break;case"toggle":E.loop.active?(E.loop.start=0,E.loop.end=null):(E.loop.start=0,E.loop.end=at.elements.media.duration-2);break;default:E.loop.start=0,E.loop.end=null}E.loop.active=L.number(E.loop.start)&&L.number(E.loop.end);var a=(De(E.loop.start,V('[data-plyr-loop="start"]')),null);L.number(E.loop.end)&&(a=De(E.loop.end,t.querySelector('[data-loop__value="loopout"]'))),E.loop.active}function Ce(e){if(L.undefined(e)&&(e=at.storage.speed||E.defaultSpeed),!L.array(E.speeds))return void rt("Invalid speeds format");if(!L.number(e)){var t=E.speeds.indexOf(E.currentSpeed);if(t!==-1){var n=t+1;n>=E.speeds.length&&(n=0),e=E.speeds[n]}else e=E.defaultSpeed}E.currentSpeed=e,at.elements.media.playbackRate=e,de({speed:e})}function xe(){return E.currentSpeed.toFixed(1).toString().replace(".0","")+"×"}function Te(e){L.number(e)||(e=E.seekTime),_e(at.elements.media.currentTime-e)}function Se(e){L.number(e)||(e=E.seekTime),_e(at.elements.media.currentTime+e)}function _e(e){var t=0,n=at.elements.media.paused,a=Ee();L.number(e)?t=e:L.event(e)&&s(["input","change"],e.type)&&(t=e.target.value/e.target.max*a),t<0?t=0:t>a&&(t=a),Be(t);try{at.elements.media.currentTime=t.toFixed(4)}catch(e){}if(s(E.types.embed,at.type)){switch(at.type){case"youtube":at.embed.seekTo(t);break;case"vimeo":at.embed.setCurrentTime(t.toFixed(0));break;case"soundcloud":at.embed.seekTo(1e3*t)}n&&he(),M(at.elements.media,"timeupdate"),at.elements.media.seeking=!0,M(at.elements.media,"seeking")}it("Seeking to "+at.elements.media.currentTime+" seconds"),ae(t)}function Ee(){var e=parseInt(E.duration),t=0;return null===at.elements.media.duration||isNaN(at.elements.media.duration)||(t=at.elements.media.duration),isNaN(e)?t:e}function Ae(){f(at.elements.container,E.classes.playing,!at.elements.media.paused),f(at.elements.container,E.classes.stopped,at.elements.media.paused),Xe(at.elements.media.paused)}function Ie(){F={x:e.pageXOffset||0,y:e.pageYOffset||0}}function Pe(){e.scrollTo(F.x,F.y)}function Ne(e){var n=O.fullscreen;if(n){if(!e||e.type!==j.eventType)return j.isFullScreen(at.elements.container)?j.cancelFullScreen():(Ie(),j.requestFullScreen(at.elements.container)),void(at.fullscreen.active=j.isFullScreen(at.elements.container));at.fullscreen.active=j.isFullScreen(at.elements.container)}else at.fullscreen.active=!at.fullscreen.active,t.body.style.overflow=at.fullscreen.active?"hidden":"";f(at.elements.container,E.classes.fullscreen.active,at.fullscreen.active),W(at.fullscreen.active),at.elements.buttons&&at.elements.buttons.fullscreen&&C(at.elements.buttons.fullscreen,at.fullscreen.active),M(at.elements.container,at.fullscreen.active?"enterfullscreen":"exitfullscreen",!0),!at.fullscreen.active&&n&&Pe()}function Fe(e){if(L.boolean(e)||(e=!at.elements.media.muted),C(at.elements.buttons.mute,e),at.elements.media.muted=e,0===at.elements.media.volume&&qe(E.volume),s(E.types.embed,at.type)){switch(at.type){case"youtube":at.embed[at.elements.media.muted?"mute":"unMute"]();break;case"vimeo":case"soundcloud":at.embed.setVolume(at.elements.media.muted?0:parseFloat(E.volume/10))}M(at.elements.media,"volumechange")}}function qe(e){var t=10,n=0;if(L.event(e)&&(e=e.target.value),L.undefined(e)&&(e=at.storage.volume),(null===e||isNaN(e))&&(e=E.volume),e>t&&(e=t),e0&&Fe()}function Le(e){var t=at.elements.media.muted?0:10*at.elements.media.volume;L.number(e)||(e=1),qe(t+e)}function je(e){var t=at.elements.media.muted?0:10*at.elements.media.volume;L.number(e)||(e=1),qe(t-e)}function Oe(){var e=at.elements.media.muted?0:10*at.elements.media.volume;at.supported.full&&(at.elements.inputs.volume&&(at.elements.inputs.volume.value=e),at.elements.display.volume&&(at.elements.display.volume.value=e)),de({volume:e}),f(at.elements.container,E.classes.muted,0===e),at.supported.full&&at.elements.buttons.mute&&C(at.elements.buttons.mute,0===e)}function Me(e){var t="waiting"===e.type;clearTimeout(st.loading),st.loading=setTimeout(function(){f(at.elements.container,E.classes.loading,t),Xe(t)},t?250:0)}function Re(e){if(at.supported.full){var t=at.elements.display.played,n=0,a=Ee();if(e)switch(e.type){case"timeupdate":case"seeking":if(at.elements.controls.pressed)return;n=x(at.elements.media.currentTime,a),"timeupdate"===e.type&&at.elements.inputs.seek&&(at.elements.inputs.seek.value=n);break;case"playing":case"progress":t=at.elements.display.buffer,n=function(){var e=at.elements.media.buffered;return e&&e.length?x(e.end(0),a):L.number(e)?100*e:0}()}L.number(E.loop.start)&&L.number(E.loop.end)&&at.elements.media.currentTime>=E.loop.end&&_e(E.loop.start),Ve(t,n)}}function Ve(e,t){if(at.supported.full){if(L.undefined(t)&&(t=0),L.undefined(e)){if(!L.htmlElement(at.elements.display.buffer))return;e=at.elements.display.buffer}if(L.htmlElement(e)){e.value=t;var n=e.getElementsByTagName("span")[0];L.htmlElement(n)&&(n.childNodes[0].nodeValue=t)}}}function De(e,t){if(t){isNaN(e)&&(e=0);var n=parseInt(e%60),a=parseInt(e/60%60),s=parseInt(e/60/60%60),l=parseInt(Ee()/60/60%60)>0;n=("0"+n).slice(-2),a=("0"+a).slice(-2);var i=(l?s+":":"")+a+":"+n;return t.textContent=i,i}}function We(){if(at.supported.full){var e=Ee()||0;!at.elements.display.duration&&E.displayDuration&&at.elements.media.paused&&De(e,at.elements.display.currentTime),at.elements.display.duration&&De(e,at.elements.display.duration),Ye()}}function He(e){De(at.elements.media.currentTime,at.elements.display.currentTime),e&&"timeupdate"===e.type&&at.elements.media.seeking||Re(e)}function Be(e){L.number(e)||(e=0);var t=Ee(),n=x(e,t);at.elements.progress&&at.elements.display.played&&(at.elements.display.played.value=n),at.elements.buttons&&at.elements.inputs.seek&&(at.elements.inputs.seek.value=n)}function Ye(e){var t=Ee();if(E.tooltips.seek&&L.htmlElement(at.elements.inputs.seek)&&L.htmlElement(at.elements.display.seekTooltip)&&0!==t){var n=at.elements.inputs.seek.getBoundingClientRect(),a=0,l=E.classes.tooltip+"--visible";if(L.event(e))a=100/n.width*(e.pageX-n.left);else{if(!y(at.elements.display.seekTooltip,l))return;a=at.elements.display.seekTooltip.style.left.replace("%","")}a<0?a=0:a>100&&(a=100), +De(t/100*a,at.elements.display.seekTooltip),at.elements.display.seekTooltip.style.left=a+"%",L.event(e)&&s(["mouseenter","mouseleave"],e.type)&&f(at.elements.display.seekTooltip,l,"mouseenter"===e.type)}}function Xe(t){if(E.hideControls&&"audio"!==at.type){var n=0,a=!1,l=t,i=y(at.elements.container,E.classes.loading);if(L.boolean(t)||(t&&t.type?(a="enterfullscreen"===t.type,l=s(["mousemove","touchstart","mouseenter","focus"],t.type),s(["mousemove","touchmove"],t.type)&&(n=2e3),"focus"===t.type&&(n=3e3)):l=y(at.elements.container,E.classes.hideControls)),e.clearTimeout(st.hover),l||at.elements.media.paused||i){if(f(at.elements.container,E.classes.hideControls,!1),at.elements.media.paused||i)return;at.browser.isTouch&&(n=3e3)}l&&at.elements.media.paused||(st.hover=e.setTimeout(function(){(!at.elements.controls.pressed&&!at.elements.controls.hover||a)&&f(at.elements.container,E.classes.hideControls,!0)},n))}}function Ue(e){if(!L.undefined(e))return void Je(e);var t;switch(at.type){case"youtube":t=at.embed.getVideoUrl();break;case"vimeo":at.embed.getVideoUrl.then(function(e){t=e});break;case"soundcloud":at.embed.getCurrentSound(function(e){t=e.permalink_url});break;default:t=at.elements.media.currentSrc}return t||""}function Je(e){function t(){if(at.embed=null,i(at.elements.media),"video"===at.type&&at.elements.wrapper&&i(at.elements.wrapper),at.elements.container&&at.elements.container.removeAttribute("class"),"type"in e&&(at.type=e.type,"video"===at.type)){var t=e.sources[0];"type"in t&&s(E.types.embed,t.type)&&(at.type=t.type)}switch(at.supported=I(at.type),at.type){case"video":at.elements.media=c("video");break;case"audio":at.elements.media=c("audio");break;case"youtube":case"vimeo":case"soundcloud":at.elements.media=c("div"),at.embedId=e.sources[0].src}r(at.elements.container,at.elements.media),L.boolean(e.autoplay)&&(E.autoplay=e.autoplay),s(E.types.html5,at.type)&&(E.crossorigin&&at.elements.media.setAttribute("crossorigin",""),E.autoplay&&at.elements.media.setAttribute("autoplay",""),"poster"in e&&at.elements.media.setAttribute("poster",e.poster),E.loop.active&&at.elements.media.setAttribute("loop","")),f(at.elements.container,E.classes.fullscreen.active,at.fullscreen.active),f(at.elements.container,E.classes.captions.active,at.captions.enabled),re(),s(E.types.html5,at.type)&&H("source",e.sources),pe(),s(E.types.html5,at.type)&&("tracks"in e&&H("track",e.tracks),at.elements.media.load()),(s(E.types.html5,at.type)||s(E.types.embed,at.type)&&!at.supported.full)&&(et(),tt()),E.title=e.title,ue()}return L.object(e)&&"sources"in e&&e.sources.length?(f(at.elements.container,E.classes.ready,!1),he(),Be(),Ve(),$e(),void Ge(t,!1)):void rt("Invalid source format")}function Ke(e){"video"===at.type&&at.elements.media.setAttribute("poster",e)}function Qe(){function n(){var e=ke(),t=at.elements.buttons[e?"play":"pause"],n=at.elements.buttons[e?"pause":"play"];if(n=n&&n.length>1?n[n.length-1]:n[0]){var a=y(t,E.classes.tabFocus);setTimeout(function(){n.focus(),a&&(f(t,E.classes.tabFocus,!1),f(n,E.classes.tabFocus,!0))},100)}}function a(){var e=t.activeElement;return e=e&&e!==t.body?t.querySelector(":focus"):null}function l(e){return e.keyCode?e.keyCode:e.which}function r(e){for(var t in at.elements.buttons){var n=at.elements.buttons[t];if(L.nodeList(n))for(var a=0;a0)&&(t?(je(n),a=-1):(Le(n),a=1)),(e.deltaY>0||e.deltaX<0)&&(t?(Le(n),a=1):(je(n),a=-1)),(1===a&&at.elements.media.volume<1||a===-1&&at.elements.media.volume>0)&&e.preventDefault()}),O.fullscreen&&h(t,j.eventType,Ne)}function ze(){if(h(at.elements.media,"timeupdate seeking",He),h(at.elements.media,"timeupdate",ae),h(at.elements.media,"durationchange loadedmetadata",We),h(at.elements.media,"ended",function(){"video"===at.type&&E.showPosterOnEnd&&("video"===at.type&&ne(),_e(),at.elements.media.load())}),h(at.elements.media,"progress playing",Re),h(at.elements.media,"volumechange",Oe),h(at.elements.media,"play pause ended",Ae),h(at.elements.media,"waiting canplay seeked",Me),E.clickToPlay&&"audio"!==at.type){var e=V("."+E.classes.videoWrapper);if(!e)return;e.style.cursor="pointer",h(e,"click",function(){E.hideControls&&at.browser.isTouch&&!at.elements.media.paused||(at.elements.media.paused?ge():at.elements.media.ended?(_e(),ge()):he())})}E.disableContextMenu&&h(at.elements.media,"contextmenu",function(e){e.preventDefault()}),h(at.elements.media,E.events.concat(["keyup","keydown"]).join(" "),function(e){M(at.elements.container,e.type,!0)})}function $e(){if(s(E.types.html5,at.type)){for(var e=at.elements.media.querySelectorAll("source"),t=0;t', @@ -1732,7 +1755,7 @@ '' ].join('')); - getElement(config.selectors.menu.quality).innerHTML = list.join(''); + player.elements.settings.panes.quality.innerHTML = list.join(''); } } @@ -2549,7 +2572,8 @@ // Get the instance var instance = event.target; - var quality = player.getPlaybackQuality(); + // Get current quality + var quality = instance.getPlaybackQuality(); // var set = player.setPlaybackQuality(); console.warn(quality); @@ -2560,30 +2584,30 @@ // Create a faux HTML5 API using the YouTube API player.elements.media.play = function() { - player.playVideo(); + instance.playVideo(); player.elements.media.paused = false; }; player.elements.media.pause = function() { - player.pauseVideo(); + instance.pauseVideo(); player.elements.media.paused = true; }; player.elements.media.stop = function() { - player.stopVideo(); + instance.stopVideo(); player.elements.media.paused = true; }; - player.elements.media.duration = player.getDuration(); + player.elements.media.duration = instance.getDuration(); player.elements.media.paused = true; player.elements.media.currentTime = 0; - player.elements.media.muted = player.isMuted(); + player.elements.media.muted = instance.isMuted(); // Get available speeds - var speed = player.getPlaybackRate(); - var speedOptions = player.getAvailablePlaybackRates(); - //var set = player.setPlaybackRate(); + var speed = instance.getPlaybackRate(); + var speedOptions = instance.getAvailablePlaybackRates(); + //var set = instance.setPlaybackRate(); console.warn(speed, speedOptions); // Set title - config.title = player.getVideoData().title; + config.title = instance.getVideoData().title; // Set the tabindex if (player.supported.full) { @@ -2605,7 +2629,7 @@ // Setup buffering timers.buffering = window.setInterval(function() { // Get loaded % from YouTube - player.elements.media.buffered = player.getVideoLoadedFraction(); + player.elements.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something if (player.elements.media.lastBuffered === null || player.elements.media.lastBuffered < player.elements.media.buffered) { @@ -2659,7 +2683,7 @@ // Poll to get playback progress timers.playing = window.setInterval(function() { // Set the current time - player.elements.media.currentTime = player.getCurrentTime(); + player.elements.media.currentTime = instance.getCurrentTime(); // Trigger timeupdate trigger(player.elements.media, 'timeupdate'); @@ -2668,14 +2692,14 @@ // Check duration again due to YouTube bug // https://github.com/Selz/plyr/issues/374 // https://code.google.com/p/gdata-issues/issues/detail?id=8690 - if (player.elements.media.duration !== player.getDuration()) { - player.elements.media.duration = player.getDuration(); + if (player.elements.media.duration !== instance.getDuration()) { + player.elements.media.duration = instance.getDuration(); trigger(player.elements.media, 'durationchange'); } // Get quality - var qualityOptions = player.getAvailableQualityLevels(); - var quality = player.getPlaybackQuality(); + var qualityOptions = instance.getAvailableQualityLevels(); + var quality = instance.getPlaybackQuality(); setQualityMenu(qualityOptions, quality); break; @@ -2975,7 +2999,7 @@ } } - // Speed-up + // Set playback speed function setSpeed(speed) { // Load speed from storage or default value if (is.undefined(speed)) { @@ -3042,9 +3066,9 @@ // Seek to time // The input parameter can be an event or a number function seek(input) { - var targetTime = 0, - paused = player.elements.media.paused, - duration = getDuration(); + var targetTime = 0; + var paused = player.elements.media.paused; + var duration = getDuration(); if (is.number(input)) { targetTime = input; @@ -3244,6 +3268,11 @@ var max = 10; var min = 0; + // If volume is event, get from input + if (is.event(volume)) { + volume = volume.target.value; + } + // Load volume from storage if no value specified if (is.undefined(volume)) { volume = player.storage.volume; @@ -3476,7 +3505,7 @@ mins = ('0' + mins).slice(-2); // Generate display - var label = (displayHours ? hours + ':' : '') + mins + ':' + secs; + var display = (displayHours ? hours + ':' : '') + mins + ':' + secs; // Render element.textContent = display; @@ -3548,24 +3577,24 @@ var duration = getDuration(); // Bail if setting not true - if (!config.tooltips.seek || !player.elements.progress.container || duration === 0) { + if (!config.tooltips.seek || !is.htmlElement(player.elements.inputs.seek) || !is.htmlElement(player.elements.display.seekTooltip) || duration === 0) { return; } // Calculate percentage - var clientRect = player.elements.progress.container.getBoundingClientRect(), - percent = 0, - visible = config.classes.tooltip + '--visible'; + var clientRect = player.elements.inputs.seek.getBoundingClientRect(); + var percent = 0; + var visible = config.classes.tooltip + '--visible'; // Determine percentage, if already visible - if (!event) { + if (is.event(event)) { + percent = ((100 / clientRect.width) * (event.pageX - clientRect.left)); + } else { if (hasClass(player.elements.display.seekTooltip, visible)) { percent = player.elements.display.seekTooltip.style.left.replace('%', ''); } else { return; } - } else { - percent = ((100 / clientRect.width) * (event.pageX - clientRect.left)); } // Set bounds @@ -3583,7 +3612,7 @@ // Show/hide the tooltip // If the event is a moues in/out and percentage is inside bounds - if (event && inArray(['mouseenter', 'mouseleave'], event.type)) { + if (is.event(event) && inArray(['mouseenter', 'mouseleave'], event.type)) { toggleClass(player.elements.display.seekTooltip, visible, (event.type === 'mouseenter')); } } @@ -3595,10 +3624,10 @@ return; } - var delay = 0, - isEnterFullscreen = false, - show = toggle, - loading = hasClass(player.elements.container, config.classes.loading); + var delay = 0; + var isEnterFullscreen = false; + var show = toggle; + var loading = hasClass(player.elements.container, config.classes.loading); // Default to false if no boolean if (!is.boolean(toggle)) { @@ -4072,8 +4101,8 @@ // Focus/tab management on(window, 'keyup', function(event) { - var code = getKeyCode(event), - focused = getFocusElement(); + var code = getKeyCode(event); + var focused = getFocusElement(); if (code === 9) { checkTabFocus(focused); @@ -4090,6 +4119,16 @@ }); } + // Trigger custom and default handlers + var handlerProxy = function(event, customHandler, defaultHandler) { + if (is.function(customHandler)) { + customHandler.call(this, event); + } + if (is.function(defaultHandler)) { + defaultHandler.call(this, event); + } + } + // Play proxy(player.elements.buttons.play, 'click', config.listeners.play, _togglePlay); proxy(player.elements.buttons.playLarge, 'click', config.listeners.play, _togglePlay); @@ -4097,61 +4136,33 @@ // Pause proxy(player.elements.buttons.pause, 'click', config.listeners.pause, _togglePlay); - // Restart + // Pause proxy(player.elements.buttons.restart, 'click', config.listeners.restart, seek); // Rewind proxy(player.elements.buttons.rewind, 'click', config.listeners.rewind, rewind); - // Fast forward + // Rewind proxy(player.elements.buttons.forward, 'click', config.listeners.forward, forward); - // Speed-up - proxy(player.elements.buttons.speed, 'click', config.listeners.speed, function() { - //var speedValue = document.querySelector('[data-plyr="speed"]:checked').value; - //setSpeed(Number(speedValue)); - }); - - // Seek - proxy(player.elements.inputs.seek, inputEvent, config.listeners.seek, seek); - - // Set volume - proxy(player.elements.inputs.volume, inputEvent, config.listeners.volume, function() { - setVolume(player.elements.inputs.volume.value); - }); - // Mute proxy(player.elements.buttons.mute, 'click', config.listeners.mute, toggleMute); + // Captions + proxy(player.elements.buttons.captions, 'click', config.listeners.captions, toggleCaptions); + // Fullscreen proxy(player.elements.buttons.fullscreen, 'click', config.listeners.fullscreen, toggleFullscreen); - // Looping - proxy(player.elements.buttons.loop, 'click', config.listeners.loop, function(event) { - var value = event.target.getAttribute('data-loop__value') || event.target.getAttribute('data-loop__type'); - - if (inArray(['start', 'end', 'all', 'none'], value)) { - toggleLoop(value); - } + // Picture-in-Picture + proxy(player.elements.buttons.pip, 'click', config.listeners.pip, function(event) { + // TODO: Check support here + player.elements.media.webkitSetPresentationMode(player.elements.media.webkitPresentationMode === 'picture-in-picture' ? 'inline' : 'picture-in-picture'); }); - // Handle user exiting fullscreen by escaping etc - if (support.fullscreen) { - on(document, fullscreen.eventType, toggleFullscreen); - } - - // Captions - proxy(player.elements.buttons.captions, 'click', config.listeners.captions, toggleCaptions); - // TODO: ?? - // on(player.elements.buttons.captions_menu, 'click', toggleCaptions); - // Language - proxy(player.elements.buttons.lang, 'click', config.listeners.lang, function(e) { - var langIndex = e.target.attributes.getNamedItem("data-index").value; - setCaptionIndex(langIndex); - }); - - // Settings - on(player.elements.buttons.settings, 'click', function(event) { + // Settings menu + on(player.elements.settings.menu, 'click', function(event) { + // Settings menu var menu = this; var toggle = event.target; var target = document.getElementById(toggle.getAttribute('aria-controls')); @@ -4210,14 +4221,53 @@ } }); - // Picture in picture - on(player.elements.buttons.pip, 'click', function() { - // TODO: Check support here - player.elements.media.webkitSetPresentationMode(player.elements.media.webkitPresentationMode === 'picture-in-picture' ? 'inline' : 'picture-in-picture'); + // Settings menu items - use event delegation as items are added/removed + on(player.elements.settings.menu, 'click', function(event) { + // Settings - Speed + if (matches(event.target, config.selectors.buttons.speed)) { + handlerProxy.call(this, event, config.listeners.speed, function() { + //var speedValue = document.querySelector('[data-plyr="speed"]:checked').value; + //setSpeed(Number(speedValue)); + }); + } + + // Settings - Quality + else if (matches(event.target, config.selectors.buttons.quality)) { + handlerProxy.call(this, event, config.listeners.quality, function() { + console.warn("Set quality"); + }); + } + + // Settings - Looping + else if (matches(event.target, config.selectors.buttons.loop)) { + handlerProxy.call(this, event, config.listeners.loop, function() { + // TODO: This should be done in the method itself I think + var value = event.target.getAttribute('data-loop__value') || event.target.getAttribute('data-loop__type'); + + if (inArray(['start', 'end', 'all', 'none'], value)) { + toggleLoop(value); + } + }); + } + + // Settings - Language + else if (matches(event.target, config.selectors.buttons.language)) { + handlerProxy.call(this, event, config.listeners.language, function(event) { + // TODO: This should be done in the method itself I think + var index = event.target.attributes.getNamedItem("data-index").value; + setCaptionIndex(index); + }); + } }); + // Seek + proxy(player.elements.inputs.seek, inputEvent, config.listeners.seek, seek); + + // Seek + proxy(player.elements.inputs.volume, inputEvent, config.listeners.volume, setVolume); + // Seek tooltip - on(player.elements.progress.container, 'mouseenter mouseleave mousemove', updateSeekTooltip); + on(player.elements.progress, 'mouseenter mouseleave mousemove', updateSeekTooltip); // Toggle controls visibility based on mouse movement if (config.hideControls) { @@ -4238,21 +4288,22 @@ on(player.elements.controls, 'focus blur', toggleControls, true); } - // Adjust volume on scroll - on(player.elements.inputs.volume, 'wheel', function(event) { - event.preventDefault(); - + // Mouse wheel for volume + proxy(player.elements.inputs.volume, 'wheel', config.listeners.volume, function(event) { // Detect "natural" scroll - suppored on OS X Safari only // Other browsers on OS X will be inverted until support improves - var inverted = event.webkitDirectionInvertedFromDevice, - step = (1 / 5); + var inverted = event.webkitDirectionInvertedFromDevice; + var step = (1 / 5); + var direction = 0; // Scroll down (or up on natural) to decrease if (event.deltaY < 0 || event.deltaX > 0) { if (inverted) { decreaseVolume(step); + direction = -1; } else { increaseVolume(step); + direction = 1; } } @@ -4260,11 +4311,24 @@ if (event.deltaY > 0 || event.deltaX < 0) { if (inverted) { increaseVolume(step); + direction = 1; } else { decreaseVolume(step); + direction = -1; } } + + // Don't break page scrolling at max and min + if ((direction === 1 && player.elements.media.volume < 1) || + (direction === -1 && player.elements.media.volume > 0)) { + event.preventDefault(); + } }); + + // Handle user exiting fullscreen by escaping etc + if (support.fullscreen) { + on(document, fullscreen.eventType, toggleFullscreen); + } } // Listen for media events