var __extends = (this && this.__extends) || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
///<reference path="../../base/BaseClass.ts" />
///<reference path="../MediaTracker.ts" />
///<reference path="../IMediaTrackerConfigOptions.ts" />
///<reference path="../../debug.ts" />
///<reference path="../../util/DomHelper.ts" />
var econda;
(function (econda) {
    var media;
    (function (media) {
        var helper;
        (function (helper) {
            var DomHelper = econda.util.DomHelper;
            var MediaTracker = econda.media.MediaTracker;
            /**
             * Helper to setup trackig for html5 audio tag based media playback.
             *
             * <h3>Example</h3>
        
             *     <!-- Our audio -->
             *     <audio id="audioTagId"
             *            controls="controls">
             *         <source src="./media-files/music/music.mp3"/>
             *         <p>Your Browser does not support the html audio tag.</p>
             *     </audio>
             *
             *     <!-- setup econda audio tracking -->
             *     <script type="text/javascript">
             *
             *         // enable debug output
             *         econda.debug.setEnabled(true);
             *
             *         // Setup player tracker
             *         var trackingHelper = new econda.media.helper.HtmlAudioTracker({
             *             player: document.getElementById("audioTagId"),
             *             tracker: {content: "HTML5 Example audio"}
             *         });
             *
             *     </script>
             *
             * @class econda.media.helper.HtmlAudioTracker
             * @extends econda.base.BaseClass
             * @param {Object} cfg Configuration options
             */
            var HtmlAudioTracker = (function (_super) {
                __extends(HtmlAudioTracker, _super);
                function HtmlAudioTracker(cfg) {
                    _super.call(this);
                    /**
                     * @cfg {econda.media.MediaTracker/Object} tracker Reference to tracker object or config options for a new tracker object.
                     */
                    this.tracker = null;
                    /**
                     * @cfg {Object} player Reference to html audio element
                     * @accessor
                     */
                    this.player = null;
                    // @private
                    this.__defaultProperty = "player";
                    /**
                     * Reference to element where we can get duration etc...
                     * audio or source tag.
                     * @private
                     * @property {Object} ve
                     */
                    this.ve = null;
                    /**
                     * True as soon as we could read infos from player object.
                     * (Duration, etc...)
                     * @private
                     * @property {Boolean} playerDataLoaded
                     */
                    this.playerDataLoaded = false;
                    /**
                     * Data we wrote or have to write to tracker object
                     * @private
                     * @property {Object} trackerData
                     */
                    this.trackerData = {};
                    this.cuedSeekedEvent = null;
                    if (cfg instanceof HtmlAudioTracker) {
                        return cfg;
                    }
                    this.initConfig(cfg);
                }
                HtmlAudioTracker.prototype.getTracker = function () {
                    return this.tracker;
                };
                HtmlAudioTracker.prototype.setTracker = function (tracker) {
                    this.tracker = new MediaTracker(tracker);
                    // write cached data to tracker object
                    this.updateTrackerData();
                    return this;
                };
                HtmlAudioTracker.prototype.getPlayer = function () {
                    return this.player;
                };
                HtmlAudioTracker.prototype.setPlayer = function (domNodeOrId) {
                    var domNode;
                    if (!domNodeOrId) {
                        econda.debug.error("No dom node given in HtmlAudioTracker.setPlayer().");
                        return this;
                    }
                    // get dom node if we've got a string (= element id)
                    domNode = DomHelper.element(domNodeOrId);
                    if (!domNode) {
                        econda.debug.error("No dom node found with given element id: " + domNodeOrId);
                        return this;
                    }
                    // check if it's a html audio element
                    if (typeof domNode.tagName == 'undefined' || domNode.tagName.toLowerCase() != 'audio') {
                        econda.debug.error("Given element is not an html audio tag in HtmlAudioTracker.setPlayer().", domNode);
                        return this;
                    }
                    this.player = domNode;
                    this.ve = domNode;
                    this.addEventListeners();
                    return this;
                };
                /**
                 * Helper function to update tracker properties.
                 * We can't do this directly because the tracker might be set
                 * at a later time. You can call this function without parameters
                 * to write all stored data to tracker.
                 *
                 * @method
                 * @private
                 * @param {String} property Property name to update
                 * @param {Mixed} value Value to assign
                 */
                HtmlAudioTracker.prototype.updateTrackerData = function (property, value) {
                    if (typeof property != 'undefined') {
                        this.trackerData[property] = value;
                    }
                    if (this.tracker !== null) {
                        this.tracker.set(this.trackerData);
                    }
                    return this;
                };
                /**
                 * Add event listeners to assigned audio element
                 * @method
                 * @private
                 */
                HtmlAudioTracker.prototype.addEventListeners = function () {
                    var cmp = this;
                    var e = this.player;
                    e.addEventListener("loadeddata", function () { cmp.handleLoadedDataEvent.apply(cmp, arguments); });
                    e.addEventListener("seeking", function () { cmp.handleSeekingEvent.apply(cmp, arguments); });
                    e.addEventListener("seeked", function () { cmp.handleSeekedEvent.apply(cmp, arguments); });
                    e.addEventListener("play", function () { cmp.handlePlayEvent.apply(cmp, arguments); });
                    e.addEventListener("pause", function () { cmp.handlePauseEvent.apply(cmp, arguments); });
                    e.addEventListener("ended", function () { cmp.handleEndedEvent.apply(cmp, arguments); });
                    return this;
                };
                /**
                 * Handles the players loadeddata event
                 * @method
                 * @private
                 * @param {Object} event Event object
                 */
                HtmlAudioTracker.prototype.handleLoadedDataEvent = function (event) {
                    econda.debug.log("got loadeddata event");
                    this.updateTrackerData("duration", this.ve.duration);
                    this.playerDataLoaded = true;
                    // tracker should have all data now, so initialize it.
                    if (this.tracker) {
                        this.tracker.init();
                    }
                };
                /**
                 * Handle audio "seeking" events
                 * @method
                 * @private
                 * @param {Object} event Event object
                 */
                HtmlAudioTracker.prototype.handleSeekingEvent = function (event) {
                    var t = this.tracker;
                    econda.debug.log("got seeking event");
                    if (this.cuedSeekedEvent !== null) {
                        clearTimeout(this.cuedSeekedEvent);
                        this.cuedSeekedEvent = null;
                    }
                    if (t) {
                        t.setState("paused", this.ve.currentTime);
                    }
                };
                /**
                 * Handle audio "seeked" events
                 * @method
                 * @private
                 * @param {Object} event Event object
                 */
                HtmlAudioTracker.prototype.handleSeekedEvent = function (event) {
                    var t = this.tracker;
                    econda.debug.log("got seeked event");
                    if (t) {
                        var pos = this.ve.currentTime;
                        this.cuedSeekedEvent = setTimeout(function () {
                            t.setState("playing", pos);
                        }, 250);
                    }
                };
                /**
                 * Handle audio "play" events
                 * @method
                 * @private
                 * @param {Object} event Event object
                 */
                HtmlAudioTracker.prototype.handlePlayEvent = function (event) {
                    var t = this.tracker;
                    econda.debug.log("got play event");
                    if (t) {
                        t.setState("playing", this.ve.currentTime);
                    }
                };
                /**
                 * Handle audio "pause" events
                 * @method
                 * @private
                 * @param {Object} event Event object
                 */
                HtmlAudioTracker.prototype.handlePauseEvent = function (event) {
                    var t = this.tracker;
                    econda.debug.log("got pause event");
                    if (t) {
                        t.setState("paused", this.ve.currentTime);
                    }
                };
                /**
                 * Handle audio "ended" events
                 * @method
                 * @private
                 * @param {Object} event Event object
                 */
                HtmlAudioTracker.prototype.handleEndedEvent = function (event) {
                    var t = this.tracker;
                    econda.debug.log("got ended event");
                    if (t) {
                        t.setState("stopped", this.ve.currentTime);
                    }
                };
                return HtmlAudioTracker;
            }(econda.base.BaseClass));
            helper.HtmlAudioTracker = HtmlAudioTracker;
        })(helper = media.helper || (media.helper = {}));
    })(media = econda.media || (econda.media = {}));
})(econda || (econda = {}));