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 = {}));