if(typeof econda.media.helper == 'undefined') {
econda.media.helper = {};
}
/**
* Helper class for tracking youtube videos.
*
* @markdown
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.Object
* @constructor Constructor
* @param {econda.media.helper.YouTubeTracker/Object} cfg Helper configuration options
*/
econda.media.helper.YouTubeTracker = function(cfg)
{
cfg = cfg || {};
/**
* Private properties collection
* @property {Object} __p
* @private
*/
var __p = {
/**
* @cfg {econda.media.MediaTracker/Object} tracker Reference to tracker object or config options for a new tracker object.
*/
tracker: null,
/**
* @cfg {Object} player Reference to youtube player. Required in constructur.
*/
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";
/**
* Set tracker object or configuration. See constructor of MediaTracker object for details.
*
* // Example:
* ytTracker.setTracer({
* content: "Video Name",
* category: "/Example Videos"
* }
*
* @method
* @param {econda.media.MediaTracker/Object/String} tracker tracker object, tracker config or content name
*/
this.setTracker = function(tracker)
{
__p["tracker"] = new econda.media.MediaTracker(tracker);
return this;
};
/**
* Get tracker object
* @method
* @return {econda.media.MediaTracker}
*/
this.getTracker = function()
{
return __p["tracker"];
};
/**
* Set reference to youtube player
* @method
* @ignore Available as config option only
* @todo Check if it's possible to modify the player!
*/
this.setPlayer = function(player)
{
var cmp = this,
playerId,
playerObject;
if(typeof player == "string") {
playerObject = document.getElementById(player);
} else {
playerObject = player;
}
__p["player"] = playerObject;
// detect player type
if(typeof playerObject.getIframe != 'undefined') {
cmp.playerType = 'iframe';
cmp.playerId = playerObject.getIframe().getAttribute("id");
} else {
cmp.playerId = playerObject.getAttribute("id");
}
// register player
econda.media.helper.YouTubeTracker.registeredTrackers[cmp.playerId] = cmp;
// add event listeners
if(cmp.playerType == 'iframe') {
playerObject.addEventListener("onReady", function() {cmp.handleReadyIframe()});
playerObject.addEventListener("onStateChange", function(stateObj){cmp.handleStateChangeIframe(stateObj);});
} else {
playerObject.addEventListener(
"onStateChange",
"(function(newState){econda.media.helper.YouTubeTracker.registeredTrackers['"+cmp.playerId+"'].handleStateChange(newState);})"
);
}
return this;
};
/**
* Return reference to youtube player
*/
this.getPlayer = function()
{
return __p["player"];
};
/**
* Handle onStateChange event of youtube player
* @private
* @param {Object} newState new state of youtube player
*/
this.handleStateChangeIframe = function(stateObj)
{
// stateObj.data = new state as number
// stateObj.target = player reference
console.log("got state change" + stateObj.data);
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: // currently not supported by our tracker
// newState = 'buffering';
break;
}
if(tracker && newState) {
tracker.setState(newState, cmp.getPlayer().getCurrentTime());
}
return this;
};
/**
* Handle iframe api onReady event
*
* @method
* @private
*/
this.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();
};
// Constructor
return this.setup(cfg, __p);
};
/**
* Handle global onYouTubePlayerReady event. If you define your own onYouTubePlayerReady
* function, make sure to call this handler.
* @static
* @method handleOnYouTubePlayerReady
* @param {String} playerId Id of youtube player
*/
econda.media.helper.YouTubeTracker.handleOnYouTubePlayerReady = function(playerId)
{
econda.debug.log("Got youtube player ready event. Player ID: " + playerId);
};
/**
* playerId to player tracker object registry.
* @property {Object} registeredTrackers
* @private
* @static
*/
econda.media.helper.YouTubeTracker.registeredTrackers = {};
// add standard object features
econda.media.helper.YouTubeTracker.prototype = new econda.base.Object();