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();