{"version":3,"sources":["webpack:///assets/javascripts/index.js","webpack:///webpack/bootstrap cb43acb6fd9c11f7f5e9","webpack:///./source/assets/javascripts/initPlyr.js","webpack:///./source/assets/javascripts/index.js","webpack:///./~/plyr/src/js/plyr.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","m","c","value","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","default","_plyr2","setup","forEach","instance","on","event","title","this","childNodes","getAttribute","ga","_plyr","obj","_initPlyr","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","root","factory","document","undefined","apply","window","_browserSniff","nameOffset","verOffset","ix","ua","navigator","userAgent","appName","fullVersion","parseFloat","appVersion","majorVersion","parseInt","isIE","isFirefox","isChrome","isSafari","indexOf","substring","lastIndexOf","toLowerCase","toUpperCase","isNaN","version","isIos","test","platform","isIphone","isTouch","documentElement","_supportMime","plyr","mimeType","media","type","canPlayType","replace","_injectScript","source","querySelectorAll","length","tag","createElement","src","firstScriptTag","getElementsByTagName","parentNode","insertBefore","_inArray","haystack","needle","Array","_replaceAll","string","find","RegExp","_wrap","elements","wrapper","child","cloneNode","element","parent","sibling","nextSibling","appendChild","_remove","removeChild","_prependChild","firstChild","_setAttributes","attributes","key","setAttribute","_is","boolean","_insertElement","_getClassname","selector","_toggleClass","className","state","classList","_hasClass","contains","_matches","Element","matches","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","_proxyListener","eventName","userListener","defaultListener","useCapture","_on","_toggleListener","events","callback","toggle","eventList","split","NodeList","x","Node","arguments","_event","bubbles","properties","CustomEvent","detail","dispatchEvent","_toggleState","target","_getPercentage","current","max","toFixed","_extend","objects","destination","shift","constructor","_parseYouTubeId","url","regex","match","$2","_parseVimeoId","_fullscreen","fullscreen","supportsFullScreen","isFullScreen","requestFullScreen","cancelFullScreen","fullScreenEventName","prefix","browserPrefixes","il","msExitFullscreen","msFullscreenEnabled","body","fullscreenElement","mozFullScreenElement","Plyr","config","_triggerEvent","api","_console","args","debug","console","slice","logPrefix","unshift","_getIconUrl","iconUrl","absolute","browser","_buildControls","html","iconPath","iconPrefix","controls","push","i18n","play","restart","rewind","pause","forward","buffered","tooltips","seek","currentTime","duration","toggleMute","volume","volumeMin","volumeMax","toggleCaptions","toggleFullscreen","join","_setupFullscreen","supported","full","allowAudio","enabled","nativeSupport","fallback","_inFrame","_log","container","classes","buttons","_focusTrap","_setupCaptions","_getElement","selectors","captions","videoContainer","insertAdjacentHTML","usingTextTracks","textTracks","kind","captionSrc","children","nodeName","captionExists","tracks","mode","_showCaptions","y","track","activeCues","_setCaption","getCueAsHTML","currentCaption","xhr","XMLHttpRequest","onreadystatechange","readyState","status","caption","req","responseText","lineSeparator","r","parts","index","_warn","open","send","content","innerHTML","trim","offsetHeight","_seekManualCaptions","time","_timecodeCommon","tc","pos","tcpair","_subTcSecs","_timecodeMax","tc1","tc2","Math","floor","subcount","number","active","storage","captionsEnabled","defaultActive","_getElements","self","top","e","_checkFocus","which","isFullscreen","last","shiftKey","first","preventDefault","focus","tabbables","_insertChildElements","_injectControls","loadSprite","seekTime","random","querySelector","htmlElement","labels","hidden","label","tooltip","_findElements","mute","progress","buffer","bar","text","played","input","display","_toggleNativeControls","_toggleStyleHook","types","html5","removeAttribute","_setTitle","iframe","frameTitle","_setupStorage","_storage","localStorage","removeItem","getItem","_updateStorage","JSON","parse","setItem","stringify","_setupMedia","embed","stopped","autoplay","videoWrapper","_setupEmbed","mediaId","id","embedId","containers","embedWrapper","YT","_youTubeReady","urls","youtube","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","Vimeo","_vimeoReady","vimeo","vimeoTimer","setInterval","clearInterval","soundCloud","loaded","SC","soundcloud","soundCloudTimer","_soundcloudReady","_embedReady","_setupInterface","_ready","videoId","Player","playerVars","rel","showinfo","iv_load_policy","cc_load_policy","cc_lang_pref","wmode","modestbranding","disablekb","origin","onError","code","data","onReady","playVideo","paused","pauseVideo","stop","stopVideo","getDuration","muted","isMuted","getVideoData","timers","buffering","getVideoLoadedFraction","lastBuffered","onStateChange","playing","seeking","getCurrentTime","loop","byline","portrait","then","seconds","percent","Widget","bind","Events","READY","seekTo","getPosition","PLAY","PAUSE","PLAY_PROGRESS","currentPosition","LOAD_PROGRESS","loadProgress","FINISH","_play","_pause","_togglePlay","_rewind","_seek","_forward","targetTime","_getDuration","_updateSeekDisplay","setCurrentTime","mediaDuration","_checkPlaying","_toggleControls","_saveScrollPosition","scroll","pageXOffset","pageYOffset","_restoreScrollPosition","scrollTo","_toggleFullscreen","style","overflow","_toggleMute","_setVolume","setVolume","min","_increaseVolume","step","volumeStep","_decreaseVolume","_updateVolume","_toggleCaptions","show","_checkLoading","loading","clearTimeout","setTimeout","_updateProgress","pressed","end","_setProgress","_updateTimeDisplay","secs","mins","hours","displayHours","_displayDuration","displayDuration","_updateSeekTooltip","_timeUpdate","clientRect","getBoundingClientRect","visible","width","pageX","left","hideControls","delay","isEnterFullscreen","hover","_source","_updateSource","getVideoUrl","getCurrentSound","permalink_url","currentSrc","firstSource","sources","crossorigin","poster","load","ready","_cancelRequests","_destroy","_updatePoster","_controlListeners","togglePlay","trigger","hadTabFocus","tabFocus","getFocusElement","focused","activeElement","getKeyCode","keyCode","checkTabFocus","button","nodeList","handleKey","held","stopPropagation","inputEvent","keyboardShorcuts","global","allowed","editable","listeners","inverted","webkitDirectionInvertedFromDevice","deltaY","deltaX","_mediaListeners","showPosterOnEnd","clickToPlay","cursor","ended","disableContextMenu","concat","blankUrl","restore","cleanUp","function","original","init","replaceChild","destroy","unload","controlsMissing","defaults","getOriginal","getContainer","getEmbed","getMedia","getType","getVolume","isReady","isLoading","isPaused","toggleControls","support","tagName","basic","onload","isOldIE","audioSupport","videoSupport","targets","options","add","hook","players","instances","array","player","log","Number","String","HTMLElement","result","params","cancelable","evt","createEvent","initCustomEvent","Event"],"mappings":"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","file":"assets/javascripts/index.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmony imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 2);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function () {\n var instances = _plyr2.default.setup('.audio__player', {});\n\n instances.forEach(function (instance) {\n instance.on('play', function (event) {\n var title = this.childNodes[0].getAttribute('data-title');\n ga('send', 'event', title, 'play');\n });\n });\n};\n\nvar _plyr = __webpack_require__(3);\n\nvar _plyr2 = _interopRequireDefault(_plyr);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n__webpack_require__(1);\n\nvar _initPlyr = __webpack_require__(0);\n\nvar _initPlyr2 = _interopRequireDefault(_initPlyr);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(0, _initPlyr2.default)();\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// ==========================================================================\n// Plyr\n// plyr.js v2.0.13\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n// Credits: http://paypal.github.io/accessible-html5-video-player/\n// ==========================================================================\n\n;(function(root, factory) {\n 'use strict';\n /*global define,module*/\n\n if (typeof module === 'object' && typeof module.exports === 'object') {\n // Node, CommonJS-like\n module.exports = factory(root, document);\n } else if (true) {\n // AMD\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () { return factory(root, document); }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {\n // Browser globals (root is window)\n root.plyr = factory(root, document);\n }\n}(typeof window !== 'undefined' ? window : this, function(window, document) {\n 'use strict';\n\n // Globals\n var fullscreen,\n scroll = { x: 0, y: 0 },\n\n // Default config\n defaults = {\n enabled: true,\n debug: false,\n autoplay: false,\n loop: false,\n seekTime: 10,\n volume: 10,\n volumeMin: 0,\n volumeMax: 10,\n volumeStep: 1,\n duration: null,\n displayDuration: true,\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/2.0.13/plyr.svg',\n blankUrl: 'https://cdn.selz.com/plyr/blank.mp4',\n clickToPlay: true,\n hideControls: true,\n showPosterOnEnd: false,\n disableContextMenu: true,\n keyboardShorcuts: {\n focused: true,\n global: false\n },\n tooltips: {\n controls: false,\n seek: true\n },\n selectors: {\n html5: 'video, audio',\n embed: '[data-type]',\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls'\n },\n labels: '[data-plyr]',\n buttons: {\n seek: '[data-plyr=\"seek\"]',\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n forward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]'\n },\n volume: {\n input: '[data-plyr=\"volume\"]',\n display: '.plyr__volume--display'\n },\n progress: {\n container: '.plyr__progress',\n buffer: '.plyr__progress--buffer',\n played: '.plyr__progress--played'\n },\n captions: '.plyr__captions',\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration'\n },\n classes: {\n setup: 'plyr--setup',\n ready: 'plyr--ready',\n videoWrapper: 'plyr__video-wrapper',\n embedWrapper: 'plyr__video-embed',\n type: 'plyr--{0}',\n stopped: 'plyr--stopped',\n playing: 'plyr--playing',\n muted: 'plyr--muted',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isIos: 'plyr--is-ios',\n isTouch: 'plyr--is-touch',\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active'\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n active: 'plyr--fullscreen-active'\n },\n tabFocus: 'tab-focus'\n },\n captions: {\n defaultActive: false\n },\n fullscreen: {\n enabled: true,\n fallback: true,\n allowAudio: false\n },\n storage: {\n enabled: true,\n key: 'plyr'\n },\n controls: ['play-large', 'play', 'progress', 'current-time', 'mute', 'volume', 'captions', 'fullscreen'],\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime} secs',\n play: 'Play',\n pause: 'Pause',\n forward: 'Forward {seektime} secs',\n played: 'played',\n buffered: 'buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n toggleMute: 'Toggle Mute',\n toggleCaptions: 'Toggle Captions',\n toggleFullscreen: 'Toggle Fullscreen',\n frameTitle: 'Player for {title}'\n },\n types: {\n embed: ['youtube', 'vimeo', 'soundcloud'],\n html5: ['video', 'audio']\n },\n // URLs\n urls: {\n vimeo: {\n api: 'https://player.vimeo.com/api/player.js',\n },\n youtube: {\n api: 'https://www.youtube.com/iframe_api'\n },\n soundcloud: {\n api: 'https://w.soundcloud.com/player/api.js'\n }\n },\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n forward: null,\n mute: null,\n volume: null,\n captions: null,\n fullscreen: null\n },\n // Events to watch on HTML5 media elements\n events: ['ready', 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied'],\n // Logging\n logPrefix: '[Plyr]'\n };\n\n // Credits: http://paypal.github.io/accessible-html5-video-player/\n // Unfortunately, due to mixed support, UA sniffing is required\n function _browserSniff() {\n var ua = navigator.userAgent,\n name = navigator.appName,\n fullVersion = '' + parseFloat(navigator.appVersion),\n majorVersion = parseInt(navigator.appVersion, 10),\n nameOffset,\n verOffset,\n ix,\n isIE = false,\n isFirefox = false,\n isChrome = false,\n isSafari = false;\n\n if ((navigator.appVersion.indexOf('Windows NT') !== -1) && (navigator.appVersion.indexOf('rv:11') !== -1)) {\n // MSIE 11\n isIE = true;\n name = 'IE';\n fullVersion = '11';\n } else if ((verOffset = ua.indexOf('MSIE')) !== -1) {\n // MSIE\n isIE = true;\n name = 'IE';\n fullVersion = ua.substring(verOffset + 5);\n } else if ((verOffset = ua.indexOf('Chrome')) !== -1) {\n // Chrome\n isChrome = true;\n name = 'Chrome';\n fullVersion = ua.substring(verOffset + 7);\n } else if ((verOffset = ua.indexOf('Safari')) !== -1) {\n // Safari\n isSafari = true;\n name = 'Safari';\n fullVersion = ua.substring(verOffset + 7);\n if ((verOffset = ua.indexOf('Version')) !== -1) {\n fullVersion = ua.substring(verOffset + 8);\n }\n } else if ((verOffset = ua.indexOf('Firefox')) !== -1) {\n // Firefox\n isFirefox = true;\n name = 'Firefox';\n fullVersion = ua.substring(verOffset + 8);\n } else if ((nameOffset = ua.lastIndexOf(' ') + 1) < (verOffset = ua.lastIndexOf('/'))) {\n // In most other browsers, 'name/version' is at the end of userAgent\n name = ua.substring(nameOffset,verOffset);\n fullVersion = ua.substring(verOffset + 1);\n\n if (name.toLowerCase() === name.toUpperCase()) {\n name = navigator.appName;\n }\n }\n\n // Trim the fullVersion string at semicolon/space if present\n if ((ix = fullVersion.indexOf(';')) !== -1) {\n fullVersion = fullVersion.substring(0, ix);\n }\n if ((ix = fullVersion.indexOf(' ')) !== -1) {\n fullVersion = fullVersion.substring(0, ix);\n }\n\n // Get major version\n majorVersion = parseInt('' + fullVersion, 10);\n if (isNaN(majorVersion)) {\n fullVersion = '' + parseFloat(navigator.appVersion);\n majorVersion = parseInt(navigator.appVersion, 10);\n }\n\n // Return data\n return {\n name: name,\n version: majorVersion,\n isIE: isIE,\n isFirefox: isFirefox,\n isChrome: isChrome,\n isSafari: isSafari,\n isIos: /(iPad|iPhone|iPod)/g.test(navigator.platform),\n isIphone: /(iPhone|iPod)/g.test(navigator.userAgent),\n isTouch: 'ontouchstart' in document.documentElement\n };\n }\n\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplyr.com/test/h5mt.html\n function _supportMime(plyr, mimeType) {\n var media = plyr.media;\n\n if (plyr.type === 'video') {\n // Check type\n switch (mimeType) {\n case 'video/webm': return !!(media.canPlayType && media.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/no/, ''));\n case 'video/mp4': return !!(media.canPlayType && media.canPlayType('video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"').replace(/no/, ''));\n case 'video/ogg': return !!(media.canPlayType && media.canPlayType('video/ogg; codecs=\"theora\"').replace(/no/, ''));\n }\n } else if (plyr.type === 'audio') {\n // Check type\n switch (mimeType) {\n case 'audio/mpeg': return !!(media.canPlayType && media.canPlayType('audio/mpeg;').replace(/no/, ''));\n case 'audio/ogg': return !!(media.canPlayType && media.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/no/, ''));\n case 'audio/wav': return !!(media.canPlayType && media.canPlayType('audio/wav; codecs=\"1\"').replace(/no/, ''));\n }\n }\n\n // If we got this far, we're stuffed\n return false;\n }\n\n // Inject a script\n function _injectScript(source) {\n if (document.querySelectorAll('script[src=\"' + source + '\"]').length) {\n return;\n }\n\n var tag = document.createElement('script');\n tag.src = source;\n var firstScriptTag = document.getElementsByTagName('script')[0];\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n }\n\n // Element exists in an array\n function _inArray(haystack, needle) {\n return Array.prototype.indexOf && (haystack.indexOf(needle) !== -1);\n }\n\n // Replace all\n function _replaceAll(string, find, replace) {\n return string.replace(new RegExp(find.replace(/([.*+?\\^=!:${}()|\\[\\]\\/\\\\])/g, '\\\\$1'), 'g'), replace);\n }\n\n // Wrap an element\n function _wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n if (!elements.length) {\n elements = [elements];\n }\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n for (var i = elements.length - 1; i >= 0; i--) {\n var child = (i > 0) ? wrapper.cloneNode(true) : wrapper;\n var element = elements[i];\n\n // Cache the current parent and sibling.\n var parent = element.parentNode;\n var sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n\n return child;\n }\n }\n\n // Unwrap an element\n // http://plainjs.com/javascript/manipulation/unwrap-a-dom-element-35/\n /*function _unwrap(wrapper) {\n // Get the element's parent node\n var parent = wrapper.parentNode;\n\n // Move all children out of the element\n while (wrapper.firstChild) {\n parent.insertBefore(wrapper.firstChild, wrapper);\n }\n\n // Remove the empty element\n parent.removeChild(wrapper);\n }*/\n\n // Remove an element\n function _remove(element) {\n if (!element) {\n return;\n }\n element.parentNode.removeChild(element);\n }\n\n // Prepend child\n function _prependChild(parent, element) {\n parent.insertBefore(element, parent.firstChild);\n }\n\n // Set attributes\n function _setAttributes(element, attributes) {\n for (var key in attributes) {\n element.setAttribute(key, (_is.boolean(attributes[key]) && attributes[key]) ? '' : attributes[key]);\n }\n }\n\n // Insert a HTML element\n function _insertElement(type, parent, attributes) {\n // Create a new \n var element = document.createElement(type);\n\n // Set all passed attributes\n _setAttributes(element, attributes);\n\n // Inject the new element\n _prependChild(parent, element);\n }\n\n // Get a classname from selector\n function _getClassname(selector) {\n return selector.replace('.', '');\n }\n\n // Toggle class on an element\n function _toggleClass(element, className, state) {\n if (element) {\n if (element.classList) {\n element.classList[state ? 'add' : 'remove'](className);\n } else {\n var name = (' ' + element.className + ' ').replace(/\\s+/g, ' ').replace(' ' + className + ' ', '');\n element.className = name + (state ? ' ' + className : '');\n }\n }\n }\n\n // Has class name\n function _hasClass(element, className) {\n if (element) {\n if (element.classList) {\n return element.classList.contains(className);\n } else {\n return new RegExp('(\\\\s|^)' + className + '(\\\\s|$)').test(element.className);\n }\n }\n return false;\n }\n\n // Element matches selector\n function _matches(element, selector) {\n var p = Element.prototype;\n\n var f = p.matches || p.webkitMatchesSelector || p.mozMatchesSelector || p.msMatchesSelector || function(s) {\n return [].indexOf.call(document.querySelectorAll(s), this) !== -1;\n };\n\n return f.call(element, selector);\n }\n\n // Bind along with custom handler\n function _proxyListener(element, eventName, userListener, defaultListener, useCapture) {\n _on(element, eventName, function(event) {\n if (userListener) {\n userListener.apply(element, [event]);\n }\n defaultListener.apply(element, [event]);\n }, useCapture);\n }\n\n // Toggle event listener\n function _toggleListener(element, events, callback, toggle, useCapture) {\n var eventList = events.split(' ');\n\n // Whether the listener is a capturing listener or not\n // Default to false\n if (!_is.boolean(useCapture)) {\n useCapture = false;\n }\n\n // If a nodelist is passed, call itself on each node\n if (element instanceof NodeList) {\n for (var x = 0; x < element.length; x++) {\n if (element[x] instanceof Node) {\n _toggleListener(element[x], arguments[1], arguments[2], arguments[3]);\n }\n }\n return;\n }\n\n // If a single node is passed, bind the event listener\n for (var i = 0; i < eventList.length; i++) {\n element[toggle ? 'addEventListener' : 'removeEventListener'](eventList[i], callback, useCapture);\n }\n }\n\n // Bind event\n function _on(element, events, callback, useCapture) {\n if (element) {\n _toggleListener(element, events, callback, true, useCapture);\n }\n }\n\n // Unbind event\n /*function _off(element, events, callback, useCapture) {\n if (element) {\n _toggleListener(element, events, callback, false, useCapture);\n }\n }*/\n\n // Trigger event\n function _event(element, type, bubbles, properties) {\n // Bail if no element\n if (!element || !type) {\n return;\n }\n\n // Default bubbles to false\n if (!_is.boolean(bubbles)) {\n bubbles = false;\n }\n\n // Create and dispatch the event\n var event = new CustomEvent(type, {\n bubbles: bubbles,\n detail: properties\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n }\n\n // Toggle aria-pressed state on a toggle button\n // http://www.ssbbartgroup.com/blog/how-not-to-misuse-aria-states-properties-and-roles\n function _toggleState(target, state) {\n // Bail if no target\n if (!target) {\n return;\n }\n\n // Get state\n state = (_is.boolean(state) ? state : !target.getAttribute('aria-pressed'));\n\n // Set the attribute on target\n target.setAttribute('aria-pressed', state);\n\n return state;\n }\n\n // Get percentage\n function _getPercentage(current, max) {\n if (current === 0 || max === 0 || isNaN(current) || isNaN(max)) {\n return 0;\n }\n return ((current / max) * 100).toFixed(2);\n }\n\n // Deep extend/merge destination object with N more objects\n // http://andrewdupont.net/2009/08/28/deep-extending-objects-in-javascript/\n // Removed call to arguments.callee (used explicit function name instead)\n function _extend() {\n // Get arguments\n var objects = arguments;\n\n // Bail if nothing to merge\n if (!objects.length) {\n return;\n }\n\n // Return first if specified but nothing to merge\n if (objects.length === 1) {\n return objects[0];\n }\n\n // First object is the destination\n var destination = Array.prototype.shift.call(objects),\n length = objects.length;\n\n // Loop through all objects to merge\n for (var i = 0; i < length; i++) {\n var source = objects[i];\n\n for (var property in source) {\n if (source[property] && source[property].constructor && source[property].constructor === Object) {\n destination[property] = destination[property] || {};\n _extend(destination[property], source[property]);\n } else {\n destination[property] = source[property];\n }\n }\n }\n\n return destination;\n }\n\n // Check variable types\n var _is = {\n object: function(input) {\n return input !== null && typeof(input) === 'object';\n },\n array: function(input) {\n return input !== null && (typeof(input) === 'object' && input.constructor === Array);\n },\n number: function(input) {\n return input !== null && (typeof(input) === 'number' && !isNaN(input - 0) || (typeof input === 'object' && input.constructor === Number));\n },\n string: function(input) {\n return input !== null && (typeof input === 'string' || (typeof input === 'object' && input.constructor === String));\n },\n boolean: function(input) {\n return input !== null && typeof input === 'boolean';\n },\n nodeList: function(input) {\n return input !== null && input instanceof NodeList;\n },\n htmlElement: function(input) {\n return input !== null && input instanceof HTMLElement;\n },\n function: function(input) {\n return input !== null && typeof input === 'function';\n },\n undefined: function(input) {\n return input !== null && typeof input === 'undefined';\n }\n };\n\n // Parse YouTube ID from url\n function _parseYouTubeId(url) {\n var regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|\\&v=)([^#\\&\\?]*).*/;\n return (url.match(regex)) ? RegExp.$2 : url;\n }\n\n // Parse Vimeo ID from url\n function _parseVimeoId(url) {\n var regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return (url.match(regex)) ? RegExp.$2 : url;\n }\n\n // Fullscreen API\n function _fullscreen() {\n var fullscreen = {\n supportsFullScreen: false,\n isFullScreen: function() { return false; },\n requestFullScreen: function() {},\n cancelFullScreen: function() {},\n fullScreenEventName: '',\n element: null,\n prefix: ''\n },\n browserPrefixes = 'webkit o moz ms khtml'.split(' ');\n\n // Check for native support\n if (!_is.undefined(document.cancelFullScreen)) {\n fullscreen.supportsFullScreen = true;\n } else {\n // Check for fullscreen support by vendor prefix\n for (var i = 0, il = browserPrefixes.length; i < il; i++ ) {\n fullscreen.prefix = browserPrefixes[i];\n\n if (!_is.undefined(document[fullscreen.prefix + 'CancelFullScreen'])) {\n fullscreen.supportsFullScreen = true;\n break;\n } else if (!_is.undefined(document.msExitFullscreen) && document.msFullscreenEnabled) {\n // Special case for MS (when isn't it?)\n fullscreen.prefix = 'ms';\n fullscreen.supportsFullScreen = true;\n break;\n }\n }\n }\n\n // Update methods to do something useful\n if (fullscreen.supportsFullScreen) {\n // Yet again Microsoft awesomeness,\n // Sometimes the prefix is 'ms', sometimes 'MS' to keep you on your toes\n fullscreen.fullScreenEventName = (fullscreen.prefix === 'ms' ? 'MSFullscreenChange' : fullscreen.prefix + 'fullscreenchange');\n\n fullscreen.isFullScreen = function(element) {\n if (_is.undefined(element)) {\n element = document.body;\n }\n switch (this.prefix) {\n case '':\n return document.fullscreenElement === element;\n case 'moz':\n return document.mozFullScreenElement === element;\n default:\n return document[this.prefix + 'FullscreenElement'] === element;\n }\n };\n fullscreen.requestFullScreen = function(element) {\n if (_is.undefined(element)) {\n element = document.body;\n }\n return (this.prefix === '') ? element.requestFullScreen() : element[this.prefix + (this.prefix === 'ms' ? 'RequestFullscreen' : 'RequestFullScreen')]();\n };\n fullscreen.cancelFullScreen = function() {\n return (this.prefix === '') ? document.cancelFullScreen() : document[this.prefix + (this.prefix === 'ms' ? 'ExitFullscreen' : 'CancelFullScreen')]();\n };\n fullscreen.element = function() {\n return (this.prefix === '') ? document.fullscreenElement : document[this.prefix + 'FullscreenElement'];\n };\n }\n\n return fullscreen;\n }\n\n // Local storage\n var _storage = {\n supported: (function() {\n if (!('localStorage' in window)) {\n return false;\n }\n\n // Try to use it (it might be disabled, e.g. user is in private/porn mode)\n // see: https://github.com/sampotts/plyr/issues/131\n try {\n // Add test item\n window.localStorage.setItem('___test', 'OK');\n\n // Get the test item\n var result = window.localStorage.getItem('___test');\n\n // Clean up\n window.localStorage.removeItem('___test');\n\n // Check if value matches\n return (result === 'OK');\n }\n catch (e) {\n return false;\n }\n\n return false;\n })()\n };\n\n // Player instance\n function Plyr(media, config) {\n var plyr = this,\n timers = {},\n api;\n\n // Set media\n plyr.media = media;\n var original = media.cloneNode(true);\n\n // Trigger events, with plyr instance passed\n function _triggerEvent(element, type, bubbles, properties) {\n _event(element, type, bubbles, _extend({}, properties, {\n plyr: api\n }));\n }\n\n // Debugging\n function _console(type, args) {\n if (config.debug && window.console) {\n args = Array.prototype.slice.call(args);\n\n if (_is.string(config.logPrefix) && config.logPrefix.length) {\n args.unshift(config.logPrefix);\n }\n\n console[type].apply(console, args);\n }\n }\n var _log = function() { _console('log', arguments) },\n _warn = function() { _console('warn', arguments) };\n\n // Log config options\n _log('Config', config);\n\n // Get icon URL\n function _getIconUrl() {\n return {\n url: config.iconUrl,\n absolute: (config.iconUrl.indexOf(\"http\") === 0) || plyr.browser.isIE\n };\n }\n\n // Build the default HTML\n function _buildControls() {\n // Create html array\n var html = [],\n iconUrl = _getIconUrl(),\n iconPath = (!iconUrl.absolute ? iconUrl.url : '') + '#' + config.iconPrefix;\n\n // Larger overlaid play button\n if (_inArray(config.controls, 'play-large')) {\n html.push(\n ''\n );\n }\n\n html.push('
');\n\n // Restart button\n if (_inArray(config.controls, 'restart')) {\n html.push(\n ''\n );\n }\n\n // Rewind button\n if (_inArray(config.controls, 'rewind')) {\n html.push(\n ''\n );\n }\n\n // Play Pause button\n // TODO: This should be a toggle button really?\n if (_inArray(config.controls, 'play')) {\n html.push(\n '',\n ''\n );\n }\n\n // Fast forward button\n if (_inArray(config.controls, 'fast-forward')) {\n html.push(\n ''\n );\n }\n\n // Progress\n if (_inArray(config.controls, 'progress')) {\n // Create progress\n html.push('',\n '',\n '',\n '',\n '',\n '0% ' + config.i18n.buffered,\n '');\n\n // Seek tooltip\n if (config.tooltips.seek) {\n html.push('00:00');\n }\n\n // Close\n html.push('');\n }\n\n // Media current time display\n if (_inArray(config.controls, 'current-time')) {\n html.push(\n '',\n '' + config.i18n.currentTime + '',\n '00:00',\n ''\n );\n }\n\n // Media duration display\n if (_inArray(config.controls, 'duration')) {\n html.push(\n '',\n '' + config.i18n.duration + '',\n '00:00',\n ''\n );\n }\n\n // Toggle mute button\n if (_inArray(config.controls, 'mute')) {\n html.push(\n ''\n );\n }\n\n // Volume range control\n if (_inArray(config.controls, 'volume')) {\n html.push(\n '',\n '',\n '',\n '',\n ''\n );\n }\n\n // Toggle captions button\n if (_inArray(config.controls, 'captions')) {\n html.push(\n ''\n );\n }\n\n // Toggle fullscreen button\n if (_inArray(config.controls, 'fullscreen')) {\n html.push(\n ''\n );\n }\n\n // Close everything\n html.push('
');\n\n return html.join('');\n }\n\n // Setup fullscreen\n function _setupFullscreen() {\n if (!plyr.supported.full) {\n return;\n }\n\n if ((plyr.type !== 'audio' || config.fullscreen.allowAudio) && config.fullscreen.enabled) {\n // Check for native support\n var nativeSupport = fullscreen.supportsFullScreen;\n\n if (nativeSupport || (config.fullscreen.fallback && !_inFrame())) {\n _log((nativeSupport ? 'Native' : 'Fallback') + ' fullscreen enabled');\n\n // Add styling hook\n _toggleClass(plyr.container, config.classes.fullscreen.enabled, true);\n } else {\n _log('Fullscreen not supported and fallback disabled');\n }\n\n // Toggle state\n if (plyr.buttons && plyr.buttons.fullscreen) {\n _toggleState(plyr.buttons.fullscreen, false);\n }\n\n // Setup focus trap\n _focusTrap();\n }\n }\n\n // Setup captions\n function _setupCaptions() {\n // Bail if not HTML5 video\n if (plyr.type !== 'video') {\n return;\n }\n\n // Inject the container\n if (!_getElement(config.selectors.captions)) {\n plyr.videoContainer.insertAdjacentHTML('afterbegin', '
');\n }\n\n // Determine if HTML5 textTracks is supported\n plyr.usingTextTracks = false;\n if (plyr.media.textTracks) {\n plyr.usingTextTracks = true;\n }\n\n // Get URL of caption file if exists\n var captionSrc = '',\n kind,\n children = plyr.media.childNodes;\n\n for (var i = 0; i < children.length; i++) {\n if (children[i].nodeName.toLowerCase() === 'track') {\n kind = children[i].kind;\n if (kind === 'captions' || kind === 'subtitles') {\n captionSrc = children[i].getAttribute('src');\n }\n }\n }\n\n // Record if caption file exists or not\n plyr.captionExists = true;\n if (captionSrc === '') {\n plyr.captionExists = false;\n _log('No caption track found');\n } else {\n _log('Caption track found; URI: ' + captionSrc);\n }\n\n // If no caption file exists, hide container for caption text\n if (!plyr.captionExists) {\n _toggleClass(plyr.container, config.classes.captions.enabled);\n } else {\n // Turn off native caption rendering to avoid double captions\n // This doesn't seem to work in Safari 7+, so the elements are removed from the dom below\n var tracks = plyr.media.textTracks;\n for (var x = 0; x < tracks.length; x++) {\n tracks[x].mode = 'hidden';\n }\n\n // Enable UI\n _showCaptions(plyr);\n\n // Disable unsupported browsers than report false positive\n // Firefox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1033144\n if ((plyr.browser.isIE && plyr.browser.version >= 10) ||\n (plyr.browser.isFirefox && plyr.browser.version >= 31)) {\n\n // Debugging\n _log('Detected browser with known TextTrack issues - using manual fallback');\n\n // Set to false so skips to 'manual' captioning\n plyr.usingTextTracks = false;\n }\n\n // Rendering caption tracks\n // Native support required - http://caniuse.com/webvtt\n if (plyr.usingTextTracks) {\n _log('TextTracks supported');\n\n for (var y = 0; y < tracks.length; y++) {\n var track = tracks[y];\n\n if (track.kind === 'captions' || track.kind === 'subtitles') {\n _on(track, 'cuechange', function() {\n // Display a cue, if there is one\n if (this.activeCues[0] && 'text' in this.activeCues[0]) {\n _setCaption(this.activeCues[0].getCueAsHTML());\n } else {\n _setCaption();\n }\n });\n }\n }\n } else {\n // Caption tracks not natively supported\n _log('TextTracks not supported so rendering captions manually');\n\n // Render captions from array at appropriate time\n plyr.currentCaption = '';\n plyr.captions = [];\n\n if (captionSrc !== '') {\n // Create XMLHttpRequest Object\n var xhr = new XMLHttpRequest();\n\n xhr.onreadystatechange = function() {\n if (xhr.readyState === 4) {\n if (xhr.status === 200) {\n var captions = [],\n caption,\n req = xhr.responseText;\n\n //According to webvtt spec, line terminator consists of one of the following\n // CRLF (U+000D U+000A), LF (U+000A) or CR (U+000D)\n var lineSeparator = '\\r\\n';\n if(req.indexOf(lineSeparator+lineSeparator) === -1) {\n if(req.indexOf('\\r\\r') !== -1){\n lineSeparator = '\\r';\n } else {\n lineSeparator = '\\n';\n }\n }\n\n captions = req.split(lineSeparator+lineSeparator);\n\n for (var r = 0; r < captions.length; r++) {\n caption = captions[r];\n plyr.captions[r] = [];\n\n // Get the parts of the captions\n var parts = caption.split(lineSeparator),\n index = 0;\n\n // Incase caption numbers are added\n if (parts[index].indexOf(\":\") === -1) {\n index = 1;\n }\n\n plyr.captions[r] = [parts[index], parts[index + 1]];\n }\n\n // Remove first element ('VTT')\n plyr.captions.shift();\n\n _log('Successfully loaded the caption file via AJAX');\n } else {\n _warn(config.logPrefix + 'There was a problem loading the caption file via AJAX');\n }\n }\n };\n\n xhr.open('get', captionSrc, true);\n\n xhr.send();\n }\n }\n }\n }\n\n // Set the current caption\n function _setCaption(caption) {\n /* jshint unused:false */\n var container = _getElement(config.selectors.captions),\n content = document.createElement('span');\n\n // Empty the container\n container.innerHTML = '';\n\n // Default to empty\n if (_is.undefined(caption)) {\n caption = '';\n }\n\n // Set the span content\n if (_is.string(caption)) {\n content.innerHTML = caption.trim();\n } else {\n content.appendChild(caption);\n }\n\n // Set new caption text\n container.appendChild(content);\n\n // Force redraw (for Safari)\n var redraw = container.offsetHeight;\n }\n\n // Captions functions\n // Seek the manual caption time and update UI\n function _seekManualCaptions(time) {\n // Utilities for caption time codes\n function _timecodeCommon(tc, pos) {\n var tcpair = [];\n tcpair = tc.split(' --> ');\n for(var i = 0; i < tcpair.length; i++) {\n // WebVTT allows for extra meta data after the timestamp line\n // So get rid of this if it exists\n tcpair[i] = tcpair[i].replace(/(\\d+:\\d+:\\d+\\.\\d+).*/, \"$1\");\n }\n return _subTcSecs(tcpair[pos]);\n }\n function _timecodeMin(tc) {\n return _timecodeCommon(tc, 0);\n }\n function _timecodeMax(tc) {\n return _timecodeCommon(tc, 1);\n }\n function _subTcSecs(tc) {\n if (tc === null || tc === undefined) {\n return 0;\n } else {\n var tc1 = [],\n tc2 = [],\n seconds;\n tc1 = tc.split(',');\n tc2 = tc1[0].split(':');\n seconds = Math.floor(tc2[0]*60*60) + Math.floor(tc2[1]*60) + Math.floor(tc2[2]);\n return seconds;\n }\n }\n\n // If it's not video, or we're using textTracks, bail.\n if (plyr.usingTextTracks || plyr.type !== 'video' || !plyr.supported.full) {\n return;\n }\n\n // Reset subcount\n plyr.subcount = 0;\n\n // Check time is a number, if not use currentTime\n // IE has a bug where currentTime doesn't go to 0\n // https://twitter.com/Sam_Potts/status/573715746506731521\n time = _is.number(time) ? time : plyr.media.currentTime;\n\n // If there's no subs available, bail\n if (!plyr.captions[plyr.subcount]) {\n return;\n }\n\n while (_timecodeMax(plyr.captions[plyr.subcount][0]) < time.toFixed(1)) {\n plyr.subcount++;\n if (plyr.subcount > plyr.captions.length - 1) {\n plyr.subcount = plyr.captions.length - 1;\n break;\n }\n }\n\n // Check if the next caption is in the current time range\n if (plyr.media.currentTime.toFixed(1) >= _timecodeMin(plyr.captions[plyr.subcount][0]) &&\n plyr.media.currentTime.toFixed(1) <= _timecodeMax(plyr.captions[plyr.subcount][0])) {\n plyr.currentCaption = plyr.captions[plyr.subcount][1];\n\n // Render the caption\n _setCaption(plyr.currentCaption);\n } else {\n _setCaption();\n }\n }\n\n // Display captions container and button (for initialization)\n function _showCaptions() {\n // If there's no caption toggle, bail\n if (!plyr.buttons.captions) {\n return;\n }\n\n _toggleClass(plyr.container, config.classes.captions.enabled, true);\n\n // Try to load the value from storage\n var active = plyr.storage.captionsEnabled;\n\n // Otherwise fall back to the default config\n if (!_is.boolean(active)) {\n active = config.captions.defaultActive;\n }\n\n if (active) {\n _toggleClass(plyr.container, config.classes.captions.active, true);\n _toggleState(plyr.buttons.captions, true);\n }\n }\n\n // Find all elements\n function _getElements(selector) {\n return plyr.container.querySelectorAll(selector);\n }\n\n // Find a single element\n function _getElement(selector) {\n return _getElements(selector)[0];\n }\n\n // Determine if we're in an iframe\n function _inFrame() {\n try {\n return window.self !== window.top;\n }\n catch (e) {\n return true;\n }\n }\n\n // Trap focus inside container\n function _focusTrap() {\n var tabbables = _getElements('input:not([disabled]), button:not([disabled])'),\n first = tabbables[0],\n last = tabbables[tabbables.length - 1];\n\n function _checkFocus(event) {\n // If it is TAB\n if (event.which === 9 && plyr.isFullscreen) {\n if (event.target === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n event.preventDefault();\n first.focus();\n } else if (event.target === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n event.preventDefault();\n last.focus();\n }\n }\n }\n\n // Bind the handler\n _on(plyr.container, 'keydown', _checkFocus);\n }\n\n // Add elements to HTML5 media (source, tracks, etc)\n function _insertChildElements(type, attributes) {\n if (_is.string(attributes)) {\n _insertElement(type, plyr.media, { src: attributes });\n } else if (attributes.constructor === Array) {\n for (var i = attributes.length - 1; i >= 0; i--) {\n _insertElement(type, plyr.media, attributes[i]);\n }\n }\n }\n\n // Insert controls\n function _injectControls() {\n // Sprite\n if (config.loadSprite) {\n var iconUrl = _getIconUrl();\n\n // Only load external sprite using AJAX\n if (iconUrl.absolute) {\n _log('AJAX loading absolute SVG sprite' + (plyr.browser.isIE ? ' (due to IE)' : ''));\n loadSprite(iconUrl.url, \"sprite-plyr\");\n } else {\n _log('Sprite will be used as external resource directly');\n }\n }\n\n // Make a copy of the html\n var html = config.html;\n\n // Insert custom video controls\n _log('Injecting custom controls');\n\n // If no controls are specified, create default\n if (!html) {\n html = _buildControls();\n }\n\n // Replace seek time instances\n html = _replaceAll(html, '{seektime}', config.seekTime);\n\n // Replace all id references with random numbers\n html = _replaceAll(html, '{id}', Math.floor(Math.random() * (10000)));\n\n // Controls container\n var target;\n\n // Inject to custom location\n if (_is.string(config.selectors.controls.container)) {\n target = document.querySelector(config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!_is.htmlElement(target)) {\n target = plyr.container\n }\n\n // Inject controls HTML\n target.insertAdjacentHTML('beforeend', html);\n\n // Setup tooltips\n if (config.tooltips.controls) {\n var labels = _getElements([config.selectors.controls.wrapper, ' ', config.selectors.labels, ' .', config.classes.hidden].join(''));\n\n for (var i = labels.length - 1; i >= 0; i--) {\n var label = labels[i];\n\n _toggleClass(label, config.classes.hidden, false);\n _toggleClass(label, config.classes.tooltip, true);\n }\n }\n }\n\n // Find the UI controls and store references\n function _findElements() {\n try {\n plyr.controls = _getElement(config.selectors.controls.wrapper);\n\n // Buttons\n plyr.buttons = {};\n plyr.buttons.seek = _getElement(config.selectors.buttons.seek);\n plyr.buttons.play = _getElements(config.selectors.buttons.play);\n plyr.buttons.pause = _getElement(config.selectors.buttons.pause);\n plyr.buttons.restart = _getElement(config.selectors.buttons.restart);\n plyr.buttons.rewind = _getElement(config.selectors.buttons.rewind);\n plyr.buttons.forward = _getElement(config.selectors.buttons.forward);\n plyr.buttons.fullscreen = _getElement(config.selectors.buttons.fullscreen);\n\n // Inputs\n plyr.buttons.mute = _getElement(config.selectors.buttons.mute);\n plyr.buttons.captions = _getElement(config.selectors.buttons.captions);\n\n // Progress\n plyr.progress = {};\n plyr.progress.container = _getElement(config.selectors.progress.container);\n\n // Progress - Buffering\n plyr.progress.buffer = {};\n plyr.progress.buffer.bar = _getElement(config.selectors.progress.buffer);\n plyr.progress.buffer.text = plyr.progress.buffer.bar && plyr.progress.buffer.bar.getElementsByTagName('span')[0];\n\n // Progress - Played\n plyr.progress.played = _getElement(config.selectors.progress.played);\n\n // Seek tooltip\n plyr.progress.tooltip = plyr.progress.container && plyr.progress.container.querySelector('.' + config.classes.tooltip);\n\n // Volume\n plyr.volume = {};\n plyr.volume.input = _getElement(config.selectors.volume.input);\n plyr.volume.display = _getElement(config.selectors.volume.display);\n\n // Timing\n plyr.duration = _getElement(config.selectors.duration);\n plyr.currentTime = _getElement(config.selectors.currentTime);\n plyr.seekTime = _getElements(config.selectors.seekTime);\n\n return true;\n }\n catch(e) {\n _warn('It looks like there is a problem with your controls HTML');\n\n // Restore native video controls\n _toggleNativeControls(true);\n\n return false;\n }\n }\n\n // Toggle style hook\n function _toggleStyleHook() {\n _toggleClass(plyr.container, config.selectors.container.replace('.', ''), plyr.supported.full);\n }\n\n // Toggle native controls\n function _toggleNativeControls(toggle) {\n if (toggle && _inArray(config.types.html5, plyr.type)) {\n plyr.media.setAttribute('controls', '');\n } else {\n plyr.media.removeAttribute('controls');\n }\n }\n\n // Setup aria attribute for play and iframe title\n function _setTitle(iframe) {\n // Find the current text\n var label = config.i18n.play;\n\n // If there's a media title set, use that for the label\n if (_is.string(config.title) && config.title.length) {\n label += ', ' + config.title;\n\n // Set container label\n plyr.container.setAttribute('aria-label', config.title);\n }\n\n // If there's a play button, set label\n if (plyr.supported.full && plyr.buttons.play) {\n for (var i = plyr.buttons.play.length - 1; i >= 0; i--) {\n plyr.buttons.play[i].setAttribute('aria-label', label);\n }\n }\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (_is.htmlElement(iframe)) {\n iframe.setAttribute('title', config.i18n.frameTitle.replace('{title}', config.title));\n }\n }\n\n // Setup localStorage\n function _setupStorage() {\n var value = null;\n plyr.storage = {};\n\n // Bail if we don't have localStorage support or it's disabled\n if (!_storage.supported || !config.storage.enabled) {\n return;\n }\n\n // Clean up old volume\n // https://github.com/sampotts/plyr/issues/171\n window.localStorage.removeItem('plyr-volume');\n\n // load value from the current key\n value = window.localStorage.getItem(config.storage.key);\n\n if (!value) {\n // Key wasn't set (or had been cleared), move along\n return;\n } else if (/^\\d+(\\.\\d+)?$/.test(value)) {\n // If value is a number, it's probably volume from an older\n // version of plyr. See: https://github.com/sampotts/plyr/pull/313\n // Update the key to be JSON\n _updateStorage({volume: parseFloat(value)});\n } else {\n // Assume it's JSON from this or a later version of plyr\n plyr.storage = JSON.parse(value);\n }\n }\n\n // Save a value back to local storage\n function _updateStorage(value) {\n // Bail if we don't have localStorage support or it's disabled\n if (!_storage.supported || !config.storage.enabled) {\n return;\n }\n\n // Update the working copy of the values\n _extend(plyr.storage, value);\n\n // Update storage\n window.localStorage.setItem(config.storage.key, JSON.stringify(plyr.storage));\n }\n\n // Setup media\n function _setupMedia() {\n // If there's no media, bail\n if (!plyr.media) {\n _warn('No media element found!');\n return;\n }\n\n if (plyr.supported.full) {\n // Add type class\n _toggleClass(plyr.container, config.classes.type.replace('{0}', plyr.type), true);\n\n // Add video class for embeds\n // This will require changes if audio embeds are added\n if (_inArray(config.types.embed, plyr.type)) {\n _toggleClass(plyr.container, config.classes.type.replace('{0}', 'video'), true);\n }\n\n // If there's no autoplay attribute, assume the video is stopped and add state class\n _toggleClass(plyr.container, config.classes.stopped, config.autoplay);\n\n // Add iOS class\n _toggleClass(plyr.container, config.classes.isIos, plyr.browser.isIos);\n\n // Add touch class\n _toggleClass(plyr.container, config.classes.isTouch, plyr.browser.isTouch);\n\n // Inject the player wrapper\n if (plyr.type === 'video') {\n // Create the wrapper div\n var wrapper = document.createElement('div');\n wrapper.setAttribute('class', config.classes.videoWrapper);\n\n // Wrap the video in a container\n _wrap(plyr.media, wrapper);\n\n // Cache the container\n plyr.videoContainer = wrapper;\n }\n }\n\n // Embeds\n if (_inArray(config.types.embed, plyr.type)) {\n _setupEmbed();\n }\n }\n\n // Setup YouTube/Vimeo\n function _setupEmbed() {\n var container = document.createElement('div'),\n mediaId,\n id = plyr.type + '-' + Math.floor(Math.random() * (10000));\n\n // Parse IDs from URLs if supplied\n switch (plyr.type) {\n case 'youtube':\n mediaId = _parseYouTubeId(plyr.embedId);\n break;\n\n case 'vimeo':\n mediaId = _parseVimeoId(plyr.embedId);\n break;\n\n default:\n mediaId = plyr.embedId;\n }\n\n // Remove old containers\n var containers = _getElements('[id^=\"' + plyr.type + '-\"]');\n for (var i = containers.length - 1; i >= 0; i--) {\n _remove(containers[i]);\n }\n\n // Add embed class for responsive\n _toggleClass(plyr.media, config.classes.videoWrapper, true);\n _toggleClass(plyr.media, config.classes.embedWrapper, true);\n\n if (plyr.type === 'youtube') {\n // Create the YouTube container\n plyr.media.appendChild(container);\n\n // Set ID\n container.setAttribute('id', id);\n\n // Setup API\n if (_is.object(window.YT)) {\n _youTubeReady(mediaId, container);\n } else {\n // Load the API\n _injectScript(config.urls.youtube.api);\n\n // Setup callback for the API\n window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n // Add to queue\n window.onYouTubeReadyCallbacks.push(function() { _youTubeReady(mediaId, container); });\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = function () {\n window.onYouTubeReadyCallbacks.forEach(function(callback) { callback(); });\n };\n }\n } else if (plyr.type === 'vimeo') {\n // Vimeo needs an extra div to hide controls on desktop (which has full support)\n if (plyr.supported.full) {\n plyr.media.appendChild(container);\n } else {\n container = plyr.media;\n }\n\n // Set ID\n container.setAttribute('id', id);\n\n // Load the API if not already\n if (!_is.object(window.Vimeo)) {\n _injectScript(config.urls.vimeo.api);\n\n // Wait for fragaloop load\n var vimeoTimer = window.setInterval(function() {\n if (_is.object(window.Vimeo)) {\n window.clearInterval(vimeoTimer);\n _vimeoReady(mediaId, container);\n }\n }, 50);\n } else {\n _vimeoReady(mediaId, container);\n }\n } else if (plyr.type === 'soundcloud') {\n // TODO: Currently unsupported and undocumented\n // Inject the iframe\n var soundCloud = document.createElement('iframe');\n\n // Watch for iframe load\n soundCloud.loaded = false;\n _on(soundCloud, 'load', function() { soundCloud.loaded = true; });\n\n _setAttributes(soundCloud, {\n 'src': 'https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/' + mediaId,\n 'id': id\n });\n\n container.appendChild(soundCloud);\n plyr.media.appendChild(container);\n\n // Load the API if not already\n if (!window.SC) {\n _injectScript(config.urls.soundcloud.api);\n }\n\n // Wait for SC load\n var soundCloudTimer = window.setInterval(function() {\n if (window.SC && soundCloud.loaded) {\n window.clearInterval(soundCloudTimer);\n _soundcloudReady.call(soundCloud);\n }\n }, 50);\n }\n }\n\n // When embeds are ready\n function _embedReady() {\n // Setup the UI and call ready if full support\n if (plyr.supported.full) {\n _setupInterface();\n _ready();\n }\n\n // Set title\n _setTitle(_getElement('iframe'));\n }\n\n // Handle YouTube API ready\n function _youTubeReady(videoId, container) {\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n plyr.embed = new window.YT.Player(container.id, {\n videoId: videoId,\n playerVars: {\n autoplay: (config.autoplay ? 1 : 0),\n controls: (plyr.supported.full ? 0 : 1),\n rel: 0,\n showinfo: 0,\n iv_load_policy: 3,\n cc_load_policy: (config.captions.defaultActive ? 1 : 0),\n cc_lang_pref: 'en',\n wmode: 'transparent',\n modestbranding: 1,\n disablekb: 1,\n origin: '*' // https://code.google.com/p/gdata-issues/issues/detail?id=5788#c45\n },\n events: {\n 'onError': function(event) {\n _triggerEvent(plyr.container, 'error', true, {\n code: event.data,\n embed: event.target\n });\n },\n 'onReady': function(event) {\n // Get the instance\n var instance = event.target;\n\n // Create a faux HTML5 API using the YouTube API\n plyr.media.play = function() {\n instance.playVideo();\n plyr.media.paused = false;\n };\n plyr.media.pause = function() {\n instance.pauseVideo();\n plyr.media.paused = true;\n };\n plyr.media.stop = function() {\n instance.stopVideo();\n plyr.media.paused = true;\n };\n plyr.media.duration = instance.getDuration();\n plyr.media.paused = true;\n plyr.media.currentTime = 0;\n plyr.media.muted = instance.isMuted();\n\n // Set title\n config.title = instance.getVideoData().title;\n\n // Set the tabindex\n if (plyr.supported.full) {\n plyr.media.querySelector('iframe').setAttribute('tabindex', '-1');\n }\n\n // Update UI\n _embedReady();\n\n // Trigger timeupdate\n _triggerEvent(plyr.media, 'timeupdate');\n\n // Trigger timeupdate\n _triggerEvent(plyr.media, 'durationchange');\n\n // Reset timer\n window.clearInterval(timers.buffering);\n\n // Setup buffering\n timers.buffering = window.setInterval(function() {\n // Get loaded % from YouTube\n plyr.media.buffered = instance.getVideoLoadedFraction();\n\n // Trigger progress only when we actually buffer something\n if (plyr.media.lastBuffered === null || plyr.media.lastBuffered < plyr.media.buffered) {\n _triggerEvent(plyr.media, 'progress');\n }\n\n // Set last buffer point\n plyr.media.lastBuffered = plyr.media.buffered;\n\n // Bail if we're at 100%\n if (plyr.media.buffered === 1) {\n window.clearInterval(timers.buffering);\n\n // Trigger event\n _triggerEvent(plyr.media, 'canplaythrough');\n }\n }, 200);\n },\n 'onStateChange': function(event) {\n // Get the instance\n var instance = event.target;\n\n // Reset timer\n window.clearInterval(timers.playing);\n\n // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n switch (event.data) {\n case 0:\n plyr.media.paused = true;\n _triggerEvent(plyr.media, 'ended');\n break;\n\n case 1:\n plyr.media.paused = false;\n\n // If we were seeking, fire seeked event\n if (plyr.media.seeking) {\n _triggerEvent(plyr.media, 'seeked');\n }\n\n plyr.media.seeking = false;\n _triggerEvent(plyr.media, 'play');\n _triggerEvent(plyr.media, 'playing');\n\n // Poll to get playback progress\n timers.playing = window.setInterval(function() {\n // Set the current time\n plyr.media.currentTime = instance.getCurrentTime();\n\n // Trigger timeupdate\n _triggerEvent(plyr.media, 'timeupdate');\n }, 100);\n\n // Check duration again due to YouTube bug\n // https://github.com/sampotts/plyr/issues/374\n // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n if (plyr.media.duration !== instance.getDuration()) {\n plyr.media.duration = instance.getDuration();\n _triggerEvent(plyr.media, 'durationchange');\n }\n\n break;\n\n case 2:\n plyr.media.paused = true;\n _triggerEvent(plyr.media, 'pause');\n break;\n }\n\n _triggerEvent(plyr.container, 'statechange', false, {\n code: event.data\n });\n }\n }\n });\n }\n\n // Vimeo ready\n function _vimeoReady(mediaId, container) {\n // Setup instance\n // https://github.com/vimeo/player.js\n plyr.embed = new window.Vimeo.Player(container, {\n id: parseInt(mediaId),\n loop: config.loop,\n autoplay: config.autoplay,\n byline: false,\n portrait: false,\n title: false\n });\n\n // Create a faux HTML5 API using the Vimeo API\n plyr.media.play = function() {\n plyr.embed.play();\n plyr.media.paused = false;\n };\n plyr.media.pause = function() {\n plyr.embed.pause();\n plyr.media.paused = true;\n };\n plyr.media.stop = function() {\n plyr.embed.stop();\n plyr.media.paused = true;\n };\n\n plyr.media.paused = true;\n plyr.media.currentTime = 0;\n\n // Update UI\n _embedReady();\n\n plyr.embed.getCurrentTime().then(function(value) {\n plyr.media.currentTime = value;\n\n // Trigger timeupdate\n _triggerEvent(plyr.media, 'timeupdate');\n });\n\n plyr.embed.getDuration().then(function(value) {\n plyr.media.duration = value;\n\n // Trigger timeupdate\n _triggerEvent(plyr.media, 'durationchange');\n });\n\n // TODO: Captions\n /*if (config.captions.defaultActive) {\n plyr.embed.enableTextTrack('en');\n }*/\n\n plyr.embed.on('loaded', function() {\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n if (_is.htmlElement(plyr.embed.element) && plyr.supported.full) {\n plyr.embed.element.setAttribute('tabindex', '-1');\n }\n });\n\n plyr.embed.on('play', function() {\n plyr.media.paused = false;\n _triggerEvent(plyr.media, 'play');\n _triggerEvent(plyr.media, 'playing');\n });\n\n plyr.embed.on('pause', function() {\n plyr.media.paused = true;\n _triggerEvent(plyr.media, 'pause');\n });\n\n plyr.embed.on('timeupdate', function(data) {\n plyr.media.seeking = false;\n plyr.media.currentTime = data.seconds;\n _triggerEvent(plyr.media, 'timeupdate');\n });\n\n plyr.embed.on('progress', function(data) {\n plyr.media.buffered = data.percent;\n _triggerEvent(plyr.media, 'progress');\n\n if (parseInt(data.percent) === 1) {\n // Trigger event\n _triggerEvent(plyr.media, 'canplaythrough');\n }\n });\n\n plyr.embed.on('seeked', function() {\n plyr.media.seeking = false;\n _triggerEvent(plyr.media, 'seeked');\n _triggerEvent(plyr.media, 'play');\n });\n\n plyr.embed.on('ended', function() {\n plyr.media.paused = true;\n _triggerEvent(plyr.media, 'ended');\n });\n }\n\n // Soundcloud ready\n function _soundcloudReady() {\n /* jshint validthis: true */\n plyr.embed = window.SC.Widget(this);\n\n // Setup on ready\n plyr.embed.bind(window.SC.Widget.Events.READY, function() {\n // Create a faux HTML5 API using the Soundcloud API\n plyr.media.play = function() {\n plyr.embed.play();\n plyr.media.paused = false;\n };\n plyr.media.pause = function() {\n plyr.embed.pause();\n plyr.media.paused = true;\n };\n plyr.media.stop = function() {\n plyr.embed.seekTo(0);\n plyr.embed.pause();\n plyr.media.paused = true;\n };\n\n plyr.media.paused = true;\n plyr.media.currentTime = 0;\n\n plyr.embed.getDuration(function(value) {\n plyr.media.duration = value/1000;\n\n // Update UI\n _embedReady();\n });\n\n plyr.embed.getPosition(function(value) {\n plyr.media.currentTime = value;\n\n // Trigger timeupdate\n _triggerEvent(plyr.media, 'timeupdate');\n });\n\n plyr.embed.bind(window.SC.Widget.Events.PLAY, function() {\n plyr.media.paused = false;\n _triggerEvent(plyr.media, 'play');\n _triggerEvent(plyr.media, 'playing');\n });\n\n plyr.embed.bind(window.SC.Widget.Events.PAUSE, function() {\n plyr.media.paused = true;\n _triggerEvent(plyr.media, 'pause');\n });\n\n plyr.embed.bind(window.SC.Widget.Events.PLAY_PROGRESS, function(data) {\n plyr.media.seeking = false;\n plyr.media.currentTime = data.currentPosition/1000;\n _triggerEvent(plyr.media, 'timeupdate');\n });\n\n plyr.embed.bind(window.SC.Widget.Events.LOAD_PROGRESS, function(data) {\n plyr.media.buffered = data.loadProgress;\n _triggerEvent(plyr.media, 'progress');\n\n if (parseInt(data.loadProgress) === 1) {\n // Trigger event\n _triggerEvent(plyr.media, 'canplaythrough');\n }\n });\n\n plyr.embed.bind(window.SC.Widget.Events.FINISH, function() {\n plyr.media.paused = true;\n _triggerEvent(plyr.media, 'ended');\n });\n });\n }\n\n // Play media\n function _play() {\n if ('play' in plyr.media) {\n plyr.media.play();\n }\n }\n\n // Pause media\n function _pause() {\n if ('pause' in plyr.media) {\n plyr.media.pause();\n }\n }\n\n // Toggle playback\n function _togglePlay(toggle) {\n // True toggle\n if (!_is.boolean(toggle)) {\n toggle = plyr.media.paused;\n }\n\n if (toggle) {\n _play();\n } else {\n _pause();\n }\n\n return toggle;\n }\n\n // Rewind\n function _rewind(seekTime) {\n // Use default if needed\n if (!_is.number(seekTime)) {\n seekTime = config.seekTime;\n }\n _seek(plyr.media.currentTime - seekTime);\n }\n\n // Fast forward\n function _forward(seekTime) {\n // Use default if needed\n if (!_is.number(seekTime)) {\n seekTime = config.seekTime;\n }\n _seek(plyr.media.currentTime + seekTime);\n }\n\n // Seek to time\n // The input parameter can be an event or a number\n function _seek(input) {\n var targetTime = 0,\n paused = plyr.media.paused,\n duration = _getDuration();\n\n if (_is.number(input)) {\n targetTime = input;\n } else if (_is.object(input) && _inArray(['input', 'change'], input.type)) {\n // It's the seek slider\n // Seek to the selected time\n targetTime = ((input.target.value / input.target.max) * duration);\n }\n\n // Normalise targetTime\n if (targetTime < 0) {\n targetTime = 0;\n } else if (targetTime > duration) {\n targetTime = duration;\n }\n\n // Update seek range and progress\n _updateSeekDisplay(targetTime);\n\n // Set the current time\n // Try/catch incase the media isn't set and we're calling seek() from source() and IE moans\n try {\n plyr.media.currentTime = targetTime.toFixed(4);\n }\n catch(e) {}\n\n // Embeds\n if (_inArray(config.types.embed, plyr.type)) {\n switch(plyr.type) {\n case 'youtube':\n plyr.embed.seekTo(targetTime);\n break;\n\n case 'vimeo':\n // Round to nearest second for vimeo\n plyr.embed.setCurrentTime(targetTime.toFixed(0));\n break;\n\n case 'soundcloud':\n plyr.embed.seekTo(targetTime * 1000);\n break;\n }\n\n if (paused) {\n _pause();\n }\n\n // Trigger timeupdate\n _triggerEvent(plyr.media, 'timeupdate');\n\n // Set seeking flag\n plyr.media.seeking = true;\n\n // Trigger seeking\n _triggerEvent(plyr.media, 'seeking');\n }\n\n // Logging\n _log('Seeking to ' + plyr.media.currentTime + ' seconds');\n\n // Special handling for 'manual' captions\n _seekManualCaptions(targetTime);\n }\n\n // Get the duration (or custom if set)\n function _getDuration() {\n // It should be a number, but parse it just incase\n var duration = parseInt(config.duration),\n\n // True duration\n mediaDuration = 0;\n\n // Only if duration available\n if (plyr.media.duration !== null && !isNaN(plyr.media.duration)) {\n mediaDuration = plyr.media.duration;\n }\n\n // If custom duration is funky, use regular duration\n return (isNaN(duration) ? mediaDuration : duration);\n }\n\n // Check playing state\n function _checkPlaying() {\n _toggleClass(plyr.container, config.classes.playing, !plyr.media.paused);\n\n _toggleClass(plyr.container, config.classes.stopped, plyr.media.paused);\n\n _toggleControls(plyr.media.paused);\n }\n\n // Save scroll position\n function _saveScrollPosition() {\n scroll = {\n x: window.pageXOffset || 0,\n y: window.pageYOffset || 0\n };\n }\n\n // Restore scroll position\n function _restoreScrollPosition() {\n window.scrollTo(scroll.x, scroll.y);\n }\n\n // Toggle fullscreen\n function _toggleFullscreen(event) {\n // Check for native support\n var nativeSupport = fullscreen.supportsFullScreen;\n\n if (nativeSupport) {\n // If it's a fullscreen change event, update the UI\n if (event && event.type === fullscreen.fullScreenEventName) {\n plyr.isFullscreen = fullscreen.isFullScreen(plyr.container);\n } else {\n // Else it's a user request to enter or exit\n if (!fullscreen.isFullScreen(plyr.container)) {\n // Save scroll position\n _saveScrollPosition();\n\n // Request full screen\n fullscreen.requestFullScreen(plyr.container);\n } else {\n // Bail from fullscreen\n fullscreen.cancelFullScreen();\n }\n\n // Check if we're actually full screen (it could fail)\n plyr.isFullscreen = fullscreen.isFullScreen(plyr.container);\n\n return;\n }\n } else {\n // Otherwise, it's a simple toggle\n plyr.isFullscreen = !plyr.isFullscreen;\n\n // Bind/unbind escape key\n document.body.style.overflow = plyr.isFullscreen ? 'hidden' : '';\n }\n\n // Set class hook\n _toggleClass(plyr.container, config.classes.fullscreen.active, plyr.isFullscreen);\n\n // Trap focus\n _focusTrap(plyr.isFullscreen);\n\n // Set button state\n if (plyr.buttons && plyr.buttons.fullscreen) {\n _toggleState(plyr.buttons.fullscreen, plyr.isFullscreen);\n }\n\n // Trigger an event\n _triggerEvent(plyr.container, plyr.isFullscreen ? 'enterfullscreen' : 'exitfullscreen', true);\n\n // Restore scroll position\n if (!plyr.isFullscreen && nativeSupport) {\n _restoreScrollPosition();\n }\n }\n\n // Mute\n function _toggleMute(muted) {\n // If the method is called without parameter, toggle based on current value\n if (!_is.boolean(muted)) {\n muted = !plyr.media.muted;\n }\n\n // Set button state\n _toggleState(plyr.buttons.mute, muted);\n\n // Set mute on the player\n plyr.media.muted = muted;\n\n // If volume is 0 after unmuting, set to default\n if (plyr.media.volume === 0) {\n _setVolume(config.volume);\n }\n\n // Embeds\n if (_inArray(config.types.embed, plyr.type)) {\n // YouTube\n switch(plyr.type) {\n case 'youtube':\n plyr.embed[plyr.media.muted ? 'mute' : 'unMute']();\n break;\n\n case 'vimeo':\n case 'soundcloud':\n plyr.embed.setVolume(plyr.media.muted ? 0 : parseFloat(config.volume / config.volumeMax));\n break;\n }\n\n // Trigger volumechange for embeds\n _triggerEvent(plyr.media, 'volumechange');\n }\n }\n\n // Set volume\n function _setVolume(volume) {\n var max = config.volumeMax,\n min = config.volumeMin;\n\n // Load volume from storage if no value specified\n if (_is.undefined(volume)) {\n volume = plyr.storage.volume;\n }\n\n // Use config if all else fails\n if (volume === null || isNaN(volume)) {\n volume = config.volume;\n }\n\n // Maximum is volumeMax\n if (volume > max) {\n volume = max;\n }\n // Minimum is volumeMin\n if (volume < min) {\n volume = min;\n }\n\n // Set the player volume\n plyr.media.volume = parseFloat(volume / max);\n\n // Set the display\n if (plyr.volume.display) {\n plyr.volume.display.value = volume;\n }\n\n // Embeds\n if (_inArray(config.types.embed, plyr.type)) {\n switch(plyr.type) {\n case 'youtube':\n plyr.embed.setVolume(plyr.media.volume * 100);\n break;\n\n case 'vimeo':\n case 'soundcloud':\n plyr.embed.setVolume(plyr.media.volume);\n break;\n }\n\n // Trigger volumechange for embeds\n _triggerEvent(plyr.media, 'volumechange');\n }\n\n // Toggle muted state\n if (volume === 0) {\n plyr.media.muted = true;\n } else if (plyr.media.muted && volume > 0) {\n _toggleMute();\n }\n }\n\n // Increase volume\n function _increaseVolume(step) {\n var volume = plyr.media.muted ? 0 : (plyr.media.volume * config.volumeMax);\n\n if (!_is.number(step)) {\n step = config.volumeStep;\n }\n\n _setVolume(volume + step);\n }\n\n // Decrease volume\n function _decreaseVolume(step) {\n var volume = plyr.media.muted ? 0 : (plyr.media.volume * config.volumeMax);\n\n if (!_is.number(step)) {\n step = config.volumeStep;\n }\n\n _setVolume(volume - step);\n }\n\n // Update volume UI and storage\n function _updateVolume() {\n // Get the current volume\n var volume = plyr.media.muted ? 0 : (plyr.media.volume * config.volumeMax);\n\n // Update the if present\n if (plyr.supported.full) {\n if (plyr.volume.input) {\n plyr.volume.input.value = volume;\n }\n if (plyr.volume.display) {\n plyr.volume.display.value = volume;\n }\n }\n\n // Update the volume in storage\n _updateStorage({volume: volume});\n\n // Toggle class if muted\n _toggleClass(plyr.container, config.classes.muted, (volume === 0));\n\n // Update checkbox for mute state\n if (plyr.supported.full && plyr.buttons.mute) {\n _toggleState(plyr.buttons.mute, (volume === 0));\n }\n }\n\n // Toggle captions\n function _toggleCaptions(show) {\n // If there's no full support, or there's no caption toggle\n if (!plyr.supported.full || !plyr.buttons.captions) {\n return;\n }\n\n // If the method is called without parameter, toggle based on current value\n if (!_is.boolean(show)) {\n show = (plyr.container.className.indexOf(config.classes.captions.active) === -1);\n }\n\n // Set global\n plyr.captionsEnabled = show;\n\n // Toggle state\n _toggleState(plyr.buttons.captions, plyr.captionsEnabled);\n\n // Add class hook\n _toggleClass(plyr.container, config.classes.captions.active, plyr.captionsEnabled);\n\n // Trigger an event\n _triggerEvent(plyr.container, plyr.captionsEnabled ? 'captionsenabled' : 'captionsdisabled', true);\n\n // Save captions state to localStorage\n _updateStorage({captionsEnabled: plyr.captionsEnabled});\n }\n\n // Check if media is loading\n function _checkLoading(event) {\n var loading = (event.type === 'waiting');\n\n // Clear timer\n clearTimeout(timers.loading);\n\n // Timer to prevent flicker when seeking\n timers.loading = setTimeout(function() {\n // Toggle container class hook\n _toggleClass(plyr.container, config.classes.loading, loading);\n\n // Show controls if loading, hide if done\n _toggleControls(loading);\n }, (loading ? 250 : 0));\n }\n\n // Update elements\n function _updateProgress(event) {\n if (!plyr.supported.full) {\n return;\n }\n\n var progress = plyr.progress.played,\n value = 0,\n duration = _getDuration();\n\n if (event) {\n switch (event.type) {\n // Video playing\n case 'timeupdate':\n case 'seeking':\n if (plyr.controls.pressed) {\n return;\n }\n\n value = _getPercentage(plyr.media.currentTime, duration);\n\n // Set seek range value only if it's a 'natural' time event\n if (event.type === 'timeupdate' && plyr.buttons.seek) {\n plyr.buttons.seek.value = value;\n }\n\n break;\n\n // Check buffer status\n case 'playing':\n case 'progress':\n progress = plyr.progress.buffer;\n value = (function() {\n var buffered = plyr.media.buffered;\n\n if (buffered && buffered.length) {\n // HTML5\n return _getPercentage(buffered.end(0), duration);\n } else if (_is.number(buffered)) {\n // YouTube returns between 0 and 1\n return (buffered * 100);\n }\n\n return 0;\n })();\n\n break;\n }\n }\n\n // Set values\n _setProgress(progress, value);\n }\n\n // Set value\n function _setProgress(progress, value) {\n if (!plyr.supported.full) {\n return;\n }\n\n // Default to 0\n if (_is.undefined(value)) {\n value = 0;\n }\n // Default to buffer or bail\n if (_is.undefined(progress)) {\n if (plyr.progress && plyr.progress.buffer) {\n progress = plyr.progress.buffer;\n } else {\n return;\n }\n }\n\n // One progress element passed\n if (_is.htmlElement(progress)) {\n progress.value = value;\n } else if (progress) {\n // Object of progress + text element\n if (progress.bar) {\n progress.bar.value = value;\n }\n if (progress.text) {\n progress.text.innerHTML = value;\n }\n }\n }\n\n // Update the displayed time\n function _updateTimeDisplay(time, element) {\n // Bail if there's no duration display\n if (!element) {\n return;\n }\n\n // Fallback to 0\n if (isNaN(time)) {\n time = 0;\n }\n\n plyr.secs = parseInt(time % 60);\n plyr.mins = parseInt((time / 60) % 60);\n plyr.hours = parseInt(((time / 60) / 60) % 60);\n\n // Do we need to display hours?\n var displayHours = (parseInt(((_getDuration() / 60) / 60) % 60) > 0);\n\n // Ensure it's two digits. For example, 03 rather than 3.\n plyr.secs = ('0' + plyr.secs).slice(-2);\n plyr.mins = ('0' + plyr.mins).slice(-2);\n\n // Render\n element.innerHTML = (displayHours ? plyr.hours + ':' : '') + plyr.mins + ':' + plyr.secs;\n }\n\n // Show the duration on metadataloaded\n function _displayDuration() {\n if (!plyr.supported.full) {\n return;\n }\n\n // Determine duration\n var duration = _getDuration() || 0;\n\n // If there's only one time display, display duration there\n if (!plyr.duration && config.displayDuration && plyr.media.paused) {\n _updateTimeDisplay(duration, plyr.currentTime);\n }\n\n // If there's a duration element, update content\n if (plyr.duration) {\n _updateTimeDisplay(duration, plyr.duration);\n }\n\n // Update the tooltip (if visible)\n _updateSeekTooltip();\n }\n\n // Handle time change event\n function _timeUpdate(event) {\n // Duration\n _updateTimeDisplay(plyr.media.currentTime, plyr.currentTime);\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && plyr.media.seeking) {\n return;\n }\n\n // Playing progress\n _updateProgress(event);\n }\n\n // Update seek range and progress\n function _updateSeekDisplay(time) {\n // Default to 0\n if (!_is.number(time)) {\n time = 0;\n }\n\n var duration = _getDuration(),\n value = _getPercentage(time, duration);\n\n // Update progress\n if (plyr.progress && plyr.progress.played) {\n plyr.progress.played.value = value;\n }\n\n // Update seek range input\n if (plyr.buttons && plyr.buttons.seek) {\n plyr.buttons.seek.value = value;\n }\n }\n\n // Update hover tooltip for seeking\n function _updateSeekTooltip(event) {\n var duration = _getDuration();\n\n // Bail if setting not true\n if (!config.tooltips.seek || !plyr.progress.container || duration === 0) {\n return;\n }\n\n // Calculate percentage\n var clientRect = plyr.progress.container.getBoundingClientRect(),\n percent = 0,\n visible = config.classes.tooltip + '--visible';\n\n // Determine percentage, if already visible\n if (!event) {\n if (_hasClass(plyr.progress.tooltip, visible)) {\n percent = plyr.progress.tooltip.style.left.replace('%', '');\n } else {\n return;\n }\n } else {\n percent = ((100 / clientRect.width) * (event.pageX - clientRect.left));\n }\n\n // Set bounds\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n }\n\n // Display the time a click would seek to\n _updateTimeDisplay(((duration / 100) * percent), plyr.progress.tooltip);\n\n // Set position\n plyr.progress.tooltip.style.left = percent + \"%\";\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (event && _inArray(['mouseenter', 'mouseleave'], event.type)) {\n _toggleClass(plyr.progress.tooltip, visible, (event.type === 'mouseenter'));\n }\n }\n\n // Show the player controls in fullscreen mode\n function _toggleControls(toggle) {\n // Don't hide if config says not to, it's audio, or not ready or loading\n if (!config.hideControls || plyr.type === 'audio') {\n return;\n }\n\n var delay = 0,\n isEnterFullscreen = false,\n show = toggle,\n loading = _hasClass(plyr.container, config.classes.loading);\n\n // Default to false if no boolean\n if (!_is.boolean(toggle)) {\n if (toggle && toggle.type) {\n // Is the enter fullscreen event\n isEnterFullscreen = (toggle.type === 'enterfullscreen');\n\n // Whether to show controls\n show = _inArray(['mousemove', 'touchstart', 'mouseenter', 'focus'], toggle.type);\n\n // Delay hiding on move events\n if (_inArray(['mousemove', 'touchmove'], toggle.type)) {\n delay = 2000;\n }\n\n // Delay a little more for keyboard users\n if (toggle.type === 'focus') {\n delay = 3000;\n }\n } else {\n show = _hasClass(plyr.container, config.classes.hideControls);\n }\n }\n\n // Clear timer every movement\n window.clearTimeout(timers.hover);\n\n // If the mouse is not over the controls, set a timeout to hide them\n if (show || plyr.media.paused || loading) {\n _toggleClass(plyr.container, config.classes.hideControls, false);\n\n // Always show controls when paused or if touch\n if (plyr.media.paused || loading) {\n return;\n }\n\n // Delay for hiding on touch\n if (plyr.browser.isTouch) {\n delay = 3000;\n }\n }\n\n // If toggle is false or if we're playing (regardless of toggle),\n // then set the timer to hide the controls\n if (!show || !plyr.media.paused) {\n timers.hover = window.setTimeout(function() {\n // If the mouse is over the controls (and not entering fullscreen), bail\n if ((plyr.controls.pressed || plyr.controls.hover) && !isEnterFullscreen) {\n return;\n }\n\n _toggleClass(plyr.container, config.classes.hideControls, true);\n }, delay);\n }\n }\n\n // Add common function to retrieve media source\n function _source(source) {\n // If not null or undefined, parse it\n if (!_is.undefined(source)) {\n _updateSource(source);\n return;\n }\n\n // Return the current source\n var url;\n switch(plyr.type) {\n case 'youtube':\n url = plyr.embed.getVideoUrl();\n break;\n\n case 'vimeo':\n plyr.embed.getVideoUrl.then(function (value) {\n url = value;\n });\n break;\n\n case 'soundcloud':\n plyr.embed.getCurrentSound(function(object) {\n url = object.permalink_url;\n });\n break;\n\n default:\n url = plyr.media.currentSrc;\n break;\n }\n\n return url || '';\n }\n\n // Update source\n // Sources are not checked for support so be careful\n function _updateSource(source) {\n if (!_is.object(source) || !('sources' in source) || !source.sources.length) {\n _warn('Invalid source format');\n return;\n }\n\n // Remove ready class hook\n _toggleClass(plyr.container, config.classes.ready, false);\n\n // Pause playback\n _pause();\n\n // Update seek range and progress\n _updateSeekDisplay();\n\n // Reset buffer progress\n _setProgress();\n\n // Cancel current network requests\n _cancelRequests();\n\n // Setup new source\n function setup() {\n // Remove embed object\n plyr.embed = null;\n\n // Remove the old media\n _remove(plyr.media);\n\n // Remove video container\n if (plyr.type === 'video' && plyr.videoContainer) {\n _remove(plyr.videoContainer);\n }\n\n // Reset class name\n if (plyr.container) {\n plyr.container.removeAttribute('class');\n }\n\n // Set the type\n if ('type' in source) {\n plyr.type = source.type;\n\n // Get child type for video (it might be an embed)\n if (plyr.type === 'video') {\n var firstSource = source.sources[0];\n\n if ('type' in firstSource && _inArray(config.types.embed, firstSource.type)) {\n plyr.type = firstSource.type;\n }\n }\n }\n\n // Check for support\n plyr.supported = supported(plyr.type);\n\n // Create new markup\n switch(plyr.type) {\n case 'video':\n plyr.media = document.createElement('video');\n break;\n\n case 'audio':\n plyr.media = document.createElement('audio');\n break;\n\n case 'youtube':\n case 'vimeo':\n case 'soundcloud':\n plyr.media = document.createElement('div');\n plyr.embedId = source.sources[0].src;\n break;\n }\n\n // Inject the new element\n _prependChild(plyr.container, plyr.media);\n\n // Autoplay the new source?\n if (_is.boolean(source.autoplay)) {\n config.autoplay = source.autoplay;\n }\n\n // Set attributes for audio and video\n if (_inArray(config.types.html5, plyr.type)) {\n if (config.crossorigin) {\n plyr.media.setAttribute('crossorigin', '');\n }\n if (config.autoplay) {\n plyr.media.setAttribute('autoplay', '');\n }\n if ('poster' in source) {\n plyr.media.setAttribute('poster', source.poster);\n }\n if (config.loop) {\n plyr.media.setAttribute('loop', '');\n }\n }\n\n // Restore class hooks\n _toggleClass(plyr.container, config.classes.fullscreen.active, plyr.isFullscreen);\n _toggleClass(plyr.container, config.classes.captions.active, plyr.captionsEnabled);\n _toggleStyleHook();\n\n // Set new sources for html5\n if (_inArray(config.types.html5, plyr.type)) {\n _insertChildElements('source', source.sources);\n }\n\n // Set up from scratch\n _setupMedia();\n\n // HTML5 stuff\n if (_inArray(config.types.html5, plyr.type)) {\n // Setup captions\n if ('tracks' in source) {\n _insertChildElements('track', source.tracks);\n }\n\n // Load HTML5 sources\n plyr.media.load();\n }\n\n // If HTML5 or embed but not fully supported, setupInterface and call ready now\n if (_inArray(config.types.html5, plyr.type) || (_inArray(config.types.embed, plyr.type) && !plyr.supported.full)) {\n // Setup interface\n _setupInterface();\n\n // Call ready\n _ready();\n }\n\n // Set aria title and iframe title\n config.title = source.title;\n _setTitle();\n }\n\n // Destroy instance adn wait for callback\n // Vimeo throws a wobbly if you don't wait\n _destroy(setup, false);\n }\n\n // Update poster\n function _updatePoster(source) {\n if (plyr.type === 'video') {\n plyr.media.setAttribute('poster', source);\n }\n }\n\n // Listen for control events\n function _controlListeners() {\n // IE doesn't support input event, so we fallback to change\n var inputEvent = (plyr.browser.isIE ? 'change' : 'input');\n\n // Click play/pause helper\n function togglePlay() {\n var play = _togglePlay();\n\n // Determine which buttons\n var trigger = plyr.buttons[play ? 'play' : 'pause'],\n target = plyr.buttons[play ? 'pause' : 'play'];\n\n // Get the last play button to account for the large play button\n if (target && target.length > 1) {\n target = target[target.length - 1];\n } else {\n target = target[0];\n }\n\n // Setup focus and tab focus\n if (target) {\n var hadTabFocus = _hasClass(trigger, config.classes.tabFocus);\n\n setTimeout(function() {\n target.focus();\n\n if (hadTabFocus) {\n _toggleClass(trigger, config.classes.tabFocus, false);\n _toggleClass(target, config.classes.tabFocus, true);\n }\n }, 100);\n }\n }\n\n // Get the focused element\n function getFocusElement() {\n var focused = document.activeElement;\n\n if (!focused || focused === document.body) {\n focused = null;\n } else {\n focused = document.querySelector(':focus');\n }\n\n return focused;\n }\n\n // Get the key code for an event\n function getKeyCode(event) {\n return event.keyCode ? event.keyCode : event.which;\n }\n\n // Detect tab focus\n function checkTabFocus(focused) {\n for (var button in plyr.buttons) {\n var element = plyr.buttons[button];\n\n if (_is.nodeList(element)) {\n for (var i = 0; i < element.length; i++) {\n _toggleClass(element[i], config.classes.tabFocus, (element[i] === focused));\n }\n } else {\n _toggleClass(element, config.classes.tabFocus, (element === focused));\n }\n }\n }\n\n // Keyboard shortcuts\n if (config.keyboardShorcuts.focused) {\n var last = null;\n\n // Handle global presses\n if (config.keyboardShorcuts.global) {\n _on(window, 'keydown keyup', function(event) {\n var code = getKeyCode(event),\n focused = getFocusElement(),\n allowed = [48,49,50,51,52,53,54,56,57,75,77,70,67],\n count = get().length;\n\n // Only handle global key press if there's only one player\n // and the key is in the allowed keys\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n if (count === 1 && _inArray(allowed, code) && (!_is.htmlElement(focused) || !_matches(focused, config.selectors.editable))) {\n handleKey(event);\n }\n });\n }\n\n // Handle presses on focused\n _on(plyr.container, 'keydown keyup', handleKey);\n }\n\n function handleKey(event) {\n var code = getKeyCode(event),\n pressed = event.type === 'keydown',\n held = pressed && code === last;\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n if (!_is.number(code)) {\n return;\n }\n\n // Seek by the number keys\n function seekByKey() {\n // Get current duration\n var duration = plyr.media.duration;\n\n // Bail if we have no duration set\n if (!_is.number(duration)) {\n return;\n }\n\n // Divide the max duration into 10th's and times by the number value\n _seek((duration / 10) * (code - 48));\n }\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Which keycodes should we prevent default\n var preventDefault = [48,49,50,51,52,53,54,56,57,32,75,38,40,77,39,37,70,67];\n\n // If the code is found prevent default (e.g. prevent scrolling for arrows)\n if (_inArray(preventDefault, code)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n switch(code) {\n // 0-9\n case 48:\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57: if (!held) { seekByKey(); } break;\n // Space and K key\n case 32:\n case 75: if (!held) { _togglePlay(); } break;\n // Arrow up\n case 38: _increaseVolume(); break;\n // Arrow down\n case 40: _decreaseVolume(); break;\n // M key\n case 77: if (!held) { _toggleMute() } break;\n // Arrow forward\n case 39: _forward(); break;\n // Arrow back\n case 37: _rewind(); break;\n // F key\n case 70: _toggleFullscreen(); break;\n // C key\n case 67: if (!held) { _toggleCaptions(); } break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (!fullscreen.supportsFullScreen && plyr.isFullscreen && code === 27) {\n _toggleFullscreen();\n }\n\n // Store last code for next cycle\n last = code;\n } else {\n last = null;\n }\n }\n\n // Focus/tab management\n _on(window, 'keyup', function(event) {\n var code = getKeyCode(event),\n focused = getFocusElement();\n\n if (code === 9) {\n checkTabFocus(focused);\n }\n });\n _on(document.body, 'click', function() {\n _toggleClass(_getElement('.' + config.classes.tabFocus), config.classes.tabFocus, false);\n });\n for (var button in plyr.buttons) {\n var element = plyr.buttons[button];\n\n _on(element, 'blur', function() {\n _toggleClass(element, 'tab-focus', false);\n });\n }\n\n // Play\n _proxyListener(plyr.buttons.play, 'click', config.listeners.play, togglePlay);\n\n // Pause\n _proxyListener(plyr.buttons.pause, 'click', config.listeners.pause, togglePlay);\n\n // Restart\n _proxyListener(plyr.buttons.restart, 'click', config.listeners.restart, _seek);\n\n // Rewind\n _proxyListener(plyr.buttons.rewind, 'click', config.listeners.rewind, _rewind);\n\n // Fast forward\n _proxyListener(plyr.buttons.forward, 'click', config.listeners.forward, _forward);\n\n // Seek\n _proxyListener(plyr.buttons.seek, inputEvent, config.listeners.seek, _seek);\n\n // Set volume\n _proxyListener(plyr.volume.input, inputEvent, config.listeners.volume, function() {\n _setVolume(plyr.volume.input.value);\n });\n\n // Mute\n _proxyListener(plyr.buttons.mute, 'click', config.listeners.mute, _toggleMute);\n\n // Fullscreen\n _proxyListener(plyr.buttons.fullscreen, 'click', config.listeners.fullscreen, _toggleFullscreen);\n\n // Handle user exiting fullscreen by escaping etc\n if (fullscreen.supportsFullScreen) {\n _on(document, fullscreen.fullScreenEventName, _toggleFullscreen);\n }\n\n // Captions\n _proxyListener(plyr.buttons.captions, 'click', config.listeners.captions, _toggleCaptions);\n\n // Seek tooltip\n _on(plyr.progress.container, 'mouseenter mouseleave mousemove', _updateSeekTooltip);\n\n // Toggle controls visibility based on mouse movement\n if (config.hideControls) {\n // Toggle controls on mouse events and entering fullscreen\n _on(plyr.container, 'mouseenter mouseleave mousemove touchstart touchend touchcancel touchmove enterfullscreen', _toggleControls);\n\n // Watch for cursor over controls so they don't hide when trying to interact\n _on(plyr.controls, 'mouseenter mouseleave', function(event) {\n plyr.controls.hover = event.type === 'mouseenter';\n });\n\n // Watch for cursor over controls so they don't hide when trying to interact\n _on(plyr.controls, 'mousedown mouseup touchstart touchend touchcancel', function(event) {\n plyr.controls.pressed = _inArray(['mousedown', 'touchstart'], event.type);\n });\n\n // Focus in/out on controls\n _on(plyr.controls, 'focus blur', _toggleControls, true);\n }\n\n // Adjust volume on scroll\n _on(plyr.volume.input, 'wheel', function(event) {\n event.preventDefault();\n\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n var inverted = event.webkitDirectionInvertedFromDevice,\n step = (config.volumeStep / 5);\n\n // Scroll down (or up on natural) to decrease\n if (event.deltaY < 0 || event.deltaX > 0) {\n if (inverted) {\n _decreaseVolume(step);\n } else {\n _increaseVolume(step);\n }\n }\n\n // Scroll up (or down on natural) to increase\n if (event.deltaY > 0 || event.deltaX < 0) {\n if (inverted) {\n _increaseVolume(step);\n } else {\n _decreaseVolume(step);\n }\n }\n });\n }\n\n // Listen for media events\n function _mediaListeners() {\n // Time change on media\n _on(plyr.media, 'timeupdate seeking', _timeUpdate);\n\n // Update manual captions\n _on(plyr.media, 'timeupdate', _seekManualCaptions);\n\n // Display duration\n _on(plyr.media, 'durationchange loadedmetadata', _displayDuration);\n\n // Handle the media finishing\n _on(plyr.media, 'ended', function() {\n // Show poster on end\n if (plyr.type === 'video' && config.showPosterOnEnd) {\n // Clear\n if (plyr.type === 'video') {\n _setCaption();\n }\n\n // Restart\n _seek();\n\n // Re-load media\n plyr.media.load();\n }\n });\n\n // Check for buffer progress\n _on(plyr.media, 'progress playing', _updateProgress);\n\n // Handle native mute\n _on(plyr.media, 'volumechange', _updateVolume);\n\n // Handle native play/pause\n _on(plyr.media, 'play pause ended', _checkPlaying);\n\n // Loading\n _on(plyr.media, 'waiting canplay seeked', _checkLoading);\n\n // Click video\n if (config.clickToPlay && plyr.type !== 'audio') {\n // Re-fetch the wrapper\n var wrapper = _getElement('.' + config.classes.videoWrapper);\n\n // Bail if there's no wrapper (this should never happen)\n if (!wrapper) {\n return;\n }\n\n // Set cursor\n wrapper.style.cursor = \"pointer\";\n\n // On click play, pause ore restart\n _on(wrapper, 'click', function() {\n // Touch devices will just show controls (if we're hiding controls)\n if (config.hideControls && plyr.browser.isTouch && !plyr.media.paused) {\n return;\n }\n\n if (plyr.media.paused) {\n _play();\n } else if (plyr.media.ended) {\n _seek();\n _play();\n } else {\n _pause();\n }\n });\n }\n\n // Disable right click\n if (config.disableContextMenu) {\n _on(plyr.media, 'contextmenu', function(event) { event.preventDefault(); });\n }\n\n // Proxy events to container\n // Bubble up key events for Edge\n _on(plyr.media, config.events.concat(['keyup', 'keydown']).join(' '), function(event) {\n _triggerEvent(plyr.container, event.type, true);\n });\n }\n\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n function _cancelRequests() {\n if (!_inArray(config.types.html5, plyr.type)) {\n return;\n }\n\n // Remove child sources\n var sources = plyr.media.querySelectorAll('source');\n for (var i = 0; i < sources.length; i++) {\n _remove(sources[i]);\n }\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n plyr.media.setAttribute('src', config.blankUrl);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n plyr.media.load();\n\n // Debugging\n _log('Cancelled network requests');\n }\n\n // Destroy an instance\n // Event listeners are removed when elements are removed\n // http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n function _destroy(callback, restore) {\n // Bail if the element is not initialized\n if (!plyr.init) {\n return null;\n }\n\n // Type specific stuff\n switch (plyr.type) {\n case 'youtube':\n // Clear timers\n window.clearInterval(timers.buffering);\n window.clearInterval(timers.playing);\n\n // Destroy YouTube API\n plyr.embed.destroy();\n\n // Clean up\n cleanUp();\n\n break;\n\n case 'vimeo':\n // Destroy Vimeo API\n // then clean up (wait, to prevent postmessage errors)\n plyr.embed.unload().then(cleanUp);\n\n // Vimeo does not always return\n timers.cleanUp = window.setTimeout(cleanUp, 200);\n\n break;\n\n case 'video':\n case 'audio':\n // Restore native video controls\n _toggleNativeControls(true);\n\n // Clean up\n cleanUp();\n\n break;\n }\n\n function cleanUp() {\n clearTimeout(timers.cleanUp);\n\n // Default to restore original element\n if (!_is.boolean(restore)) {\n restore = true;\n }\n\n // Callback\n if (_is.function(callback)) {\n callback.call(original);\n }\n\n // Bail if we don't need to restore the original element\n if (!restore) {\n return;\n }\n\n // Remove init flag\n plyr.init = false;\n\n // Replace the container with the original element provided\n plyr.container.parentNode.replaceChild(original, plyr.container);\n\n // Allow overflow (set on fullscreen)\n document.body.style.overflow = '';\n\n // Event\n _triggerEvent(original, 'destroyed', true);\n }\n }\n\n // Setup a player\n function _init() {\n // Bail if the element is initialized\n if (plyr.init) {\n return null;\n }\n\n // Setup the fullscreen api\n fullscreen = _fullscreen();\n\n // Sniff out the browser\n plyr.browser = _browserSniff();\n\n // Bail if nothing to setup\n if (!_is.htmlElement(plyr.media)) {\n return;\n }\n\n // Load saved settings from localStorage\n _setupStorage();\n\n // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n var tagName = media.tagName.toLowerCase();\n if (tagName === 'div') {\n plyr.type = media.getAttribute('data-type');\n plyr.embedId = media.getAttribute('data-video-id');\n\n // Clean up\n media.removeAttribute('data-type');\n media.removeAttribute('data-video-id');\n } else {\n plyr.type = tagName;\n config.crossorigin = (media.getAttribute('crossorigin') !== null);\n config.autoplay = (config.autoplay || (media.getAttribute('autoplay') !== null));\n config.loop = (config.loop || (media.getAttribute('loop') !== null));\n }\n\n // Check for support\n plyr.supported = supported(plyr.type);\n\n // If no native support, bail\n if (!plyr.supported.basic) {\n return;\n }\n\n // Wrap media\n plyr.container = _wrap(media, document.createElement('div'));\n\n // Allow focus to be captured\n plyr.container.setAttribute('tabindex', 0);\n\n // Add style hook\n _toggleStyleHook();\n\n // Debug info\n _log('' + plyr.browser.name + ' ' + plyr.browser.version);\n\n // Setup media\n _setupMedia();\n\n // Setup interface\n // If embed but not fully supported, setupInterface (to avoid flash of controls) and call ready now\n if (_inArray(config.types.html5, plyr.type) || (_inArray(config.types.embed, plyr.type) && !plyr.supported.full)) {\n // Setup UI\n _setupInterface();\n\n // Call ready\n _ready();\n\n // Set title on button and frame\n _setTitle();\n }\n\n // Successful setup\n plyr.init = true;\n }\n\n // Setup the UI\n function _setupInterface() {\n // Don't setup interface if no support\n if (!plyr.supported.full) {\n _warn('Basic support only', plyr.type);\n\n // Remove controls\n _remove(_getElement(config.selectors.controls.wrapper));\n\n // Remove large play\n _remove(_getElement(config.selectors.buttons.play));\n\n // Restore native controls\n _toggleNativeControls(true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n var controlsMissing = !_getElements(config.selectors.controls.wrapper).length;\n if (controlsMissing) {\n // Inject custom controls\n _injectControls();\n }\n\n // Find the elements\n if (!_findElements()) {\n return;\n }\n\n // If the controls are injected, re-bind listeners for controls\n if (controlsMissing) {\n _controlListeners();\n }\n\n // Media element listeners\n _mediaListeners();\n\n // Remove native controls\n _toggleNativeControls();\n\n // Setup fullscreen\n _setupFullscreen();\n\n // Captions\n _setupCaptions();\n\n // Set volume\n _setVolume();\n _updateVolume();\n\n // Reset time display\n _timeUpdate();\n\n // Update the UI\n _checkPlaying();\n }\n\n api = {\n getOriginal: function() { return original; },\n getContainer: function() { return plyr.container },\n getEmbed: function() { return plyr.embed; },\n getMedia: function() { return plyr.media; },\n getType: function() { return plyr.type; },\n getDuration: _getDuration,\n getCurrentTime: function() { return plyr.media.currentTime; },\n getVolume: function() { return plyr.media.volume; },\n isMuted: function() { return plyr.media.muted; },\n isReady: function() { return _hasClass(plyr.container, config.classes.ready); },\n isLoading: function() { return _hasClass(plyr.container, config.classes.loading); },\n isPaused: function() { return plyr.media.paused; },\n on: function(event, callback) { _on(plyr.container, event, callback); return this; },\n play: _play,\n pause: _pause,\n stop: function() { _pause(); _seek(); },\n restart: _seek,\n rewind: _rewind,\n forward: _forward,\n seek: _seek,\n source: _source,\n poster: _updatePoster,\n setVolume: _setVolume,\n togglePlay: _togglePlay,\n toggleMute: _toggleMute,\n toggleCaptions: _toggleCaptions,\n toggleFullscreen: _toggleFullscreen,\n toggleControls: _toggleControls,\n isFullscreen: function() { return plyr.isFullscreen || false; },\n support: function(mimeType) { return _supportMime(plyr, mimeType); },\n destroy: _destroy\n };\n\n // Everything done\n function _ready() {\n // Ready event at end of execution stack\n window.setTimeout(function() {\n _triggerEvent(plyr.media, 'ready');\n }, 0);\n\n // Set class hook on media element\n _toggleClass(plyr.media, defaults.classes.setup, true);\n\n // Set container class for ready\n _toggleClass(plyr.container, config.classes.ready, true);\n\n // Store a refernce to instance\n plyr.media.plyr = api;\n\n // Autoplay\n if (config.autoplay) {\n _play();\n }\n }\n\n // Initialize instance\n _init();\n\n // If init failed, return null\n if (!plyr.init) {\n return null;\n }\n\n return api;\n }\n\n // Load a sprite\n function loadSprite(url, id) {\n var x = new XMLHttpRequest();\n\n // If the id is set and sprite exists, bail\n if (_is.string(id) && _is.htmlElement(document.querySelector('#' + id))) {\n return;\n }\n\n // Create placeholder (to prevent loading twice)\n var container = document.createElement('div');\n container.setAttribute('hidden', '');\n if (_is.string(id)) {\n container.setAttribute('id', id);\n }\n document.body.insertBefore(container, document.body.childNodes[0]);\n\n // Check for CORS support\n if ('withCredentials' in x) {\n x.open('GET', url, true);\n } else {\n return;\n }\n\n // Inject hidden div with sprite on load\n x.onload = function() {\n container.innerHTML = x.responseText;\n }\n\n x.send();\n }\n\n // Check for support\n function supported(type) {\n var browser = _browserSniff(),\n isOldIE = (browser.isIE && browser.version <= 9),\n isIos = browser.isIos,\n isIphone = browser.isIphone,\n audioSupport = !!document.createElement('audio').canPlayType,\n videoSupport = !!document.createElement('video').canPlayType,\n basic = false,\n full = false;\n\n switch (type) {\n case 'video':\n basic = videoSupport;\n full = (basic && (!isOldIE && !isIphone));\n break;\n\n case 'audio':\n basic = audioSupport;\n full = (basic && !isOldIE);\n break;\n\n // Vimeo does not seem to be supported on iOS via API\n // Issue raised https://github.com/vimeo/player.js/issues/87\n case 'vimeo':\n basic = true;\n full = (!isOldIE && !isIos);\n break;\n\n case 'youtube':\n basic = true;\n full = (!isOldIE && !isIos);\n\n // YouTube seems to work on iOS 10+ on iPad\n if (isIos && !isIphone && browser.version >= 10) {\n full = true;\n }\n\n break;\n\n case 'soundcloud':\n basic = true;\n full = (!isOldIE && !isIphone);\n break;\n\n default:\n basic = (audioSupport && videoSupport);\n full = (basic && !isOldIE);\n }\n\n return {\n basic: basic,\n full: full\n };\n }\n\n // Setup function\n function setup(targets, options) {\n // Get the players\n var players = [],\n instances = [],\n selector = [defaults.selectors.html5, defaults.selectors.embed].join(',');\n\n // Select the elements\n if (_is.string(targets)) {\n // String selector passed\n targets = document.querySelectorAll(targets);\n } else if (_is.htmlElement(targets)) {\n // Single HTMLElement passed\n targets = [targets];\n } else if (!_is.nodeList(targets) && !_is.array(targets) && !_is.string(targets)) {\n // No selector passed, possibly options as first argument\n // If options are the first argument\n if (_is.undefined(options) && _is.object(targets)) {\n options = targets;\n }\n\n // Use default selector\n targets = document.querySelectorAll(selector);\n }\n\n // Convert NodeList to array\n if (_is.nodeList(targets)) {\n targets = Array.prototype.slice.call(targets);\n }\n\n // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n if (!supported().basic || !targets.length) {\n return false;\n }\n\n // Add to container list\n function add(target, media) {\n if (!_hasClass(media, defaults.classes.hook)) {\n players.push({\n // Always wrap in a
for styling\n //container: _wrap(media, document.createElement('div')),\n // Could be a container or the media itself\n target: target,\n // This should be the