/* global IntlHelper */ (function(window) { 'use strict'; var proto = Object.create(HTMLElement.prototype); var isTouch = 'ontouchstart' in window; proto.createdCallback = function() { var shadowRoot = this.createShadowRoot(); shadowRoot.innerHTML = `
`; var $id = shadowRoot.getElementById.bind(shadowRoot); this.els = { container: $id('container'), elapsedTime: $id('elapsed-time'), seekBar: $id('seek-bar'), seekBarProgress: $id('seek-bar-progress'), seekBarIndicator: $id('seek-bar-indicator'), remainingTime: $id('remaining-time') }; var container = this.els.container; var seekBar = this.els.seekBar; var seekTimeout = null; container.addEventListener(isTouch ? 'touchstart' : 'mousedown', (evt) => { clearTimeout(seekTimeout); container.addEventListener(isTouch ? 'touchmove' : 'mousemove', pointerMoveHandler); container.addEventListener(isTouch ? 'touchend' : 'mouseup', pointerEndHandler); this.els.seekBarIndicator.classList.add('highlight'); pointerMoveHandler(evt); }); var pointerMoveHandler = (evt) => { var pointer = isTouch ? evt.targetTouches[0] : evt; var percent = clamp(0, 1, (pointer.clientX - seekBar.offsetLeft) / seekBar.offsetWidth); if (document.documentElement.dir === 'rtl') { this.remainingTime = this._overrideRemainingTime = percent * this.duration; } else { this.elapsedTime = this._overrideElapsedTime = percent * this.duration; } }; var pointerEndHandler = (evt) => { this.dispatchEvent(new CustomEvent('seek', { detail: { elapsedTime: this.elapsedTime } })); container.removeEventListener(isTouch ? 'touchmove' : 'mousemove', pointerMoveHandler); container.removeEventListener(isTouch ? 'touchend' : 'mouseup', pointerEndHandler); seekTimeout = setTimeout(() => { this._overrideRemainingTime = null; this._overrideElapsedTime = null; this.els.seekBarIndicator.classList.remove('highlight'); }, 100); }; this._overrideRemainingTime = null; this._overrideElapsedTime = null; this.duration = null; this.elapsedTime = null; this.remainingTime = null; }; Object.defineProperty(proto, 'duration', { get: function() { return this._duration; }, set: function(value) { if (isNaN(value)) { this._duration = null; this.remainingTime = null; return; } this._duration = value; this.remainingTime = this._duration - this._elapsedTime; } }); Object.defineProperty(proto, 'elapsedTime', { get: function() { return this._elapsedTime; }, set: function(value) { if (isNaN(value)) { this._elapsedTime = null; this.remainingTime = null; return; } this._elapsedTime = this._overrideElapsedTime !== null ? this._overrideElapsedTime : value; this.remainingTime = this._duration - this._elapsedTime; } }); Object.defineProperty(proto, 'remainingTime', { get: function() { return this._remainingTime; }, set: function(value) { var indeterminate = isNaN(value) || isNaN(this._duration); if (indeterminate) { this._remainingTime = null; this._elapsedTime = null; } else { this._remainingTime = this._overrideRemainingTime !== null ? this._overrideRemainingTime : value; this._elapsedTime = this._duration - this._remainingTime; } window.requestAnimationFrame(() => { if (indeterminate) { this.els.remainingTime.textContent = '---:--'; this.els.elapsedTime.textContent = '--:--'; return; } var percent = this._duration ? this._elapsedTime / this._duration : 0; var x = this.els.seekBar.offsetWidth * percent; if (document.documentElement.dir === 'rtl') { x = this.els.seekBar.offsetWidth - x; } this.els.seekBarIndicator.style.transform = 'translateX(' + x + 'px)'; IntlHelper.get('duration').then((duration) => { this.els.remainingTime.textContent = duration.format(-this._remainingTime * 1000); this.els.elapsedTime.textContent = duration.format(this._elapsedTime * 1000); }); }); } }); function clamp(min, max, value) { return Math.min(Math.max(min, value), max); } IntlHelper.define('duration', 'mozduration', { minUnit: 'second', maxUnit: 'minute' }); try { window.MusicSeekBar = document.registerElement('music-seek-bar', { prototype: proto }); } catch (e) { if (e.name !== 'NotSupportedError') { throw e; } } })(window);