diff options
author | Sam Potts <me@sampotts.me> | 2016-08-20 18:02:02 +1000 |
---|---|---|
committer | Sam Potts <me@sampotts.me> | 2016-08-20 18:02:02 +1000 |
commit | 9d109bf02dc6ae6bfe356bfe25c2acb8915c05dd (patch) | |
tree | dbb5fe14507bee39f906dfa587c654aadedd7f04 | |
parent | fc45ab48c932c6ecb810ed6456ff824ef43be73c (diff) | |
download | plyr-9d109bf02dc6ae6bfe356bfe25c2acb8915c05dd.tar.lz plyr-9d109bf02dc6ae6bfe356bfe25c2acb8915c05dd.tar.xz plyr-9d109bf02dc6ae6bfe356bfe25c2acb8915c05dd.zip |
Refactoring and bug fixing
-rw-r--r-- | demo/dist/demo.css | 2 | ||||
-rw-r--r-- | demo/dist/demo.js | 2 | ||||
-rw-r--r-- | demo/index.html | 3 | ||||
-rw-r--r-- | demo/src/js/main.js | 4 | ||||
-rw-r--r-- | demo/src/less/components/base.less | 5 | ||||
-rw-r--r-- | demo/src/less/components/examples.less | 5 | ||||
-rw-r--r-- | dist/plyr.js | 4 | ||||
-rw-r--r-- | package.json | 2 | ||||
-rw-r--r-- | readme.md | 5 | ||||
-rw-r--r-- | src/js/plyr.js | 635 |
10 files changed, 372 insertions, 295 deletions
diff --git a/demo/dist/demo.css b/demo/dist/demo.css index 302747cb..cf8073a7 100644 --- a/demo/dist/demo.css +++ b/demo/dist/demo.css @@ -1 +1 @@ -/*! normalize.css v2.1.3 | MIT License | git.io/normalize */a.logo,img,legend{border:0}a,h1,h2{color:#3498db}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,small,summary{display:block}body,figure,li,ul{margin:0}[hidden],template{display:none}li,nav ul,ul{list-style:none;padding:0}legend,li,nav ul,ul{padding:0}.btn__bar,sub,sup{position:relative}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}a{background:0 0;text-decoration:none;border-bottom:1px dotted currentColor;transition:background .3s ease,color .3s ease,border .3s ease}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}hr{box-sizing:content-box;height:0}mark{background:#ff0;color:#000}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}.btn__bar,nav li{white-space:nowrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}sub,sup{font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@-webkit-keyframes fade-in{0%{opacity:0}100%{opacity:1}}@keyframes fade-in{0%{opacity:0}100%{opacity:1}}@font-face{font-family:Avenir;src:url(//cdn.plyr.io/fonts/avenir-medium.woff2) format("woff2"),url(//cdn.plyr.io/fonts/avenir-medium.woff) format("woff");font-style:normal;font-weight:500}@font-face{font-family:Avenir;src:url(//cdn.plyr.io/fonts/avenir-bold.woff2) format("woff2"),url(//cdn.plyr.io/fonts/avenir-bold.woff) format("woff");font-style:normal;font-weight:700}html{font-size:100%;height:100%;background:fixed #f2f5f7}body{font-family:Avenir,"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:1.5;text-align:center;color:#55646b;font-weight:500;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;padding:10px}h1,h2{letter-spacing:-.025em;margin:0 0 10px;line-height:1.2;font-weight:700}h1{font-size:64px;font-size:4rem}p,small{margin:0 0 20px}small{padding:0 10px;font-size:14px;font-size:.875rem}a:focus,a:hover{color:#343f4a;border-bottom-color:transparent}a:focus{outline:#343f4a dotted thin;outline-offset:1px}.color--vimeo{color:#19b7ed}.color--youtube{color:#cc181e}*,::after,::before{box-sizing:border-box}.btn__bar ul,nav li{display:inline-block}header{padding:20px;margin-bottom:20px}header p{font-size:18px;font-size:1.125rem}section{padding-bottom:20px}@media (min-width:480px){header{padding-top:60px;padding-bottom:60px}section{padding-bottom:40px}}.icon{fill:currentColor;width:18px;height:18px;vertical-align:-3px}.btn,.btn__count,.error main,video{vertical-align:middle}a svg,button svg,label svg{pointer-events:none}.btn .icon,a .icon{margin-right:10px}.btn:not(.btn-large) .icon{width:16px;height:16px}nav ul{margin:0;font-size:0}nav li{margin-top:10px;font-size:16px;font-size:1rem}nav li+li{margin-left:20px}.btn__bar{margin:0 auto 20px;max-width:1200px}.btn__bar::before{content:"";position:absolute;top:50%;left:0;right:0;height:1px;background:#dbe3e8}.btn__bar ul{position:relative;z-index:1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn__bar li{margin:0}.btn__bar li:first-child .btn{border-radius:4px 0 0 4px}.btn__bar li:last-child .btn{border-radius:0 4px 4px 0}.btn__bar li+li .btn{margin-left:-1px}.btn__bar li.active .btn{position:relative;z-index:1}.btn__bar li.active .btn .icon{color:inherit}.btn__bar li.active+li .btn:hover{z-index:0}.btn__bar .btn{position:relative;display:block;border-radius:0}.btn__bar .btn:focus,.btn__bar .btn:hover{z-index:1}@media (min-width:560px){.btn__bar{margin-bottom:40px}}.btn,.btn__count{display:inline-block;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-weight:700}.btn{padding:10px 12px;background:linear-gradient(#f8fafb,#e9eef1);border:1px solid #cbd0d3;box-shadow:0 1px 1px rgba(0,0,0,.05);text-shadow:0 1px 1px #fff;color:#55646b;transition:background .1s ease,color .1s ease;font-size:14px;font-size:.875rem}.btn:focus,.btn:hover{border-color:#b5bcc0;color:#55646b;outline:0}.btn--large{padding:10px 20px;font-size:16px;font-size:1rem}.btn--primary,.btn__bar li.active .btn{background-image:linear-gradient(#3498db,#258cd1);background-color:#3498db;border-color:#217dbb;box-shadow:0 1px 1px rgba(0,0,0,.15);text-shadow:0 1px 1px rgba(0,0,0,.1);color:#fff}.btn--primary:focus,.btn--primary:hover{color:#fff;border-color:#196090}.btn--youtube .icon{color:#cc181e}.btn--vimeo .icon{color:#19b7ed}.btn--twitter .icon{color:#4BAAF4}.btn__count{position:relative;margin-left:10px;padding:10px 15px;background:#fff;border:1px solid #cbd0d3}.btn__count::before,.plyr__video-wrapper::after{content:"";position:absolute}.btn__count::before{display:block;width:8px;height:8px;left:1px;top:50%;margin-top:-4px;background:inherit;border:inherit;border-width:1px 0 0 1px;-webkit-transform:rotate(-45deg) translate(-50%,-50%);transform:rotate(-45deg) translate(-50%,-50%)}.error body,html.error{height:100%}.error body{width:100%;display:table;table-layout:fixed}.error main{display:table-cell;width:100%}section{margin:0 auto 20px;max-width:1200px}video{max-width:100%}.plyr{margin:0 auto;border-radius:6px}.plyr--audio{max-width:520px}.plyr__video-wrapper::after{pointer-events:none;top:0;bottom:0;left:0;right:0;border:1px solid rgba(0,0,0,.15);border-radius:inherit}.plyr__cite{display:none;margin-top:20px}.plyr__cite .icon{margin-right:5px}.plyr--audio~ul .plyr__cite--audio,.plyr--video:not(.plyr--youtube):not(.plyr--vimeo)~ul .plyr__cite--video,.plyr--vimeo~ul .plyr__cite--vimeo,.plyr--youtube~ul .plyr__cite--youtube{display:block}
\ No newline at end of file +/*! normalize.css v2.1.3 | MIT License | git.io/normalize */a.logo,img,legend{border:0}a,h1,h2{color:#3498db}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,small,summary{display:block}body,figure,li,ul{margin:0}[hidden],template{display:none}li,nav ul,ul{list-style:none;padding:0}legend,li,nav ul,ul{padding:0}.btn__bar,sub,sup{position:relative}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}a{background:0 0;text-decoration:none;border-bottom:1px dotted currentColor;transition:background .3s ease,color .3s ease,border .3s ease}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}hr{box-sizing:content-box;height:0}mark{background:#ff0;color:#000}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}.btn__bar,nav li{white-space:nowrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}sub,sup{font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@-webkit-keyframes fade-in{0%{opacity:0}100%{opacity:1}}@keyframes fade-in{0%{opacity:0}100%{opacity:1}}@font-face{font-family:Avenir;src:url(//cdn.plyr.io/fonts/avenir-medium.woff2) format("woff2"),url(//cdn.plyr.io/fonts/avenir-medium.woff) format("woff");font-style:normal;font-weight:500}@font-face{font-family:Avenir;src:url(//cdn.plyr.io/fonts/avenir-bold.woff2) format("woff2"),url(//cdn.plyr.io/fonts/avenir-bold.woff) format("woff");font-style:normal;font-weight:700}html{font-size:100%;height:100%;background:fixed #f2f5f7}body{font-family:Avenir,"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:1.5;text-align:center;color:#55646b;font-weight:500;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;padding:10px}h1,h2{letter-spacing:-.025em;margin:0 0 10px;line-height:1.2;font-weight:700}h1{font-size:64px;font-size:4rem}p,small{margin:0 0 20px}small{padding:0 10px;font-size:14px;font-size:.875rem}a:focus,a:hover{color:#343f4a;border-bottom-color:transparent}a:focus{outline:#343f4a dotted thin;outline-offset:1px}.color--vimeo{color:#19b7ed}.color--youtube{color:#cc181e}*,::after,::before{box-sizing:border-box}.btn__bar ul,nav li{display:inline-block}header{padding:20px;margin-bottom:20px}header p{font-size:18px;font-size:1.125rem}section{max-width:1200px;margin:0 auto 20px}@media (min-width:480px){header{padding-top:60px;padding-bottom:60px}section{margin-bottom:40px}}.icon{fill:currentColor;width:18px;height:18px;vertical-align:-3px}.btn,.btn__count,.error main,video{vertical-align:middle}a svg,button svg,label svg{pointer-events:none}.btn .icon,a .icon{margin-right:10px}.btn:not(.btn-large) .icon{width:16px;height:16px}nav ul{margin:0;font-size:0}nav li{margin-top:10px;font-size:16px;font-size:1rem}nav li+li{margin-left:20px}.btn__bar{margin:0 auto 20px;max-width:1200px}.btn__bar::before{content:"";position:absolute;top:50%;left:0;right:0;height:1px;background:#dbe3e8}.btn__bar ul{position:relative;z-index:1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn__bar li{margin:0}.btn__bar li:first-child .btn{border-radius:4px 0 0 4px}.btn__bar li:last-child .btn{border-radius:0 4px 4px 0}.btn__bar li+li .btn{margin-left:-1px}.btn__bar li.active .btn{position:relative;z-index:1}.btn__bar li.active .btn .icon{color:inherit}.btn__bar li.active+li .btn:hover{z-index:0}.btn__bar .btn{position:relative;display:block;border-radius:0}.btn__bar .btn:focus,.btn__bar .btn:hover{z-index:1}@media (min-width:560px){.btn__bar{margin-bottom:40px}}.btn,.btn__count{display:inline-block;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-weight:700}.btn{padding:10px 12px;background:linear-gradient(#f8fafb,#e9eef1);border:1px solid #cbd0d3;box-shadow:0 1px 1px rgba(0,0,0,.05);text-shadow:0 1px 1px #fff;color:#55646b;transition:background .1s ease,color .1s ease;font-size:14px;font-size:.875rem}.btn:focus,.btn:hover{border-color:#b5bcc0;color:#55646b;outline:0}.btn--large{padding:10px 20px;font-size:16px;font-size:1rem}.btn--primary,.btn__bar li.active .btn{background-image:linear-gradient(#3498db,#258cd1);background-color:#3498db;border-color:#217dbb;box-shadow:0 1px 1px rgba(0,0,0,.15);text-shadow:0 1px 1px rgba(0,0,0,.1);color:#fff}.btn--primary:focus,.btn--primary:hover{color:#fff;border-color:#196090}.btn--youtube .icon{color:#cc181e}.btn--vimeo .icon{color:#19b7ed}.btn--twitter .icon{color:#4BAAF4}.btn__count{position:relative;margin-left:10px;padding:10px 15px;background:#fff;border:1px solid #cbd0d3}.btn__count::before,.plyr__video-wrapper::after{content:"";position:absolute}.btn__count::before{display:block;width:8px;height:8px;left:1px;top:50%;margin-top:-4px;background:inherit;border:inherit;border-width:1px 0 0 1px;-webkit-transform:rotate(-45deg) translate(-50%,-50%);transform:rotate(-45deg) translate(-50%,-50%)}.error body,html.error{height:100%}.error body{width:100%;display:table;table-layout:fixed}.error main{display:table-cell;width:100%}video{max-width:100%}.plyr{margin:0 auto;border-radius:6px}.plyr--audio{max-width:520px}.plyr__video-wrapper::after{pointer-events:none;top:0;bottom:0;left:0;right:0;border:1px solid rgba(0,0,0,.15);border-radius:inherit}.plyr__cite{display:none;margin-top:20px}.plyr__cite .icon{margin-right:5px}.plyr--audio~ul .plyr__cite--audio,.plyr--video:not(.plyr--youtube):not(.plyr--vimeo)~ul .plyr__cite--video,.plyr--vimeo~ul .plyr__cite--vimeo,.plyr--youtube~ul .plyr__cite--youtube{display:block}
\ No newline at end of file diff --git a/demo/dist/demo.js b/demo/dist/demo.js index c30c1cd3..fdb89c46 100644 --- a/demo/dist/demo.js +++ b/demo/dist/demo.js @@ -1 +1 @@ -"document"in self&&("classList"in document.createElement("_")?!function(){"use strict";var e=document.createElement("_");if(e.classList.add("c1","c2"),!e.classList.contains("c2")){var t=function(e){var t=DOMTokenList.prototype[e];DOMTokenList.prototype[e]=function(e){var i,o=arguments.length;for(i=0;o>i;i++)e=arguments[i],t.call(this,e)}};t("add"),t("remove")}if(e.classList.toggle("c3",!1),e.classList.contains("c3")){var i=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(e,t){return 1 in arguments&&!this.contains(e)==!t?t:i.call(this,e)}}e=null}():!function(e){"use strict";if("Element"in e){var t="classList",i="prototype",o=e.Element[i],n=Object,s=String[i].trim||function(){return this.replace(/^\s+|\s+$/g,"")},r=Array[i].indexOf||function(e){for(var t=0,i=this.length;i>t;t++)if(t in this&&this[t]===e)return t;return-1},a=function(e,t){this.name=e,this.code=DOMException[e],this.message=t},c=function(e,t){if(""===t)throw new a("SYNTAX_ERR","An invalid or illegal string was specified");if(/\s/.test(t))throw new a("INVALID_CHARACTER_ERR","String contains an invalid character");return r.call(e,t)},l=function(e){for(var t=s.call(e.getAttribute("class")||""),i=t?t.split(/\s+/):[],o=0,n=i.length;n>o;o++)this.push(i[o]);this._updateClassName=function(){e.setAttribute("class",this.toString())}},u=l[i]=[],d=function(){return new l(this)};if(a[i]=Error[i],u.item=function(e){return this[e]||null},u.contains=function(e){return e+="",-1!==c(this,e)},u.add=function(){var e,t=arguments,i=0,o=t.length,n=!1;do e=t[i]+"",-1===c(this,e)&&(this.push(e),n=!0);while(++i<o);n&&this._updateClassName()},u.remove=function(){var e,t,i=arguments,o=0,n=i.length,s=!1;do for(e=i[o]+"",t=c(this,e);-1!==t;)this.splice(t,1),s=!0,t=c(this,e);while(++o<n);s&&this._updateClassName()},u.toggle=function(e,t){e+="";var i=this.contains(e),o=i?t!==!0&&"remove":t!==!1&&"add";return o&&this[o](e),t===!0||t===!1?t:!i},u.toString=function(){return this.join(" ")},n.defineProperty){var p={get:d,enumerable:!0,configurable:!0};try{n.defineProperty(o,t,p)}catch(h){-2146823252===h.number&&(p.enumerable=!1,n.defineProperty(o,t,p))}}else n[i].__defineGetter__&&o.__defineGetter__(t,d)}}(self)),function(){function e(e,t,i){if(e)if(e.classList)e.classList[i?"add":"remove"](t);else{var o=(" "+e.className+" ").replace(/\s+/g," ").replace(" "+t+" ","");e.className=o+(i?" "+t:"")}}function t(t,i){if(t in s&&(i||t!=r)&&(r.length||t!=s.video)){switch(t){case s.video:o.source({type:"video",title:"View From A Blue Moon",sources:[{src:"https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.mp4",type:"video/mp4"},{src:"https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.webm",type:"video/webm"}],poster:"https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.jpg",tracks:[{kind:"captions",label:"English",srclang:"en",src:"https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.en.vtt","default":!0}]});break;case s.audio:o.source({type:"audio",title:"Kishi Bashi – “It All Began With A Burst”",sources:[{src:"https://cdn.selz.com/plyr/1.5/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3",type:"audio/mp3"},{src:"https://cdn.selz.com/plyr/1.5/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg",type:"audio/ogg"}]});break;case s.youtube:o.source({type:"video",title:"View From A Blue Moon",sources:[{src:"bTqVqk7FSmY",type:"youtube"}]});break;case s.vimeo:o.source({type:"video",title:"View From A Blue Moon",sources:[{src:"143418951",type:"vimeo"}]})}r=t;for(var a=n.length-1;a>=0;a--)e(n[a].parentElement,"active",!1);e(document.querySelector('[data-source="'+t+'"]').parentElement,"active",!0)}}document.body.addEventListener("ready",function(e){console.log(e)});var i=plyr.setup({debug:!0,title:"Video demo",iconUrl:"../dist/plyr.svg",tooltips:{controls:!0},captions:{defaultActive:!0}});plyr.loadSprite("dist/demo.svg");for(var o=i[0].plyr,n=document.querySelectorAll("[data-source]"),s={video:"video",audio:"audio",youtube:"youtube",vimeo:"vimeo"},r=window.location.hash.replace("#",""),a=window.history&&window.history.pushState,c=n.length-1;c>=0;c--)n[c].addEventListener("click",function(){var e=this.getAttribute("data-source");t(e),a&&history.pushState({type:e},"","#"+e)});if(window.addEventListener("popstate",function(e){e.state&&"type"in e.state&&t(e.state.type)}),a){var l=!r.length;l&&(r=s.video),r in s&&history.replaceState({type:r},"",l?"":"#"+r),r!==s.video&&t(r,!0)}}(),document.domain.indexOf("plyr.io")>-1&&(!function(e,t,i,o,n,s,r){e.GoogleAnalyticsObject=n,e[n]=e[n]||function(){(e[n].q=e[n].q||[]).push(arguments)},e[n].l=1*new Date,s=t.createElement(i),r=t.getElementsByTagName(i)[0],s.async=1,s.src=o,r.parentNode.insertBefore(s,r)}(window,document,"script","//www.google-analytics.com/analytics.js","ga"),ga("create","UA-40881672-11","auto"),ga("send","pageview"));
\ No newline at end of file +"document"in self&&("classList"in document.createElement("_")?!function(){"use strict";var e=document.createElement("_");if(e.classList.add("c1","c2"),!e.classList.contains("c2")){var t=function(e){var t=DOMTokenList.prototype[e];DOMTokenList.prototype[e]=function(e){var i,s=arguments.length;for(i=0;s>i;i++)e=arguments[i],t.call(this,e)}};t("add"),t("remove")}if(e.classList.toggle("c3",!1),e.classList.contains("c3")){var i=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(e,t){return 1 in arguments&&!this.contains(e)==!t?t:i.call(this,e)}}e=null}():!function(e){"use strict";if("Element"in e){var t="classList",i="prototype",s=e.Element[i],o=Object,n=String[i].trim||function(){return this.replace(/^\s+|\s+$/g,"")},r=Array[i].indexOf||function(e){for(var t=0,i=this.length;i>t;t++)if(t in this&&this[t]===e)return t;return-1},a=function(e,t){this.name=e,this.code=DOMException[e],this.message=t},c=function(e,t){if(""===t)throw new a("SYNTAX_ERR","An invalid or illegal string was specified");if(/\s/.test(t))throw new a("INVALID_CHARACTER_ERR","String contains an invalid character");return r.call(e,t)},l=function(e){for(var t=n.call(e.getAttribute("class")||""),i=t?t.split(/\s+/):[],s=0,o=i.length;o>s;s++)this.push(i[s]);this._updateClassName=function(){e.setAttribute("class",this.toString())}},u=l[i]=[],d=function(){return new l(this)};if(a[i]=Error[i],u.item=function(e){return this[e]||null},u.contains=function(e){return e+="",-1!==c(this,e)},u.add=function(){var e,t=arguments,i=0,s=t.length,o=!1;do e=t[i]+"",-1===c(this,e)&&(this.push(e),o=!0);while(++i<s);o&&this._updateClassName()},u.remove=function(){var e,t,i=arguments,s=0,o=i.length,n=!1;do for(e=i[s]+"",t=c(this,e);-1!==t;)this.splice(t,1),n=!0,t=c(this,e);while(++s<o);n&&this._updateClassName()},u.toggle=function(e,t){e+="";var i=this.contains(e),s=i?t!==!0&&"remove":t!==!1&&"add";return s&&this[s](e),t===!0||t===!1?t:!i},u.toString=function(){return this.join(" ")},o.defineProperty){var p={get:d,enumerable:!0,configurable:!0};try{o.defineProperty(s,t,p)}catch(h){-2146823252===h.number&&(p.enumerable=!1,o.defineProperty(s,t,p))}}else o[i].__defineGetter__&&s.__defineGetter__(t,d)}}(self)),function(){function e(e,t,i){if(e)if(e.classList)e.classList[i?"add":"remove"](t);else{var s=(" "+e.className+" ").replace(/\s+/g," ").replace(" "+t+" ","");e.className=s+(i?" "+t:"")}}function t(t,i){if(t in n&&(i||t!=r)&&(r.length||t!=n.video)){switch(t){case n.video:s.source({type:"video",title:"View From A Blue Moon",sources:[{src:"https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.mp4",type:"video/mp4"},{src:"https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.webm",type:"video/webm"}],poster:"https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.jpg",tracks:[{kind:"captions",label:"English",srclang:"en",src:"https://cdn.selz.com/plyr/1.5/View_From_A_Blue_Moon_Trailer-HD.en.vtt","default":!0}]});break;case n.audio:s.source({type:"audio",title:"Kishi Bashi – “It All Began With A Burst”",sources:[{src:"https://cdn.selz.com/plyr/1.5/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3",type:"audio/mp3"},{src:"https://cdn.selz.com/plyr/1.5/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg",type:"audio/ogg"}]});break;case n.youtube:s.source({type:"video",title:"View From A Blue Moon",sources:[{src:"bTqVqk7FSmY",type:"youtube"}]});break;case n.vimeo:s.source({type:"video",title:"View From A Blue Moon",sources:[{src:"143418951",type:"vimeo"}]})}r=t;for(var a=o.length-1;a>=0;a--)e(o[a].parentElement,"active",!1);e(document.querySelector('[data-source="'+t+'"]').parentElement,"active",!0)}}var i=plyr.setup({debug:!0,title:"Video demo",iconUrl:"../dist/plyr.svg",tooltips:{controls:!0},captions:{defaultActive:!0}});plyr.loadSprite("dist/demo.svg");for(var s=i[0],o=document.querySelectorAll("[data-source]"),n={video:"video",audio:"audio",youtube:"youtube",vimeo:"vimeo"},r=window.location.hash.replace("#",""),a=window.history&&window.history.pushState,c=o.length-1;c>=0;c--)o[c].addEventListener("click",function(){var e=this.getAttribute("data-source");t(e),a&&history.pushState({type:e},"","#"+e)});if(window.addEventListener("popstate",function(e){e.state&&"type"in e.state&&t(e.state.type)}),a){var l=!r.length;l&&(r=n.video),r in n&&history.replaceState({type:r},"",l?"":"#"+r),r!==n.video&&t(r,!0)}}(),document.domain.indexOf("plyr.io")>-1&&(!function(e,t,i,s,o,n,r){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,n=t.createElement(i),r=t.getElementsByTagName(i)[0],n.async=1,n.src=s,r.parentNode.insertBefore(n,r)}(window,document,"script","//www.google-analytics.com/analytics.js","ga"),ga("create","UA-40881672-11","auto"),ga("send","pageview"));
\ No newline at end of file diff --git a/demo/index.html b/demo/index.html index 0c9b83af..d8ea6c2f 100644 --- a/demo/index.html +++ b/demo/index.html @@ -73,7 +73,8 @@ </main> <!-- Plyr core script --> - <script src="../dist/plyr.js"></script> + <!--<script src="../dist/plyr.js"></script>--> + <script src="../src/js/plyr.js"></script> <!-- Docs script --> <script src="dist/demo.js"></script> diff --git a/demo/src/js/main.js b/demo/src/js/main.js index bdd7febe..3337df88 100644 --- a/demo/src/js/main.js +++ b/demo/src/js/main.js @@ -8,7 +8,7 @@ // General functions ;(function() { - document.body.addEventListener('ready', function(event) { console.log(event); }); + //document.body.addEventListener('ready', function(event) { console.log(event); }); // Setup the player var instances = plyr.setup({ @@ -25,7 +25,7 @@ plyr.loadSprite('dist/demo.svg'); // Plyr returns an array regardless - var player = instances[0].plyr; + var player = instances[0]; // Setup type toggle var buttons = document.querySelectorAll('[data-source]'), diff --git a/demo/src/less/components/base.less b/demo/src/less/components/base.less index c584b57e..502196cf 100644 --- a/demo/src/less/components/base.less +++ b/demo/src/less/components/base.less @@ -39,9 +39,10 @@ header { // Sections section { - padding-bottom: @padding-base; + max-width: @example-width-video; + margin: 0 auto @padding-base; @media (min-width: @screen-sm) { - padding-bottom: (@padding-base * 2); + margin-bottom: (@padding-base * 2); } }
\ No newline at end of file diff --git a/demo/src/less/components/examples.less b/demo/src/less/components/examples.less index 8649c023..a9e72d21 100644 --- a/demo/src/less/components/examples.less +++ b/demo/src/less/components/examples.less @@ -2,11 +2,6 @@ // Examples // ========================================================================== -section { - margin: 0 auto @padding-base; - max-width: @example-width-video; -} - // For non supported browsers video { max-width: 100%; diff --git a/dist/plyr.js b/dist/plyr.js index fe051eda..f8d7208b 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(null,function(){t(e,document)}):e.plyr=t(e,document)}("undefined"!=typeof window?window:this,function(e,t){"use strict";function n(){var e,n,r,s=navigator.userAgent,o=navigator.appName,a=""+parseFloat(navigator.appVersion),i=parseInt(navigator.appVersion,10),l=!1,u=!1,c=!1,p=!1;return-1!==navigator.appVersion.indexOf("Windows NT")&&-1!==navigator.appVersion.indexOf("rv:11")?(l=!0,o="IE",a="11"):-1!==(n=s.indexOf("MSIE"))?(l=!0,o="IE",a=s.substring(n+5)):-1!==(n=s.indexOf("Chrome"))?(c=!0,o="Chrome",a=s.substring(n+7)):-1!==(n=s.indexOf("Safari"))?(p=!0,o="Safari",a=s.substring(n+7),-1!==(n=s.indexOf("Version"))&&(a=s.substring(n+8))):-1!==(n=s.indexOf("Firefox"))?(u=!0,o="Firefox",a=s.substring(n+8)):(e=s.lastIndexOf(" ")+1)<(n=s.lastIndexOf("/"))&&(o=s.substring(e,n),a=s.substring(n+1),o.toLowerCase()==o.toUpperCase()&&(o=navigator.appName)),-1!==(r=a.indexOf(";"))&&(a=a.substring(0,r)),-1!==(r=a.indexOf(" "))&&(a=a.substring(0,r)),i=parseInt(""+a,10),isNaN(i)&&(a=""+parseFloat(navigator.appVersion),i=parseInt(navigator.appVersion,10)),{name:o,version:i,isIE:l,isFirefox:u,isChrome:c,isSafari:p,isIos:/(iPad|iPhone|iPod)/g.test(navigator.platform),isTouch:"ontouchstart"in t.documentElement}}function r(e,t){var n=e.media;if("video"==e.type)switch(t){case"video/webm":return!(!n.canPlayType||!n.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/no/,""));case"video/mp4":return!(!n.canPlayType||!n.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/,""));case"video/ogg":return!(!n.canPlayType||!n.canPlayType('video/ogg; codecs="theora"').replace(/no/,""))}else if("audio"==e.type)switch(t){case"audio/mpeg":return!(!n.canPlayType||!n.canPlayType("audio/mpeg;").replace(/no/,""));case"audio/ogg":return!(!n.canPlayType||!n.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/,""));case"audio/wav":return!(!n.canPlayType||!n.canPlayType('audio/wav; codecs="1"').replace(/no/,""))}return!1}function s(e){if(!t.querySelectorAll('script[src="'+e+'"]').length){var n=t.createElement("script");n.src=e;var r=t.getElementsByTagName("script")[0];r.parentNode.insertBefore(n,r)}}function o(e,t){return Array.prototype.indexOf&&-1!=e.indexOf(t)}function a(e,t,n){return e.replace(new RegExp(t.replace(/([.*+?\^=!:${}()|\[\]\/\\])/g,"\\$1"),"g"),n)}function i(e,t){e.length||(e=[e]);for(var n=e.length-1;n>=0;n--){var r=n>0?t.cloneNode(!0):t,s=e[n],o=s.parentNode,a=s.nextSibling;return r.appendChild(s),a?o.insertBefore(r,a):o.appendChild(r),r}}function l(e){for(var t=e.parentNode;e.firstChild;)t.insertBefore(e.firstChild,e);t.removeChild(e)}function u(e){e&&e.parentNode.removeChild(e)}function c(e,t){e.insertBefore(t,e.firstChild)}function p(e,t){for(var n in t)e.setAttribute(n,L["boolean"](t[n])&&t[n]?"":t[n])}function d(e,n,r){var s=t.createElement(e);p(s,r),c(n,s)}function m(e){return e.replace(".","")}function f(e,t,n){if(e)if(e.classList)e.classList[n?"add":"remove"](t);else{var r=(" "+e.className+" ").replace(/\s+/g," ").replace(" "+t+" ","");e.className=r+(n?" "+t:"")}}function y(e,t){return e?e.classList?e.classList.contains(t):new RegExp("(\\s|^)"+t+"(\\s|$)").test(e.className):!1}function b(e,n){var r=Element.prototype,s=r.matches||r.webkitMatchesSelector||r.mozMatchesSelector||r.msMatchesSelector||function(e){return-1!==[].indexOf.call(t.querySelectorAll(e),this)};return s.call(e,n)}function v(e,t,n,r){e&&k(e,t,n,!0,r)}function g(e,t,n,r){e&&k(e,t,n,!1,r)}function h(e,t,n,r,s){v(e,t,function(t){n&&n.apply(e,[t]),r.apply(e,[t])},s)}function k(e,t,n,r,s){var o=t.split(" ");if(L["boolean"](s)||(s=!1),e instanceof NodeList)for(var a=0;a<e.length;a++)e[a]instanceof Node&&k(e[a],arguments[1],arguments[2],arguments[3]);else for(var i=0;i<o.length;i++)e[r?"addEventListener":"removeEventListener"](o[i],n,s)}function w(e,t,n,r){if(e&&t){L["boolean"](n)||(n=!1);var s=new CustomEvent(t,{bubbles:n,detail:r});e.dispatchEvent(s)}}function T(e,t){return e?(t=L["boolean"](t)?t:!e.getAttribute("aria-pressed"),e.setAttribute("aria-pressed",t),t):void 0}function x(e,t){return 0===e||0===t||isNaN(e)||isNaN(t)?0:(e/t*100).toFixed(2)}function _(){var e=arguments;if(e.length){if(1==e.lenth)return e[0];for(var t=Array.prototype.shift.call(e),n=e.length,r=0;n>r;r++){var s=e[r];for(var o in s)s[o]&&s[o].constructor&&s[o].constructor===Object?(t[o]=t[o]||{},_(t[o],s[o])):t[o]=s[o]}return t}}function S(){var e={supportsFullScreen:!1,isFullScreen:function(){return!1},requestFullScreen:function(){},cancelFullScreen:function(){},fullScreenEventName:"",element:null,prefix:""},n="webkit moz o ms khtml".split(" ");if(L.undefined(t.cancelFullScreen))for(var r=0,s=n.length;s>r;r++){if(e.prefix=n[r],!L.undefined(t[e.prefix+"CancelFullScreen"])){e.supportsFullScreen=!0;break}if(!L.undefined(t.msExitFullscreen)&&t.msFullscreenEnabled){e.prefix="ms",e.supportsFullScreen=!0;break}}else e.supportsFullScreen=!0;return e.supportsFullScreen&&(e.fullScreenEventName="ms"==e.prefix?"MSFullscreenChange":e.prefix+"fullscreenchange",e.isFullScreen=function(e){switch(L.undefined(e)&&(e=t.body),this.prefix){case"":return t.fullscreenElement==e;case"moz":return t.mozFullScreenElement==e;default:return t[this.prefix+"FullscreenElement"]==e}},e.requestFullScreen=function(e){return L.undefined(e)&&(e=t.body),""===this.prefix?e.requestFullScreen():e[this.prefix+("ms"==this.prefix?"RequestFullscreen":"RequestFullScreen")]()},e.cancelFullScreen=function(){return""===this.prefix?t.cancelFullScreen():t[this.prefix+("ms"==this.prefix?"ExitFullscreen":"CancelFullScreen")]()},e.element=function(){return""===this.prefix?t.fullscreenElement:t[this.prefix+"FullscreenElement"]}),e}function C(){var t={supported:function(){if(!("localStorage"in e))return!1;try{e.localStorage.setItem("___test","OK");var t=e.localStorage.getItem("___test");return e.localStorage.removeItem("___test"),"OK"===t}catch(n){return!1}return!1}()};return t}function E(b,k){function _(){k.debug&&e.console&&console.log.apply(console,arguments)}function E(){k.debug&&e.console&&console.warn.apply(console,arguments)}function I(){return{url:k.iconUrl,absolute:0===k.iconUrl.indexOf("http")||qe.browser.isIE}}function P(){var e=[],t=I(),n=(t.absolute?"":t.url)+"#"+k.iconPrefix;return o(k.controls,"play-large")&&e.push('<button type="button" data-plyr="play" class="plyr__play-large">','<svg><use xlink:href="'+n+'-play" /></svg>','<span class="plyr__sr-only">'+k.i18n.play+"</span>","</button>"),e.push('<div class="plyr__controls">'),o(k.controls,"restart")&&e.push('<button type="button" data-plyr="restart">','<svg><use xlink:href="'+n+'-restart" /></svg>','<span class="plyr__sr-only">'+k.i18n.restart+"</span>","</button>"),o(k.controls,"rewind")&&e.push('<button type="button" data-plyr="rewind">','<svg><use xlink:href="'+n+'-rewind" /></svg>','<span class="plyr__sr-only">'+k.i18n.rewind+"</span>","</button>"),o(k.controls,"play")&&e.push('<button type="button" data-plyr="play">','<svg><use xlink:href="'+n+'-play" /></svg>','<span class="plyr__sr-only">'+k.i18n.play+"</span>","</button>",'<button type="button" data-plyr="pause">','<svg><use xlink:href="'+n+'-pause" /></svg>','<span class="plyr__sr-only">'+k.i18n.pause+"</span>","</button>"),o(k.controls,"fast-forward")&&e.push('<button type="button" data-plyr="fast-forward">','<svg><use xlink:href="'+n+'-fast-forward" /></svg>','<span class="plyr__sr-only">'+k.i18n.forward+"</span>","</button>"),o(k.controls,"progress")&&(e.push('<span class="plyr__progress">','<label for="seek{id}" class="plyr__sr-only">Seek</label>','<input id="seek{id}" class="plyr__progress--seek" type="range" min="0" max="100" step="0.1" value="0" data-plyr="seek">','<progress class="plyr__progress--played" max="100" value="0" role="presentation"></progress>','<progress class="plyr__progress--buffer" max="100" value="0">',"<span>0</span>% "+k.i18n.buffered,"</progress>"),k.tooltips.seek&&e.push('<span class="plyr__tooltip">00:00</span>'),e.push("</span>")),o(k.controls,"current-time")&&e.push('<span class="plyr__time">','<span class="plyr__sr-only">'+k.i18n.currentTime+"</span>",'<span class="plyr__time--current">00:00</span>',"</span>"),o(k.controls,"duration")&&e.push('<span class="plyr__time">','<span class="plyr__sr-only">'+k.i18n.duration+"</span>",'<span class="plyr__time--duration">00:00</span>',"</span>"),o(k.controls,"mute")&&e.push('<button type="button" data-plyr="mute">','<svg class="icon--muted"><use xlink:href="'+n+'-muted" /></svg>','<svg><use xlink:href="'+n+'-volume" /></svg>','<span class="plyr__sr-only">'+k.i18n.toggleMute+"</span>","</button>"),o(k.controls,"volume")&&e.push('<span class="plyr__volume">','<label for="volume{id}" class="plyr__sr-only">'+k.i18n.volume+"</label>",'<input id="volume{id}" class="plyr__volume--input" type="range" min="'+k.volumeMin+'" max="'+k.volumeMax+'" value="'+k.volume+'" data-plyr="volume">','<progress class="plyr__volume--display" max="'+k.volumeMax+'" value="'+k.volumeMin+'" role="presentation"></progress>',"</span>"),o(k.controls,"captions")&&e.push('<button type="button" data-plyr="captions">','<svg class="icon--captions-on"><use xlink:href="'+n+'-captions-on" /></svg>','<svg><use xlink:href="'+n+'-captions-off" /></svg>','<span class="plyr__sr-only">'+k.i18n.toggleCaptions+"</span>","</button>"),o(k.controls,"fullscreen")&&e.push('<button type="button" data-plyr="fullscreen">','<svg class="icon--exit-fullscreen"><use xlink:href="'+n+'-exit-fullscreen" /></svg>','<svg><use xlink:href="'+n+'-enter-fullscreen" /></svg>','<span class="plyr__sr-only">'+k.i18n.toggleFullscreen+"</span>","</button>"),e.push("</div>"),e.join("")}function O(){if(qe.supported.full&&("audio"!=qe.type||k.fullscreen.allowAudio)&&k.fullscreen.enabled){var e=N.supportsFullScreen;e||k.fullscreen.fallback&&!W()?(_((e?"Native":"Fallback")+" fullscreen enabled"),f(qe.container,k.classes.fullscreen.enabled,!0)):_("Fullscreen not supported and fallback disabled"),qe.buttons&&qe.buttons.fullscreen&&T(qe.buttons.fullscreen,!1),Y()}}function j(){if("video"===qe.type){H(k.selectors.captions)||qe.videoContainer.insertAdjacentHTML("afterbegin",'<div class="'+m(k.selectors.captions)+'"></div>'),qe.usingTextTracks=!1,qe.media.textTracks&&(qe.usingTextTracks=!0);for(var e,t="",n=qe.media.childNodes,r=0;r<n.length;r++)"track"===n[r].nodeName.toLowerCase()&&(e=n[r].kind,"captions"!==e&&"subtitles"!==e||(t=n[r].getAttribute("src")));if(qe.captionExists=!0,""===t?(qe.captionExists=!1,_("No caption track found")):_("Caption track found; URI: "+t),qe.captionExists){for(var s=qe.media.textTracks,o=0;o<s.length;o++)s[o].mode="hidden";if(R(qe),(qe.browser.isIE&&qe.browser.version>=10||qe.browser.isFirefox&&qe.browser.version>=31)&&(_("Detected browser with known TextTrack issues - using manual fallback"),qe.usingTextTracks=!1),qe.usingTextTracks){_("TextTracks supported");for(var a=0;a<s.length;a++){var i=s[a];"captions"!==i.kind&&"subtitles"!==i.kind||v(i,"cuechange",function(){this.activeCues[0]&&"text"in this.activeCues[0]?V(this.activeCues[0].getCueAsHTML()):V()})}}else if(_("TextTracks not supported so rendering captions manually"),qe.currentCaption="",qe.captions=[],""!==t){var l=new XMLHttpRequest;l.onreadystatechange=function(){if(4===l.readyState)if(200===l.status){var e,t=[],n=l.responseText;t=n.split("\n\n");for(var r=0;r<t.length;r++){e=t[r],qe.captions[r]=[];var s=e.split("\n"),o=0;-1===s[o].indexOf(":")&&(o=1),qe.captions[r]=[s[o],s[o+1]]}qe.captions.shift(),_("Successfully loaded the caption file via AJAX")}else E("There was a problem loading the caption file via AJAX")},l.open("get",t,!0),l.send()}}else f(qe.container,k.classes.captions.enabled)}}function V(e){var n=H(k.selectors.captions),r=t.createElement("span");n.innerHTML="",L.undefined(e)&&(e=""),L.undefined(e)?r.innerHTML=e.trim():r.appendChild(e),n.appendChild(r);n.offsetHeight}function q(e){function t(e,t){var n=[];n=e.split(" --> ");for(var r=0;r<n.length;r++)n[r]=n[r].replace(/(\d+:\d+:\d+\.\d+).*/,"$1");return s(n[t])}function n(e){return t(e,0)}function r(e){return t(e,1)}function s(e){if(null===e||void 0===e)return 0;var t,n=[],r=[];return n=e.split(","),r=n[0].split(":"),t=Math.floor(60*r[0]*60)+Math.floor(60*r[1])+Math.floor(r[2])}if(!qe.usingTextTracks&&"video"===qe.type&&qe.supported.full&&(qe.subcount=0,e=L.number(e)?e:qe.media.currentTime,qe.captions[qe.subcount])){for(;r(qe.captions[qe.subcount][0])<e.toFixed(1);)if(qe.subcount++,qe.subcount>qe.captions.length-1){qe.subcount=qe.captions.length-1;break}qe.media.currentTime.toFixed(1)>=n(qe.captions[qe.subcount][0])&&qe.media.currentTime.toFixed(1)<=r(qe.captions[qe.subcount][0])?(qe.currentCaption=qe.captions[qe.subcount][1],V(qe.currentCaption)):V()}}function R(){qe.buttons.captions&&(f(qe.container,k.classes.captions.enabled,!0),k.captions.defaultActive&&(f(qe.container,k.classes.captions.active,!0),T(qe.buttons.captions,!0)))}function D(e){return qe.container.querySelectorAll(e)}function H(e){return D(e)[0]}function W(){try{return e.self!==e.top}catch(t){return!0}}function Y(){function e(e){9===e.which&&qe.isFullscreen&&(e.target!==r||e.shiftKey?e.target===n&&e.shiftKey&&(e.preventDefault(),r.focus()):(e.preventDefault(),n.focus()))}var t=D("input:not([disabled]), button:not([disabled])"),n=t[0],r=t[t.length-1];v(qe.container,"keydown",e)}function X(e,t){if(L.string(t))d(e,qe.media,{src:t});else if(t.constructor===Array)for(var n=t.length-1;n>=0;n--)d(e,qe.media,t[n])}function B(){if(k.loadSprite){var e=I();e.absolute?(_("AJAX loading absolute SVG sprite"+(qe.browser.isIE?" (due to IE)":"")),F(e.url,"sprite-plyr")):_("Sprite will be used as external resource directly")}var n=k.html;_("Injecting custom controls"),n||(n=P()),n=a(n,"{seektime}",k.seekTime),n=a(n,"{id}",Math.floor(1e4*Math.random()));var r;if(null!==k.selectors.controls.container&&(r=k.selectors.controls.container,L.string(r)&&(r=t.querySelector(r))),L.htmlElement(r)||(r=qe.container),r.insertAdjacentHTML("beforeend",n),k.tooltips.controls)for(var s=D([k.selectors.controls.wrapper," ",k.selectors.labels," .",k.classes.hidden].join("")),o=s.length-1;o>=0;o--){var i=s[o];f(i,k.classes.hidden,!1),f(i,k.classes.tooltip,!0)}}function U(){try{return qe.controls=H(k.selectors.controls.wrapper),qe.buttons={},qe.buttons.seek=H(k.selectors.buttons.seek),qe.buttons.play=D(k.selectors.buttons.play),qe.buttons.pause=H(k.selectors.buttons.pause),qe.buttons.restart=H(k.selectors.buttons.restart),qe.buttons.rewind=H(k.selectors.buttons.rewind),qe.buttons.forward=H(k.selectors.buttons.forward),qe.buttons.fullscreen=H(k.selectors.buttons.fullscreen),qe.buttons.mute=H(k.selectors.buttons.mute),qe.buttons.captions=H(k.selectors.buttons.captions),qe.progress={},qe.progress.container=H(k.selectors.progress.container),qe.progress.buffer={},qe.progress.buffer.bar=H(k.selectors.progress.buffer),qe.progress.buffer.text=qe.progress.buffer.bar&&qe.progress.buffer.bar.getElementsByTagName("span")[0],qe.progress.played=H(k.selectors.progress.played),qe.progress.tooltip=qe.progress.container&&qe.progress.container.querySelector("."+k.classes.tooltip),qe.volume={},qe.volume.input=H(k.selectors.volume.input),qe.volume.display=H(k.selectors.volume.display),qe.duration=H(k.selectors.duration),qe.currentTime=H(k.selectors.currentTime),qe.seekTime=D(k.selectors.seekTime),!0}catch(e){return E("It looks like there is a problem with your controls HTML"),G(!0),!1}}function z(){f(qe.container,k.selectors.container.replace(".",""),qe.supported.full)}function G(e){e&&o(k.types.html5,qe.type)?qe.media.setAttribute("controls",""):qe.media.removeAttribute("controls")}function J(e){var t=k.i18n.play;if(!L.undefined(k.title)&&k.title.length&&(t+=", "+k.title),qe.supported.full&&qe.buttons.play)for(var n=qe.buttons.play.length-1;n>=0;n--)qe.buttons.play[n].setAttribute("aria-label",t);L.htmlElement(e)&&e.setAttribute("title",k.i18n.frameTitle.replace("{title}",k.title))}function K(){if(!qe.media)return void E("No media element found!");if(qe.supported.full&&(f(qe.container,k.classes.type.replace("{0}",qe.type),!0),o(k.types.embed,qe.type)&&f(qe.container,k.classes.type.replace("{0}","video"),!0),f(qe.container,k.classes.stopped,k.autoplay),f(qe.container,k.classes.isIos,qe.browser.isIos),f(qe.container,k.classes.isTouch,qe.browser.isTouch),"video"===qe.type)){var e=t.createElement("div");e.setAttribute("class",k.classes.videoWrapper),i(qe.media,e),qe.videoContainer=e}o(k.types.embed,qe.type)&&($(),qe.embedId=null)}function $(){for(var n=t.createElement("div"),r=qe.embedId,o=qe.type+"-"+Math.floor(1e4*Math.random()),a=D('[id^="'+qe.type+'-"]'),i=a.length-1;i>=0;i--)u(a[i]);if(f(qe.media,k.classes.videoWrapper,!0),f(qe.media,k.classes.embedWrapper,!0),"youtube"===qe.type)qe.media.appendChild(n),n.setAttribute("id",o),L.object(e.YT)?Z(r,n):(s(k.urls.youtube.api),e.onYouTubeReadyCallbacks=e.onYouTubeReadyCallbacks||[],e.onYouTubeReadyCallbacks.push(function(){Z(r,n)}),e.onYouTubeIframeAPIReady=function(){e.onYouTubeReadyCallbacks.forEach(function(e){e()})});else if("vimeo"===qe.type)if(qe.supported.full?qe.media.appendChild(n):n=qe.media,n.setAttribute("id",o),L.object(e.Vimeo))ee(r,n);else{s(k.urls.vimeo.api);var l=e.setInterval(function(){L.object(e.Vimeo)&&(e.clearInterval(l),ee(r,n))},50)}else if("soundcloud"===qe.type){var c=t.createElement("iframe");c.loaded=!1,v(c,"load",function(){c.loaded=!0}),p(c,{src:"https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/"+r,id:o}),n.appendChild(c),qe.media.appendChild(n),e.SC||s(k.urls.soundcloud.api);var d=e.setInterval(function(){e.SC&&c.loaded&&(e.clearInterval(d),te.call(c))},50)}}function Q(){qe.container.plyr.embed=qe.embed,qe.supported.full&&Ve(),J(H("iframe"))}function Z(t,n){"timer"in qe||(qe.timer={}),qe.embed=new e.YT.Player(n.id,{videoId:t,playerVars:{autoplay:k.autoplay?1:0,controls:qe.supported.full?0:1,rel:0,showinfo:0,iv_load_policy:3,cc_load_policy:k.captions.defaultActive?1:0,cc_lang_pref:"en",wmode:"transparent",modestbranding:1,disablekb:1,origin:"*"},events:{onError:function(e){w(qe.container,"error",!0,{code:e.data,embed:e.target})},onReady:function(t){var n=t.target;qe.media.play=function(){n.playVideo(),qe.media.paused=!1},qe.media.pause=function(){n.pauseVideo(),qe.media.paused=!0},qe.media.stop=function(){n.stopVideo(),qe.media.paused=!0},qe.media.duration=n.getDuration(),qe.media.paused=!0,qe.media.currentTime=n.getCurrentTime(),qe.media.muted=n.isMuted(),k.title=n.getVideoData().title,w(qe.media,"timeupdate"),e.clearInterval(qe.timer.buffering),qe.timer.buffering=e.setInterval(function(){qe.media.buffered=n.getVideoLoadedFraction(),w(qe.media,"progress"),1===qe.media.buffered&&(e.clearInterval(qe.timer.buffering),w(qe.media,"canplaythrough"))},200),Q(),_e()},onStateChange:function(t){var n=t.target;switch(e.clearInterval(qe.timer.playing),t.data){case 0:qe.media.paused=!0,w(qe.media,"ended");break;case 1:qe.media.paused=!1,qe.media.seeking=!1,w(qe.media,"play"),w(qe.media,"playing"),qe.timer.playing=e.setInterval(function(){qe.media.currentTime=n.getCurrentTime(),w(qe.media,"timeupdate")},100);break;case 2:qe.media.paused=!0,w(qe.media,"pause")}w(qe.container,"statechange",!1,{code:t.data})}}})}function ee(t,n){qe.embed=new e.Vimeo.Player(n.id,{id:t,loop:k.loop,autoplay:k.autoplay,byline:!1,portrait:!1,title:!1}),qe.media.play=function(){qe.embed.play(),qe.media.paused=!1},qe.media.pause=function(){qe.embed.pause(),qe.media.paused=!0},qe.media.stop=function(){qe.embed.stop(),qe.media.paused=!0},qe.media.paused=!0,qe.media.currentTime=0,Q(),qe.embed.getCurrentTime().then(function(e){qe.media.currentTime=e,w(qe.media,"timeupdate")}),qe.embed.getDuration().then(function(e){qe.media.duration=e,_e()}),qe.embed.on("loaded",function(){L.htmlElement(qe.embed.element)&&qe.embed.element.setAttribute("tabindex","-1")}),qe.embed.on("play",function(){qe.media.paused=!1,w(qe.media,"play"),w(qe.media,"playing")}),qe.embed.on("pause",function(){qe.media.paused=!0,w(qe.media,"pause")}),qe.embed.on("timeupdate",function(e){qe.media.seeking=!1,qe.media.currentTime=e.seconds,w(qe.media,"timeupdate")}),qe.embed.on("progress",function(e){qe.media.buffered=e.percent,w(qe.media,"progress"),1===parseInt(e.percent)&&w(qe.media,"canplaythrough")}),qe.embed.on("ended",function(){qe.media.paused=!0,w(qe.media,"ended")})}function te(){qe.embed=e.SC.Widget(this),qe.embed.bind(e.SC.Widget.Events.READY,function(){qe.media.play=function(){qe.embed.play(),qe.media.paused=!1},qe.media.pause=function(){qe.embed.pause(),qe.media.paused=!0},qe.media.stop=function(){qe.embed.seekTo(0),qe.embed.pause(),qe.media.paused=!0},qe.media.paused=!0,qe.media.currentTime=0,Q(),qe.embed.getPosition(function(e){qe.media.currentTime=e,w(qe.media,"timeupdate")}),qe.embed.getDuration(function(e){qe.media.duration=e/1e3,_e()}),qe.embed.bind(e.SC.Widget.Events.PLAY,function(){qe.media.paused=!1,w(qe.media,"play"),w(qe.media,"playing")}),qe.embed.bind(e.SC.Widget.Events.PAUSE,function(){qe.media.paused=!0,w(qe.media,"pause")}),qe.embed.bind(e.SC.Widget.Events.PLAY_PROGRESS,function(e){qe.media.seeking=!1,qe.media.currentTime=e.currentPosition/1e3,w(qe.media,"timeupdate")}),qe.embed.bind(e.SC.Widget.Events.LOAD_PROGRESS,function(e){qe.media.buffered=e.loadProgress,w(qe.media,"progress"),1===parseInt(e.loadProgress)&&w(qe.media,"canplaythrough")}),qe.embed.bind(e.SC.Widget.Events.FINISH,function(){qe.media.paused=!0,w(qe.media,"ended")}),k.autoplay&&qe.embed.play()})}function ne(){"play"in qe.media&&qe.media.play()}function re(){"pause"in qe.media&&qe.media.pause()}function se(e){e===!0?ne():e===!1?re():qe.media[qe.media.paused?"play":"pause"]()}function oe(e){L.number(e)||(e=k.seekTime),ie(qe.media.currentTime-e)}function ae(e){L.number(e)||(e=k.seekTime),ie(qe.media.currentTime+e)}function ie(e){var t=0,n=qe.media.paused,r=le();L.number(e)?t=e:L.object(e)&&o(["input","change"],e.type)&&(t=e.target.value/e.target.max*r),0>t?t=0:t>r&&(t=r),Ce(t);try{qe.media.currentTime=t.toFixed(4)}catch(s){}if(o(k.types.embed,qe.type)){switch(qe.type){case"youtube":qe.embed.seekTo(t);break;case"vimeo":qe.embed.setCurrentTime(t.toFixed(0));break;case"soundcloud":qe.embed.seekTo(1e3*t)}n&&re(),w(qe.media,"timeupdate"),qe.media.seeking=!0}_("Seeking to "+qe.media.currentTime+" seconds"),q(t)}function le(){var e=parseInt(k.duration),t=0;return null===qe.media.duration||isNaN(qe.media.duration)||(t=qe.media.duration),isNaN(e)?t:e}function ue(){f(qe.container,k.classes.playing,!qe.media.paused),f(qe.container,k.classes.stopped,qe.media.paused),Fe(qe.media.paused)}function ce(){M={x:e.pageXOffset||0,y:e.pageYOffset||0}}function pe(){e.scrollTo(M.x,M.y)}function de(e){var n=N.supportsFullScreen;e&&e.type===N.fullScreenEventName?qe.isFullscreen=N.isFullScreen(qe.container):n?(N.isFullScreen(qe.container)?N.cancelFullScreen():(ce(),N.requestFullScreen(qe.container)),qe.isFullscreen=N.isFullScreen(qe.container)):(qe.isFullscreen=!qe.isFullscreen,qe.isFullscreen?(v(t,"keyup",me),t.body.style.overflow="hidden"):(g(t,"keyup",me),t.body.style.overflow="")),f(qe.container,k.classes.fullscreen.active,qe.isFullscreen),qe.isFullscreen?qe.container.setAttribute("tabindex","-1"):qe.container.removeAttribute("tabindex"),Y(qe.isFullscreen),qe.buttons&&qe.buttons.fullscreen&&T(qe.buttons.fullscreen,qe.isFullscreen),w(qe.container,qe.isFullscreen?"enterfullscreen":"exitfullscreen",!0),!qe.isFullscreen&&n&&pe()}function me(e){27===(e.which||e.charCode||e.keyCode)&&qe.isFullscreen&&de()}function fe(e){if(L["boolean"](e)||(e=!qe.media.muted),T(qe.buttons.mute,e),qe.media.muted=e,0===qe.media.volume&&ye(k.volume),o(k.types.embed,qe.type)){switch(qe.type){case"youtube":qe.embed[qe.media.muted?"mute":"unMute"]();break;case"vimeo":case"soundcloud":qe.embed.setVolume(qe.media.muted?0:parseFloat(k.volume/k.volumeMax))}w(qe.media,"volumechange")}}function ye(t){var n=k.volumeMax,r=k.volumeMin;if(L.undefined(t)&&(t=k.volume,k.storage.enabled&&C().supported&&(t=e.localStorage.getItem(k.storage.key),e.localStorage.removeItem("plyr-volume"))),(null===t||isNaN(t))&&(t=k.volume),t>n&&(t=n),r>t&&(t=r),qe.media.volume=parseFloat(t/n),qe.volume.display&&(qe.volume.display.value=t),o(k.types.embed,qe.type)){switch(qe.type){case"youtube":qe.embed.setVolume(100*qe.media.volume);break;case"vimeo":case"soundcloud":qe.embed.setVolume(qe.media.volume)}w(qe.media,"volumechange")}qe.media.muted&&t>0&&fe()}function be(){var e=qe.media.muted?0:qe.media.volume*k.volumeMax;ye(e+k.volumeStep/5)}function ve(){var e=qe.media.muted?0:qe.media.volume*k.volumeMax;ye(e-k.volumeStep/5)}function ge(){var t=qe.media.muted?0:qe.media.volume*k.volumeMax;qe.supported.full&&(qe.volume.input&&(qe.volume.input.value=t),qe.volume.display&&(qe.volume.display.value=t)),k.storage.enabled&&C().supported&&!isNaN(t)&&e.localStorage.setItem(k.storage.key,t),f(qe.container,k.classes.muted,0===t),qe.supported.full&&qe.buttons.mute&&T(qe.buttons.mute,0===t)}function he(e){qe.supported.full&&qe.buttons.captions&&(L["boolean"](e)||(e=-1===qe.container.className.indexOf(k.classes.captions.active)),qe.captionsEnabled=e,T(qe.buttons.captions,qe.captionsEnabled),f(qe.container,k.classes.captions.active,qe.captionsEnabled),w(qe.container,qe.captionsEnabled?"captionsenabled":"captionsdisabled",!0))}function ke(e){var t="waiting"===e.type;clearTimeout(qe.timers.loading),qe.timers.loading=setTimeout(function(){f(qe.container,k.classes.loading,t)},t?250:0)}function we(e){if(qe.supported.full){var t=qe.progress.played,n=0,r=le();if(e)switch(e.type){case"timeupdate":case"seeking":if(qe.controls.pressed)return;n=x(qe.media.currentTime,r),"timeupdate"==e.type&&qe.buttons.seek&&(qe.buttons.seek.value=n);break;case"playing":case"progress":t=qe.progress.buffer,n=function(){var e=qe.media.buffered;return e&&e.length?x(e.end(0),r):L.number(e)?100*e:0}()}Te(t,n)}}function Te(e,t){if(qe.supported.full){if(L.undefined(t)&&(t=0),L.undefined(e)){if(!qe.progress||!qe.progress.buffer)return;e=qe.progress.buffer}L.htmlElement(e)?e.value=t:e&&(e.bar&&(e.bar.value=t),e.text&&(e.text.innerHTML=t))}}function xe(e,t){if(t){isNaN(e)&&(e=0),qe.secs=parseInt(e%60),qe.mins=parseInt(e/60%60),qe.hours=parseInt(e/60/60%60);var n=parseInt(le()/60/60%60)>0;qe.secs=("0"+qe.secs).slice(-2),qe.mins=("0"+qe.mins).slice(-2),t.innerHTML=(n?qe.hours+":":"")+qe.mins+":"+qe.secs}}function _e(){if(qe.supported.full){var e=le()||0;!qe.duration&&k.displayDuration&&qe.media.paused&&xe(e,qe.currentTime),qe.duration&&xe(e,qe.duration),Ee()}}function Se(e){xe(qe.media.currentTime,qe.currentTime),e&&"timeupdate"==e.type&&qe.media.seeking||we(e)}function Ce(e){L.number(e)||(e=0);var t=le(),n=x(e,t);qe.progress&&qe.progress.played&&(qe.progress.played.value=n),qe.buttons&&qe.buttons.seek&&(qe.buttons.seek.value=n)}function Ee(e){var t=le();if(k.tooltips.seek&&qe.progress.container&&0!==t){var n=qe.progress.container.getBoundingClientRect(),r=0,s=k.classes.tooltip+"--visible";if(e)r=100/n.width*(e.pageX-n.left);else{if(!y(qe.progress.tooltip,s))return;r=qe.progress.tooltip.style.left.replace("%","")}0>r?r=0:r>100&&(r=100),xe(t/100*r,qe.progress.tooltip),qe.progress.tooltip.style.left=r+"%",e&&o(["mouseenter","mouseleave"],e.type)&&f(qe.progress.tooltip,s,"mouseenter"===e.type)}}function Fe(t){if(k.hideControls&&"audio"!==qe.type){var n=0,r=!1,s=t;if(L["boolean"](t)||(t&&t.type?(r="enterfullscreen"===t.type,s=o(["mousemove","touchstart","mouseenter","focus"],t.type),o(["mousemove","touchmove"],t.type)&&(n=2e3),"focus"===t.type&&(n=3e3)):s=y(qe.container,k.classes.hideControls)),e.clearTimeout(qe.timers.hover),s||qe.media.paused){if(f(qe.container,k.classes.hideControls,!1),qe.media.paused)return;qe.browser.isTouch&&(n=3e3)}s&&qe.media.paused||(qe.timers.hover=e.setTimeout(function(){(!qe.controls.pressed&&!qe.controls.hover||r)&&f(qe.container,k.classes.hideControls,!0)},n))}}function Ae(e){if(!L.undefined(e))return void Ie(e);var t;switch(qe.type){case"youtube":t=qe.embed.getVideoUrl();break;case"vimeo":qe.embed.getVideoUrl.then(function(e){t=e});break;case"soundcloud":qe.embed.getCurrentSound(function(e){t=e.permalink_url});break;default:t=qe.media.currentSrc}return t||""}function Ie(n){if(!(L.object(n)&&"sources"in n&&n.sources.length))return void E("Invalid source format");if(re(),Ce(),Te(),Le(),"youtube"===qe.type?(qe.embed.destroy(),e.clearInterval(qe.timer.buffering),e.clearInterval(qe.timer.playing)):"video"===qe.type&&qe.videoContainer&&u(qe.videoContainer),qe.embed=null,u(qe.media),"type"in n&&(qe.type=n.type,"video"===qe.type)){var r=n.sources[0];"type"in r&&o(k.types.embed,r.type)&&(qe.type=r.type)}switch(qe.supported=A(qe.type),qe.type){case"video":qe.media=t.createElement("video");break;case"audio":qe.media=t.createElement("audio");break;case"youtube":case"vimeo":case"soundcloud":qe.media=t.createElement("div"),qe.embedId=n.sources[0].src}c(qe.container,qe.media),L["boolean"](n.autoplay)&&(k.autoplay=n.autoplay),o(k.types.html5,qe.type)&&(k.crossorigin&&qe.media.setAttribute("crossorigin",""),k.autoplay&&qe.media.setAttribute("autoplay",""),"poster"in n&&qe.media.setAttribute("poster",n.poster),k.loop&&qe.media.setAttribute("loop","")),qe.container.className=qe.originalClassName,f(qe.container,k.classes.fullscreen.active,qe.isFullscreen),f(qe.container,k.classes.captions.active,qe.captionsEnabled),z(),o(k.types.html5,qe.type)&&X("source",n.sources),K(),o(k.types.html5,qe.type)?("tracks"in n&&X("track",n.tracks),qe.media.load(),Ve(),_e()):o(k.types.embed,qe.type)&&!qe.supported.full&&Ve(),k.title=n.title,J(),qe.container.plyr.media=qe.media}function Ne(e){"video"===qe.type&&qe.media.setAttribute("poster",e)}function Me(){function n(){var e=qe.media.paused;e?ne():re();var t=qe.buttons[e?"play":"pause"],n=qe.buttons[e?"pause":"play"];if(n=n&&n.length>1?n[n.length-1]:n[0]){var r=y(t,k.classes.tabFocus);setTimeout(function(){n.focus(),r&&(f(t,k.classes.tabFocus,!1),f(n,k.classes.tabFocus,!0))},100)}}function r(){var e=t.activeElement;e&&e!=t.body?t.querySelector&&(e=t.querySelector(":focus")):e=null;for(var n in qe.buttons){var r=qe.buttons[n];if(L.nodeList(r))for(var s=0;s<r.length;s++)f(r[s],k.classes.tabFocus,r[s]===e);else f(r,k.classes.tabFocus,r===e)}}var s=qe.browser.isIE?"change":"input";v(e,"keyup",function(e){var t=e.keyCode?e.keyCode:e.which;9==t&&r()}),v(t.body,"click",function(){f(H("."+k.classes.tabFocus),k.classes.tabFocus,!1)});for(var a in qe.buttons){var i=qe.buttons[a];v(i,"blur",function(){f(i,"tab-focus",!1)})}h(qe.buttons.play,"click",k.listeners.play,n),h(qe.buttons.pause,"click",k.listeners.pause,n),h(qe.buttons.restart,"click",k.listeners.restart,ie),h(qe.buttons.rewind,"click",k.listeners.rewind,oe),h(qe.buttons.forward,"click",k.listeners.forward,ae),h(qe.buttons.seek,s,k.listeners.seek,ie),h(qe.volume.input,s,k.listeners.volume,function(){ye(qe.volume.input.value)}),h(qe.buttons.mute,"click",k.listeners.mute,fe),h(qe.buttons.fullscreen,"click",k.listeners.fullscreen,de),N.supportsFullScreen&&v(t,N.fullScreenEventName,de),v(qe.buttons.captions,"click",he),v(qe.progress.container,"mouseenter mouseleave mousemove",Ee),k.hideControls&&(v(qe.container,"mouseenter mouseleave mousemove touchstart touchend touchcancel touchmove enterfullscreen",Fe),v(qe.controls,"mouseenter mouseleave",function(e){qe.controls.hover="mouseenter"===e.type}),v(qe.controls,"mousedown mouseup touchstart touchend touchcancel",function(e){qe.controls.pressed=o(["mousedown","touchstart"],e.type)}),v(qe.controls,"focus blur",Fe,!0)),v(qe.volume.input,"wheel",function(e){e.preventDefault();var t=e.webkitDirectionInvertedFromDevice;(e.deltaY<0||e.deltaX>0)&&(t?ve():be()),(e.deltaY>0||e.deltaX<0)&&(t?be():ve())})}function Pe(){if(v(qe.media,"timeupdate seeking",Se),v(qe.media,"timeupdate",q),v(qe.media,"durationchange loadedmetadata",_e),v(qe.media,"ended",function(){"video"===qe.type&&V(),ue(),ie(0),_e(),"video"===qe.type&&k.showPosterOnEnd&&qe.media.load()}),v(qe.media,"progress playing",we), -v(qe.media,"volumechange",ge),v(qe.media,"play pause",ue),v(qe.media,"waiting canplay seeked",ke),k.clickToPlay&&"audio"!==qe.type){var e=H("."+k.classes.videoWrapper);if(!e)return;e.style.cursor="pointer",v(e,"click",function(){k.hideControls&&qe.browser.isTouch&&!qe.media.paused||(qe.media.paused?ne():qe.media.ended?(ie(),ne()):re())})}k.disableContextMenu&&v(qe.media,"contextmenu",function(e){e.preventDefault()}),v(qe.media,k.events.join(" "),function(e){w(qe.container,e.type,!0)})}function Le(){if(o(k.types.html5,qe.type)){for(var e=qe.media.querySelectorAll("source"),t=0;t<e.length;t++)u(e[t]);qe.media.setAttribute("src","https://cdn.selz.com/plyr/blank.mp4"),qe.media.load(),_("Cancelled network requests for old media")}}function Oe(){if(!qe.init)return null;if(qe.container.setAttribute("class",m(k.selectors.container)),qe.init=!1,u(H(k.selectors.controls.wrapper)),"youtube"===qe.type)return void qe.embed.destroy();"video"===qe.type&&(u(H(k.selectors.captions)),l(qe.videoContainer)),G(!0);var e=qe.media.cloneNode(!0);qe.media.parentNode.replaceChild(e,qe.media)}function je(){if(qe.init)return null;if(N=S(),qe.browser=n(),qe.media=qe.container.querySelectorAll("audio, video")[0],qe.media||(qe.media=qe.container.querySelectorAll("[data-type]")[0]),qe.media){qe.originalClassName=qe.container.className;var e=qe.media.tagName.toLowerCase();if("div"===e?(qe.type=qe.media.getAttribute("data-type"),qe.embedId=qe.media.getAttribute("data-video-id"),qe.media.removeAttribute("data-type"),qe.media.removeAttribute("data-video-id")):(qe.type=e,k.crossorigin=null!==qe.media.getAttribute("crossorigin"),k.autoplay=k.autoplay||null!==qe.media.getAttribute("autoplay"),k.loop=k.loop||null!==qe.media.getAttribute("loop")),qe.supported=A(qe.type),z(),!qe.supported.basic)return!1;if(_(qe.browser.name+" "+qe.browser.version),K(),o(k.types.html5,qe.type)){if(!qe.supported.full)return void(qe.init=!0);Ve(),J(),k.autoplay&&ne()}else o(k.types.embed,qe.type)&&!qe.supported.full&&Ve();qe.init=!0}}function Ve(){if(!qe.supported.full)return E("No full support for this media type ("+qe.type+")"),u(H(k.selectors.controls.wrapper)),u(H(k.selectors.buttons.play)),void G(!0);var e=!D(k.selectors.controls.wrapper).length;e&&B(),U()&&(e&&Me(),Pe(),G(),O(),j(),ye(),ge(),Se(),ue(),_e(),w(qe.container,"ready",!0))}var qe=this;return qe.container=b,qe.timers={},_(k),je(),qe.init?{media:qe.media,play:ne,pause:re,restart:ie,rewind:oe,forward:ae,seek:ie,source:Ae,poster:Ne,setVolume:ye,togglePlay:se,toggleMute:fe,toggleCaptions:he,toggleFullscreen:de,toggleControls:Fe,isFullscreen:function(){return qe.isFullscreen||!1},support:function(e){return r(qe,e)},destroy:Oe,restore:je,getCurrentTime:function(){return qe.media.currentTime}}:{}}function F(e,n){var r=new XMLHttpRequest;L.string(n)&&null!==t.querySelector("#"+n)||"withCredentials"in r&&(r.open("GET",e,!0),r.onload=function(){var e=t.createElement("div");e.setAttribute("hidden",""),L.string(n)&&e.setAttribute("id",n),e.innerHTML=r.responseText,t.body.insertBefore(e,t.body.childNodes[0])},r.send())}function A(e){var r,s,o=n(),a=o.isIE&&o.version<=9,i=o.isIos,l=/iPhone|iPod/i.test(navigator.userAgent),u=!!t.createElement("audio").canPlayType,c=!!t.createElement("video").canPlayType;switch(e){case"video":r=c,s=r&&!a&&!l;break;case"audio":r=u,s=r&&!a;break;case"vimeo":case"youtube":case"soundcloud":r=!0,s=!a&&!i;break;default:r=u&&c,s=r&&!a}return{basic:r,full:s}}function I(e,n){var r=[],s=[],o=[P.selectors.html5,P.selectors.embed].join(",");if(L.string(e)?e=t.querySelectorAll(e):L.htmlElement(e)?e=[e]:L.nodeList(e)||L.array(e)||L.string(e)||(L.undefined(n)&&L.object(e)&&(n=e),e=t.querySelectorAll(o)),L.nodeList(e)&&(e=Array.prototype.slice.call(e)),!A().basic||!e.length)return!1;for(var a=0;a<e.length;a++){var l=e[a],u=l.querySelectorAll(o);if(u.length>1)for(var c=0;c<u.length;c++)s.push({element:i(u[c],t.createElement("div")),original:l});else s.push({element:l})}for(var p in s){var d=s[p].element,m=s[p].original||d;if(b(d,o)&&(d=i(d,t.createElement("div"))),!("plyr"in d)){var f=_({},P,n,JSON.parse(m.getAttribute("data-plyr")));if(!f.enabled)return null;var y=new E(d,f);d.plyr=Object.keys(y).length?y:!1,w(m,"setup",!0,{plyr:d.plyr})}r.push(d)}return r}var N,M={x:0,y:0},P={enabled:!0,debug:!1,autoplay:!1,loop:!1,seekTime:10,volume:5,volumeMin:0,volumeMax:10,volumeStep:1,duration:null,displayDuration:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/1.8.11/plyr.svg",clickToPlay:!0,hideControls:!0,showPosterOnEnd:!1,disableContextMenu:!0,tooltips:{controls:!1,seek:!0},selectors:{html5:"video, audio",embed:"[data-type]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{seek:'[data-plyr="seek"]',play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',forward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',fullscreen:'[data-plyr="fullscreen"]'},volume:{input:'[data-plyr="volume"]',display:".plyr__volume--display"},progress:{container:".plyr__progress",buffer:".plyr__progress--buffer",played:".plyr__progress--played"},captions:".plyr__captions",currentTime:".plyr__time--current",duration:".plyr__time--duration"},classes:{videoWrapper:"plyr__video-wrapper",embedWrapper:"plyr__video-embed",type:"plyr--{0}",stopped:"plyr--stopped",playing:"plyr--playing",muted:"plyr--muted",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isIos:"plyr--is-ios",isTouch:"plyr--is-touch",captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",active:"plyr--fullscreen-active"},tabFocus:"tab-focus"},captions:{defaultActive:!1},fullscreen:{enabled:!0,fallback:!0,allowAudio:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","fullscreen"],i18n:{restart:"Restart",rewind:"Rewind {seektime} secs",play:"Play",pause:"Pause",forward:"Forward {seektime} secs",played:"played",buffered:"buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",toggleMute:"Toggle Mute",toggleCaptions:"Toggle Captions",toggleFullscreen:"Toggle Fullscreen",frameTitle:"Player for {title}"},types:{embed:["youtube","vimeo","soundcloud"],html5:["video","audio"]},urls:{vimeo:{api:"https://player.vimeo.com/api/player.js"},youtube:{api:"https://www.youtube.com/iframe_api"},soundcloud:{api:"https://w.soundcloud.com/player/api.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,forward:null,mute:null,volume:null,captions:null,fullscreen:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","emptied"]},L={object:function(e){return null!==e&&"object"==typeof e},array:function(e){return null!==e&&"object"==typeof e&&e.constructor===Array},number:function(e){return"number"==typeof e&&!isNaN(e-0)||"object"==typeof e&&e.constructor===Number},string:function(e){return"string"==typeof e||"object"==typeof e&&e.constructor===String},"boolean":function(e){return"boolean"==typeof e},nodeList:function(e){return e instanceof NodeList},htmlElement:function(e){return e instanceof HTMLElement},undefined:function(e){return"undefined"==typeof e}};return{setup:I,supported:A,loadSprite:F}}),function(){function e(e,t){t=t||{bubbles:!1,cancelable:!1,detail:void 0};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,t.bubbles,t.cancelable,t.detail),n}"function"!=typeof window.CustomEvent&&(e.prototype=window.Event.prototype,window.CustomEvent=e)}();
\ No newline at end of file +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=t(e,document):"function"==typeof define&&define.amd?define(null,function(){t(e,document)}):e.plyr=t(e,document)}("undefined"!=typeof window?window:this,function(e,t){"use strict";function n(){var e,n,r,s=navigator.userAgent,o=navigator.appName,a=""+parseFloat(navigator.appVersion),i=parseInt(navigator.appVersion,10),l=!1,u=!1,c=!1,p=!1;return-1!==navigator.appVersion.indexOf("Windows NT")&&-1!==navigator.appVersion.indexOf("rv:11")?(l=!0,o="IE",a="11"):-1!==(n=s.indexOf("MSIE"))?(l=!0,o="IE",a=s.substring(n+5)):-1!==(n=s.indexOf("Chrome"))?(c=!0,o="Chrome",a=s.substring(n+7)):-1!==(n=s.indexOf("Safari"))?(p=!0,o="Safari",a=s.substring(n+7),-1!==(n=s.indexOf("Version"))&&(a=s.substring(n+8))):-1!==(n=s.indexOf("Firefox"))?(u=!0,o="Firefox",a=s.substring(n+8)):(e=s.lastIndexOf(" ")+1)<(n=s.lastIndexOf("/"))&&(o=s.substring(e,n),a=s.substring(n+1),o.toLowerCase()==o.toUpperCase()&&(o=navigator.appName)),-1!==(r=a.indexOf(";"))&&(a=a.substring(0,r)),-1!==(r=a.indexOf(" "))&&(a=a.substring(0,r)),i=parseInt(""+a,10),isNaN(i)&&(a=""+parseFloat(navigator.appVersion),i=parseInt(navigator.appVersion,10)),{name:o,version:i,isIE:l,isFirefox:u,isChrome:c,isSafari:p,isIos:/(iPad|iPhone|iPod)/g.test(navigator.platform),isTouch:"ontouchstart"in t.documentElement}}function r(e,t){var n=e.media;if("video"==e.type)switch(t){case"video/webm":return!(!n.canPlayType||!n.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/no/,""));case"video/mp4":return!(!n.canPlayType||!n.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/,""));case"video/ogg":return!(!n.canPlayType||!n.canPlayType('video/ogg; codecs="theora"').replace(/no/,""))}else if("audio"==e.type)switch(t){case"audio/mpeg":return!(!n.canPlayType||!n.canPlayType("audio/mpeg;").replace(/no/,""));case"audio/ogg":return!(!n.canPlayType||!n.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/,""));case"audio/wav":return!(!n.canPlayType||!n.canPlayType('audio/wav; codecs="1"').replace(/no/,""))}return!1}function s(e){if(!t.querySelectorAll('script[src="'+e+'"]').length){var n=t.createElement("script");n.src=e;var r=t.getElementsByTagName("script")[0];r.parentNode.insertBefore(n,r)}}function o(e,t){return Array.prototype.indexOf&&-1!=e.indexOf(t)}function a(e,t,n){return e.replace(new RegExp(t.replace(/([.*+?\^=!:${}()|\[\]\/\\])/g,"\\$1"),"g"),n)}function i(e,t){e.length||(e=[e]);for(var n=e.length-1;n>=0;n--){var r=n>0?t.cloneNode(!0):t,s=e[n],o=s.parentNode,a=s.nextSibling;return r.appendChild(s),a?o.insertBefore(r,a):o.appendChild(r),r}}function l(e){e&&e.parentNode.removeChild(e)}function u(e,t){e.insertBefore(t,e.firstChild)}function c(e,t){for(var n in t)e.setAttribute(n,L["boolean"](t[n])&&t[n]?"":t[n])}function p(e,n,r){var s=t.createElement(e);c(s,r),u(n,s)}function d(e){return e.replace(".","")}function m(e,t,n){if(e)if(e.classList)e.classList[n?"add":"remove"](t);else{var r=(" "+e.className+" ").replace(/\s+/g," ").replace(" "+t+" ","");e.className=r+(n?" "+t:"")}}function f(e,t){return e?e.classList?e.classList.contains(t):new RegExp("(\\s|^)"+t+"(\\s|$)").test(e.className):!1}function y(e,n){var r=Element.prototype,s=r.matches||r.webkitMatchesSelector||r.mozMatchesSelector||r.msMatchesSelector||function(e){return-1!==[].indexOf.call(t.querySelectorAll(e),this)};return s.call(e,n)}function b(e,t,n,r){e&&h(e,t,n,!0,r)}function v(e,t,n,r){e&&h(e,t,n,!1,r)}function g(e,t,n,r,s){b(e,t,function(t){n&&n.apply(e,[t]),r.apply(e,[t])},s)}function h(e,t,n,r,s){var o=t.split(" ");if(L["boolean"](s)||(s=!1),e instanceof NodeList)for(var a=0;a<e.length;a++)e[a]instanceof Node&&h(e[a],arguments[1],arguments[2],arguments[3]);else for(var i=0;i<o.length;i++)e[r?"addEventListener":"removeEventListener"](o[i],n,s)}function k(e,t,n,r){if(e&&t){L["boolean"](n)||(n=!1);var s=new CustomEvent(t,{bubbles:n,detail:r});e.dispatchEvent(s)}}function w(e,t){return e?(t=L["boolean"](t)?t:!e.getAttribute("aria-pressed"),e.setAttribute("aria-pressed",t),t):void 0}function x(e,t){return 0===e||0===t||isNaN(e)||isNaN(t)?0:(e/t*100).toFixed(2)}function T(){var e=arguments;if(e.length){if(1==e.lenth)return e[0];for(var t=Array.prototype.shift.call(e),n=e.length,r=0;n>r;r++){var s=e[r];for(var o in s)s[o]&&s[o].constructor&&s[o].constructor===Object?(t[o]=t[o]||{},T(t[o],s[o])):t[o]=s[o]}return t}}function _(){var e={supportsFullScreen:!1,isFullScreen:function(){return!1},requestFullScreen:function(){},cancelFullScreen:function(){},fullScreenEventName:"",element:null,prefix:""},n="webkit moz o ms khtml".split(" ");if(L.undefined(t.cancelFullScreen))for(var r=0,s=n.length;s>r;r++){if(e.prefix=n[r],!L.undefined(t[e.prefix+"CancelFullScreen"])){e.supportsFullScreen=!0;break}if(!L.undefined(t.msExitFullscreen)&&t.msFullscreenEnabled){e.prefix="ms",e.supportsFullScreen=!0;break}}else e.supportsFullScreen=!0;return e.supportsFullScreen&&(e.fullScreenEventName="ms"==e.prefix?"MSFullscreenChange":e.prefix+"fullscreenchange",e.isFullScreen=function(e){switch(L.undefined(e)&&(e=t.body),this.prefix){case"":return t.fullscreenElement==e;case"moz":return t.mozFullScreenElement==e;default:return t[this.prefix+"FullscreenElement"]==e}},e.requestFullScreen=function(e){return L.undefined(e)&&(e=t.body),""===this.prefix?e.requestFullScreen():e[this.prefix+("ms"==this.prefix?"RequestFullscreen":"RequestFullScreen")]()},e.cancelFullScreen=function(){return""===this.prefix?t.cancelFullScreen():t[this.prefix+("ms"==this.prefix?"ExitFullscreen":"CancelFullScreen")]()},e.element=function(){return""===this.prefix?t.fullscreenElement:t[this.prefix+"FullscreenElement"]}),e}function S(){var t={supported:function(){if(!("localStorage"in e))return!1;try{e.localStorage.setItem("___test","OK");var t=e.localStorage.getItem("___test");return e.localStorage.removeItem("___test"),"OK"===t}catch(n){return!1}return!1}()};return t}function E(y,h){function E(t,n){h.debug&&e.console&&(n=Array.prototype.slice.call(n),L.string(h.logPrefix)&&h.logPrefix.length&&n.unshift(h.logPrefix),console[t].apply(console,n))}function A(){return{url:h.iconUrl,absolute:0===h.iconUrl.indexOf("http")||Re.browser.isIE}}function I(){var e=[],t=A(),n=(t.absolute?"":t.url)+"#"+h.iconPrefix;return o(h.controls,"play-large")&&e.push('<button type="button" data-plyr="play" class="plyr__play-large">','<svg><use xlink:href="'+n+'-play" /></svg>','<span class="plyr__sr-only">'+h.i18n.play+"</span>","</button>"),e.push('<div class="plyr__controls">'),o(h.controls,"restart")&&e.push('<button type="button" data-plyr="restart">','<svg><use xlink:href="'+n+'-restart" /></svg>','<span class="plyr__sr-only">'+h.i18n.restart+"</span>","</button>"),o(h.controls,"rewind")&&e.push('<button type="button" data-plyr="rewind">','<svg><use xlink:href="'+n+'-rewind" /></svg>','<span class="plyr__sr-only">'+h.i18n.rewind+"</span>","</button>"),o(h.controls,"play")&&e.push('<button type="button" data-plyr="play">','<svg><use xlink:href="'+n+'-play" /></svg>','<span class="plyr__sr-only">'+h.i18n.play+"</span>","</button>",'<button type="button" data-plyr="pause">','<svg><use xlink:href="'+n+'-pause" /></svg>','<span class="plyr__sr-only">'+h.i18n.pause+"</span>","</button>"),o(h.controls,"fast-forward")&&e.push('<button type="button" data-plyr="fast-forward">','<svg><use xlink:href="'+n+'-fast-forward" /></svg>','<span class="plyr__sr-only">'+h.i18n.forward+"</span>","</button>"),o(h.controls,"progress")&&(e.push('<span class="plyr__progress">','<label for="seek{id}" class="plyr__sr-only">Seek</label>','<input id="seek{id}" class="plyr__progress--seek" type="range" min="0" max="100" step="0.1" value="0" data-plyr="seek">','<progress class="plyr__progress--played" max="100" value="0" role="presentation"></progress>','<progress class="plyr__progress--buffer" max="100" value="0">',"<span>0</span>% "+h.i18n.buffered,"</progress>"),h.tooltips.seek&&e.push('<span class="plyr__tooltip">00:00</span>'),e.push("</span>")),o(h.controls,"current-time")&&e.push('<span class="plyr__time">','<span class="plyr__sr-only">'+h.i18n.currentTime+"</span>",'<span class="plyr__time--current">00:00</span>',"</span>"),o(h.controls,"duration")&&e.push('<span class="plyr__time">','<span class="plyr__sr-only">'+h.i18n.duration+"</span>",'<span class="plyr__time--duration">00:00</span>',"</span>"),o(h.controls,"mute")&&e.push('<button type="button" data-plyr="mute">','<svg class="icon--muted"><use xlink:href="'+n+'-muted" /></svg>','<svg><use xlink:href="'+n+'-volume" /></svg>','<span class="plyr__sr-only">'+h.i18n.toggleMute+"</span>","</button>"),o(h.controls,"volume")&&e.push('<span class="plyr__volume">','<label for="volume{id}" class="plyr__sr-only">'+h.i18n.volume+"</label>",'<input id="volume{id}" class="plyr__volume--input" type="range" min="'+h.volumeMin+'" max="'+h.volumeMax+'" value="'+h.volume+'" data-plyr="volume">','<progress class="plyr__volume--display" max="'+h.volumeMax+'" value="'+h.volumeMin+'" role="presentation"></progress>',"</span>"),o(h.controls,"captions")&&e.push('<button type="button" data-plyr="captions">','<svg class="icon--captions-on"><use xlink:href="'+n+'-captions-on" /></svg>','<svg><use xlink:href="'+n+'-captions-off" /></svg>','<span class="plyr__sr-only">'+h.i18n.toggleCaptions+"</span>","</button>"),o(h.controls,"fullscreen")&&e.push('<button type="button" data-plyr="fullscreen">','<svg class="icon--exit-fullscreen"><use xlink:href="'+n+'-exit-fullscreen" /></svg>','<svg><use xlink:href="'+n+'-enter-fullscreen" /></svg>','<span class="plyr__sr-only">'+h.i18n.toggleFullscreen+"</span>","</button>"),e.push("</div>"),e.join("")}function M(){if(Re.supported.full&&("audio"!=Re.type||h.fullscreen.allowAudio)&&h.fullscreen.enabled){var e=N.supportsFullScreen;e||h.fullscreen.fallback&&!H()?(We((e?"Native":"Fallback")+" fullscreen enabled"),m(Re.container,h.classes.fullscreen.enabled,!0)):We("Fullscreen not supported and fallback disabled"),Re.buttons&&Re.buttons.fullscreen&&w(Re.buttons.fullscreen,!1),W()}}function O(){if("video"===Re.type){D(h.selectors.captions)||Re.videoContainer.insertAdjacentHTML("afterbegin",'<div class="'+d(h.selectors.captions)+'"></div>'),Re.usingTextTracks=!1,Re.media.textTracks&&(Re.usingTextTracks=!0);for(var e,t="",n=Re.media.childNodes,r=0;r<n.length;r++)"track"===n[r].nodeName.toLowerCase()&&(e=n[r].kind,"captions"!==e&&"subtitles"!==e||(t=n[r].getAttribute("src")));if(Re.captionExists=!0,""===t?(Re.captionExists=!1,We("No caption track found")):We("Caption track found; URI: "+t),Re.captionExists){for(var s=Re.media.textTracks,o=0;o<s.length;o++)s[o].mode="hidden";if(q(Re),(Re.browser.isIE&&Re.browser.version>=10||Re.browser.isFirefox&&Re.browser.version>=31)&&(We("Detected browser with known TextTrack issues - using manual fallback"),Re.usingTextTracks=!1),Re.usingTextTracks){We("TextTracks supported");for(var a=0;a<s.length;a++){var i=s[a];"captions"!==i.kind&&"subtitles"!==i.kind||b(i,"cuechange",function(){this.activeCues[0]&&"text"in this.activeCues[0]?j(this.activeCues[0].getCueAsHTML()):j()})}}else if(We("TextTracks not supported so rendering captions manually"),Re.currentCaption="",Re.captions=[],""!==t){var l=new XMLHttpRequest;l.onreadystatechange=function(){if(4===l.readyState)if(200===l.status){var e,t=[],n=l.responseText;t=n.split("\n\n");for(var r=0;r<t.length;r++){e=t[r],Re.captions[r]=[];var s=e.split("\n"),o=0;-1===s[o].indexOf(":")&&(o=1),Re.captions[r]=[s[o],s[o+1]]}Re.captions.shift(),We("Successfully loaded the caption file via AJAX")}else Ye(h.logPrefix+"There was a problem loading the caption file via AJAX")},l.open("get",t,!0),l.send()}}else m(Re.container,h.classes.captions.enabled)}}function j(e){var n=D(h.selectors.captions),r=t.createElement("span");n.innerHTML="",L.undefined(e)&&(e=""),L.string(e)?r.innerHTML=e.trim():r.appendChild(e),n.appendChild(r);n.offsetHeight}function V(e){function t(e,t){var n=[];n=e.split(" --> ");for(var r=0;r<n.length;r++)n[r]=n[r].replace(/(\d+:\d+:\d+\.\d+).*/,"$1");return s(n[t])}function n(e){return t(e,0)}function r(e){return t(e,1)}function s(e){if(null===e||void 0===e)return 0;var t,n=[],r=[];return n=e.split(","),r=n[0].split(":"),t=Math.floor(60*r[0]*60)+Math.floor(60*r[1])+Math.floor(r[2])}if(!Re.usingTextTracks&&"video"===Re.type&&Re.supported.full&&(Re.subcount=0,e=L.number(e)?e:Re.media.currentTime,Re.captions[Re.subcount])){for(;r(Re.captions[Re.subcount][0])<e.toFixed(1);)if(Re.subcount++,Re.subcount>Re.captions.length-1){Re.subcount=Re.captions.length-1;break}Re.media.currentTime.toFixed(1)>=n(Re.captions[Re.subcount][0])&&Re.media.currentTime.toFixed(1)<=r(Re.captions[Re.subcount][0])?(Re.currentCaption=Re.captions[Re.subcount][1],j(Re.currentCaption)):j()}}function q(){if(Re.buttons.captions){m(Re.container,h.classes.captions.enabled,!0);var e=Re.storage.captionsEnabled;L["boolean"](e)||(e=h.captions.defaultActive),e&&(m(Re.container,h.classes.captions.active,!0),w(Re.buttons.captions,!0))}}function R(e){return Re.container.querySelectorAll(e)}function D(e){return R(e)[0]}function H(){try{return e.self!==e.top}catch(t){return!0}}function W(){function e(e){9===e.which&&Re.isFullscreen&&(e.target!==r||e.shiftKey?e.target===n&&e.shiftKey&&(e.preventDefault(),r.focus()):(e.preventDefault(),n.focus()))}var t=R("input:not([disabled]), button:not([disabled])"),n=t[0],r=t[t.length-1];b(Re.container,"keydown",e)}function Y(e,t){if(L.string(t))p(e,Re.media,{src:t});else if(t.constructor===Array)for(var n=t.length-1;n>=0;n--)p(e,Re.media,t[n])}function B(){if(h.loadSprite){var e=A();e.absolute?(We("AJAX loading absolute SVG sprite"+(Re.browser.isIE?" (due to IE)":"")),C(e.url,"sprite-plyr")):We("Sprite will be used as external resource directly")}var n=h.html;We("Injecting custom controls"),n||(n=I()),n=a(n,"{seektime}",h.seekTime),n=a(n,"{id}",Math.floor(1e4*Math.random()));var r;if(L.string(h.selectors.controls.container)&&(r=t.querySelector(h.selectors.controls.container)),L.htmlElement(r)||(r=Re.container),r.insertAdjacentHTML("beforeend",n),h.tooltips.controls)for(var s=R([h.selectors.controls.wrapper," ",h.selectors.labels," .",h.classes.hidden].join("")),o=s.length-1;o>=0;o--){var i=s[o];m(i,h.classes.hidden,!1),m(i,h.classes.tooltip,!0)}}function X(){try{return Re.controls=D(h.selectors.controls.wrapper),Re.buttons={},Re.buttons.seek=D(h.selectors.buttons.seek),Re.buttons.play=R(h.selectors.buttons.play),Re.buttons.pause=D(h.selectors.buttons.pause),Re.buttons.restart=D(h.selectors.buttons.restart),Re.buttons.rewind=D(h.selectors.buttons.rewind),Re.buttons.forward=D(h.selectors.buttons.forward),Re.buttons.fullscreen=D(h.selectors.buttons.fullscreen),Re.buttons.mute=D(h.selectors.buttons.mute),Re.buttons.captions=D(h.selectors.buttons.captions),Re.progress={},Re.progress.container=D(h.selectors.progress.container),Re.progress.buffer={},Re.progress.buffer.bar=D(h.selectors.progress.buffer),Re.progress.buffer.text=Re.progress.buffer.bar&&Re.progress.buffer.bar.getElementsByTagName("span")[0],Re.progress.played=D(h.selectors.progress.played),Re.progress.tooltip=Re.progress.container&&Re.progress.container.querySelector("."+h.classes.tooltip),Re.volume={},Re.volume.input=D(h.selectors.volume.input),Re.volume.display=D(h.selectors.volume.display),Re.duration=D(h.selectors.duration),Re.currentTime=D(h.selectors.currentTime),Re.seekTime=R(h.selectors.seekTime),!0}catch(e){return Ye("It looks like there is a problem with your controls HTML"),J(!0),!1}}function U(){m(Re.container,h.selectors.container.replace(".",""),Re.supported.full)}function J(e){e&&o(h.types.html5,Re.type)?Re.media.setAttribute("controls",""):Re.media.removeAttribute("controls")}function z(e){var t=h.i18n.play;if(!L.undefined(h.title)&&h.title.length&&(t+=", "+h.title),Re.supported.full&&Re.buttons.play)for(var n=Re.buttons.play.length-1;n>=0;n--)Re.buttons.play[n].setAttribute("aria-label",t);L.htmlElement(e)&&e.setAttribute("title",h.i18n.frameTitle.replace("{title}",h.title))}function $(){var t=null;Re.storage={},S().supported&&h.storage.enabled&&(e.localStorage.removeItem("plyr-volume"),t=e.localStorage.getItem(h.storage.key),t&&(/^\d+(\.\d+)?$/.test(t)?G({volume:parseFloat(t)}):Re.storage=JSON.parse(t)))}function G(t){S().supported&&h.storage.enabled&&(T(Re.storage,t),e.localStorage.setItem(h.storage.key,JSON.stringify(Re.storage)))}function K(){if(!Re.media)return void Ye("No media element found!");if(Re.supported.full&&(m(Re.container,h.classes.type.replace("{0}",Re.type),!0),o(h.types.embed,Re.type)&&m(Re.container,h.classes.type.replace("{0}","video"),!0),m(Re.container,h.classes.stopped,h.autoplay),m(Re.ontainer,h.classes.isIos,Re.browser.isIos),m(Re.container,h.classes.isTouch,Re.browser.isTouch),"video"===Re.type)){var e=t.createElement("div");e.setAttribute("class",h.classes.videoWrapper),i(Re.media,e),Re.videoContainer=e}o(h.types.embed,Re.type)&&Q()}function Q(){for(var n=t.createElement("div"),r=Re.embedId,o=Re.type+"-"+Math.floor(1e4*Math.random()),a=R('[id^="'+Re.type+'-"]'),i=a.length-1;i>=0;i--)l(a[i]);if(m(Re.media,h.classes.videoWrapper,!0),m(Re.media,h.classes.embedWrapper,!0),"youtube"===Re.type)Re.media.appendChild(n),n.setAttribute("id",o),L.object(e.YT)?ee(r,n):(s(h.urls.youtube.api),e.onYouTubeReadyCallbacks=e.onYouTubeReadyCallbacks||[],e.onYouTubeReadyCallbacks.push(function(){ee(r,n)}),e.onYouTubeIframeAPIReady=function(){e.onYouTubeReadyCallbacks.forEach(function(e){e()})});else if("vimeo"===Re.type)if(Re.supported.full?Re.media.appendChild(n):n=Re.media,n.setAttribute("id",o),L.object(e.Vimeo))te(r,n);else{s(h.urls.vimeo.api);var u=e.setInterval(function(){L.object(e.Vimeo)&&(e.clearInterval(u),te(r,n))},50)}else if("soundcloud"===Re.type){var p=t.createElement("iframe");p.loaded=!1,b(p,"load",function(){p.loaded=!0}),c(p,{src:"https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/"+r,id:o}),n.appendChild(p),Re.media.appendChild(n),e.SC||s(h.urls.soundcloud.api);var d=e.setInterval(function(){e.SC&&p.loaded&&(e.clearInterval(d),ne.call(p))},50)}}function Z(){Re.supported.full&&qe(),z(D("iframe"))}function ee(t,n){Re.embed=new e.YT.Player(n.id,{videoId:t,playerVars:{autoplay:h.autoplay?1:0,controls:Re.supported.full?0:1,rel:0,showinfo:0,iv_load_policy:3,cc_load_policy:h.captions.defaultActive?1:0,cc_lang_pref:"en",wmode:"transparent",modestbranding:1,disablekb:1,origin:"*"},events:{onError:function(e){k(n,"error",!0,{code:e.data,embed:e.target})},onReady:function(t){var n=t.target;Re.media.play=function(){n.playVideo(),Re.media.paused=!1},Re.media.pause=function(){n.pauseVideo(),Re.media.paused=!0},Re.media.stop=function(){n.stopVideo(),Re.media.paused=!0},Re.media.duration=n.getDuration(),Re.media.paused=!0,Re.media.currentTime=n.getCurrentTime(),Re.media.muted=n.isMuted(),h.title=n.getVideoData().title,Z(),k(Re.media,"timeupdate"),e.clearInterval(De.buffering),De.buffering=e.setInterval(function(){Re.media.buffered=n.getVideoLoadedFraction(),(null===Re.media.lastBuffered||Re.media.lastBuffered<Re.media.buffered)&&k(Re.media,"progress"),Re.media.lastBuffered=Re.media.buffered,1===Re.media.buffered&&(e.clearInterval(De.buffering),k(Re.media,"canplaythrough"))},200),Se()},onStateChange:function(t){var r=t.target;switch(e.clearInterval(De.playing),t.data){case 0:Re.media.paused=!0,k(Re.media,"ended");break;case 1:Re.media.paused=!1,Re.media.seeking=!1,k(Re.media,"play"),k(Re.media,"playing"),De.playing=e.setInterval(function(){Re.media.currentTime=r.getCurrentTime(),k(Re.media,"timeupdate")},100);break;case 2:Re.media.paused=!0,k(Re.media,"pause")}k(n,"statechange",!1,{code:t.data})}}})}function te(t,n){Re.embed=new e.Vimeo.Player(n.id,{id:t,loop:h.loop,autoplay:h.autoplay,byline:!1,portrait:!1,title:!1}),Re.media.play=function(){Re.embed.play(),Re.media.paused=!1},Re.media.pause=function(){Re.embed.pause(),Re.media.paused=!0},Re.media.stop=function(){Re.embed.stop(),Re.media.paused=!0},Re.media.paused=!0,Re.media.currentTime=0,Z(),Re.embed.getCurrentTime().then(function(e){Re.media.currentTime=e,k(Re.media,"timeupdate")}),Re.embed.getDuration().then(function(e){Re.media.duration=e,Se()}),Re.embed.on("loaded",function(){L.htmlElement(Re.embed.element)&&Re.supported.full&&Re.embed.element.setAttribute("tabindex","-1")}),Re.embed.on("play",function(){Re.media.paused=!1,k(Re.media,"play"),k(Re.media,"playing")}),Re.embed.on("pause",function(){Re.media.paused=!0,k(Re.media,"pause")}),Re.embed.on("timeupdate",function(e){Re.media.seeking=!1,Re.media.currentTime=e.seconds,k(Re.media,"timeupdate")}),Re.embed.on("progress",function(e){Re.media.buffered=e.percent,k(Re.media,"progress"),1===parseInt(e.percent)&&k(Re.media,"canplaythrough")}),Re.embed.on("ended",function(){Re.media.paused=!0,k(Re.media,"ended")})}function ne(){Re.embed=e.SC.Widget(this),Re.embed.bind(e.SC.Widget.Events.READY,function(){Re.media.play=function(){Re.embed.play(),Re.media.paused=!1},Re.media.pause=function(){Re.embed.pause(),Re.media.paused=!0},Re.media.stop=function(){Re.embed.seekTo(0),Re.embed.pause(),Re.media.paused=!0},Re.media.paused=!0,Re.media.currentTime=0,Z(),Re.embed.getPosition(function(e){Re.media.currentTime=e,k(Re.media,"timeupdate")}),Re.embed.getDuration(function(e){Re.media.duration=e/1e3,Se()}),Re.embed.bind(e.SC.Widget.Events.PLAY,function(){Re.media.paused=!1,k(Re.media,"play"),k(Re.media,"playing")}),Re.embed.bind(e.SC.Widget.Events.PAUSE,function(){Re.media.paused=!0,k(Re.media,"pause")}),Re.embed.bind(e.SC.Widget.Events.PLAY_PROGRESS,function(e){Re.media.seeking=!1,Re.media.currentTime=e.currentPosition/1e3,k(Re.media,"timeupdate")}),Re.embed.bind(e.SC.Widget.Events.LOAD_PROGRESS,function(e){Re.media.buffered=e.loadProgress,k(Re.media,"progress"),1===parseInt(e.loadProgress)&&k(Re.media,"canplaythrough")}),Re.embed.bind(e.SC.Widget.Events.FINISH,function(){Re.media.paused=!0,k(Re.media,"ended")}),h.autoplay&&Re.embed.play()})}function re(){"play"in Re.media&&Re.media.play()}function se(){"pause"in Re.media&&Re.media.pause()}function oe(e){e===!0?re():e===!1?se():Re.media[Re.media.paused?"play":"pause"]()}function ae(e){L.number(e)||(e=h.seekTime),le(Re.media.currentTime-e)}function ie(e){L.number(e)||(e=h.seekTime),le(Re.media.currentTime+e)}function le(e){var t=0,n=Re.media.paused,r=ue();L.number(e)?t=e:L.object(e)&&o(["input","change"],e.type)&&(t=e.target.value/e.target.max*r),0>t?t=0:t>r&&(t=r),Ce(t);try{Re.media.currentTime=t.toFixed(4)}catch(s){}if(o(h.types.embed,Re.type)){switch(Re.type){case"youtube":Re.embed.seekTo(t);break;case"vimeo":Re.embed.setCurrentTime(t.toFixed(0));break;case"soundcloud":Re.embed.seekTo(1e3*t)}n&&se(),k(Re.media,"timeupdate"),Re.media.seeking=!0}We("Seeking to "+Re.media.currentTime+" seconds"),V(t)}function ue(){var e=parseInt(h.duration),t=0;return null===Re.media.duration||isNaN(Re.media.duration)||(t=Re.media.duration),isNaN(e)?t:e}function ce(){m(Re.container,h.classes.playing,!Re.media.paused),m(Re.container,h.classes.stopped,Re.media.paused),Ae(Re.media.paused)}function pe(){P={x:e.pageXOffset||0,y:e.pageYOffset||0}}function de(){e.scrollTo(P.x,P.y)}function me(e){var n=N.supportsFullScreen;e&&e.type===N.fullScreenEventName?Re.isFullscreen=N.isFullScreen(Re.container):n?(N.isFullScreen(Re.container)?N.cancelFullScreen():(pe(),N.requestFullScreen(Re.container)),Re.isFullscreen=N.isFullScreen(Re.container)):(Re.isFullscreen=!Re.isFullscreen,Re.isFullscreen?(b(t,"keyup",fe),t.body.style.overflow="hidden"):(v(t,"keyup",fe),t.body.style.overflow="")),m(Re.container,h.classes.fullscreen.active,Re.isFullscreen),Re.isFullscreen?Re.container.setAttribute("tabindex","-1"):Re.container.removeAttribute("tabindex"),W(Re.isFullscreen),Re.buttons&&Re.buttons.fullscreen&&w(Re.buttons.fullscreen,Re.isFullscreen),k(Re.container,Re.isFullscreen?"enterfullscreen":"exitfullscreen",!0),!Re.isFullscreen&&n&&de()}function fe(e){27===(e.which||e.charCode||e.keyCode)&&Re.isFullscreen&&me()}function ye(e){if(L["boolean"](e)||(e=!Re.media.muted),w(Re.buttons.mute,e),Re.media.muted=e,0===Re.media.volume&&be(h.volume),o(h.types.embed,Re.type)){switch(Re.type){case"youtube":Re.embed[Re.media.muted?"mute":"unMute"]();break;case"vimeo":case"soundcloud":Re.embed.setVolume(Re.media.muted?0:parseFloat(h.volume/h.volumeMax))}k(Re.media,"volumechange")}}function be(e){var t=h.volumeMax,n=h.volumeMin;if(L.undefined(e)&&(e=Re.storage.volume),(null===e||isNaN(e))&&(e=h.volume),e>t&&(e=t),n>e&&(e=n),Re.media.volume=parseFloat(e/t),Re.volume.display&&(Re.volume.display.value=e),o(h.types.embed,Re.type)){switch(Re.type){case"youtube":Re.embed.setVolume(100*Re.media.volume);break;case"vimeo":case"soundcloud":Re.embed.setVolume(Re.media.volume)}k(Re.media,"volumechange")}Re.media.muted&&e>0&&ye()}function ve(){var e=Re.media.muted?0:Re.media.volume*h.volumeMax;be(e+h.volumeStep/5)}function ge(){var e=Re.media.muted?0:Re.media.volume*h.volumeMax;be(e-h.volumeStep/5)}function he(){var e=Re.media.muted?0:Re.media.volume*h.volumeMax;Re.supported.full&&(Re.volume.input&&(Re.volume.input.value=e),Re.volume.display&&(Re.volume.display.value=e)),G({volume:e}),m(Re.container,h.classes.muted,0===e),Re.supported.full&&Re.buttons.mute&&w(Re.buttons.mute,0===e)}function ke(e){Re.supported.full&&Re.buttons.captions&&(L["boolean"](e)||(e=-1===Re.container.className.indexOf(h.classes.captions.active)),Re.captionsEnabled=e,w(Re.buttons.captions,Re.captionsEnabled),m(Re.container,h.classes.captions.active,Re.captionsEnabled),k(Re.container,Re.captionsEnabled?"captionsenabled":"captionsdisabled",!0),G({captionsEnabled:Re.captionsEnabled}))}function we(e){var t="waiting"===e.type;clearTimeout(De.loading),De.loading=setTimeout(function(){m(Re.container,h.classes.loading,t)},t?250:0)}function xe(e){if(Re.supported.full){var t=Re.progress.played,n=0,r=ue();if(e)switch(e.type){case"timeupdate":case"seeking":if(Re.controls.pressed)return;n=x(Re.media.currentTime,r),"timeupdate"==e.type&&Re.buttons.seek&&(Re.buttons.seek.value=n);break;case"playing":case"progress":t=Re.progress.buffer,n=function(){var e=Re.media.buffered;return e&&e.length?x(e.end(0),r):L.number(e)?100*e:0}()}Te(t,n)}}function Te(e,t){if(Re.supported.full){if(L.undefined(t)&&(t=0),L.undefined(e)){if(!Re.progress||!Re.progress.buffer)return;e=Re.progress.buffer}L.htmlElement(e)?e.value=t:e&&(e.bar&&(e.bar.value=t),e.text&&(e.text.innerHTML=t))}}function _e(e,t){if(t){isNaN(e)&&(e=0),Re.secs=parseInt(e%60),Re.mins=parseInt(e/60%60),Re.hours=parseInt(e/60/60%60);var n=parseInt(ue()/60/60%60)>0;Re.secs=("0"+Re.secs).slice(-2),Re.mins=("0"+Re.mins).slice(-2),t.innerHTML=(n?Re.hours+":":"")+Re.mins+":"+Re.secs}}function Se(){if(Re.supported.full){var e=ue()||0;!Re.duration&&h.displayDuration&&Re.media.paused&&_e(e,Re.currentTime),Re.duration&&_e(e,Re.duration),Fe()}}function Ee(e){_e(Re.media.currentTime,Re.currentTime),e&&"timeupdate"==e.type&&Re.media.seeking||xe(e)}function Ce(e){L.number(e)||(e=0);var t=ue(),n=x(e,t);Re.progress&&Re.progress.played&&(Re.progress.played.value=n),Re.buttons&&Re.buttons.seek&&(Re.buttons.seek.value=n)}function Fe(e){var t=ue();if(h.tooltips.seek&&Re.progress.container&&0!==t){var n=Re.progress.container.getBoundingClientRect(),r=0,s=h.classes.tooltip+"--visible";if(e)r=100/n.width*(e.pageX-n.left);else{if(!f(Re.progress.tooltip,s))return;r=Re.progress.tooltip.style.left.replace("%","")}0>r?r=0:r>100&&(r=100),_e(t/100*r,Re.progress.tooltip),Re.progress.tooltip.style.left=r+"%",e&&o(["mouseenter","mouseleave"],e.type)&&m(Re.progress.tooltip,s,"mouseenter"===e.type)}}function Ae(t){if(h.hideControls&&"audio"!==Re.type&&f(Re.container,h.classes.ready)){var n=0,r=!1,s=t;if(L["boolean"](t)||(t&&t.type?(r="enterfullscreen"===t.type,s=o(["mousemove","touchstart","mouseenter","focus"],t.type),o(["mousemove","touchmove"],t.type)&&(n=2e3),"focus"===t.type&&(n=3e3)):s=f(Re.container,h.classes.hideControls)),e.clearTimeout(De.hover),s||Re.media.paused){if(m(Re.container,h.classes.hideControls,!1),Re.media.paused)return;Re.browser.isTouch&&(n=3e3)}s&&Re.media.paused||(De.hover=e.setTimeout(function(){(!Re.controls.pressed&&!Re.controls.hover||r)&&m(Re.container,h.classes.hideControls,!0)},n))}}function Ie(e){if(!L.undefined(e))return void Ne(e);var t;switch(Re.type){case"youtube":t=Re.embed.getVideoUrl();break;case"vimeo":Re.embed.getVideoUrl.then(function(e){t=e});break;case"soundcloud":Re.embed.getCurrentSound(function(e){t=e.permalink_url});break;default:t=Re.media.currentSrc}return t||""}function Ne(e){function n(){if(Re.embed=null,"video"===Re.type&&Re.videoContainer&&l(Re.videoContainer),l(Re.media),Re.container&&Re.container.removeAttribute("class"),"type"in e&&(Re.type=e.type,"video"===Re.type)){var n=e.sources[0];"type"in n&&o(h.types.embed,n.type)&&(Re.type=n.type)}switch(Re.supported=F(Re.type),Re.type){case"video":Re.media=t.createElement("video");break;case"audio":Re.media=t.createElement("audio");break;case"youtube":case"vimeo":case"soundcloud":Re.media=t.createElement("div"),Re.embedId=e.sources[0].src}u(Re.container,Re.media),L["boolean"](e.autoplay)&&(h.autoplay=e.autoplay),o(h.types.html5,Re.type)&&(h.crossorigin&&Re.media.setAttribute("crossorigin",""),h.autoplay&&Re.media.setAttribute("autoplay",""),"poster"in e&&Re.media.setAttribute("poster",e.poster),h.loop&&Re.media.setAttribute("loop","")),m(Re.container,h.classes.fullscreen.active,Re.isFullscreen),m(Re.container,h.classes.captions.active,Re.captionsEnabled),U(),o(h.types.html5,Re.type)&&Y("source",e.sources),K(),o(h.types.html5,Re.type)?("tracks"in e&&Y("track",e.tracks),Re.media.load(),qe(),Se()):o(h.types.embed,Re.type)&&!Re.supported.full&&qe(),h.title=e.title,z()}return L.object(e)&&"sources"in e&&e.sources.length?(se(),Ce(),Te(),Oe(),void je(n,!1)):void Ye("Invalid source format")}function Pe(e){"video"===Re.type&&Re.media.setAttribute("poster",e)}function Me(){function n(){var e=Re.media.paused;e?re():se();var t=Re.buttons[e?"play":"pause"],n=Re.buttons[e?"pause":"play"];if(n=n&&n.length>1?n[n.length-1]:n[0]){var r=f(t,h.classes.tabFocus);setTimeout(function(){n.focus(),r&&(m(t,h.classes.tabFocus,!1),m(n,h.classes.tabFocus,!0))},100)}}function r(){var e=t.activeElement;e&&e!=t.body?t.querySelector&&(e=t.querySelector(":focus")):e=null;for(var n in Re.buttons){var r=Re.buttons[n];if(L.nodeList(r))for(var s=0;s<r.length;s++)m(r[s],h.classes.tabFocus,r[s]===e);else m(r,h.classes.tabFocus,r===e)}}var s=Re.browser.isIE?"change":"input";b(e,"keyup",function(e){var t=e.keyCode?e.keyCode:e.which;9==t&&r()}),b(t.body,"click",function(){m(D("."+h.classes.tabFocus),h.classes.tabFocus,!1)});for(var a in Re.buttons){var i=Re.buttons[a];b(i,"blur",function(){m(i,"tab-focus",!1)})}g(Re.buttons.play,"click",h.listeners.play,n),g(Re.buttons.pause,"click",h.listeners.pause,n),g(Re.buttons.restart,"click",h.listeners.restart,le),g(Re.buttons.rewind,"click",h.listeners.rewind,ae),g(Re.buttons.forward,"click",h.listeners.forward,ie),g(Re.buttons.seek,s,h.listeners.seek,le),g(Re.volume.input,s,h.listeners.volume,function(){be(Re.volume.input.value)}),g(Re.buttons.mute,"click",h.listeners.mute,ye),g(Re.buttons.fullscreen,"click",h.listeners.fullscreen,me),N.supportsFullScreen&&b(t,N.fullScreenEventName,me),b(Re.buttons.captions,"click",ke),b(Re.progress.container,"mouseenter mouseleave mousemove",Fe),h.hideControls&&(b(Re.container,"mouseenter mouseleave mousemove touchstart touchend touchcancel touchmove enterfullscreen",Ae),b(Re.controls,"mouseenter mouseleave",function(e){Re.controls.hover="mouseenter"===e.type}),b(Re.controls,"mousedown mouseup touchstart touchend touchcancel",function(e){Re.controls.pressed=o(["mousedown","touchstart"],e.type)}),b(Re.controls,"focus blur",Ae,!0)),b(Re.volume.input,"wheel",function(e){e.preventDefault();var t=e.webkitDirectionInvertedFromDevice;(e.deltaY<0||e.deltaX>0)&&(t?ge():ve()),(e.deltaY>0||e.deltaX<0)&&(t?ve():ge())})}function Le(){if(b(Re.media,"timeupdate seeking",Ee),b(Re.media,"timeupdate",V),b(Re.media,"durationchange loadedmetadata",Se),b(Re.media,"ended",function(){"video"===Re.type&&j(), +ce(),le(0),Se(),"video"===Re.type&&h.showPosterOnEnd&&Re.media.load()}),b(Re.media,"progress playing",xe),b(Re.media,"volumechange",he),b(Re.media,"play pause",ce),b(Re.media,"waiting canplay seeked",we),h.clickToPlay&&"audio"!==Re.type){var e=D("."+h.classes.videoWrapper);if(!e)return;e.style.cursor="pointer",b(e,"click",function(){h.hideControls&&Re.browser.isTouch&&!Re.media.paused||(Re.media.paused?re():Re.media.ended?(le(),re()):se())})}h.disableContextMenu&&b(Re.media,"contextmenu",function(e){e.preventDefault()}),b(Re.media,h.events.join(" "),function(e){k(Re.container,e.type,!0)})}function Oe(){if(o(h.types.html5,Re.type)){for(var e=Re.media.querySelectorAll("source"),t=0;t<e.length;t++)l(e[t]);Re.media.setAttribute("src","https://cdn.selz.com/plyr/blank.mp4"),Re.media.load(),We("Cancelled network requests for old media")}}function je(t,n){function r(){L["boolean"](n)||(n=!0),L["function"](t)&&t.call(He),n&&(Re.init=!1,Re.container.parentNode.replaceChild(He,Re.container),k(He,"destroyed",!0))}if(!Re.init)return null;switch(Re.type){case"youtube":e.clearInterval(De.buffering),e.clearInterval(De.playing),Re.embed.destroy(),r();break;case"vimeo":Re.embed.unload().then(r),e.setTimeout(r,200);break;case"video":case"audio":J(!0),r()}}function Ve(){if(Re.init)return null;if(N=_(),Re.browser=n(),L.htmlElement(Re.media)){$();var e=y.tagName.toLowerCase();"div"===e?(Re.type=y.getAttribute("data-type"),Re.embedId=y.getAttribute("data-video-id"),y.removeAttribute("data-type"),y.removeAttribute("data-video-id")):(Re.type=e,h.crossorigin=null!==y.getAttribute("crossorigin"),h.autoplay=h.autoplay||null!==y.getAttribute("autoplay"),h.loop=h.loop||null!==y.getAttribute("loop")),Re.supported=F(Re.type),Re.supported.basic&&(Re.container=i(y,t.createElement("div")),U(),We(""+Re.browser.name+" "+Re.browser.version),K(),o(h.types.html5,Re.type)?(qe(),z(),h.autoplay&&re()):o(h.types.embed,Re.type)&&!Re.supported.full&&qe(),Re.init=!0)}}function qe(){if(!Re.supported.full)return Ye("Basic support only",Re.type),l(D(h.selectors.controls.wrapper)),l(D(h.selectors.buttons.play)),void J(!0);var e=!R(h.selectors.controls.wrapper).length;e&&B(),X()&&(e&&Me(),Le(),J(),M(),O(),be(),he(),Ee(),ce(),Se(),k(Re.container,"ready",!0),m(Re.container,h.classes.ready,!0))}var Re=this,De={};Re.media=y;var He=y.cloneNode(!0),We=function(){E("log",arguments)},Ye=function(){E("warn",arguments)};return We("Config",h),Ve(),Re.init?{getContainer:function(){return Re.container},getEmbed:function(){return Re.embed},getMedia:function(){return Re.media},getType:function(){return Re.type},isReady:function(){return f(Re.container,h.classes.ready)},on:function(e,t){b(Re.container,e,t)},play:re,pause:se,stop:function(){se(),le()},restart:le,rewind:ae,forward:ie,seek:le,source:Ie,poster:Pe,setVolume:be,togglePlay:oe,toggleMute:ye,toggleCaptions:ke,toggleFullscreen:me,toggleControls:Ae,isFullscreen:function(){return Re.isFullscreen||!1},support:function(e){return r(Re,e)},destroy:je,getCurrentTime:function(){return y.currentTime}}:{}}function C(e,n){var r=new XMLHttpRequest;if(!L.string(n)||!L.htmlElement(t.querySelector("#"+n))){var s=t.createElement("div");s.setAttribute("hidden",""),L.string(n)&&s.setAttribute("id",n),t.body.insertBefore(s,t.body.childNodes[0]),"withCredentials"in r&&(r.open("GET",e,!0),r.onload=function(){s.innerHTML=r.responseText},r.send())}}function F(e){var r,s,o=n(),a=o.isIE&&o.version<=9,i=o.isIos,l=/iPhone|iPod/i.test(navigator.userAgent),u=!!t.createElement("audio").canPlayType,c=!!t.createElement("video").canPlayType;switch(e){case"video":r=c,s=r&&!a&&!l;break;case"audio":r=u,s=r&&!a;break;case"vimeo":case"youtube":case"soundcloud":r=!0,s=!a&&!i;break;default:r=u&&c,s=r&&!a}return{basic:r,full:s}}function A(e,n){function r(e,t){f(t,M.classes.hook)||s.push({target:e,media:t})}var s=[],o=[],a=[M.selectors.html5,M.selectors.embed].join(",");if(L.string(e)?e=t.querySelectorAll(e):L.htmlElement(e)?e=[e]:L.nodeList(e)||L.array(e)||L.string(e)||(L.undefined(n)&&L.object(e)&&(n=e),e=t.querySelectorAll(a)),L.nodeList(e)&&(e=Array.prototype.slice.call(e)),!F().basic||!e.length)return!1;for(var i=0;i<e.length;i++){var l=e[i],u=l.querySelectorAll(a);if(u.length)for(var c=0;c<u.length;c++)r(l,u[c]);else y(l,a)&&r(l,l)}return s.forEach(function(e){var t=e.target,r=e.media,s=!1;r===t&&(s=!0);var a={};try{a=JSON.parse(t.getAttribute("data-plyr"))}catch(i){}var l=T({},M,n,a);if(!l.enabled)return null;var u=new E(r,l);if(L.object(u)){if(r.plyr=u,m(r,M.classes.setup,!0),l.debug){var c=l.events.concat(["setup","ready","statechange","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled"]);b(u.getContainer(),c.join(" "),function(){console.log([l.logPrefix,"event:",event.type].join(" "))})}k(u.getContainer(),"setup",!0,{plyr:u}),o.push(u)}}),o}function I(e){if(L.string(e)?e=t.querySelector(e):L.undefined(e)&&(e=t.body),L.htmlElement(e)){var n=e.querySelectorAll("."+M.classes.setup),r=[];return Array.prototype.slice.call(n).forEach(function(e){r.push(e.plyr)}),r}return[]}var N,P={x:0,y:0},M={enabled:!0,debug:!1,autoplay:!1,loop:!1,seekTime:10,volume:10,volumeMin:0,volumeMax:10,volumeStep:1,duration:null,displayDuration:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/1.8.12/plyr.svg",clickToPlay:!0,hideControls:!0,showPosterOnEnd:!1,disableContextMenu:!0,tooltips:{controls:!1,seek:!0},selectors:{html5:"video, audio",embed:"[data-type]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{seek:'[data-plyr="seek"]',play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',forward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',fullscreen:'[data-plyr="fullscreen"]'},volume:{input:'[data-plyr="volume"]',display:".plyr__volume--display"},progress:{container:".plyr__progress",buffer:".plyr__progress--buffer",played:".plyr__progress--played"},captions:".plyr__captions",currentTime:".plyr__time--current",duration:".plyr__time--duration"},classes:{setup:"plyr--setup",ready:"plyr--ready",videoWrapper:"plyr__video-wrapper",embedWrapper:"plyr__video-embed",type:"plyr--{0}",stopped:"plyr--stopped",playing:"plyr--playing",muted:"plyr--muted",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isIos:"plyr--is-ios",isTouch:"plyr--is-touch",captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",active:"plyr--fullscreen-active"},tabFocus:"tab-focus"},captions:{defaultActive:!1},fullscreen:{enabled:!0,fallback:!0,allowAudio:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","fullscreen"],i18n:{restart:"Restart",rewind:"Rewind {seektime} secs",play:"Play",pause:"Pause",forward:"Forward {seektime} secs",played:"played",buffered:"buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",toggleMute:"Toggle Mute",toggleCaptions:"Toggle Captions",toggleFullscreen:"Toggle Fullscreen",frameTitle:"Player for {title}"},types:{embed:["youtube","vimeo","soundcloud"],html5:["video","audio"]},urls:{vimeo:{api:"https://player.vimeo.com/api/player.js"},youtube:{api:"https://www.youtube.com/iframe_api"},soundcloud:{api:"https://w.soundcloud.com/player/api.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,forward:null,mute:null,volume:null,captions:null,fullscreen:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","emptied"],logPrefix:"[Plyr]"},L={object:function(e){return null!==e&&"object"==typeof e},array:function(e){return null!==e&&"object"==typeof e&&e.constructor===Array},number:function(e){return null!==e&&("number"==typeof e&&!isNaN(e-0)||"object"==typeof e&&e.constructor===Number)},string:function(e){return null!==e&&("string"==typeof e||"object"==typeof e&&e.constructor===String)},"boolean":function(e){return null!==e&&"boolean"==typeof e},nodeList:function(e){return null!==e&&e instanceof NodeList},htmlElement:function(e){return null!==e&&e instanceof HTMLElement},"function":function(e){return null!==e&&"function"==typeof e},undefined:function(e){return null!==e&&"undefined"==typeof e}};return{setup:A,supported:F,loadSprite:C,get:I}}),function(){function e(e,t){t=t||{bubbles:!1,cancelable:!1,detail:void 0};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,t.bubbles,t.cancelable,t.detail),n}"function"!=typeof window.CustomEvent&&(e.prototype=window.Event.prototype,window.CustomEvent=e)}();
\ No newline at end of file diff --git a/package.json b/package.json index f03a3663..4cca2c5c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "plyr", - "version": "1.8.12", + "version": "1.9.0", "description": "A simple, accessible and customizable HTML5, YouTube and Vimeo media player", "homepage": "http://plyr.io", "main": "src/js/plyr.js", @@ -542,11 +542,6 @@ Here's a list of the methods supported: <td>Destroys the plyr UI and any media event listeners, effectively restoring to the previous state before <code>setup()</code> was called.</td> </tr> <tr> - <td><code>restore()</code></td> - <td>—</td> - <td>Reverses the effects of the <code>destroy()</code> method, restoring the UI and listeners.</td> - </tr> - <tr> <td><code>getCurrentTime()</code></td> <td>—</td> <td>Will return a float with the current time in seconds.</td> diff --git a/src/js/plyr.js b/src/js/plyr.js index f01866bd..96b4870e 100644 --- a/src/js/plyr.js +++ b/src/js/plyr.js @@ -35,7 +35,7 @@ autoplay: false, loop: false, seekTime: 10, - volume: 5, + volume: 10, volumeMin: 0, volumeMax: 10, volumeStep: 1, @@ -86,6 +86,8 @@ duration: '.plyr__time--duration' }, classes: { + setup: 'plyr--setup', + ready: 'plyr--ready', videoWrapper: 'plyr__video-wrapper', embedWrapper: 'plyr__video-embed', type: 'plyr--{0}', @@ -168,7 +170,9 @@ fullscreen: null }, // Events to watch on HTML5 media elements - events: ['ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'emptied'] + events: ['ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'emptied'], + // Logging + logPrefix: '[Plyr]' }; // Credits: http://paypal.github.io/accessible-html5-video-player/ @@ -346,7 +350,7 @@ // Unwrap an element // http://plainjs.com/javascript/manipulation/unwrap-a-dom-element-35/ - function _unwrap(wrapper) { + /*function _unwrap(wrapper) { // Get the element's parent node var parent = wrapper.parentNode; @@ -357,7 +361,7 @@ // Remove the empty element parent.removeChild(wrapper); - } + }*/ // Remove an element function _remove(element) { @@ -575,25 +579,28 @@ return input !== null && typeof(input) === 'object'; }, array: function(input) { - return input !== null && typeof(input) === 'object' && input.constructor === Array; + return input !== null && (typeof(input) === 'object' && input.constructor === Array); }, number: function(input) { - return typeof(input) === 'number' && !isNaN(input - 0) || (typeof input == 'object' && input.constructor === Number); + return input !== null && (typeof(input) === 'number' && !isNaN(input - 0) || (typeof input == 'object' && input.constructor === Number)); }, string: function(input) { - return typeof input === 'string' || (typeof input == 'object' && input.constructor === String); + return input !== null && (typeof input === 'string' || (typeof input == 'object' && input.constructor === String)); }, boolean: function(input) { - return typeof input === 'boolean'; + return input !== null && typeof input === 'boolean'; }, nodeList: function(input) { - return input instanceof NodeList; + return input !== null && input instanceof NodeList; }, htmlElement: function(input) { - return input instanceof HTMLElement; + return input !== null && input instanceof HTMLElement; + }, + function: function(input) { + return input !== null && typeof input === 'function'; }, undefined: function(input) { - return typeof input === 'undefined'; + return input !== null && typeof input === 'undefined'; } }; @@ -702,25 +709,31 @@ } // Player instance - function Plyr(container, config) { - var plyr = this; - plyr.container = container; - plyr.timers = {}; + function Plyr(media, config) { + var plyr = this, + timers = {}; - // Log config options - _log(config); + // Set media + plyr.media = media; + var original = media.cloneNode(true); // Debugging - function _log() { - if (config.debug && window.console) { - console.log.apply(console, arguments); - } - } - function _warn() { + function _console(type, args) { if (config.debug && window.console) { - console.warn.apply(console, arguments); + args = Array.prototype.slice.call(args); + + if (_is.string(config.logPrefix) && config.logPrefix.length) { + args.unshift(config.logPrefix); + } + + console[type].apply(console, args); } } + var _log = function() { _console('log', arguments) }, + _warn = function() { _console('warn', arguments) }; + + // Log config options + _log('Config', config); // Get icon URL function _getIconUrl() { @@ -1048,7 +1061,7 @@ _log('Successfully loaded the caption file via AJAX'); } else { - _warn('There was a problem loading the caption file via AJAX'); + _warn(config.logPrefix + 'There was a problem loading the caption file via AJAX'); } } }; @@ -1076,7 +1089,7 @@ } // Set the span content - if (_is.undefined(caption)) { + if (_is.string(caption)) { content.innerHTML = caption.trim(); } else { @@ -1279,24 +1292,20 @@ html = _replaceAll(html, '{id}', Math.floor(Math.random() * (10000))); // Controls container - var container; + var target; // Inject to custom location - if (config.selectors.controls.container !== null) { - container = config.selectors.controls.container; - - if (_is.string(container)) { - container = document.querySelector(container); - } + if (_is.string(config.selectors.controls.container)) { + target = document.querySelector(config.selectors.controls.container); } // Inject into the container by default - if (!_is.htmlElement(container)) { - container = plyr.container + if (!_is.htmlElement(target)) { + target = plyr.container } // Inject controls HTML - container.insertAdjacentHTML('beforeend', html); + target.insertAdjacentHTML('beforeend', html); // Setup tooltips if (config.tooltips.controls) { @@ -1475,7 +1484,7 @@ _toggleClass(plyr.container, config.classes.stopped, config.autoplay); // Add iOS class - _toggleClass(plyr.container, config.classes.isIos, plyr.browser.isIos); + _toggleClass(plyr.ontainer, config.classes.isIos, plyr.browser.isIos); // Add touch class _toggleClass(plyr.container, config.classes.isTouch, plyr.browser.isTouch); @@ -1497,9 +1506,6 @@ // Embeds if (_inArray(config.types.embed, plyr.type)) { _setupEmbed(); - - // Clean up - plyr.embedId = null; } } @@ -1611,9 +1617,6 @@ // When embeds are ready function _embedReady() { - // Store reference to API - plyr.container.plyr.embed = plyr.embed; - // Setup the UI if full support if (plyr.supported.full) { _setupInterface(); @@ -1625,12 +1628,6 @@ // Handle YouTube API ready function _youTubeReady(videoId, container) { - // Setup timers object - // We have to poll YouTube for updates - if (!('timer' in plyr)) { - plyr.timer = {}; - } - // Setup instance // https://developers.google.com/youtube/iframe_api_reference plyr.embed = new window.YT.Player(container.id, { @@ -1650,7 +1647,7 @@ }, events: { 'onError': function(event) { - _triggerEvent(plyr.container, 'error', true, { + _triggerEvent(container, 'error', true, { code: event.data, embed: event.target }); @@ -1680,32 +1677,37 @@ // Set title config.title = instance.getVideoData().title; + // Update UI + _embedReady(); + // Trigger timeupdate _triggerEvent(plyr.media, 'timeupdate'); // Reset timer - window.clearInterval(plyr.timer.buffering); + window.clearInterval(timers.buffering); // Setup buffering - plyr.timer.buffering = window.setInterval(function() { + timers.buffering = window.setInterval(function() { // Get loaded % from YouTube plyr.media.buffered = instance.getVideoLoadedFraction(); - // Trigger progress - _triggerEvent(plyr.media, 'progress'); + // Trigger progress only when we actually buffer something + if (plyr.media.lastBuffered === null || plyr.media.lastBuffered < plyr.media.buffered) { + _triggerEvent(plyr.media, 'progress'); + } + + // Set last buffer point + plyr.media.lastBuffered = plyr.media.buffered; // Bail if we're at 100% if (plyr.media.buffered === 1) { - window.clearInterval(plyr.timer.buffering); + window.clearInterval(timers.buffering); // Trigger event _triggerEvent(plyr.media, 'canplaythrough'); } }, 200); - // Update UI - _embedReady(); - // Display duration if available _displayDuration(); }, @@ -1714,7 +1716,7 @@ var instance = event.target; // Reset timer - window.clearInterval(plyr.timer.playing); + window.clearInterval(timers.playing); // Handle events // -1 Unstarted @@ -1736,7 +1738,7 @@ _triggerEvent(plyr.media, 'playing'); // Poll to get playback progress - plyr.timer.playing = window.setInterval(function() { + timers.playing = window.setInterval(function() { // Set the current time plyr.media.currentTime = instance.getCurrentTime(); @@ -1752,7 +1754,7 @@ break; } - _triggerEvent(plyr.container, 'statechange', false, { + _triggerEvent(container, 'statechange', false, { code: event.data }); } @@ -1786,13 +1788,14 @@ plyr.embed.stop(); plyr.media.paused = true; }; + plyr.media.paused = true; plyr.media.currentTime = 0; // Update UI _embedReady(); - plyr.embed.getCurrentTime().then(function (value) { + plyr.embed.getCurrentTime().then(function(value) { plyr.media.currentTime = value; // Trigger timeupdate @@ -1811,12 +1814,14 @@ plyr.embed.enableTextTrack('en'); }*/ - // Fix keyboard focus issues - // https://github.com/Selz/plyr/issues/317 plyr.embed.on('loaded', function() { + // Fix keyboard focus issues + // https://github.com/Selz/plyr/issues/317 if(_is.htmlElement(plyr.embed.element) && plyr.supported.full) { plyr.embed.element.setAttribute('tabindex', '-1'); } + + //console.log(plyr.embed); }); plyr.embed.on('play', function() { @@ -1858,7 +1863,7 @@ plyr.embed = window.SC.Widget(this); // Setup on ready - plyr.embed.bind(window.SC.Widget.Events.READY, function() { + plyr.embed.bind(window.SC.Widget.Events.READY, function() { // Create a faux HTML5 API using the Soundcloud API plyr.media.play = function() { plyr.embed.play(); @@ -1873,6 +1878,7 @@ plyr.embed.pause(); plyr.media.paused = true; }; + plyr.media.paused = true; plyr.media.currentTime = 0; @@ -2333,10 +2339,10 @@ var loading = (event.type === 'waiting'); // Clear timer - clearTimeout(plyr.timers.loading); + clearTimeout(timers.loading); // Timer to prevent flicker when seeking - plyr.timers.loading = setTimeout(function() { + timers.loading = setTimeout(function() { _toggleClass(plyr.container, config.classes.loading, loading); }, (loading ? 250 : 0)); } @@ -2566,7 +2572,8 @@ // Show the player controls in fullscreen mode function _toggleControls(toggle) { - if (!config.hideControls || plyr.type === 'audio') { + // Don't hide if config says not to, it's audio, or not loaded/ready + if (!config.hideControls || plyr.type === 'audio' || !_hasClass(plyr.container, config.classes.ready)) { return; } @@ -2599,7 +2606,7 @@ } // Clear timer every movement - window.clearTimeout(plyr.timers.hover); + window.clearTimeout(timers.hover); // If the mouse is not over the controls, set a timeout to hide them if (show || plyr.media.paused) { @@ -2619,7 +2626,7 @@ // If toggle is false or if we're playing (regardless of toggle), // then set the timer to hide the controls if (!show || !plyr.media.paused) { - plyr.timers.hover = window.setTimeout(function() { + timers.hover = window.setTimeout(function() { // If the mouse is over the controls (and not entering fullscreen), bail if ((plyr.controls.pressed || plyr.controls.hover) && !isEnterFullscreen) { return; @@ -2685,129 +2692,125 @@ // Cancel current network requests _cancelRequests(); - // Clean up YouTube stuff - if (plyr.type === 'youtube') { - // Destroy the embed instance - plyr.embed.destroy(); + // Destroy instance adn wait for callback + // Vimeo throws a wobbly if you don't wait + _destroy(setup, false); - // Clear timer - window.clearInterval(plyr.timer.buffering); - window.clearInterval(plyr.timer.playing); - } - // HTML5 Video - else if (plyr.type === 'video' && plyr.videoContainer) { - // Remove video wrapper - _remove(plyr.videoContainer); - } + // Setup new source + function setup() { + // Remove embed object + plyr.embed = null; + + // Remove video container + if (plyr.type === 'video' && plyr.videoContainer) { + _remove(plyr.videoContainer); + } - // Remove embed object - plyr.embed = null; + // Remove the old media + _remove(plyr.media); - // Remove the old media - _remove(plyr.media); + // Reset class name + if (plyr.container) { + plyr.container.removeAttribute('class'); + } - // Set the type - if ('type' in source) { - plyr.type = source.type; + // Set the type + if ('type' in source) { + plyr.type = source.type; - // Get child type for video (it might be an embed) - if (plyr.type === 'video') { - var firstSource = source.sources[0]; + // Get child type for video (it might be an embed) + if (plyr.type === 'video') { + var firstSource = source.sources[0]; - if ('type' in firstSource && _inArray(config.types.embed, firstSource.type)) { - plyr.type = firstSource.type; + if ('type' in firstSource && _inArray(config.types.embed, firstSource.type)) { + plyr.type = firstSource.type; + } } } - } - // Check for support - plyr.supported = supported(plyr.type); - - // Create new markup - switch(plyr.type) { - case 'video': - plyr.media = document.createElement('video'); - break; + // Check for support + plyr.supported = supported(plyr.type); - case 'audio': - plyr.media = document.createElement('audio'); - break; + // Create new markup + switch(plyr.type) { + case 'video': + plyr.media = document.createElement('video'); + break; - case 'youtube': - case 'vimeo': - case 'soundcloud': - plyr.media = document.createElement('div'); - plyr.embedId = source.sources[0].src; - break; - } + case 'audio': + plyr.media = document.createElement('audio'); + break; - // Inject the new element - _prependChild(plyr.container, plyr.media); + case 'youtube': + case 'vimeo': + case 'soundcloud': + plyr.media = document.createElement('div'); + plyr.embedId = source.sources[0].src; + break; + } - // Autoplay the new source? - if (_is.boolean(source.autoplay)) { - config.autoplay = source.autoplay; - } + // Inject the new element + _prependChild(plyr.container, plyr.media); - // Set attributes for audio video - if (_inArray(config.types.html5, plyr.type)) { - if (config.crossorigin) { - plyr.media.setAttribute('crossorigin', ''); + // Autoplay the new source? + if (_is.boolean(source.autoplay)) { + config.autoplay = source.autoplay; } - if (config.autoplay) { - plyr.media.setAttribute('autoplay', ''); - } - if ('poster' in source) { - plyr.media.setAttribute('poster', source.poster); - } - if (config.loop) { - plyr.media.setAttribute('loop', ''); + + // Set attributes for audio and video + if (_inArray(config.types.html5, plyr.type)) { + if (config.crossorigin) { + plyr.media.setAttribute('crossorigin', ''); + } + if (config.autoplay) { + plyr.media.setAttribute('autoplay', ''); + } + if ('poster' in source) { + plyr.media.setAttribute('poster', source.poster); + } + if (config.loop) { + plyr.media.setAttribute('loop', ''); + } } - } - // Classname reset - plyr.container.className = plyr.originalClassName; + // Restore class hooks + _toggleClass(plyr.container, config.classes.fullscreen.active, plyr.isFullscreen); + _toggleClass(plyr.container, config.classes.captions.active, plyr.captionsEnabled); + _toggleStyleHook(); - // Restore class hooks - _toggleClass(plyr.container, config.classes.fullscreen.active, plyr.isFullscreen); - _toggleClass(plyr.container, config.classes.captions.active, plyr.captionsEnabled); - _toggleStyleHook(); + // Set new sources for html5 + if (_inArray(config.types.html5, plyr.type)) { + _insertChildElements('source', source.sources); + } - // Set new sources for html5 - if (_inArray(config.types.html5, plyr.type)) { - _insertChildElements('source', source.sources); - } + // Set up from scratch + _setupMedia(); - // Set up from scratch - _setupMedia(); + // HTML5 stuff + if (_inArray(config.types.html5, plyr.type)) { + // Setup captions + if ('tracks' in source) { + _insertChildElements('track', source.tracks); + } - // HTML5 stuff - if (_inArray(config.types.html5, plyr.type)) { - // Setup captions - if ('tracks' in source) { - _insertChildElements('track', source.tracks); - } + // Load HTML5 sources + plyr.media.load(); - // Load HTML5 sources - plyr.media.load(); + // Setup interface + _setupInterface(); - // Setup interface - _setupInterface(); + // Display duration if available + _displayDuration(); + } + // If embed but not fully supported, setupInterface now + else if (_inArray(config.types.embed, plyr.type) && !plyr.supported.full) { + _setupInterface(); + } - // Display duration if available - _displayDuration(); - } - // If embed but not fully supported, setupInterface now - else if (_inArray(config.types.embed, plyr.type) && !plyr.supported.full) { - _setupInterface(); + // Set aria title and iframe title + config.title = source.title; + _setTitle(); } - - // Set aria title and iframe title - config.title = source.title; - _setTitle(); - - // Reset media objects - plyr.container.plyr.media = plyr.media; } // Update poster @@ -3106,49 +3109,79 @@ plyr.media.load(); // Debugging - _log("Cancelled network requests for old media"); + _log('Cancelled network requests for old media'); } // Destroy an instance // Event listeners are removed when elements are removed // http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory - function _destroy() { + function _destroy(callback, restore) { // Bail if the element is not initialized if (!plyr.init) { return null; } - // Reset container classname - plyr.container.setAttribute('class', _getClassname(config.selectors.container)); + // Type specific stuff + switch (plyr.type) { + case 'youtube': + // Clear timers + window.clearInterval(timers.buffering); + window.clearInterval(timers.playing); - // Remove init flag - plyr.init = false; + // Destroy YouTube API + plyr.embed.destroy(); - // Remove controls - _remove(_getElement(config.selectors.controls.wrapper)); + // Clean up + cleanUp(); + + break; - // YouTube - if (plyr.type === 'youtube') { - plyr.embed.destroy(); - return; - } + case 'vimeo': + // Destroy Vimeo API + // then clean up (wait, to prevent postmessage errors) + plyr.embed.unload().then(cleanUp); - // If video, we need to remove some more - if (plyr.type === 'video') { - // Remove captions container - _remove(_getElement(config.selectors.captions)); + // Vimeo does not always return + window.setTimeout(cleanUp, 200); - // Remove video wrapper - _unwrap(plyr.videoContainer); + break; + + case 'video': + case 'audio': + // Restore native video controls + _toggleNativeControls(true); + + // Clean up + cleanUp(); + + break; } - // Restore native video controls - _toggleNativeControls(true); + function cleanUp() { + // Default to restore original element + if (!_is.boolean(restore)) { + restore = true; + } + + // Callback + if (_is.function(callback)) { + callback.call(original); + } + + // Bail if we don't need to restore the original element + if (!restore) { + return; + } + + // Remove init flag + plyr.init = false; + + // Replace the container with the original element provided + plyr.container.parentNode.replaceChild(original, plyr.container); - // Clone the media element to remove listeners - // http://stackoverflow.com/questions/19469881/javascript-remove-all-event-listeners-of-specific-type - var clone = plyr.media.cloneNode(true); - plyr.media.parentNode.replaceChild(clone, plyr.media); + // Event + _triggerEvent(original, 'destroyed', true); + } } // Setup a player @@ -3164,71 +3197,54 @@ // Sniff out the browser plyr.browser = _browserSniff(); - // Get the media element - plyr.media = plyr.container.querySelectorAll('audio, video')[0]; - - // Get the div placeholder for YouTube and Vimeo - if (!plyr.media) { - plyr.media = plyr.container.querySelectorAll('[data-type]')[0]; - } - // Bail if nothing to setup - if (!plyr.media) { + if (!_is.htmlElement(plyr.media)) { return; } // Load saved settings from localStorage _setupStorage(); - // Get original classname - plyr.originalClassName = plyr.container.className; - // Set media type based on tag or data attribute // Supported: video, audio, vimeo, youtube - var tagName = plyr.media.tagName.toLowerCase(); + var tagName = media.tagName.toLowerCase(); if (tagName === 'div') { - plyr.type = plyr.media.getAttribute('data-type'); - plyr.embedId = plyr.media.getAttribute('data-video-id'); + plyr.type = media.getAttribute('data-type'); + plyr.embedId = media.getAttribute('data-video-id'); // Clean up - plyr.media.removeAttribute('data-type'); - plyr.media.removeAttribute('data-video-id'); + media.removeAttribute('data-type'); + media.removeAttribute('data-video-id'); } else { plyr.type = tagName; - config.crossorigin = (plyr.media.getAttribute('crossorigin') !== null); - config.autoplay = (config.autoplay || (plyr.media.getAttribute('autoplay') !== null)); - config.loop = (config.loop || (plyr.media.getAttribute('loop') !== null)); + config.crossorigin = (media.getAttribute('crossorigin') !== null); + config.autoplay = (config.autoplay || (media.getAttribute('autoplay') !== null)); + config.loop = (config.loop || (media.getAttribute('loop') !== null)); } // Check for support plyr.supported = supported(plyr.type); - // Add style hook - _toggleStyleHook(); - // If no native support, bail if (!plyr.supported.basic) { - return false; + return; } + // Wrap media + plyr.container = _wrap(media, document.createElement('div')); + + // Add style hook + _toggleStyleHook(); + // Debug info - _log(plyr.browser.name + ' ' + plyr.browser.version); + _log('' + plyr.browser.name + ' ' + plyr.browser.version); // Setup media _setupMedia(); // Setup interface if (_inArray(config.types.html5, plyr.type)) { - // Bail if no support - if (!plyr.supported.full) { - // Successful setup - plyr.init = true; - - // Don't inject controls if no full support - return; - } - // Setup UI _setupInterface(); @@ -3252,7 +3268,7 @@ function _setupInterface() { // Don't setup interface if no support if (!plyr.supported.full) { - _warn('No full support for this media type (' + plyr.type + ')'); + _warn('Basic support only', plyr.type); // Remove controls _remove(_getElement(config.selectors.controls.wrapper)); @@ -3311,6 +3327,9 @@ // Ready event _triggerEvent(plyr.container, 'ready', true); + + // Class + _toggleClass(plyr.container, config.classes.ready, true); } // Initialize instance @@ -3322,9 +3341,15 @@ } return { - media: plyr.media, + getContainer: function() { return plyr.container }, + getEmbed: function() { return plyr.embed; }, + getMedia: function() { return plyr.media; }, + getType: function() { return plyr.type; }, + isReady: function() { return _hasClass(plyr.container, config.classes.ready); }, + on: function(event, callback) { _on(plyr.container, event, callback); }, play: _play, pause: _pause, + stop: function() { _pause(); _seek(); }, restart: _seek, rewind: _rewind, forward: _forward, @@ -3340,8 +3365,7 @@ isFullscreen: function() { return plyr.isFullscreen || false; }, support: function(mimeType) { return _supportMime(plyr, mimeType); }, destroy: _destroy, - restore: _init, - getCurrentTime: function() { return plyr.media.currentTime; } + getCurrentTime: function() { return media.currentTime; } }; } @@ -3350,10 +3374,18 @@ var x = new XMLHttpRequest(); // If the id is set and sprite exists, bail - if (_is.string(id) && document.querySelector('#' + id) !== null) { + if (_is.string(id) && _is.htmlElement(document.querySelector('#' + id))) { return; } + // Create placeholder (to prevent loading twice) + var c = document.createElement('div'); + c.setAttribute('hidden', ''); + if (_is.string(id)) { + c.setAttribute('id', id); + } + document.body.insertBefore(c, document.body.childNodes[0]); + // Check for CORS support if ('withCredentials' in x) { x.open('GET', url, true); @@ -3364,13 +3396,7 @@ // Inject hidden div with sprite on load x.onload = function() { - var c = document.createElement('div'); - c.setAttribute('hidden', ''); - if (_is.string(id)) { - c.setAttribute('id', id); - } c.innerHTML = x.responseText; - document.body.insertBefore(c, document.body.childNodes[0]); } x.send(); @@ -3418,8 +3444,8 @@ // Setup function function setup(targets, options) { // Get the players - var elements = [], - containers = [], + var players = [], + instances = [], selector = [defaults.selectors.html5, defaults.selectors.embed].join(','); // Select the elements @@ -3453,6 +3479,20 @@ return false; } + // Add to container list + function add(target, media) { + if (!_hasClass(media, defaults.classes.hook)) { + players.push({ + // Always wrap in a <div> for styling + //container: _wrap(media, document.createElement('div')), + // Could be a container or the media itself + target: target, + // This should be the <video>, <audio> or <div> (YouTube/Vimeo) + media: media + }); + } + } + // Check if the targets have multiple media elements for (var i = 0; i < targets.length; i++) { var target = targets[i]; @@ -3460,67 +3500,112 @@ // Get children var children = target.querySelectorAll(selector); - // If there's more than one media element, wrap them - if (children.length > 1) { + // If there's more than one media element child, wrap them + if (children.length) { for (var x = 0; x < children.length; x++) { - containers.push({ - element: _wrap(children[x], document.createElement('div')), - original: target - }); + add(target, children[x]); } } - else { - containers.push({ - element: target - }); + // Wrap target if it's a media element + else if (_matches(target, selector)) { + add(target, target); } } // Create a player instance for each element - for (var key in containers) { - var element = containers[key].element, - original = containers[key].original || element; + players.forEach(function(player) { + var element = player.target, + media = player.media, + match = false; - // Wrap each media element if is target is media element - // as opposed to a wrapper - if (_matches(element, selector)) { - // Wrap in a <div> - element = _wrap(element, document.createElement('div')); + // The target element can also be the media element + if (media === element) { + match = true; } // Setup a player instance and add to the element - if (!('plyr' in element)) { - // Create instance-specific config - var config = _extend({}, defaults, options, JSON.parse(original.getAttribute('data-plyr'))); + // Create instance-specific config + var data = {}; - // Bail if not enabled - if (!config.enabled) { - return null; - } + // Try parsing data attribute config + try { data = JSON.parse(element.getAttribute('data-plyr')); } + catch(e) { } - // Create new instance - var instance = new Plyr(element, config); + var config = _extend({}, defaults, options, data); - // Set plyr to false if setup failed - element.plyr = (Object.keys(instance).length ? instance : false); + // Bail if not enabled + if (!config.enabled) { + return null; + } - // Callback - _triggerEvent(original, 'setup', true, { - plyr: element.plyr + // Create new instance + var instance = new Plyr(media, config); + + // Go to next if setup failed + if (!_is.object(instance)) { + return; + } + + // Set plyr to false if setup failed + // Maybe we remove this and add a .get() function to get the instance + // If passed a media element or container? + media.plyr = instance; + + // Set class hook + _toggleClass(media, defaults.classes.setup, true); + + // Listen for events if debugging + if (config.debug) { + var events = config.events.concat(['setup', 'ready', 'statechange', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled']); + + _on(instance.getContainer(), events.join(' '), function() { + console.log([config.logPrefix, 'event:', event.type].join(' ')); }); } + // Callback + _triggerEvent(instance.getContainer(), 'setup', true, { + plyr: instance + }); + // Add to return array even if it's already setup - elements.push(element); + instances.push(instance); + }); + + return instances; + } + + // Get all instances within a provided container + function get(container) { + // Get selector if string passed + if (_is.string(container)) { + container = document.querySelector(container); + } + // Use body by default to get all on page + else if (_is.undefined(container)) { + container = document.body; + } + + // If we have a HTML element + if (_is.htmlElement(container)) { + var elements = container.querySelectorAll('.' + defaults.classes.setup), + instances = []; + + Array.prototype.slice.call(elements).forEach(function(element) { + instances.push(element.plyr); + }); + + return instances; } - return elements; + return []; } return { setup: setup, supported: supported, - loadSprite: loadSprite + loadSprite: loadSprite, + get: get }; })); |