if(typeof econda.media.helper == 'undefined') {
econda.media.helper = {};
}
/**
* Helper to setup trackig for jwplayer.
* <a target="blank" href="http://www.longtailvideo.com/jw-player/">http://www.longtailvideo.com/jw-player/</a>
*
* @markdown
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.proxy.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.Object
* @constructor Constructor
* @param {Object} cfg Configuration options
*/
econda.media.helper.JwPlayerTracker = function(cfg)
{
var cmp = this;
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 jw player instance element
*/
player: null
};
this.__defaultProperty = "player";
/**
* Reference to element where we can get duration etc...
* video or source tag.
* @private
* @property {Object} ve
*/
var ve = null;
/**
* True as soon as we could read infos from player object.
* (Duration, etc...)
* @private
* @property {Boolean} playerDataLoaded
*/
var playerDataLoaded = false;
/**
* Data we wrote or have to write to tracker object
* @private
* @property {Object} trackerData
*/
var trackerData = {};
/**
* 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
*/
this.updateTrackerData = function(property, value)
{
if(typeof property != 'undefined') {
trackerData[property] = value;
}
if(typeof __p["tracker"] != 'undefined') {
__p["tracker"].set(trackerData);
}
return this;
};
/**
* 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);
// write cached data to tracker object
this.updateTrackerData();
return this;
};
/**
* Get tracker object
* @method
* @return {econda.media.MediaTracker}
*/
this.getTracker = function()
{
return __p["tracker"];
};
/**
* Set reference to html video element
* @method
* @param {Object} domNode Html video tag or element id
* @chainable
*/
this.setPlayer = function(jwplayer)
{
var domNode;
if(!jwplayer) {
econda.debug.error("No player object given.");
return this;
}
__p["player"] = jwplayer;
this.addEventListeners();
return this;
};
/**
* Add event listeners to jwplayer
* @method
* @private
*/
this.addEventListeners = function()
{
var p = __p["player"];
p.onReady(cmp.handleReadyEvent);
p.onPlay(cmp.handlePlayEvent);
p.onPause(cmp.handlePauseEvent);
p.onSeek(cmp.handleSeekEvent);
p.onComplete(cmp.handleCompleteEvent);
return this;
};
/**
* Handles the players loadeddata event
* @method
* @private
*/
this.handleReadyEvent = function()
{
econda.debug.log("got onReady event");
cmp.updateTrackerData("duration", __p["player"].getDuration());
playerDataLoaded = true;
// tracker should have all data now, so initialize it.
if(__p["tracker"]) {
__p["tracker"].init();
}
};
/**
* Handle video "play" events
* @method
* @private
*/
this.handlePlayEvent = function()
{
var t = __p["tracker"],
p = __p["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}
*/
this.handleSeekEvent = function(args)
{
var t = __p["tracker"],
p = __p["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
*/
this.handlePauseEvent = function(event)
{
var t = __p["tracker"];
econda.debug.log("got pause event");
if(t) {
t.setState("paused", __p["player"].getPosition());
}
};
/**
* Handle video "ended" events
* @method
* @private
* @param {Object} event Event object
*/
this.handleCompleteEvent = function(event)
{
var t = __p["tracker"];
econda.debug.log("got completed event");
if(t) {
t.setState("stopped", __p["player"].getPosition());
}
};
/**
* Return reference to html video element
* @method
*/
this.getPlayer = function()
{
return __p["player"];
};
return this.setup(cfg, __p);
};
econda.media.helper.JwPlayerTracker.prototype = new econda.base.Object();