{"version":3,"sources":["../../../../src/ClassList.js","../../../../src/Component.js","../../../../src/Container.js","../../../../src/Control.js","../../../../src/PanelControl.js","../../../../src/PlayPause.js","../../../../src/PauseOverlay.js","../../../../src/BufferingOverlay.js","../../../../src/Utils.js","../../../../src/CurrentTime.js","../../../../src/Live.js","../../../../src/Duration.js","../../../../src/Slider.js","../../../../src/Progress.js","../../../../src/Volume.js","../../../../src/Toggle.js","../../../../src/Mute.js","../../../../src/Unmute.js","../../../../src/Fullscreen.js","../../../../src/SettingsButton.js","../../../../src/ListItem.js","../../../../src/Panel.js","../../../../src/PanelMenu.js","../../../../src/captionsettings/Home.js","../../../../src/captionsettings/Options.js","../../../../src/captionsettings/OptionsPanel.js","../../../../src/captionsettings/Color.js","../../../../src/captionsettings/BackgroundColor.js","../../../../src/captionsettings/BackgroundOpacity.js","../../../../src/captionsettings/CharacterEdgeStyle.js","../../../../src/captionsettings/FontColor.js","../../../../src/captionsettings/FontFamily.js","../../../../src/captionsettings/FontOpacity.js","../../../../src/captionsettings/FontSize.js","../../../../src/captionsettings/WindowColor.js","../../../../src/captionsettings/WindowOpacity.js","../../../../src/captionsettings/ScrollType.js","../../../../src/captionsettings/EdgeColor.js","../../../../src/captionsettings/EdgeOpacity.js","../../../../src/CaptionData.js","../../../../src/CaptionSettings.js","../../../../src/Quality.js","../../../../src/PlaybackRate.js","../../../../src/AudioTracks.js","../../../../src/SettingsPanel.js","../../../../src/ShareButton.js","../../../../src/SharePanel.js","../../../../src/CaptionToggleButton.js","../../../../src/JumpBack.js","../../../../src/JumpForward.js","../../../../src/Poster.js","../../../../src/Title.js","../../../../src/ErrorMsg.js","../../../../src/ContextMenu.js","../../../../src/Ads.js","../../../../src/Airplay.js","../../../../src/PiP.js","../../../../src/ChromeCast.js","../../../../src/Mode.js","../../../../src/ActiveState.js","../../../../src/UI.js","../../../../src/main.js"],"names":["ClassList","this","prepend","token","contains","tokens","unshift","i","splice","indexOf","remove","add","className","setState","toString","player","l10n","_this","handlers","forEach","_this2","handler","bind","props","nextState","key","state","nextProps","_key","playerEventMap","event","_this3","extends","ref","propsList","classList","events","values","amp","Events","type","_this5","akamai","data","_props","babelHelpers","objectWithoutProperties","object","PropTypes","React","Component","component","Utils","createUID","components","item","parent","dom","mouseFocus","altText","focused","scrollTop","onKeyPress","keyCode","onAction","value","onChange","title","tabIndex","onMouseDown","onMouseUp","onMouseOver","onMouseOut","onFocus","onBlur","onKeyDown","onClick","aria","PanelControl","__proto__","Object","getPrototypeOf","call","context","panel","Control","playState","play","parseInt","formatZeroFill","time","strTime","length","str","number","precision","window","pageXOffset","targetTouches","pageX","scrollX","pageY","scrollY","pageYOffset","plugin","enabled","config","disabled","liveClickHandler","percent","min","range","dragging","increment","direction","Math","max","round","getLocalizedString","format","isNumber","element","offset","pos","getEventPos","top","height","y","code","stopPropagation","preventDefault","onHandleMouseUp","onHandleMouseMove","addEventListener","removeEventListener","onMouseMove","style","width","onHandleMouseDown","onTouchStart","change","update","assign","valueText","textVisible","isTouch","bindHandlers","onadtimeupdate","ondurationchange","currentTime","markers","clear","cues","duration","cue","index","left","startTime","refs","getBoundingClientRect","clamp","states","text","clientWidth","textPercent","minClampValue","textValue","Slider","volume","_open","timeout","dispatchEvent","isVolumeSettable","Volume","prototype","retval","createElement","amp-open","toggled","level","muted","Toggle","dismissed","Unmute","enterFullScreen","parentNode","settingsPanel","close","tabable","document","getElementsByClassName","role","closeHandler","open","items","clickHandler","isOptionSelected","ListItem","activeState","onopen","startActiveTimeout","onclose","_babelHelpers$get","Panel","Home","listOptions","language","captioning","tracks","track","getLanguageString","lang","OptionsList","map","selected","viewChange","label","OptionsPanel","captionsettings","options","len","setting","r","g","b","test","replace","a","activeIndex","Color","parts","parseFloat","labels","_ref","defineProperty","keyDown","settings","captions","CaptionData","hidden","selectTrackByLanguage","color","prevProps","gotoSettings","qualityLevels","onqualitylevelsloaded","detail","bitrate","push","autoLevel","qualityMode","findIndex","levelObject","qualityIndex","quality","playbackRate","PlaybackRate","audioTracks","activeIds","localization","id","getString","settingsLevel","brLabel","firstElem","focus","childNodes","isCaptionEnabled","componentEnabled","isQualityEnabled","audioTracksAvailable","qualityRef","playbackRef","changeState","PanelMenu","url","link","media","embed","CaptionToggleButton","ContextMenu","menuItems","akamaiGetViewerId","x","onadbreakstart","controlsMode","onadbreakend","onadstarted","container","adVO","mode","msg","adMode","totalAds","position","amp-ad-break","available","video","isAvailable","mediaElement","setAttribute","availability","webkitCurrentPlaybackTargetIsWireless","playing","get","Airplay","amp-playback-target-airplay","webkitPresentationMode","PiP","webkitSupportsPresentationMode","webkitSetPresentationMode","chromecast","ChromeCast","Mode","ActiveState","feature","contextMenuClick","isTouchDevice","autoHide","EventDispatcher","dispatcher","onMouseEnter","stopActiveTimeout","onMouseLeave","medium","amp-text-tracks","amp-waiting","IDLE","setTimeout","_this6","isMouseOverElement","ACTIVE","target","nodeName","isFocused","displayState","exitFullScreen","togglePlayPause","progress","body","contextMenu","removeContextMenu","appendChild","display","onContextMenu","Ads","PauseOverlay","BufferingOverlay","Progress","PlayPause","JumpBack","JumpForward","Duration","SettingsButton","Fullscreen","SharePanel","SettingsPanel","ErrorMsg","AUTO","_container$classList$","IdleUtil","viewComponent","idleUtil","INACTIVE","start","stop","active","inactive","amp-inactive","amp-idle","idle","_value","native","controls","ui","ads","Promise","setPlayerProperty","ReactDOM","render","UI","AMP"],"mappings":"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","file":"akamai/amp/react/React.min.js","sourcesContent":["export default class ClassList {\n\n constructor(component, tokens = []) {\n this.component = component\n this.tokens = tokens\n }\n\n add(token, prepend = false) {\n if (this.contains(token))\n return\n\n if (prepend === true) {\n this.tokens.unshift(token)\n } else {\n this.tokens.push(token)\n }\n }\n\n contains(token) {\n return this.tokens.indexOf(token) !== -1\n }\n\n item(index) {\n return this.tokens[index] || null\n }\n\n remove(token) {\n const i = this.tokens.indexOf(token)\n if (i === -1)\n return\n this.tokens.splice(i, 1)\n }\n\n toggle(token) {\n if (this.contains(token)) {\n this.remove(token)\n } else {\n this.add(token)\n }\n }\n\n update(tokenMap) {\n for (let token in tokenMap) {\n if (tokenMap[token]) {\n this.add(token)\n } else {\n this.remove(token)\n }\n }\n\n let className = this.toString()\n if (className != this.component.state.className) {\n this.component.setState({className})\n }\n }\n\n toString() {\n return this.tokens.join(' ')\n }\n}\n","import ClassList from \"./ClassList.js\"\n\nexport default class Component extends React.Component {\n\n constructor (props, context) {\n super(props, context)\n\n this.state = {\n l10n: this.player.l10n\n }\n this.classList = new ClassList(this, this.props.classList)\n }\n\n static get contextTypes() {\n return {\n player: PropTypes.object,\n config: PropTypes.object,\n plugin: PropTypes.object\n }\n }\n\n get player() {\n return this.props.player || this.context.player\n }\n\n get config() {\n return this.props.config || this.context.config\n }\n\n get l10n() {\n return this.state.l10n\n }\n\n get plugin() {\n return this.context.plugin\n }\n\n get className() {\n let className = this.props.className || \"\"\n className += ` ${this.classList}`\n\n return className.trim()\n }\n\n get textContent() {\n return this.props.textContent || this.state.textContent\n }\n\n get children() {\n return this.props.children || []\n }\n\n get element() {\n return this.refs.element\n }\n\n get dom() {\n return this.element || ReactDOM.findNode(this)\n }\n\n get data() {\n return this.props.data || {}\n }\n\n get playerEventMap() {\n const events = []\n\n if (this.player == null)\n return events\n\n Object.values(akamai.amp.Events).forEach((type) => {\n let key = `on${type}`\n if (typeof this[key] != \"function\")\n return\n events.push({key: key, type: type})\n })\n\n return events\n }\n\n get propsList() {\n const { className, classList, data, textContent, ...props } = this.props\n return props\n }\n\n getLocalizedString(key) {\n return this.player.getLocalizedString(key)\n }\n\n onlanguagechange() {\n this.setState({l10n: this.player.l10n})\n }\n\n bindHandlers(handlers) {\n if (handlers == null || handlers.length <= 0)\n return\n\n handlers.forEach((handler) => {\n if (typeof this[handler] != \"function\")\n return\n this[handler] = this[handler].bind(this)\n })\n }\n\n shouldComponentUpdate(nextProps, nextState) {\n let state = this.state\n let props = this.props\n\n if (nextState != null) {\n for (let key in nextState) {\n if (nextState[key] != state[key]) {\n return true\n }\n }\n }\n\n // TODO: Is this needed?\n if (nextProps != null) {\n for (let key in nextProps) {\n if (nextProps[key] != props[key]) {\n return true\n }\n }\n }\n\n return false\n }\n\n componentWillMount() {\n this.playerEventMap.forEach((event) => {\n this[event.key] = this[event.key].bind(this)\n this.player.addEventListener(event.type, this[event.key])\n })\n }\n\n componentWillUnmount() {\n this.playerEventMap.forEach((event) => {\n this.player.removeEventListener(event.type, this[event.key])\n })\n }\n\n render() {\n return (\n
\n {this.textContent}\n {this.children}\n
\n )\n }\n}\n","import Component from \"./Component.js\"\n\nexport default class Container extends Component {\n constructor(props, context) {\n super(props, context)\n this.state.components = []\n }\n\n // TODO: HACK! This is a hack to get around IE 9-10 not inheriting static properties.\n // Remove this when these browsers are dropped, along with similar code\n // in other classes that extend Component and Container.\n static get contextTypes() {\n return super.contextTypes\n }\n\n get components() {\n return this.state.components\n }\n\n addComponent(component) {\n let components = this.state.components.slice()\n if (component.key == null)\n component.key = akamai.amp.Utils.createUID()\n components.push(component)\n this.setState({components})\n }\n\n removeComponent(component) {\n let components = this.state.components.filter((item) => item != component)\n this.setState({components})\n }\n\n clear() {\n this.setState({components: []})\n }\n\n appendChild(element) {\n let parent = this.dom\n if (parent == null)\n return\n parent.appendChild(element)\n }\n\n removeChild(element) {\n let parent = this.dom\n if (parent == null)\n return\n parent.removeChild(element)\n }\n\n get children() {\n return super.children.concat(this.state.components)\n }\n}\n","import Component from \"./Component.js\"\n\nexport default class Control extends Component {\n constructor(props, context) {\n super(props, context)\n this.classList.add(\"amp-icon\")\n this.classList.add(\"amp-control\")\n this.mouseFocus = false\n this.focused = false\n this.state.altText = this.altText\n\n this.bindHandlers([\"onMouseDown\", \"onMouseUp\", \"onMouseOver\", \"onMouseOut\", \"onFocus\", \"onBlur\", \"onKeyDown\", \"onClick\", \"onChange\"])\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n get aria() {\n return {\n \"aria-label\": this.title,\n role: \"button\"\n }\n }\n\n get propsList() {\n const { altText, ...props } = super.propsList\n props.className = this.className\n props.tabIndex = \"0\"\n props.onMouseDown = (event) => (this.props.onMouseDown || this.onMouseDown)(event)\n props.onMouseUp = (event) => (this.props.onMouseUp || this.onMouseUp)(event)\n props.onMouseOver = (event) => (this.props.onMouseOver || this.onMouseOver)(event)\n props.onMouseOut = (event) => (this.props.onMouseOut || this.onMouseOut)(event)\n props.onFocus = (event) => (this.props.onFocus || this.onFocus)(event)\n props.onBlur = (event) => (this.props.onBlur || this.onBlur)(event)\n props.onKeyDown = (event) => (this.props.onKeyDown || this.onKeyDown)(event)\n props.onClick = (event) => (this.props.onClick || this.onClick)(event)\n\n const aria = this.aria\n for (let key in aria) {\n props[key] = aria[key]\n }\n\n return props\n }\n\n get altText() {\n return this.props.altText || this.state.altText\n }\n\n get title() {\n return this.player.getLocalizedString(this.altText)\n }\n\n onMouseDown(event) {\n this.mouseFocus = true\n }\n\n onMouseUp(event) {\n this.mouseFocus = false\n }\n \n onMouseOver(event) {\n \t\n }\n \n onMouseOut(event) {\n \t\n }\n \n onFocus(event) {\n if (this.mouseFocus == true)\n return\n\n this.focused = true\n this.classList.update({\"amp-focus\": true})\n //Hack to Prevent overflow hidden elemnts to scroll up on tabbing\n this.player.viewComponent.scrollTop = 0\n }\n\n onBlur(event) {\n if (this.mouseFocus == true)\n return\n\n this.focused = false\n this.classList.update({\"amp-focus\": false})\n }\n\n onKeyDown(event) {\n if (this.mouseFocus == true)\n return\n\n this.onKeyPress(event)\n\n if (event.type == \"keypress\" && (event.keyCode == 13 || event.keyCode == 32))\n this.onAction()\n }\n\n onAction() {\n this.onClick()\n }\n\n onKeyPress(event) {\n\n }\n\n onClick(event) {\n\n }\n\n change(value) {\n const onChange = this.propsList.onChange || this.onChange\n if (typeof onChange != \"function\")\n return\n onChange(value)\n }\n\n render() {\n return (\n \n )\n }\n}\n","import Control from \"./Control.js\"\n\nexport default class PanelControl extends Control {\n constructor(props, context) {\n super(props, context)\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n get propsList() {\n const { panel, ...props } = super.propsList\n return props\n }\n\n get panel() {\n return this.plugin.refs[this.props.panel]\n }\n\n onClick() {\n this.panel.toggle()\n }\n\n onKeyDown(event) {\n this.panel.onKeyDown(event)\n }\n}\n","import Control from \"./Control.js\"\n\nexport default class PlayPause extends Control {\n\n constructor(props, context) {\n super(props, context)\n this.classList.add(\"amp-playpause\", true)\n this.state.altText = \"MSG_PLAY\"\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n onplaying() {\n this.setState({altText: \"MSG_PAUSE\"})\n }\n\n onpause() {\n this.setState({altText: \"MSG_PLAY\"})\n }\n\n onended() {\n this.setState({altText: \"MSG_REPLAY\"})\n }\n\n onClick() {\n const player = this.player\n switch (player.playState) {\n case \"ended\":\n this.plugin.replay()\n break\n\n case \"ready\":\n case \"paused\":\n \tplayer.play()\n break\n\n default:\n player.pause()\n break\n }\n }\n\n}\n","import Control from \"./Control.js\"\n\nexport default class PauseOverlay extends Control {\n\n constructor(props, context) {\n super(props, context)\n this.classList.add(\"amp-pause-overlay\", true)\n this.state.altText = \"MSG_PLAY\"\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n onClick() {\n const player = this.player\n switch (player.playState) {\n case \"ended\":\n this.plugin.replay()\n break\n\n default:\n player.play()\n break\n }\n }\n}\n","import Component from \"./Component.js\"\n\nexport default class BufferingOverlay extends Component {\n\n constructor(props, context) {\n super(props, context)\n this.classList.add(\"amp-buffering-overlay\", true)\n this.classList.add(\"amp-icon\")\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n}\n","export default class Utils {\n\n /**\n * Takes a time in seconds and converts it to timecode.\n *\n * @param {Number} time The time in seconds to be formatted.\n * @return {String} A SMTP formatted string.\n */\n static formatTimecode(time, duration) {\n time = parseInt(time)\n if (isNaN(time)) {\n return \"00:00\"\n }\n var strTime = Utils.formatZeroFill(time % 60)\n time = parseInt(time / 60)\n strTime = Utils.formatZeroFill(time % 60) + \":\" + strTime\n time = parseInt(time / 60)\n if (time > 0) {\n strTime = Utils.formatZeroFill(time) + \":\" + strTime\n }\n if (duration >= 3600 && strTime.length === 5) {\n strTime = \"00:\" + strTime\n }\n return strTime\n }\n\n\n /**\n * Converts a time in seconds to a string and adds a zero in front of any number lower than 10.\n *\n * @param {Number} time The number to be zero filled.\n */\n static formatZeroFill(time) {\n var str = time.toString()\n if (time < 10) {\n str = \"0\" + str\n }\n return str\n }\n\n /**\n * @param {Number} number\n * The number to be rounded.\n *\n * @param {Number} precision\n * The level of precision. Positive 1 would round to 1 decimal place and -1 would round to the tens.\n *\n * @return {Number}\n * The rounded number.\n */\n static round(number, precision) {\n const factor = Math.pow(10, precision)\n return Math.round(number * factor) / factor\n }\n\n static getEventPos(event) {\n return {\n x: (event.pageX - (window.scrollX || window.pageXOffset)) || (event.targetTouches[0].pageX - window.scrollX),\n y: (event.pageY - (window.scrollY || window.pageYOffset)) || (event.targetTouches[0].pageY - window.scrollY)\n }\n }\n\n static componentEnabled(plugin, component) {\n const config = plugin.config[component]\n return ((plugin.player[component] != null && plugin.player[component].enabled !== false) || (config != null && config !== false && config.enabled !== false && config.disabled !== true))\n }\n\n static isNumber(n) {\n return !isNaN(parseFloat(n)) && isFinite(n)\n }\n}\n","import Component from \"./Component.js\"\nimport Utils from \"./Utils.js\"\n\nexport default class CurrentTime extends Component {\n\n constructor(props, context) {\n super(props, context)\n this.state.currentTime = this.player.currentTime\n this.state.duration = this.player.duration\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n onmediachange(event) {\n this.setState({currentTime: 0})\n }\n\n ontimeupdate(event) {\n this.setState({currentTime: Math.round(event.detail)})\n }\n\n onseeking() {\n this.setState({currentTime: Math.round(this.player.currentTime)})\n }\n\n ondurationchange(event) {\n this.setState({duration: Math.round(event.detail)})\n }\n\n render() {\n return {Utils.formatTimecode(this.state.currentTime, this.state.duration)}\n }\n\n}\n","import Component from \"./Component.js\"\n\nexport default class Live extends Component {\n\n constructor(props, context) {\n super(props, context)\n this.state.isLive = true\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n \n onislive(event) {\n this.setState({isLive: event.detail})\n }\n\n liveClickHandler() {\n if (!this.state.isLive)\n this.player.goLive()\n }\n\n render() {\n return {this.getLocalizedString(this.state.isLive ? \"MSG_LIVE\" : \"MSG_GO_LIVE\")}\n }\n\n}\n","import Component from \"./Component.js\"\nimport Utils from \"./Utils.js\"\n\nexport default class Duration extends Component {\n\n constructor(props, context) {\n super(props, context)\n this.state.duration = this.player.duration\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n onmediachange(event) {\n this.setState({duration: Math.round(this.player.duration)})\n }\n\n ondurationchange(event) {\n this.setState({duration: Math.round(event.detail)})\n }\n\n render() {\n return {Utils.formatTimecode(this.state.duration, this.state.duration)}\n }\n\n}\n","import Control from \"./Control.js\"\nimport Utils from \"./Utils.js\"\n\nexport default class Slider extends Control {\n\n constructor(props, context) {\n super(props, context)\n this.state.percent = 0\n this.state.value = 0\n this.state.min = 0\n this.state.range = 0\n this.state.max = 1\n this.state.dragging = false\n this.increment = 0.1\n this.classList.add(\"amp-slider\")\n this.direction = \"\"\n\n this.bindHandlers([\"onHandleMouseDown\", \"onHandleMouseUp\", \"onHandleMouseMove\"])\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n format(value) {\n return value\n }\n\n update(values) {\n if (values.percent == null && values.value != null)\n values.percent = values.value / this.max\n\n if (values.value == null && values.percent != null)\n values.value = Math.round(values.percent * this.max)\n\n if (values.valueText == null && values.value != null)\n values.valueText = `${this.format(values.value)} ${this.getLocalizedString(\"MSG_OF\")} ${this.format(this.max)}`\n\n // Handles NaN cases that cause unpredictable seek results\n if (!Utils.isNumber(values.value))\n delete values.value\n\n if (!Utils.isNumber(values.percent))\n delete values.percent\n\n this.setState(values)\n return values\n }\n\n set percent(value) {\n value = akamai.amp.Utils.clamp(value, 0, 1)\n\n if (this.percent == value)\n return\n\n this.change(this.update({percent: value}))\n }\n\n get percent() {\n return this.state.percent\n }\n\n set value(value) {\n value = akamai.amp.Utils.clamp(value, this.min, this.max)\n\n if (this.value == value)\n return\n\n this.change(this.update({value}))\n }\n\n get value() {\n return this.state.value\n }\n\n set range(value) {\n value = akamai.amp.Utils.clamp(value, this.min, this.max)\n\n if (this.range == value)\n return\n\n this.setState({range: value})\n }\n\n get range() {\n return this.state.range\n }\n\n set min(value) {\n if (this.min == value)\n return\n\n this.setState({min: value})\n }\n\n get min() {\n return this.state.min\n }\n\n set max(value) {\n if (this.max == value)\n return\n\n this.setState({max: value})\n }\n\n get max() {\n return this.state.max\n }\n\n set dragging(value) {\n if (this.dragging == value)\n return\n\n this.setState({dragging: value})\n this.classList.update({\"amp-dragging\": value})\n this.plugin.dragging = value\n }\n\n get dragging() {\n return this.state.dragging\n }\n\n get markers() {\n return this.refs.markers\n }\n\n get aria() {\n return Object.assign(super.aria, {\n role: \"slider\",\n \"aria-valuemin\": this.state.min,\n \"aria-valuemax\": Math.round(this.state.max),\n \"aria-valuenow\": Math.round(this.state.value),\n \"aria-valuetext\": this.state.valueText\n })\n }\n\n move(event) {\n const offset = this.refs.element.getBoundingClientRect()\n const pos = Utils.getEventPos(event)\n if(this.direction === \"vertical\") {\n \tthis.percent = 1-(pos.y - offset.top) / offset.height\n }\n else {\n \tthis.percent = (pos.x - offset.left) / offset.width\n }\n \t\n }\n\n onClick(event) {\n \tif(this.player.playState != \"ready\")\n \tthis.move(event)\n }\n\n onAction() {\n\n }\n\n onKeyPress(event) {\n const code = event.keyCode\n // left arrow 37\n // up arrow 38\n // right arrow 39\n // down arrow 40\n if (code == 39 || code == 38) {\n this.percent += this.increment\n } else if (code == 37 || code == 40) {\n this.percent -= this.increment\n }\n }\n\n onHandleMouseDown(event) {\n if (this.player.playState == \"ready\")\n return\n\n event.stopPropagation()\n event.preventDefault()\n this.dragging = true\n window.addEventListener(\"mouseup\", this.onHandleMouseUp)\n window.addEventListener(\"mousemove\", this.onHandleMouseMove)\n window.addEventListener(\"touchend\", this.onHandleMouseUp)\n window.addEventListener(\"touchmove\", this.onHandleMouseMove)\n }\n\n onHandleMouseMove(event) {\n this.move(event)\n }\n\n onHandleMouseUp(event) {\n event.stopPropagation()\n event.preventDefault()\n this.dragging = false\n window.removeEventListener(\"mouseup\", this.onHandleMouseUp)\n window.removeEventListener(\"mousemove\", this.onHandleMouseMove)\n window.removeEventListener(\"touchend\", this.onHandleMouseUp)\n window.removeEventListener(\"touchmove\", this.onHandleMouseMove)\n this.change(this.update({value: this.value, percent: this.percent}))\n }\n\n render() {\n const percent = `${Utils.round(this.percent * 100, 2)}%`\n const range = `${Utils.round(this.range * 100, 2)}%`\n return (\n
\n
\n
\n
\n {this.children}\n
\n
\n )\n }\n\n}\n","import Container from \"./Container.js\"\nimport Slider from \"./Slider.js\"\nimport Utils from \"./Utils.js\"\n\nexport default class Progress extends Slider {\n\n constructor(props, context) {\n super(props, context)\n this.classList.add(\"amp-progress\", true)\n this.state.altText = \"MSG_SEEK\"\n this.state.textVisible = \"visible\"\n this.bindHandlers([\"onMouseMove\", \"onaddurationchange\", \"onadtimeupdate\", \"onaddurationchange\", \"onadmanagerloaded\"])\n this.isTouch = akamai.amp.Utils.isTouch\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n get propsList() {\n const props = super.propsList\n props.onMouseMove = this.onMouseMove\n return props\n }\n\n get markers() {\n return this.refs.markers\n }\n\n format(value) {\n return Utils.formatTimecode(value, this.max)\n }\n\n onready() {\n this.player.addEventListener(\"adbreakend\", this.ondurationchange)\n this.player.addEventListener(\"adtimeupdate\", this.onadtimeupdate)\n this.player.addEventListener(\"addurationchange\", this.onaddurationchange)\n }\n\n onmediachange() {\n this.update({value: 0})\n this.range = 0\n }\n\n ontimeupdate() {\n if (this.dragging)\n return\n this.update({value: this.player.currentTime})\n }\n\n onseeking() {\n this.update({value: this.player.currentTime})\n }\n\n onprogress(event) {\n this.range = event.detail\n }\n\n oncueschange(event) {\n const cues = event.detail\n const markers = this.markers\n\n markers.clear()\n\n if (cues == null || cues.length <= 0)\n return\n\n const duration = this.player.duration\n cues.forEach((cue, index) => {\n if (cue.startTime <= 0)\n return\n markers.addComponent(
)\n })\n }\n\n ondurationchange(event) {\n this.increment = 10 / this.player.duration\n this.max = this.player.duration\n this.update({value: ((event.type == \"breakend\" && event.data.type == \"preroll\") ? 0 : this.player.currentTime)})\n }\n\n onadtimeupdate(event) {\n \tif(this.player.playState == \"ready\")\n \t\treturn\n this.update({value: event.detail})\n }\n\n onaddurationchange(event) {\n this.max = event.detail.duration\n }\n\n onMouseMove(event) {\n const offset = this.refs.element.getBoundingClientRect()\n const pos = Utils.getEventPos(event)\n const percent = (pos.x - offset.left) / offset.width\n this.setState({textPercent: akamai.amp.Utils.clamp(Utils.round(percent, 4), 0, 1)})\n }\n\n onKeyPress(event) {\n if ((this.player.ads && this.player.ads.inProgress) || this.player.playState == \"ready\") {\n return\n }\n super.onKeyPress(event)\n }\n\n onHandleMouseDown(event) {\n super.onHandleMouseDown(event)\n if (this.isTouch)\n this.setState({textVisible: \"visible\"})\n }\n\n onHandleMouseMove(event) {\n super.onHandleMouseMove(event)\n this.onMouseMove(event)\n }\n\n onHandleMouseUp(event) {\n super.onHandleMouseUp(event)\n if (this.isTouch)\n this.setState({textVisible: \"hidden\"})\n }\n\n onChange(states) {\n if (this.dragging)\n return\n this.player.currentTime = states.value\n }\n\n get children() {\n const textPercent = `${this.state.textPercent * 100}%`\n const minClampValue = this.refs.element ? ((this.refs.text.clientWidth/1.3)*100/this.refs.element.clientWidth) : 0\n const maxClampValue = 100 - minClampValue\n const textValue = `${akamai.amp.Utils.clamp(Utils.round(this.state.textPercent * 100, 2), minClampValue, maxClampValue)}%`\n\n return (\n
\n \n
{this.format(this.state.textPercent * this.player.duration)}
\n
\n )\n }\n}\n","import Slider from \"./Slider.js\"\nimport Utils from \"./Utils.js\"\n\nexport default class Volume extends Slider {\n\n constructor(props, context) {\n super(props, context)\n this.classList.add(\"amp-volume\", true)\n this.state.min = 0\n this.state.max = 100\n this.state.percent = this.player.volume\n this.state.value = this.player.volume * 100\n this.state.altText = \"MSG_VOLUME\"\n this._open = true\n this.timeout = null\n\tif(this.config.volume) {\n\t\tthis.direction = this.config.volume.direction ? this.config.volume.direction : \"\"\n\t\tif(this.direction === \"vertical\") {\n\t\t\tthis.classList.add(\"amp-volume-\"+this.direction, true)\n\t\t\tthis.classList.add(\"amp-slider-\"+this.direction, true)\n\t\t\tthis.classList.remove(\"amp-slider\", true)\n\t\t}\n \t}\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n \n onready(event) {\n \tthis.open = this.direction !== \"vertical\"\n \tthis.classList.update({\"amp-open\": this._open})\n }\n \n onseeked(event) {\n \tthis.open = false\n }\n \n onmediachange(event) {\n \tthis.open = false\n }\n \n set open(value) {\n \tif(this.direction == \"vertical\") {\n \t\tthis._open = value;\n \t\tthis.classList.update({\"amp-open\": this._open})\n \t}\n }\n \n format(value) {\n return Math.round(value)\n }\n\n onvolumechange(event) {\n this.update({percent: event.detail})\n }\n \n onClick(event) {\n this.move(event)\n }\n\n onChange(value) {\n this.player.volume = value.percent\n }\n \n onMouseOver(event) {\n \tthis.plugin.dispatchEvent(new akamai.amp.Event(\"volumemouseover\"))\n \tthis.open = true\n \tclearTimeout(this.timeout)\n }\n \n onMouseOut(event) {\n \tthis.plugin.dispatchEvent(new akamai.amp.Event(\"volumemouseout\"))\n \tclearTimeout(this.timeout)\n \tthis.timeout = setTimeout(() => {\n this.open = false\n }, 350)\n }\n \n onHandleMouseDown(event) {\n event.stopPropagation()\n event.preventDefault()\n this.dragging = true\n window.addEventListener(\"mouseup\", this.onHandleMouseUp)\n window.addEventListener(\"mousemove\", this.onHandleMouseMove)\n window.addEventListener(\"touchend\", this.onHandleMouseUp)\n window.addEventListener(\"touchmove\", this.onHandleMouseMove)\n }\n\n render() {\n if (akamai.amp.Utils.isVolumeSettable() == false)\n return null\n\n super.render()\n \n const percent = `${Utils.round(this.percent * 100, 2)}%`\n const range = `${Utils.round(this.range * 100, 2)}%`\n let retval =
\n \t\t\t\t
\n \t\t\t\t
\n \t\t\t\t
\n \t\t\t\t{this.children}\n \t\t\t\t
\n \t\t\t\t
\n if(this.direction == \"vertical\") {\n \tretval =
\n \t\t\t\t\t
\n \t\t\t\t
\n \t\t\t\t
\n \t\t\t\t
\n \t\t\t\t{this.children}\n \t\t\t\t
\n \t\t\t\t
\n }\n return (\n \tretval\n \t)\n }\n}\n","import Control from \"./Control.js\"\n\nexport default class Toggle extends Control {\n\n constructor(props, context) {\n super(props, context)\n this.state.toggled = false\n this.state.onlabel = \"\"\n this.state.offlabel = \"\"\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n set toggled(value) {\n if (value === this.state.toggled)\n return value\n\n this.setState({toggled: value})\n this.change(value)\n }\n\n get toggled() {\n return this.state.toggled\n }\n\n get propsList() {\n const props = super.propsList\n props[\"aria-checked\"] = this.state.toggled\n props[\"role\"] = \"switch\"\n return props\n }\n\n toggle() {\n return this.toggled = !this.toggled\n }\n\n onClick(event) {\n this.toggle()\n }\n}\n","import Toggle from \"./Toggle.js\"\n\nexport default class Mute extends Toggle {\n\n constructor(props, context) {\n super(props, context)\n this.state.level = \"\"\n this.classList.add(\"amp-mute\", true)\n this.state.altText = \"MSG_MUTE\"\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n get className() {\n return `${super.className} ${this.state.level}`\n }\n\n onChange() {\n const player = this.player\n player.muted = !player.muted\n }\n\n onMouseOver(event) {\n \tthis.plugin.dispatchEvent(new akamai.amp.Event(\"mutemouseover\"))\n }\n\n onMouseOut(event) {\n \tthis.plugin.dispatchEvent(new akamai.amp.Event(\"mutemouseout\"))\n }\n\n onvolumechange() {\n let level = \"\"\n\n if (this.player.muted) {\n level = \"amp-muted\"\n } else if (this.player.volume < 0.5) {\n level = \"amp-low\"\n }\n\n this.setState({level})\n }\n}\n","import Control from \"./Control.js\"\n\nexport default class Unmute extends Control {\n\n constructor(props, context) {\n super(props, context)\n this.classList.add(\"amp-unmute\", true)\n this.state.altText = \"MSG_UNMUTE\"\n this.state.dismissed = false\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n onmutechange(event) {\n if (event.detail === false)\n this.setState({dismissed: true})\n }\n\n onClick() {\n this.player.muted = false\n }\n\n render() {\n if (this.state.dismissed === true)\n return null\n\n return super.render()\n }\n}\n","import Control from \"./Control.js\"\n\nexport default class Fullscreen extends Control {\n\n constructor(props, context) {\n super(props, context)\n this.classList.add(\"amp-fullscreen\", true)\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n onfullscreenchange(event) {\n const key = (event.detail) ? \"MSG_EXIT_FULLSCREEN\" : \"MSG_ENTER_FULLSCREEN\"\n this.setState({altText: key})\n }\n\n onClick() {\n if (this.player.displayState == \"normal\") {\n this.player.enterFullScreen()\n } else {\n this.player.exitFullScreen()\n }\n }\n}\n","import PanelControl from \"./PanelControl.js\"\n\nexport default class SettingsButton extends PanelControl {\n\n constructor(props, context) {\n super(props, context)\n this.classList.add(\"amp-settings\", true)\n this.state.altText = \"MSG_SETTINGS\"\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n}\n","import Control from \"./Control.js\"\n\nexport default class ListItem extends Control {\n\n constructor(props, context) {\n super(props, context)\n this.classList.add(\"amp-list-item\")\n this.classList.remove(\"amp-icon\")\n this.classList.remove(\"amp-control\")\n this.state.direction = this.props.direction || \"none\"\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n focus() {\n this.refs.element.focus()\n }\n\n onKeyDown(event) {\n if (this.mouseFocus == true)\n return\n this.onKeyPress(event)\n if (event.type == \"keydown\") {\n //13, 32 space Enter\n //37, 39 left and right arrow\n //38, 40 up down\n switch (event.keyCode) {\n case 13:\n case 32:\n this.props.onClick(event) || this.onClick(event)\n break\n case 37:\n if (this.state.direction === \"left\")\n this.props.onClick(event) || this.onClick(event)\n break\n case 39:\n if (this.state.direction === \"right\")\n this.props.onClick(event) || this.onClick(event)\n break\n case 38:\n this.element.previousElementSibling !== null && this.element.previousElementSibling.focus()\n break\n case 40:\n this.element.nextElementSibling !== null && this.element.nextElementSibling.focus()\n break\n }\n\n if ( ((event.keyCode == 9 || event.keyCode == 40) && (event.shiftKey == false) && this.element.nextElementSibling === null) ||\n ((event.keyCode == 9 || event.keyCode == 38) && (event.shiftKey == true) && this.element.previousElementSibling === null) ||\n event.keyCode == 27 ) {\n let tabIndex\n if(this.refs.element.parentNode.className.indexOf(\"share\") >=0 ) {\n tabIndex = 4\n this.plugin.refs.sharePanel.close()\n }\n else {\n tabIndex = 2\n this.plugin.refs.settingsPanel.close()\n }\n let tabable = document.getElementsByClassName(\"amp-control\")\n setTimeout(() => { tabable[tabable.length - tabIndex].focus() }, 1);\n }\n\n }\n\n event.stopPropagation()\n }\n\n\n render() {\n return (\n
\n {this.children}\n
\n )\n }\n\n}\n","import Component from \"./Component.js\"\nimport ListItem from \"./ListItem.js\"\n\nexport default class Panel extends Component {\n\n constructor(props, context) {\n super(props, context)\n this.closeHandler = this.closeHandler.bind(this)\n this._open = false\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n set open(value) {\n if (value == this._open)\n return\n\n this._open = value\n this.classList.update({\"amp-open\": this._open})\n this.plugin.open = value\n\n if (this._open) {\n document.addEventListener(\"click\", this.closeHandler)\n this.context.plugin.activeState = \"active\"\n this.context.plugin.stopActiveTimeout()\n if (this.props.onopen)\n this.props.onopen(this)\n } else {\n this.context.plugin.startActiveTimeout()\n document.removeEventListener(\"click\", this.closeHandler)\n if (this.props.onclose)\n this.props.onclose(this)\n }\n\n }\n\n get open() {\n return this._open\n }\n\n get propsList() {\n const { onclose, onopen, ...props } = super.propsList\n return props\n }\n\n get title() {\n return \"TITLE\"\n }\n\n closeHandler(event) {\n if (this.element === undefined || this.element.contains(event.target))\n return\n\n this.open = false\n document.removeEventListener(\"click\", this.closeHandler)\n }\n\n toggle() {\n this.open = !this.open\n }\n\n close() {\n this.open = false\n }\n\n isOptionSelected(item, index) {\n return (index === this.state.activeIndex)\n }\n\n clickHandler(object, index) {\n this.setState({activeIndex: index})\n }\n\n backHandler(event) {\n this.props.gotoSettings(event)\n }\n\n render() {\n const items = this.listOptions.map((object, index) => {\n return \n \n {object.label}\n \n })\n\n return
\n \n \n {this.state.title}\n \n {items}\n
\n }\n}\n","import Panel from \"./Panel.js\"\n\nexport default class PanelMenu extends Panel {\n\n constructor(props, context) {\n super(props, context)\n this.state.keyDown = false\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n onKeyDown(event) {\n if (event.keyCode == 13 || event.keyCode == 32) {\n this.state.keyDown = true\n this.toggle()\n }\n }\n}\n","import Panel from \"../Panel.js\"\nimport ListItem from \"../ListItem.js\"\n\nexport default class Home extends Panel {\n\n constructor(props, context) {\n super(props, context)\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n\n clickHandler(object, index) {\n this.setState({activeIndex: index})\n this.props.settingsChange({language: this.listOptions[index]})\n }\n\n render() {\n this.listOptions = [{label:\"Off\", value: \"off\"}]\n this.player.captioning.tracks.forEach((track) => {\n const lang = track.language\n this.listOptions.push({label: this.player.localization.getLanguageString(lang), value: lang})\n })\n\n const OptionsList = this.listOptions.map((object, index) => {\n let selected = (!this.player.captioning.hidden && this.player.captioning.track && object.value == this.player.captioning.track.language)\n if (this.player.captioning.hidden && index === 0) {\n selected = true\n }\n return \n \n {object.label}\n \n })\n\n return (\n
\n \n \n Subtitles/CC\n \n this.props.viewChange(event, \"options\")} className=\"amp-option-button\" >Options\n {OptionsList}\n
\n )\n }\n}\n","import Panel from \"../Panel.js\"\nimport ListItem from \"../ListItem.js\"\n\nexport default class Options extends Panel {\n\n constructor(props, context) {\n super(props, context)\n this.listOptions = [\n {label: \"Font Family\", key: \"fontFamily\", value: \"Arial\"},\n {label: \"Font Color\", key: \"fontColor\", value: \"Red\"},\n {label: \"Font Size\", key: \"size\", value: \"100%\"},\n {label: \"Font Opacity\", key: \"fontOpacity\", value: \"0%\"},\n {label: \"Background Color\", key: \"backgroundColor\", value: \"Black\"},\n {label: \"Background Opacity\", key: \"backgroundOpacity\", value: \"0%\"},\n {label: \"Window Color\", key: \"windowColor\", value: \"Red\"},\n {label: \"Window Opacity\", key: \"windowOpacity\", value: \"0%\"},\n {label: \"Character Edge Style\", key: \"edgeType\", value: \"None\"},\n {label: \"Edge Color\", key: \"edgeColor\", value: \"Red\"},\n {label: \"Edge Opacity\", key: \"edgeOpacity\", value: \"Red\"},\n {label: \"Scroll\", key: \"scroll\", value: \"Pop-out\"},\n ]\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n\n render() {\n const OptionsList = this.listOptions.map((object, index) => {\n return this.props.viewChange(event, object.key)} direction=\"right\">\n {object.label}\n \n \n {this.props.captionsettings[object.key+\"Label\"]}\n \n \n })\n\n return
\n this.props.viewChange(event, \"home\")} direction=\"left\">\n \n Options\n \n {OptionsList}\n
\n }\n}\n","import Panel from \"../Panel.js\"\n\nexport default class OptionsPanel extends Panel {\n\n constructor(props, context) {\n super(props, context)\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n\n select() {\n const options = this.listOptions\n const props = this.props.captionsettings\n const len = options.length\n for (let i = 0; i < len; i++) {\n if ((/color/i.test(this.setting) && (options[i].value.r == props[this.setting].r) && (options[i].value.g == props[this.setting].g) && (options[i].value.b == props[this.setting].b)) ||\n (/opacity/i.test(this.setting) && (options[i].value == props[this.setting.replace(\"Opacity\", \"Color\")].a)) ||\n (!/opacity|color/i.test(this.setting) && options[i].value == props[this.setting])) {\n this.state.activeIndex = i\n break\n }\n }\n }\n\n clickHandler (object, index) {\n super.clickHandler(object, index)\n this.props.settingsChange({[this.setting]: object})\n }\n\n backHandler(event) {\n this.props.viewChange(event, \"options\")\n }\n}\n","export default class Color {\n\n constructor(r, g, b, a = 1) {\n if (typeof r == \"string\") {\n const parts = r.match(/[0-9\\.]+/g)\n r = parseInt(parts[0])\n g = parseInt(parts[1])\n b = parseInt(parts[2])\n a = parts[3] != null ? parseFloat(parts[3]) : 1\n }\n\n this.r = r\n this.g = g\n this.b = b\n this.a = a\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n\n toString(radix) {\n return `rgba(${this.r}, ${this.g}, ${this.b}, ${this.a})`\n }\n}\n","import OptionsPanel from \"./OptionsPanel\"\nimport Color from \"./Color\"\n\nexport default class BackgroundColor extends OptionsPanel {\n\n constructor(props, context) {\n super(props, context)\n\n this.state.title = \"Background Color\" // TODO: This needs to be localized\n this.setting = \"backgroundColor\"\n this.listOptions = props.labels[this.setting]\n this.select()\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n}\n","import OptionsPanel from \"./OptionsPanel.js\"\n\nexport default class BackgroundOpacity extends OptionsPanel {\n\n constructor(props, context) {\n super(props, context)\n\n this.state.title = \"Background Opacity\" // TODO: This needs to be localized\n this.setting = \"backgroundOpacity\"\n this.listOptions = props.labels[this.setting]\n this.select()\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n}\n","import OptionsPanel from \"./OptionsPanel.js\"\n\nexport default class CharacterEdgeStyle extends OptionsPanel {\n\n constructor(props, context) {\n super(props, context)\n\n this.state.title = \"Character Edge Style\" // TODO: This needs to be localized\n this.setting = \"edgeType\"\n this.listOptions = props.labels[this.setting]\n this.select()\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n}\n","import OptionsPanel from \"./OptionsPanel\"\nimport Color from \"./Color\"\n\nexport default class FontColor extends OptionsPanel {\n\n constructor(props, context) {\n super(props, context)\n\n this.state.title = \"Font Color\" // TODO: This needs to be localized\n this.setting = \"fontColor\"\n this.listOptions = props.labels[this.setting]\n this.select()\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n}\n","import OptionsPanel from \"./OptionsPanel.js\"\n\nexport default class FontFamily extends OptionsPanel {\n\n constructor(props, context) {\n super(props, context)\n\n this.state.title = \"Font Family\" // TODO: This needs to be localized\n this.setting = \"fontFamily\"\n this.listOptions = props.labels[this.setting]\n this.select()\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n}\n","import OptionsPanel from \"./OptionsPanel.js\"\n\nexport default class FontOpacity extends OptionsPanel {\n\n constructor(props, context) {\n super(props, context)\n\n this.state.title = \"Font Opacity\" // TODO: This needs to be localized\n this.setting = \"fontOpacity\"\n this.listOptions = props.labels[this.setting]\n this.select()\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n\n}\n","import OptionsPanel from \"./OptionsPanel.js\"\n\nexport default class FontSize extends OptionsPanel {\n\n constructor(props, context) {\n super(props, context)\n\n this.state.title = \"Font Size\" // TODO: This needs to be localized\n this.setting = \"size\"\n this.listOptions = props.labels[this.setting]\n this.select()\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n}\n","import OptionsPanel from \"./OptionsPanel\"\nimport Color from \"./Color\"\n\nexport default class WindowColor extends OptionsPanel {\n\n constructor(props, context) {\n super(props, context)\n\n this.state.title = \"Window Color\" // TODO: This needs to be localized\n this.setting = \"windowColor\"\n this.listOptions = props.labels[this.setting]\n this.select()\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n}\n","import OptionsPanel from \"./OptionsPanel.js\"\n\nexport default class WindowOpacity extends OptionsPanel {\n\n constructor(props, context) {\n super(props, context)\n\n this.state.title = \"Window Opacity\" // TODO: This needs to be localized\n this.setting = \"windowOpacity\"\n this.listOptions = props.labels[this.setting]\n this.select()\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n}\n","import OptionsPanel from \"./OptionsPanel.js\"\n\nexport default class ScrollType extends OptionsPanel {\n\n constructor(props, context) {\n super(props, context)\n\n this.state.title = \"Scroll Type\" // TODO: This needs to be localized\n this.setting = \"scroll\"\n this.listOptions = props.labels[this.setting]\n this.select()\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n}\n","import OptionsPanel from \"./OptionsPanel\"\nimport Color from \"./Color\"\n\nexport default class EdgeColor extends OptionsPanel {\n\n constructor(props, context) {\n super(props, context)\n\n this.state.title = \"Edge Color\" // TODO: This needs to be localized\n this.setting = \"edgeColor\"\n this.listOptions = props.labels[this.setting]\n this.select()\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n}\n","import OptionsPanel from \"./OptionsPanel.js\"\n\nexport default class EdgeOpacity extends OptionsPanel {\n\n constructor(props, context) {\n super(props, context)\n\n this.state.title = \"Edge Opacity\" // TODO: This needs to be localized\n this.setting = \"edgeOpacity\"\n this.listOptions = props.labels[this.setting]\n this.select()\n }\n \n static get contextTypes() {\n return super.contextTypes\n }\n\n}\n","import Color from \"./captionsettings/Color\"\n\nexport default class CaptionData {\n\n constructor() {\n return {\n fontFamily: [\n {label: \"Monospaced Serif\", value: \"'Courier New', Courier, 'Nimbus Mono L', 'Cutive Mono', monospace\"},\n {label: \"Proportional Serif\", value: \"'Times New Roman', Times, Georgia, Cambria, 'PT Serif Caption', serif\"},\n {label: \"Monospaced Sans-Serif\", value: \"'Deja Vu Sans Mono', 'Lucida Console', Monaco, Consolas, 'PT Mono', monospace\"},\n {label: \"Proportional Sans-Serif\", value: \"Roboto, 'Arial Unicode Ms', Arial, Helvetica, Verdana, 'PT Sans Caption', sans-serif\"},\n {label: \"Casual\", value: \"'Comic Sans MS', Impact, Handlee, fantasy\"},\n {label: \"Cursive\", value: \"'Monotype Corsiva', 'URW Chancery L', 'Apple Chancery', 'Dancing Script', cursive\"},\n {label: \"Small Capitals\", value: \"'Arial Unicode Ms', Arial, Helvetica, Verdana, 'Marcellus SC', sans-serif; font-variant: small-caps\"}\n ],\n fontColor: [\n {label: \"White\", value: new Color(255, 255, 255)},\n {label: \"Yellow\", value: new Color(255, 255, 0)},\n {label: \"Green\", value: new Color(0, 128, 0)},\n {label: \"Cyan\", value: new Color(0, 255, 255)},\n {label: \"Blue\", value: new Color(0, 0, 255)},\n {label: \"Magenta\", value: new Color(255, 0, 255)},\n {label: \"Red\", value: new Color(255, 0, 0)},\n {label: \"Black\", value: new Color(0, 0, 0)}\n ],\n size: [\n {label: \"70%\", value: \"x-small\"},\n {label: \"100%\", value: \"small\"},\n {label: \"150%\", value: \"medium\"},\n {label: \"200%\", value: \"large\"},\n {label: \"300%\", value: \"x-large\"}\n ],\n fontOpacity: [\n {label: \"25%\", value: 0.25},\n {label: \"50%\", value: 0.5},\n {label: \"75%\", value: 0.75},\n {label: \"100%\", value: 1}\n ],\n backgroundColor: [\n {label: \"White\", value: new Color(255,255,255)},\n {label: \"Yellow\", value: new Color(255,255,0)},\n {label: \"Green\", value: new Color(0,128,0)},\n {label: \"Cyan\", value: new Color(0,255,255)},\n {label: \"Blue\", value: new Color(0,0,255)},\n {label: \"Magenta\", value: new Color(255,0,255)},\n {label: \"Red\", value: new Color(255,0,0)},\n {label: \"Black\", value: new Color(0,0,0)}\n ],\n backgroundOpacity: [\n {label: \"0%\", value: 0},\n {label: \"25%\", value: 0.25},\n {label: \"50%\", value: 0.5},\n {label: \"75%\", value: 0.75},\n {label: \"100%\", value: 1}\n ],\n edgeType: [\n {label: \"None\", value: \"text-shadow: 0px 0px 0px\"},\n {label: \"Depressed\", value: \"text-shadow: 0px 1px 0px\"},\n {label: \"Left Drop Shadow\", value: \"text-shadow: -3px 3px 2px\"},\n {label: \"Raised\", value: \"text-shadow: 0px 1px 1px\"},\n {label: \"Right Drop Shadow\", value: \"text-shadow: 3px 3px 2px\"},\n {label: \"Uniform\", value: \"text-shadow: 0px 0px 4px\"}\n ],\n edgeColor: [\n {label: \"White\", value: new Color(255, 255, 255)},\n {label: \"Yellow\", value: new Color(255, 255, 0)},\n {label: \"Green\", value: new Color(0, 128, 0)},\n {label: \"Cyan\", value: new Color(0, 255, 255)},\n {label: \"Blue\", value: new Color(0, 0, 255)},\n {label: \"Magenta\", value: new Color(255, 0, 255)},\n {label: \"Red\", value: new Color(255, 0, 0)},\n {label: \"Black\", value: new Color(0, 0, 0)}\n ],\n edgeOpacity: [\n {label: \"0%\", value: 0},\n {label: \"25%\", value: 0.25},\n {label: \"50%\", value: 0.5},\n {label: \"75%\", value: 0.75},\n {label: \"100%\", value: 1}\n ],\n fontOpacity: [\n {label: \"25%\", value: 0.25},\n {label: \"50%\", value: 0.5},\n {label: \"75%\", value: 0.75},\n {label: \"100%\", value: 1}\n ],\n scroll: [\n {label: \"Pop-out\", value: \"popout\"},\n {label: \"Roll-on\", value: \"rollon\"},\n {label: \"Paint-on\", value: \"painton\"}\n ],\n windowColor: [\n {label: \"White\", value: new Color(255, 255, 255)},\n {label: \"Yellow\", value: new Color(255, 255, 0)},\n {label: \"Green\", value: new Color(0, 128, 0)},\n {label: \"Cyan\", value: new Color(0, 255, 255)},\n {label: \"Blue\", value: new Color(0, 0, 255)},\n {label: \"Magenta\", value: new Color(255, 0, 255)},\n {label: \"Red\", value: new Color(255, 0, 0)},\n {label: \"Black\", value: new Color(0, 0, 0)}\n ],\n windowOpacity: [\n {label: \"0%\", value: 0},\n {label: \"25%\", value: 0.25},\n {label: \"50%\", value: 0.5},\n {label: \"75%\", value: 0.75},\n {label: \"100%\", value: 1}\n ]\n }\n }\n}\n","import Panel from \"./Panel.js\"\nimport Home from \"./captionsettings/Home\"\nimport Options from \"./captionsettings/Options\"\nimport BackgroundColor from \"./captionsettings/BackgroundColor\"\nimport BackgroundOpacity from \"./captionsettings/BackgroundOpacity\"\nimport CharacterEdgeStyle from \"./captionsettings/CharacterEdgeStyle\"\nimport FontColor from \"./captionsettings/FontColor\"\nimport FontFamily from \"./captionsettings/FontFamily\"\nimport FontOpacity from \"./captionsettings/FontOpacity\"\nimport FontSize from \"./captionsettings/FontSize\"\nimport WindowColor from \"./captionsettings/WindowColor\"\nimport WindowOpacity from \"./captionsettings/WindowOpacity\"\nimport ScrollType from \"./captionsettings/ScrollType\"\nimport EdgeColor from \"./captionsettings/EdgeColor\"\nimport EdgeOpacity from \"./captionsettings/EdgeOpacity\"\nimport Color from \"./captionsettings/Color\"\nimport CaptionData from \"./CaptionData\"\n\nexport default class CaptionSettings extends Panel {\n\n constructor(props, context) {\n super(props, context)\n this.state.languages = []\n this.state.keyDown = false\n\n const settings = Object.assign({}, this.player.settings.captions)\n delete settings.track\n\n for (let key in settings) {\n if (/Color$/.test(key)) {\n settings[key] = new Color(settings[key])\n settings[key.replace(\"Color\", \"Opacity\")] = settings[key].a\n }\n }\n this.state.captionsettings = settings\n\n this.state.viewChange = this.changeView.bind(this)\n this.state.settingsChange = this.changeSettings.bind(this)\n this.state.level = \"home\"\n\n this.state.labels = new CaptionData()\n\n this.initSettingLabels()\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n componentWillMount() {\n this.open = true\n }\n\n focus(event) {\n this.refs.element.firstChild.children[2].focus()\n }\n\n changeView(event, toState) {\n if (/keydown/.test(event.type) && (event.keyCode == 13 || event.keyCode == 32 || event.keyCode == 37 || event.keyCode == 39)) {\n this.keyDown = true\n }\n setTimeout(() => { this.setState({level: toState}) }, 100)\n }\n\n initSettingLabels() {\n for (let key in this.state.labels) {\n this.state.labels[key].forEach((item) => {\n if ((/color/i.test(key) && (item.value.r == this.state.captionsettings[key].r && item.value.g == this.state.captionsettings[key].g && item.value.b == this.state.captionsettings[key].b)) ||\n (/opacity/i.test(key) && (item.value == this.state.captionsettings[key.replace(\"Opacity\", \"Color\")].a)) ||\n (this.state.captionsettings[key] == item.value)) {\n this.state.captionsettings[`${key}Label`] = item.label\n }\n })\n }\n }\n\n changeSettings(object) {\n for (var key in object) {\n let setting = object[key]\n let value = setting.value\n switch (key) {\n case \"language\":\n const hidden = (setting.value == \"off\")\n if (!hidden)\n this.player.captioning.selectTrackByLanguage(setting.value)\n this.player.captioning.hidden = hidden\n break\n\n case \"backgroundColor\":\n case \"windowColor\":\n case \"fontColor\":\n case \"edgeColor\":\n value.a = this.state.captionsettings[key].a\n break\n\n case \"backgroundOpacity\":\n case \"fontOpacity\":\n case \"windowOpacity\":\n case \"edgeOpacity\":\n let color = this.state.captionsettings[key.replace(\"Opacity\", \"Color\")]\n color.a = value\n value = color\n break\n\n }\n this.state.captionsettings[key.replace(\"Opacity\", \"Color\")] = value\n this.state.captionsettings[`${key}Label`] = setting.label\n }\n\n let settings = Object.assign({}, this.state.captionsettings)\n for (let key in settings) {\n if (/Label$/.test(key) || /Opacity$/.test(key) || /language/.test(key)) {\n delete settings[key]\n }\n else if (/Color$/.test(key)) {\n settings[key] = settings[key].toString()\n }\n }\n settings.visible = !this.player.captioning.hidden\n this.player.captioning.changeSettings(settings)\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (this.keyDown) {\n this.refs.element.firstChild.children[1].focus()\n this.keyDown = false\n }\n }\n\n getCurrentPage() {\n\n switch (this.state.level) {\n case \"home\":\n return \n break\n case \"options\":\n return \n break\n case \"fontFamily\":\n return \n break\n case \"fontColor\":\n return \n break\n case \"size\":\n return \n break\n case \"fontOpacity\":\n return \n break\n case \"backgroundColor\":\n return \n break\n case \"backgroundOpacity\":\n return \n break\n case \"windowColor\":\n return \n break\n case \"windowOpacity\":\n return \n break\n case \"edgeType\":\n return \n break\n case \"edgeColor\":\n return \n break\n case \"edgeOpacity\":\n return \n break\n case \"scroll\":\n return \n }\n }\n\n render() {\n return
{this.getCurrentPage()}
\n }\n}\n","import Panel from \"./Panel.js\"\n\nexport default class Quality extends Panel {\n\n constructor(props, context) {\n super(props, context)\n this.listOptions = [\n { label: \"Auto\", value: \"0.25\" } // TODO: Auto needs to be localized\n ]\n this.qualityLevels = []\n this.state.title = \"Quality\" // TODO: This needs to be localized\n this.state.activeIndex = -1\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n componentWillMount() {\n super.componentWillMount()\n this.onqualitylevelsloaded({detail: this.player.qualityLevels})\n this.onqualitychanging({detail: this.player.qualityLevels[this.player.quality]})\n this.open = true\n }\n\n clickHandler(object, index) {\n this.player.quality = index - 1\n if (!index)\n this.onqualitychanging()\n }\n\n onqualitylevelsloaded(event) {\n this.qualityLevels = event.detail\n this.qualityLevels.forEach((item) => {\n this.listOptions.push({\"label\": `${Math.round(item.bitrate / 1000)} Kbps`})\n })\n this.setState({redraw: true})\n }\n\n onqualitychanging(event) {\n let index = -1, autoLevel = false\n try {\n autoLevel = this.player.qualityMode\n index = autoLevel == \"auto\" ? -1 : (event.detail ? this.qualityLevels.findIndex(levelObject => levelObject.qualityIndex == event.detail.qualityIndex && levelObject.level == event.detail.level) : this.props.quality.quality)\n } catch (e) {}\n\n this.setState({activeIndex: index})\n }\n\n isOptionSelected(item, index) {\n return (index - 1 === this.state.activeIndex)\n }\n}\n","import Panel from \"./Panel.js\"\n\nexport default class PlaybackRate extends Panel {\n\n constructor(props, context) {\n super(props, context)\n this.state.title = \"Speed\" // TODO: This needs to be localized\n this.listOptions = [\n { label: \"0.25\", value: 0.25 },\n { label: \"0.5\", value: 0.5 },\n { label: \"Normal\", value: 1 },\n { label: \"1.25\", value: 1.25 },\n { label: \"1.5\", value: 1.5 },\n { label: \"2\", value: 2 }\n ]\n\n this.state.activeIndex = 2\n this.listOptions.forEach((option, index) => {\n if (option.value == this.player.playbackRate) {\n this.state.activeIndex = index\n }\n })\n this.classList.add(\"amp-playback-rate\")\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n clickHandler(object, index) {\n this.player.playbackRate = object.value\n super.clickHandler(object, index)\n }\n\n isOptionSelected(item, index) {\n return (parseFloat(item.value) === parseFloat(this.player.playbackRate))\n }\n}\n","import Panel from \"./Panel.js\"\n\nexport default class AudioTracks extends Panel {\n\n constructor(props, context) {\n super(props, context)\n this.listOptions = []\n this.audioTracks = []\n this.activeIds = []\n this.state.title = \"Audio\" // TODO: Should be localized\n this.state.activeIndex = -1\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n componentWillMount() {\n super.componentWillMount()\n this.audioTracks = this.player.audioTracks\n this.oncanplaythrough({detail: this.audioTracks})\n this.open = true\n }\n\n clickHandler(object, index) {\n this.player.audioTracks[index].enabled = true\n this.setState({activeIndex: index-1})\n this.setState({redraw: true})\n }\n\n onmediachange(event) {\n \tthis.listOptions = []\n \tthis.activeIds = []\n }\n\n oncanplaythrough(event) {\n \tthis.audioTracks = this.player.audioTracks\n this.audioTracks.forEach((item) => {\n if (this.activeIds[item.id] == null) {\n const lang = this.player.localization.getLanguageString(item.language) || item.language\n \tconst label = item.label || lang || item.id || this.player.localization.getString(\"MSG_UNKNOWN\")\n this.activeIds[item.id] = true\n this.listOptions.push({label})\n }\n })\n this.setState({redraw: true})\n }\n\n isOptionSelected(item, index) {\n return this.player.audioTracks[index].enabled\n }\n}\n","import PanelMenu from \"./PanelMenu.js\"\nimport CaptionSettings from \"./CaptionSettings.js\"\nimport Quality from \"./Quality.js\"\nimport PlaybackRate from \"./PlaybackRate.js\"\nimport AudioTracks from \"./AudioTracks.js\"\nimport ListItem from \"./ListItem.js\"\nimport Utils from \"./Utils.js\"\n\nexport default class SettingsPanel extends PanelMenu {\n\n constructor(props, context) {\n super(props, context)\n this.state.settingsLevel = 0\n this.state.bitrateLabel = \"Auto\"\n this.state.captioningSettingState = null\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n onready(event) {\n this.setState({\"autoplay\": this.player.autoplay})\n }\n\n onseeked(event) {\n \tthis.open = false\n }\n\n toggle() {\n super.toggle()\n this.state.settingsLevel = 0\n }\n\n onqualitychanging(event) {\n let brLabel = this.player.qualityMode === \"auto\" ? \"Auto\" : (Math.round(event.detail.bitrate / 1000) + \"Kbps\") // TODO: Needs to be localized\n this.state.quality = this.state.qualityLevels ? this.state.qualityLevels.findIndex(levelObject => levelObject.qualityIndex == event.detail.qualityIndex && levelObject.level == event.detail.level) : -1\n this.setState({bitrateLabel: brLabel})\n }\n\n changeState(value, event) {\n if (event.type == \"keydown\" && (event.keyCode == 13 || event.keyCode == 32 || event.keyCode == 37 || event.keyCode == 38 || event.keyCode == 39 || event.keyCode == 40) && this.mouseFocus != true) {\n if (event.keyCode == 37 && this.state.settingsLevel == 0)\n return\n this.state.keyDown = true\n }\n setTimeout(() => { this.setState({settingsLevel:value});}, 100)\n }\n\n autoplayToggle() {\n this.setState({\"autoplay\": (this.player.autoplay = !this.player.autoplay)})\n }\n\n componentWillUpdate(nextProps, nextState) {\n if(nextState.settingsLevel == 1 && this.refs.firstElem.state.captionsettings)\n this.setState({'captioningSettingState': this.refs.firstElem.state.captionsettings})\n else if ((this.refs.firstElem != null) && !isNaN(this.refs.firstElem.state.activeIndex))\n this.setState({'playbackSettingState': this.refs.firstElem.state.activeIndex})\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (this.state.keyDown) {\n if (typeof this.refs.firstElem.focus === \"function\") {\n this.refs.firstElem.focus()\n }\n else {\n this.refs.firstElem.refs.element.childNodes[1].focus()\n }\n this.state.keyDown = false\n }\n }\n\n currentAudioTrackLabel () {\n let audioTracks = this.player.audioTracks\n for (var i=0; i 1\n const audioTracksAvailable = this.player.audioTracks != null && this.player.audioTracks.length > 1\n let qualityRef, playbackRef\n if (!isCaptionEnabled && isQualityEnabled)\n qualityRef = \"firstElem\"\n else if (!isCaptionEnabled && !isQualityEnabled)\n playbackRef = \"firstElem\"\n\n return (
\n { isCaptionEnabled &&\n \n Subtitles\n \n {this.player.captioning.hidden ? \"Off\": this.player.localization.getLanguageString(this.player.captioning.track.language)}\n \n }\n { isQualityEnabled &&\n \n Quality\n \n {this.state.bitrateLabel}\n \n }\n { this.player.mode != \"flash\" &&\n \n Speed\n \n {this.player.playbackRate === 1 ? 'Normal' : this.player.playbackRate}\n \n }\n { audioTracksAvailable &&\n \n Audio\n \n {this.currentAudioTrackLabel()}\n \n }\n {\n \n Autoplay\n \n \n }\n
)\n break\n case 1:\n return (
\n \n
)\n break\n case 2:\n return (
\n \n
)\n break\n case 3:\n return (
\n \n
)\n break\n case 4:\n return (
\n \n
)\n break\n }\n\n }\n}\n","import PanelControl from \"./PanelControl.js\"\nimport Utils from \"./Utils.js\"\n\nexport default class ShareButton extends PanelControl {\n\n constructor(props, context) {\n super(props, context)\n this.classList.add(\"amp-share\", true)\n this.state.altText = \"MSG_SHARE\"\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n}\n","import PanelMenu from \"./PanelMenu.js\"\nimport ListItem from \"./ListItem.js\"\nimport Utils from \"./Utils.js\"\n\nexport default class SharePanel extends PanelMenu {\n\n constructor(props, context) {\n super(props, context)\n this.listOptions = [\n {label: \"Facebook\", id: \"facebook\", url: \"www.facebook.html\"},\n {label: \"Twitter\", id: \"twitter\", url: \"www.twitter.com\"},\n {label: \"Email\", id: \"email\", url: \"\"},\n {label: \"Embed\", id: \"embed\", url: \"\"}\n ]\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n clickHandler(object, index, event) {\n const media = this.player.media\n this.player.dispatch(\"share\", {provider: object, link: media.link, embed: media.embed})\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (this.state.keyDown) {\n this.refs.element.childNodes[0].focus()\n this.state.keyDown = false\n }\n }\n\n render() {\n const OptionsList = this.listOptions.map((object,index) => {\n return \n \n {object.label}\n \n });\n\n return
\n {OptionsList}\n
\n }\n}\n","import Toggle from \"./Toggle.js\"\nimport Utils from \"./Utils.js\"\n\nexport default class CaptionToggleButton extends Toggle {\n\n constructor(props, context) {\n super(props, context)\n this.classList.add(\"amp-cc\")\n this.state.altText = \"MSG_CLOSED_CAPTIONING\"\n this.state.toggled = this.player.captioning ? !this.player.captioning.hidden : false\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n onmediachange() {\n setTimeout(this.forceUpdate.bind(this), 1)\n }\n\n onChange(event) {\n this.player.captioning.hidden = !this.player.captioning.hidden\n }\n\n render() {\n if (!Utils.componentEnabled(this.plugin, \"captioning\"))\n return null\n\n return super.render()\n }\n}\n","import Control from \"./Control.js\"\n\nexport default class JumpBack extends Control {\n\n constructor(props, context) {\n super(props, context)\n this.classList.add(\"amp-jump-back\", true)\n this.state.altText = \"MSG_JUMP_BACK\"\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n onClick() {\n const player = this.player\n if (player.playState === \"playing\" || player.playState === \"paused\") {\n this.player.currentTime = Math.max(this.player.currentTime - 10, 0)\n }\n else if (player.ended === true) {\n this.player.replay()\n }\n }\n\n}\n","import Control from \"./Control.js\"\n\nexport default class JumpForward extends Control {\n\n constructor(props, context) {\n super(props, context)\n this.classList.add(\"amp-jump-forward\", true)\n this.state.altText = \"MSG_JUMP_AHEAD\"\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n onClick(event) {\n \tconst player = this.player\n if (!player.ended && (player.playState == \"playing\" || player.playState == \"paused\")) {\n player.currentTime = Math.min(this.player.currentTime + 10, this.player.duration - 1)\n }\n }\n\n}\n","import Component from \"./Component.js\"\n\nexport default class Poster extends Component {\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n onmediachange(event) {\n this.setState({src: this.player.evaluateBindings(this.player.media.poster)})\n }\n\n render() {\n return (\n \n )\n }\n}\n","import Component from \"./Component.js\"\n\nexport default class Title extends Component {\n\n constructor(props, context) {\n super(props, context)\n this.classList.add(\"amp-title\", true)\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n onmediachange(event) {\n this.setState({textContent: this.player.media.title})\n }\n}\n","import Component from \"./Component.js\"\n\nexport default class ErrorMsg extends Component {\n\n static get contextTypes() {\n return super.contextTypes\n }\n \n onerror(event) {\n this.setState({error: this.l10n.MSG_ERROR_DEFAULT})\n }\n\n render() {\n return (\n
\n
\n
\n )\n }\n}\n","import Component from \"./Component.js\"\n\nexport default class ContextMenu extends Component {\n\n constructor(props, context) {\n super(props, context)\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n render() {\n const menuItems = [\n
  • Akamai Adaptive Media Player
  • ,\n
  • {this.player.version}
  • \n ]\n\n if ((typeof akamaiGetViewerId == \"function\") && (akamaiGetViewerId() != null))\n menuItems.push(
  • Viewer ID: {akamaiGetViewerId()}
  • )\n\n const style = {\n top: `${this.props.y}px`,\n left: `${this.props.x}px`\n }\n\n return (\n
      \n {menuItems}\n
    \n )\n }\n}\n","import Component from \"./Component.js\"\nimport Utils from \"./Utils.js\"\n\nexport default class Ads extends Component {\n\n constructor(props, context) {\n super(props, context)\n this.classList.add(\"amp-ads\", true)\n this.state.msg = \"\"\n this.state.time = \"\"\n this.bindHandlers([\"onadbreakstart\", \"onadbreakend\", \"onadstarted\", \"onadtimeremaining\", \"onadimpression\"])\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n get container() {\n return this.refs.container\n }\n\n onready() {\n this.controlsMode = this.plugin.mode\n this.player.addEventListener(\"adbreakstart\", this.onadbreakstart)\n this.player.addEventListener(\"adbreakend\", this.onadbreakend)\n this.player.addEventListener(\"adstarted\", this.onadstarted)\n this.player.addEventListener(\"adtimeremaining\", this.onadtimeremaining)\n this.player.addEventListener(\"adimpression\", this.onadimpression)\n }\n\n onmediachange() {\n this.onadbreakend()\n }\n\n onadimpression() {\n this.plugin.container.classList.update({\"amp-ad-overlaymode\": true})\n this.player.ads.resize()\n }\n\n onadbreakstart(event) {\n this.plugin.container.classList.update({\"amp-ad-break\": true})\n this.player.container.classList.add(\"amp-ad-break\")\n const adVO = event.detail\n this.setState({msg: \"\", time: \"\"})\n this.controlsMode = this.plugin.mode\n this.plugin.mode = this.plugin.adMode\n }\n\n onadstarted(event) {\n const adVO = event.detail || {}\n const msg = (adVO.position == null || adVO.totalAds == null) ? \"\" : `${this.getLocalizedString(\"MSG_AD\")} ${adVO.position} ${this.getLocalizedString(\"MSG_OF\")} ${adVO.totalAds}`\n this.setState({time: adVO.duration, msg})\n }\n\n onadbreakend(event) {\n this.setState({msg: \"\", time: \"\"})\n this.plugin.container.classList.update({\"amp-ad-break\": false})\n this.player.container.classList.remove(\"amp-ad-break\")\n this.plugin.mode = this.controlsMode\n }\n\n onadtimeremaining(event) {\n \tif (this.player.playState == \"ready\")\n \t return\n this.setState({time: event.detail})\n }\n\n render() {\n const time = (this.state.time != \"\") ? Utils.formatTimecode(Math.ceil(this.state.time)) : this.state.time\n\n return (\n
    \n
    \n
    \n
    {this.state.msg}
    \n
    \n
    \n
    {time}
    \n
    \n
    \n )\n }\n}\n","import Control from \"./Control.js\"\n\nexport default class Airplay extends Control {\n\n constructor(props, context) {\n super(props, context)\n this.state.available = false\n this.state.playing = false\n this.classList.add(\"amp-airplay\", true)\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n get isAvailable() {\n return (window.WebKitPlaybackTargetAvailabilityEvent != null)\n }\n\n get available() {\n return (this.isAvailable && this.state.available)\n }\n\n set playing(value) {\n this.state.playing = value\n this.plugin.container.classList.update({\"amp-playback-target-airplay\": value})\n }\n\n get playing() {\n return this.state.playing\n }\n\n onready(event) {\n if (this.isAvailable === false)\n return\n\n const video = this.player.mediaElement\n video.setAttribute(\"x-webkit-airplay\", \"allow\")\n video.addEventListener(\"webkitplaybacktargetavailabilitychanged\", (event) => {\n this.state.available = (event.availability == \"available\")\n this.playing = video.webkitCurrentPlaybackTargetIsWireless\n this.forceUpdate()\n })\n window.addEventListener(\"webkitcurrentplaybacktargetiswireless\", (event) => {\n this.playing = video.webkitCurrentPlaybackTargetIsWireless\n })\n }\n\n onClick() {\n this.player.mediaElement.webkitShowPlaybackTargetPicker()\n }\n\n render() {\n if (this.available === false)\n return null\n\n return super.render()\n }\n}\n","import Control from \"./Control.js\"\n\nexport default class PiP extends Control {\n\n constructor(props, context) {\n super(props, context)\n this.classList.add(\"amp-pip\", true)\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n get available() {\n const mediaElement = this.player.mediaElement\n if (mediaElement == null || typeof mediaElement.webkitSupportsPresentationMode != \"function\" || typeof mediaElement.webkitSetPresentationMode != \"function\")\n return false\n else\n return mediaElement.webkitSupportsPresentationMode(\"picture-in-picture\")\n }\n\n onplaying(event) {\n this.forceUpdate()\n }\n\n onClick(event) {\n const mediaElement = this.player.mediaElement\n mediaElement.webkitSetPresentationMode(mediaElement.webkitPresentationMode === \"picture-in-picture\" ? \"inline\" : \"picture-in-picture\");\n }\n\n render() {\n if (!this.available)\n return null\n\n return super.render()\n }\n}\n","import Control from \"./Control.js\"\nimport Utils from \"./Utils.js\"\n\nexport default class ChromeCast extends Control {\n\n constructor(props, context) {\n super(props, context)\n this.state.available = false\n this.classList.add(\"amp-chromecast\", true)\n }\n\n static get contextTypes() {\n return super.contextTypes\n }\n\n onready() {\n if (!Utils.componentEnabled(this.plugin, \"chromecast\"))\n return\n\n this.setState({available: this.player.chromecast.available})\n }\n\n onplaybacktargetavailabilitychange(event) {\n if (event.detail.target === \"chromecast\") {\n this.setState({available: event.detail.available})\n }\n }\n\n get available() {\n return this.state.available\n }\n\n onClick() {\n this.player.chromecast.launch()\n }\n\n render() {\n if (this.available === false)\n return null\n\n return super.render()\n }\n}\n","export default class Mode {\n\n constructor() {\n }\n\n static get AUTO() { return \"auto\" }\n static get FIXED() { return \"fixed\" }\n static get PERSISTENT() { return \"persistent\" }\n}\n","export default class ActiveState {\n\n constructor() {\n }\n\n static get ACTIVE() { return \"active\" }\n static get INACTIVE() { return \"inactive\" }\n static get IDLE() { return \"idle\" }\n}\n","import Component from \"./Component.js\"\nimport Container from \"./Container.js\"\nimport PanelControl from \"./PanelControl.js\"\nimport PlayPause from \"./PlayPause.js\"\nimport PauseOverlay from \"./PauseOverlay.js\"\nimport BufferingOverlay from \"./BufferingOverlay.js\"\nimport CurrentTime from \"./CurrentTime.js\"\nimport Live from \"./Live.js\"\nimport Duration from \"./Duration.js\"\nimport Progress from \"./Progress.js\"\nimport Volume from \"./Volume.js\"\nimport Mute from \"./Mute.js\"\nimport Unmute from \"./Unmute.js\"\nimport Fullscreen from \"./Fullscreen.js\"\nimport SettingsButton from \"./SettingsButton.js\"\nimport SettingsPanel from \"./SettingsPanel.js\"\nimport ShareButton from \"./ShareButton.js\"\nimport SharePanel from \"./SharePanel.js\"\nimport CaptionToggleButton from \"./CaptionToggleButton.js\"\nimport JumpBack from \"./JumpBack.js\"\nimport JumpForward from \"./JumpForward.js\"\nimport Poster from \"./Poster.js\"\nimport Title from \"./Title.js\"\nimport ErrorMsg from \"./ErrorMsg.js\"\nimport Utils from \"./Utils.js\"\nimport ContextMenu from \"./ContextMenu.js\"\nimport Ads from \"./Ads.js\"\nimport Airplay from \"./Airplay.js\"\nimport PiP from \"./PiP.js\"\nimport ChromeCast from \"./ChromeCast.js\"\nimport AudioTracks from \"./AudioTracks.js\"\nimport Mode from \"./Mode.js\"\nimport ActiveState from \"./ActiveState.js\"\nimport Panel from \"./Panel.js\"\n\nexport default class UI extends Component {\n\n constructor(props) {\n super(props)\n this.feature = \"ui\"\n this.state.playState = \"ready\"\n this.state.open = false\n this.state.dragging = false\n this.state.mode = this.config.mode\n this.isTouchDevice = akamai.amp.Utils.isTouch\n this.contextMenuClick = this.contextMenuClick.bind(this)\n this.autoHide = (this.config.autoHide != null) ? this.config.autoHide : 3\n this.timeout = null\n\n const dispatcher = new akamai.amp.EventDispatcher(this)\n for (let key in dispatcher) {\n let value = dispatcher[key]\n if (typeof value == \"function\") {\n this[key] = value.bind(dispatcher)\n }\n }\n this.dispatcher = dispatcher\n\n this.bindHandlers([\"onMouseEnter\", \"onMouseLeave\", \"onFocus\", \"onBlur\", \"onKeyDown\", \"onContextMenu\", \"onClick\"])\n }\n\n getChildContext() {\n return {\n player: this.props.player,\n config: this.props.config,\n plugin: this\n }\n }\n\n get adMode() {\n return (this.config.adMode != null) ? this.config.adMode : Mode.AUTO\n }\n\n get debug() {\n return (this.config.debug != null) ? this.config.debug : this.player.config.debug\n }\n\n get container() {\n return this.refs.container\n }\n\n get ads() {\n return this.refs.ads\n }\n\n get components() {\n return this.refs\n }\n\n get controls() {\n return this.refs.controls\n }\n\n get mode() {\n return this.state.mode || Mode.AUTO\n }\n\n set mode(value) {\n value = value || Mode.AUTO\n const mode = this.state.mode\n this.container.classList.update({\n [`amp-controls-${mode}`]: false,\n [`amp-controls-${value}`]: true\n })\n this.setState({mode: value})\n\n if (value === Mode.AUTO) {\n if (this.idleUtil == null) {\n this.idleUtil = new akamai.amp.IdleUtil(this.player.viewComponent, this.autoHide * 1000)\n this.idleUtil.addEventListener(\"activechange\", (event) => {\n this.activeState = (event.detail.active !== true) ? ActiveState.INACTIVE : ActiveState.ACTIVE\n })\n }\n this.idleUtil.start()\n }\n else {\n if (this.idleUtil != null) {\n this.idleUtil.stop()\n }\n }\n\n // TODO: Remove these when controls plugin is completely removed from amp-web\n this.player.container.classList.remove(`amp-controls-${mode}`)\n this.player.container.classList.add(`amp-controls-${value}`)\n }\n\n get dragging() {\n return this.state.dragging\n }\n\n set dragging(value) {\n if (value == true) {\n this.stopActiveTimeout()\n }\n else {\n this.startActiveTimeout()\n }\n this.container.classList.update({[`amp-dragging`]: value})\n this.setState({dragging: value})\n }\n\n get open() {\n return this.state.open\n }\n\n set open(value) {\n this.container.classList.update({[`amp-open`]: value})\n this.setState({open: value})\n }\n\n onready(event) {\n\n if (this.config.mode != null)\n this.mode = this.config.mode\n\n this.container.classList.add(`amp-${this.player.mode}`)\n this.container.classList.update({\n \"amp-cc-active\": this.player.captioning && !this.player.captioning.hidden,\n \"amp-touch\": this.isTouchDevice\n })\n\n if (this.player.captioning != null) {\n this.player.captioning.addEventListener(\"visibilitychange\", this.onvisibilitychange.bind(this))\n }\n\n this.player.container.addEventListener(\"mouseenter\", this.onMouseEnter)\n this.player.container.addEventListener(\"mouseleave\", this.onMouseLeave)\n\n // Workaround for UI flicker and FOUT\n setTimeout(() => {\n this.container.element.style.display = \"block\"\n }, 10)\n }\n\n ondestroy() {\n this.stopActiveTimeout()\n this.player.container.removeEventListener(\"mouseenter\", this.onMouseEnter)\n this.player.container.removeEventListener(\"mouseleave\", this.onMouseLeave)\n }\n\n onvisibilitychange(event) {\n this.container.classList.update({\"amp-cc-active\": event.detail})\n }\n\n onplaybacktargetchange(event) {\n this.container.classList.update({\"amp-remote-playback\": (event.detail.value != \"amp\")})\n }\n\n onmediachange(event) {\n const media = this.player.media\n this.container.classList.update({\"amp-audio\": media.medium == \"audio\"})\n this.container.classList.update({\"amp-text-tracks\": media.tracks && media.tracks.length})\n }\n\n onmutemouseover(event) {\n \tthis.stopActiveTimeout()\n \tthis.refs.volume.open = true\n }\n\n onmutemouseout(event) {\n \tthis.stopActiveTimeout()\n \tthis.timeout = setTimeout(() => {\n this.refs.volume.open = false\n }, 350)\n }\n\n onvolumemouseover(event) {\n \tthis.stopActiveTimeout()\n }\n\n onfullscreenchange(event) {\n this.container.classList.update({\"amp-full-screen\": event.detail})\n }\n\n onmutechange(event) {\n this.container.classList.update({\"amp-muted\": event.detail})\n }\n\n onplaystatechange(event) {\n const updates = {\n [`amp-waiting`]: false,\n [`amp-${event.detail.previous}`]: false,\n [`amp-${event.detail.value}`]: true\n }\n this.container.classList.update(updates)\n }\n\n oncanplaythrough(event) {\n this.container.classList.update({\"amp-can-play\": true})\n }\n\n onplaying(event) {\n this.container.classList.update({\"amp-waiting\": false})\n this.container.classList.remove(\"amp-qualitychange-manual\")\n this.container.classList.remove(\"amp-qualitychange-auto\")\n\n if (!this.isTouchDevice)\n return\n\n this.startActiveTimeout()\n }\n\n onwaiting(event) {\n this.container.classList.update({\"amp-waiting\": true})\n this.player.once(\"timeupdate\", () => {\n if (this.player.seeking === false) {\n this.container.classList.update({\"amp-waiting\": false})\n }\n })\n }\n\n onbusy(event) {\n this.container.classList.update({\"amp-busy\": event.detail})\n }\n\n onseeking(event) {\n this.container.classList.update({\"amp-waiting\": true})\n }\n\n onseeked(event) {\n this.container.classList.update({\"amp-waiting\": false})\n }\n\n onerror(event) {\n this.container.classList.update({\"amp-error\": true})\n }\n\n onislive(event) {\n this.container.classList.update({\"amp-is-live\": event.detail})\n }\n\n ontemporaltypechange(event) {\n const updates = {\n [`amp-${event.detail.previous}`]: false,\n [`amp-${event.detail.value}`]: true\n }\n this.container.classList.update(updates)\n }\n\n onqualitychanging(event) {\n this.container.classList.add(`amp-qualitychange-${this.player.qualityMode}`)\n }\n\n onqualitychange(event) {\n this.container.classList.remove(`amp-qualitychange-${this.player.qualityMode}`)\n }\n\n onqualityswitched(event) {\n this.onqualitychange(event)\n }\n\n togglePlayPause() {\n if (this.player.playState == \"ready\" || this.player.paused) {\n this.player.play()\n } else {\n this.player.pause()\n }\n }\n\n set activeState(value) {\n const active = (value == ActiveState.ACTIVE)\n const inactive = (value == ActiveState.INACTIVE)\n const idle = (value == ActiveState.IDLE)\n this.container.classList.update({\"amp-active\": active, \"amp-inactive\": inactive, \"amp-idle\": idle})\n\n // TODO: Remove these when controls plugin is completely removed from amp-web\n let action = active ? \"add\" : \"remove\"\n this.player.container.classList[action](\"amp-active\")\n\n action = inactive ? \"add\" : \"remove\"\n this.player.container.classList[action](\"amp-inactive\")\n\n if (inactive === true) {\n for (let key in this.refs) {\n const value = this.refs[key]\n if (value instanceof Panel && value.open === true) {\n value.open = false\n }\n }\n this.startActiveTimeout()\n }\n }\n\n get activeState() {\n switch (true) {\n case this.container.classList.contains(\"amp-active\"):\n return ActiveState.ACTIVE\n\n case this.container.classList.contains(\"amp-inactive\"):\n return ActiveState.INACTIVE\n\n default:\n return ActiveState.IDLE\n }\n }\n\n get adInProgress() {\n return (this.player.ads && this.player.ads.inProgress)\n }\n\n startActiveTimeout() {\n if(this.refs.settingsPanel.open) {\n this.refs.settingsPanel.close()\n this.refs.volume.open = false\n }\n this.stopActiveTimeout()\n this.timeout = setTimeout(() => {\n this.activeState = ActiveState.IDLE\n }, this.autoHide * 1000)\n }\n\n stopActiveTimeout() {\n clearTimeout(this.timeout)\n }\n\n onMouseEnter(event) {\n this.stopActiveTimeout()\n this.activeState = ActiveState.ACTIVE\n }\n\n onMouseLeave(event) {\n const element = document.elementFromPoint(event.clientX, event.clientY)\n if (this.player.playState == \"ready\" || this.open || this.player.container.contains(element))\n return\n\n if (this.dragging) {\n const handler = () => {\n window.removeEventListener(\"mouseup\", handler)\n if (!akamai.amp.Utils.isMouseOverElement(this.container.element))\n this.onMouseLeave(event)\n }\n window.addEventListener(\"mouseup\", handler)\n return\n }\n\n this.activeState = ActiveState.INACTIVE\n }\n\n onClick() {\n if (this.isTouchDevice) {\n if (this.activeState == ActiveState.ACTIVE) {\n this.activeState = ActiveState.IDLE\n }\n else {\n this.activeState = ActiveState.ACTIVE\n this.startActiveTimeout()\n }\n }\n else {\n this.togglePlayPause()\n }\n }\n\n isFocused(element) {\n const container = this.container.element\n return (element == container || container.contains(element))\n }\n\n onFocus(event) {\n const focused = this.isFocused(event.target)\n this.focused = (event.target.nodeName != \"BUTTON\" && focused)\n if (focused)\n this.container.classList.add(\"amp-active\")\n }\n\n onBlur(event) {\n const focused = this.isFocused(event.target)\n this.focused = (event.target.nodeName != \"BUTTON\" && focused)\n if (!focused)\n this.onMouseLeave(event)\n }\n\n onKeyDown(event) {\n switch (event.keyCode) {\n case 77: // M\n this.player.muted = !this.player.muted\n break;\n\n case 67: // C\n this.player.captioning.hidden = !this.player.captioning.hidden\n break;\n\n case 70: // F\n this.player.displayState == this.player.displayState == 'full-screen'? this.player.exitFullScreen() : this.player.enterFullScreen()\n break;\n }\n\n if (this.focused == false)\n return\n\n switch (event.keyCode) {\n case 13: // Enter\n case 32: // Space\n this.togglePlayPause()\n break;\n\n case 39: // Left\n case 37: // Right\n if (this.refs.volume.focused === false)\n this.refs.progress.onKeyDown(event)\n break;\n\n case 38: // Up\n case 40: // Down\n if (this.refs.progress.focused === false)\n this.refs.volume.onKeyDown(event)\n break;\n }\n }\n\n contextMenuClick(event) {\n if (/selectable/.test(event.target.className))\n return false\n this.removeContextMenu(event)\n return false\n }\n\n removeContextMenu(event) {\n document.body.removeEventListener(\"click\", this.contextMenuClick)\n const parent = document.body\n parent.removeChild(this.contextMenu)\n this.contextMenu = null\n }\n\n onContextMenu(event) {\n if (this.debug === true)\n return\n\n event.preventDefault()\n\n const parent = document.body\n const contextMenu = (\n \n )\n\n if (this.contextMenu != null)\n this.removeContextMenu()\n\n this.contextMenu = document.createElement(\"div\")\n parent.appendChild(this.contextMenu)\n document.body.addEventListener(\"click\", this.contextMenuClick)\n ReactDOM.render(contextMenu, this.contextMenu)\n }\n\n replay() {\n this.player.replay()\n }\n\n render() {\n return (\n \n
    \n \n \n <Ads ref=\"ads\" />\n <PauseOverlay ref=\"pauseOverlay\" />\n <BufferingOverlay ref=\"bufferingOverlay\" />\n <Progress ref=\"progress\" />\n <Container ref=\"controls\" className=\"amp-controls amp-bar\">\n <PlayPause ref=\"playpause\" />\n <JumpBack ref=\"jumpback\"/>\n <JumpForward ref=\"jumpforward\"/>\n <div ref=\"timeDisplay\" className=\"amp-time-display\">\n <CurrentTime ref=\"currentTime\" />\n <span ref=\"timeSeparator\" className=\"amp-time-separator\" />\n <Duration ref=\"duration\" />\n <Live ref=\"live\" />\n </div>\n <Mute ref=\"mute\" />\n <Volume ref=\"volume\" />\n <div ref=\"spacerLeft\" className=\"amp-spacer\" />\n <div ref=\"spacerRight\" className=\"amp-spacer\" />\n <ShareButton ref=\"share\" panel=\"sharePanel\" />\n <CaptionToggleButton ref=\"cc\" />\n <SettingsButton ref=\"settings\" panel=\"settingsPanel\" />\n <PiP ref=\"pip\" />\n <Airplay ref=\"airplay\" />\n <ChromeCast ref=\"chromecast\" />\n <Fullscreen ref=\"fullscreen\" />\n </Container>\n <Unmute ref=\"unmute\" />\n <SharePanel ref=\"sharePanel\" />\n <SettingsPanel ref=\"settingsPanel\" />\n <ErrorMsg ref=\"error\" />\n {this.state.contextMenu}\n </Container>\n )\n }\n\n destroy() {\n ReactDOM.unmountComponentAtNode(this._container)\n }\n\n static get childContextTypes() {\n return {\n player: PropTypes.object,\n config: PropTypes.object,\n plugin: PropTypes.object\n }\n }\n\n static create(player, config, key) {\n if (config.native === true) {\n const ui = {config}\n player.once(\"ready\", () => player.mediaElement.controls = true)\n if (player.ads != null) {\n ui.ads = {\n container: document.createElement(\"div\")\n }\n player.container.appendChild(ui.ads.container)\n }\n return Promise.resolve(ui)\n }\n\n return new Promise((resolve, reject) => {\n player.once(\"ready\", () => {\n if (player.mediaElement.setPlayerProperty != null)\n player.mediaElement.setPlayerProperty(\"controlsMode\", \"none\")\n })\n\n const ui = ReactDOM.render(<UI player={player} config={config} />, player.container)\n player.adContainer = ui.ads.container\n resolve(ui)\n })\n }\n}\n","import \"./main.less\"\nimport UI from \"./UI.js\"\n\nakamai.amp.AMP.registerPlugin(\"react\", [\"html\", \"flash\", \"external\"], UI.create)\n\nexport {default as Component} from \"./Component.js\"\nexport {default as Container} from \"./Container.js\"\nexport {default as ClassList} from \"./ClassList.js\"\nexport {default as Panel} from \"./Panel.js\"\nexport {default as PanelMenu} from \"./PanelMenu.js\"\nexport {default as PanelControl} from \"./PanelControl.js\"\nexport {default as ListItem} from \"./ListItem.js\"\nexport {default as Mode} from \"./Mode.js\"\n\nexport {UI}\n"]}