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