/** * Created by gavorhes on 11/2/2015. */ "use strict"; var provide_1 = require('../util/provide'); var range_change_1 = require('./range-change'); var $ = require('jquery'); var nm = provide_1.default('domUtil'); /** * @callback mediaCallback * @param {number} tm */ function timeToLocalDateString(tm) { "use strict"; var d = new Date(tm); var p1 = d.toLocaleTimeString().split(' '); var p2 = p1[0].split(':'); p2 = p2.slice(0, 2); return d.toLocaleDateString() + '<br>' + p2.join(':') + ' ' + p1[1]; } var MediaControl = (function () { /** * * @param element * @param changeFunc * @param mediaConfig */ function MediaControl(element, changeFunc, mediaConfig) { var _this = this; if (changeFunc === void 0) { changeFunc = function () { return; }; } if (mediaConfig === void 0) { mediaConfig = {}; } mediaConfig.min = typeof mediaConfig.min == 'number' ? mediaConfig.min : 0; mediaConfig.max = typeof mediaConfig.max == 'number' ? mediaConfig.max : 100; mediaConfig.val = typeof mediaConfig.val == 'number' ? mediaConfig.val : 0; mediaConfig.step = typeof mediaConfig.step == 'number' ? mediaConfig.step : 5; mediaConfig.playInterval = typeof mediaConfig.playInterval == 'number' ? mediaConfig.playInterval : 500; mediaConfig.showAsDate = typeof mediaConfig.showAsDate == 'boolean' ? mediaConfig.showAsDate : false; if (typeof element == 'string') { this._container = $('#' + element); } else if (typeof element['style'] !== 'undefined') { this._container = $(element); } else { this._container = element; } this._container.addClass('media-control-container'); this._playInterval = mediaConfig.playInterval; this._changeFunc = changeFunc; this._showAsDate = mediaConfig.showAsDate; this._currentValue = undefined; this._min = undefined; this._max = undefined; this._step = undefined; this._playing = false; var htmlStr = '<span class="media-player-button media-back"></span>' + '<span class="media-player-button media-play"></span>' + '<span class="media-player-button media-pause media-disabled"></span>' + '<span class="media-player-button media-stop media-disabled" ></span>' + '<span class="media-player-button media-ahead"></span>' + "<input type=\"range\">" + "<div class=\"media-control-value-label-container\">" + "<span class=\"media-control-value-label-min\"></span>" + "<span class=\"media-control-value-label-val\"></span>" + "<span class=\"media-control-value-label-max\"></span>" + "</div>"; this._container.append(htmlStr); // let btnPause = this._container.find('.media-pause'); var btnPlay = this._container.find('.media-play'); this._$btnStop = this._container.find('.media-stop'); var btnAhead = this._container.find('.media-ahead'); var btnBack = this._container.find('.media-back'); this._$slider = this._container.find('input[type=range]'); this._$valLabelMin = this._container.find('.media-control-value-label-min'); this._$valLabelVal = this._container.find('.media-control-value-label-val'); this._$valLabelMax = this._container.find('.media-control-value-label-max'); this.setMinMaxValueStep(mediaConfig.min, mediaConfig.max, mediaConfig.val, mediaConfig.step); range_change_1.rangeChange(this._$slider, function (newVal) { _this.currentValue = newVal; }, 100); var ___this = this; btnPlay.click(function () { var $this = $(this); $this.addClass('media-disabled'); ___this._$btnStop.removeClass('media-disabled'); btnAhead.addClass('media-locked'); btnBack.addClass('media-locked'); ___this._$slider.prop('disabled', true); ___this._playing = true; ___this._interval = setInterval(function () { ___this.currentValue += ___this._step; }, ___this._playInterval); }); this._$btnStop.click(function () { clearInterval(___this._interval); var $this = $(this); $this.addClass('media-disabled'); btnPlay.removeClass('media-disabled'); btnAhead.removeClass('media-locked'); btnBack.removeClass('media-locked'); ___this._$slider.prop('disabled', false); ___this._playing = false; }); btnAhead.click(function () { ___this.currentValue = ___this.currentValue + ___this._step; }); btnBack.click(function () { ___this.currentValue = ___this.currentValue - ___this._step; }); } MediaControl.prototype.stopPlaying = function () { if (this._playing) { this._$btnStop.trigger('click'); } }; Object.defineProperty(MediaControl.prototype, "playing", { get: function () { return this._playing; }, enumerable: true, configurable: true }); Object.defineProperty(MediaControl.prototype, "min", { get: function () { return this._min; }, enumerable: true, configurable: true }); Object.defineProperty(MediaControl.prototype, "max", { get: function () { return this._max; }, enumerable: true, configurable: true }); Object.defineProperty(MediaControl.prototype, "step", { get: function () { return this._step; }, enumerable: true, configurable: true }); Object.defineProperty(MediaControl.prototype, "currentValue", { get: function () { return this._currentValue; }, set: function (newValue) { if (newValue > this._max) { newValue = this._min; } else if (newValue < this._min) { newValue = this._max; } this._currentValue = newValue; this._$slider.val(this._currentValue.toFixed(2)); if (this._showAsDate) { this._$valLabelVal.html(timeToLocalDateString(this.currentValue)); } else { this._$valLabelVal.html(this.currentValue.toString()); } this._changeFunc(newValue); }, enumerable: true, configurable: true }); /** * set min and max value with step * @param {number} newMin the new min * @param {number} newMax the new mas * @param {number} [newValue=newMin] the value to set * @param {number} [newStep=(newMax-newMin)/20] step value */ MediaControl.prototype.setMinMaxValueStep = function (newMin, newMax, newValue, newStep) { this._min = newMin; this._max = newMax; newValue = typeof newValue == 'number' ? newValue : newMin; newStep = typeof newStep == 'number' ? newStep : (newMax - newMin) / 20; this._currentValue = newValue; this._step = newStep; this._$slider.prop('min', this.min.toString()); this._$slider.prop('max', this.max.toString()); this._$slider.prop('step', this.step.toString()); this._$slider.val(this.currentValue.toString()); if (this._showAsDate) { this._$valLabelMin.html(timeToLocalDateString(this._min)); this._$valLabelVal.html(timeToLocalDateString(this.currentValue)); this._$valLabelMax.html(timeToLocalDateString(this._max)); } else { this._$valLabelMin.html(this._min.toString()); this._$valLabelVal.html(this.currentValue.toString()); this._$valLabelMax.html(this._max.toString()); } }; Object.defineProperty(MediaControl.prototype, "changeFunction", { /** * * @param {mediaCallback} newFunc the callback on change */ set: function (newFunc) { this._changeFunc = newFunc; }, enumerable: true, configurable: true }); return MediaControl; }()); exports.MediaControl = MediaControl; nm.MediaControl = MediaControl; //# sourceMappingURL=media-control.js.map