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" />
///<reference path="../../lib-definitions/youtube.d.ts" />
var econda;
(function (econda) {
    var media;
    (function (media) {
        var helper;
        (function (helper) {
            var DomHelper = econda.util.DomHelper;
            /**
             * Helper class for tracking youtube videos.
             *
             *
             * Example using youtube IFRAME API:
             *
             *     <!-- you tube player will replace this <div> tag. -->
             *     <div id="ytplayer_id"></div>
             *
             *     <script type="text/javascript">
             *         function onYouTubeIframeAPIReady() {
             *
             *             var ytplayer = new YT.Player('ytplayer_id', {
             *                 height: '390',
             *                 width: '640',
             *                 videoId: 'nHNq1tK3rFg'
             *             });
             *
             *             // Setup player tracker
             *             var ytTrackingHelper = new econda.media.helper.YouTubeTracker({
             *                 player: ytplayer,
             *                 tracker: {content: "Example Video"}
             *             });
             *         }
             *     </script>
             *
             *
             * @class econda.media.helper.YouTubeTracker
             * @extends econda.base.BaseClass
             * @param {econda.media.helper.YouTubeTracker/Object} cfg Helper configuration options
             */
            var YouTubeTracker = (function (_super) {
                __extends(YouTubeTracker, _super);
                function YouTubeTracker(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 youtube player. Required in constructur.
                     */
                    this._player = null;
                    /**
                     * Type of you tube player. One of "iframe". Will be set in setPlayer method and must not be modified anywhere else.
                     * @property {String} playerType
                     * @private
                     */
                    this._playerType = null;
                    /**
                     * Id of youtube player. Will be set in setPlayer method and must not be modified anywhere else.
                     * @property {String} playerId
                     * @private
                     */
                    this._playerId = null;
                    this.__defaultProperty = "player";
                    if (cfg instanceof YouTubeTracker) {
                        return cfg;
                    }
                    this.initConfig(cfg);
                }
                YouTubeTracker.prototype.getTracker = function () {
                    return this._tracker;
                };
                YouTubeTracker.prototype.setTracker = function (tracker) {
                    this._tracker = new econda.media.MediaTracker(tracker);
                    return this;
                };
                YouTubeTracker.prototype.getPlayer = function () {
                    return this._player;
                };
                YouTubeTracker.prototype.setPlayer = function (player) {
                    var cmp = this, playerId, playerObject;
                    if (typeof player == "string") {
                        playerObject = DomHelper.element(player);
                    }
                    else {
                        playerObject = player;
                    }
                    this._player = playerObject;
                    // detect player type
                    if (typeof playerObject.getIframe != 'undefined') {
                        this._playerType = 'iframe';
                        this._playerId = playerId = playerObject.getIframe().getAttribute("id");
                    }
                    else {
                        this._playerId = playerId = playerObject.getAttribute("id");
                    }
                    // register player
                    YouTubeTracker.registeredTrackers[playerId] = this;
                    // add event listeners
                    if (this._playerType == 'iframe') {
                        playerObject.addEventListener("onReady", function () { cmp.handleReadyIframe.apply(cmp, arguments); });
                        playerObject.addEventListener("onStateChange", function () { cmp.handleStateChangeIframe.apply(cmp, arguments); });
                    }
                    else {
                        playerObject.addEventListener("onStateChange", "(function(newState){econda.media.helper.YouTubeTracker.registeredTrackers['" + playerId + "'].handleStateChange(newState);})");
                    }
                    return this;
                };
                /**
                 * Handle onStateChange event of youtube player
                 * @private
                 * @param {Object} newState new state of youtube player
                 */
                YouTubeTracker.prototype.handleStateChangeIframe = function (stateObj) {
                    // stateObj.data = new state as number
                    // stateObj.target = player reference
                    var cmp = this, tracker = cmp.getTracker(), newState;
                    switch (stateObj.data) {
                        case -1:
                            // newState = 'unititialized';
                            break;
                        case 0:
                            newState = 'stopped';
                            break;
                        case 1:
                            newState = 'playing';
                            break;
                        case 2:
                            newState = 'paused';
                            break;
                        case 3:
                            //    newState = 'buffering';
                            break;
                    }
                    if (tracker && newState) {
                        tracker.setState(newState, cmp.getPlayer().getCurrentTime());
                    }
                    return this;
                };
                /**
                 * Handle iframe api onReady event
                 *
                 * @method
                 * @private
                 */
                YouTubeTracker.prototype.handleReadyIframe = function () {
                    var cmp = this, tracker = cmp.getTracker(), player = cmp.getPlayer(), content, previewUri;
                    // read some infos from player
                    if (!tracker) {
                        tracker = new econda.media.MediaTracker();
                        cmp.setTracker(tracker);
                    }
                    // set video duration
                    tracker.setDuration(player.getDuration());
                    // use SSL uri!!
                    previewUri = player.getVideoUrl();
                    tracker.setPreviewUri(previewUri.replace(/http:\/\//, 'https://'));
                    // use document location if we've no video name
                    if (!tracker.getContent()) {
                        tracker.setContent(location.pathname);
                    }
                    // initialize tracker
                    tracker.init();
                };
                YouTubeTracker.registeredTrackers = {};
                return YouTubeTracker;
            }(econda.base.BaseClass));
            helper.YouTubeTracker = YouTubeTracker;
        })(helper = media.helper || (media.helper = {}));
    })(media = econda.media || (econda.media = {}));
})(econda || (econda = {}));