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="../../lib-definitions/jwplayer.d.ts" />
var econda;
(function (econda) {
    var media;
    (function (media) {
        var helper;
        (function (helper) {
            /**
             * Helper to setup trackig for jwplayer.
             * <a target="blank" href="http://www.longtailvideo.com/jw-player/">http://www.longtailvideo.com/jw-player/</a>
             *
             *
             * Example:
             *     <!-- video will be placed here -->
             *     <div id="myElement">Loading the player...</div>
             *
             *     <script type="text/javascript">
             *         var myPlayer = jwplayer("myElement").setup({
             *             file: "./media-files/movies/trailer.mp4"
             *         });
             *
             *         // setup econda video tracking
             *
             *         // enable debug output
             *         econda.debug.setEnabled(true);
             *
             *         // disable real server requests for this demo page
             *         econda.media.transport.configure({
             *             type: "direct",
             *             disabled: true
             *         });
             *
             *         // Setup player tracker
             *         var trackingHelper = new econda.media.helper.JwPlayerTracker({
             *             player: myPlayer,
             *             tracker: {content: "/Examples/JwPlayer Example"}
             *         });
             *
             *     </script>
             *
             * @class econda.media.helper.JwPlayerTracker
             * @extends econda.base.BaseClass
             */
            var JwPlayerTracker = (function (_super) {
                __extends(JwPlayerTracker, _super);
                function JwPlayerTracker(cfg) {
                    _super.call(this);
                    /**
                     * @cfg {econda.media.MediaTracker/Object} tracker Reference to tracker object or config options for a new tracker object.
                     * @accessor
                     */
                    this._tracker = null;
                    /**
                     * @cfg {Object} player Reference to jw player instance element
                     * @accessor
                     */
                    this._player = null;
                    this.__defaultProperty = "player";
                    /**
                     * Reference to element where we can get duration etc...
                     * video 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 = {};
                    if (cfg instanceof JwPlayerTracker) {
                        return cfg;
                    }
                    this.initConfig(cfg);
                }
                JwPlayerTracker.prototype.getTracker = function () {
                    return this._tracker;
                };
                JwPlayerTracker.prototype.setTracker = function (tracker) {
                    this._tracker = new econda.media.MediaTracker(tracker);
                    // write cached data to tracker object
                    this.updateTrackerData();
                    return this;
                };
                JwPlayerTracker.prototype.getPlayer = function () {
                    return this._player;
                };
                JwPlayerTracker.prototype.setPlayer = function (jwplayer) {
                    if (!jwplayer) {
                        econda.debug.error("No player object given.");
                        return this;
                    }
                    this._player = jwplayer;
                    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
                 */
                JwPlayerTracker.prototype.updateTrackerData = function (property, value) {
                    if (typeof property != 'undefined') {
                        this._trackerData[property] = value;
                    }
                    if (typeof this._tracker != 'undefined') {
                        this._tracker.set(this._trackerData);
                    }
                    return this;
                };
                /**
                 * Add event listeners to jwplayer
                 * @method
                 * @private
                 */
                JwPlayerTracker.prototype.addEventListeners = function () {
                    var cmp = this;
                    var p = this._player;
                    p.onReady(function () { cmp.handleReadyEvent.apply(cmp, arguments); });
                    p.onPlay(function () { cmp.handlePlayEvent.apply(cmp, arguments); });
                    p.onPause(function () { cmp.handlePauseEvent.apply(cmp, arguments); });
                    p.onSeek(function () { cmp.handleSeekEvent.apply(cmp, arguments); });
                    p.onComplete(function () { cmp.handleCompleteEvent.apply(cmp, arguments); });
                    return this;
                };
                /**
                 * Handles the players loadeddata event
                 * @method
                 * @private
                 */
                JwPlayerTracker.prototype.handleReadyEvent = function () {
                    econda.debug.log("got onReady event");
                    this.updateTrackerData("duration", this._player.getDuration());
                    this._playerDataLoaded = true;
                    // tracker should have all data now, so initialize it.
                    if (this._tracker) {
                        this._tracker.init();
                    }
                };
                /**
                 * Handle video "play" events
                 * @method
                 * @private
                 */
                JwPlayerTracker.prototype.handlePlayEvent = function () {
                    var t = this._tracker, p = this._player;
                    econda.debug.log("got play event");
                    if (t) {
                        t.setDuration(p.getDuration());
                        t.setState("playing", p.getPosition());
                    }
                };
                /**
                 * Handle video "seek" events
                 * @method
                 * @private
                 * @param {Object} arguments {position: position, offset: new position}
                 */
                JwPlayerTracker.prototype.handleSeekEvent = function (args) {
                    var t = this._tracker, p = this._player;
                    econda.debug.log("got seek event to " + args.offset);
                    if (t) {
                        // t.setState("paused", arguments.position); FIXME
                        t.setState("playing", args.offset);
                    }
                };
                /**
                 * Handle video "pause" events
                 * @method
                 * @private
                 * @param {Object} event Event object
                 */
                JwPlayerTracker.prototype.handlePauseEvent = function (event) {
                    var t = this._tracker;
                    econda.debug.log("got pause event");
                    if (t) {
                        t.setState("paused", this._player.getPosition());
                    }
                };
                /**
                 * Handle video "ended" events
                 * @method
                 * @private
                 * @param {Object} event Event object
                 */
                JwPlayerTracker.prototype.handleCompleteEvent = function (event) {
                    var t = this._tracker;
                    econda.debug.log("got completed event");
                    if (t) {
                        t.setState("stopped", this._player.getPosition());
                    }
                };
                return JwPlayerTracker;
            }(econda.base.BaseClass));
            helper.JwPlayerTracker = JwPlayerTracker;
        })(helper = media.helper || (media.helper = {}));
    })(media = econda.media || (econda.media = {}));
})(econda || (econda = {}));