var KALTURA_PLAYER_START = 'kaltura_player_start',
    KALTURA_PLAYER_PLAY = 'kaltura_player_play',
    KALTURA_PLAYER_STOP = 'kaltura_player_stop',
    KALTURA_PLAYER_VIDEO_END = 'kaltura_player_video_end',
    KALTURA_PLAYER_FF = 'kaltura_player_ff',
    KALTURA_PLAYER_PAUSE = 'kaltura_player_pause',
    KALTURA_PLAYER_MUTE = 'kaltura_player_mute',
    KALTURA_PLAYER_INIT = 'kaltura_player_init',
    KALTURA_PLAYER_LOADED = 'kaltura_player_loaded',
    KALTURA_PLAYER_READY = 'kaltura_player_ready';

var KalturaPlayer = {
    settings: {
        container: '#video',
        player: 'player',
        src: 'http://www.kaltura.com/index.php/kwidget/wid/_31160/uiconf_id/1000106',
        width: 459,
        height: 258,
        min_flash_version: '9.0.0',
        controls: {
            container: '.controls',
            playback: '.button.playback',
            // stop: null,
            // ff: null,
            mute: '.button.mute',
            fullscreen: '.button.fullscreen'
        },
        onscreenplay: '.onscreenplay',
        afterplay: '.afterplay',
        playhead: '.playhead'
    },
    controls: null, container: null, player: null,
    status: null, onscreenplay: null, volume: 1, afterplay: null,
    playhead_timer: null, current_seconds: 0, playhead: null,
    previous_seconds: null, playhead_repeat: 0, duration: null,
    IS_FULLSCREEN: false,
    initialize: function () {
        var s = this.settings, player = this;
        this.container = $(s.container);
        this.controls = {
            container: $(s.controls.container)
        };

        this.controls.playback = $(s.controls.playback);
        this.controls.mute = $(s.controls.mute);
        this.controls.fullscreen = $(s.controls.fullscreen);
        
        this.onscreenplay = $(s.onscreenplay);
        this.playhead = $(s.playhead);
        
        this.afterplay = $(s.afterplay);

        if (swfobject.hasFlashPlayerVersion(s.min_flash_version)) {
            // console.log('Kaltura Player: Initializing.');
            this.build();
        } else {
            // console.log('Kaltura Player: Not Initializing.');
            this.controls.container.hide();
            this.container.addClass('noflash');
        }
    },

    redraw_controls: function () {
        var controls = this.controls;
            playback = controls.playback;
            mute = controls.mute;
            muted = this.volume === 0;
        switch (this.status) {
            case 'initializing':
                break;
            case 'stopped':
                playback.removeClass('pause');
                playback.addClass('play');
                break;
            case 'playing':
                playback.removeClass('play');
                playback.addClass('pause');
                break;
            case 'paused':
                playback.removeClass('pause');
                playback.addClass('play');
                break;
            default:
                return;
        };
        
        if (muted) {
            mute.removeClass('on');
            mute.addClass('off');
        } else {
            mute.removeClass('off');
            mute.addClass('on');
        };
    },
    
    start_playhead: function () {
        // console.log('Kaltura Player: Starting Playhead.');
        this.playhead_timer = setInterval(function () { KalturaPlayer.update_playhead() }, 500);
    },
    
    update_playhead: function () {
        var raw = this.get_playhead_position();
        
        this.current_seconds = raw || 0;
        if (this.previous_seconds === this.current_seconds) { 
            if (this.playhead_repeat > 200) {
                return this.stop_playhead();
            }
            this.playhead_repeat += 1;
        } else {
            this.playhead_repeat = 0;
        }
        
        var current = this.get_timecode(raw);
            duration = this.duration ? ' / ' + this.get_timecode(this.duration) : '';
        this.playhead.html([current, duration].join(''));
        this.previous_seconds = raw;
    },
    
    get_timecode: function (seconds) {
        var seconds = parseInt(seconds),
            minutes = parseInt(seconds / 60);
        seconds = seconds - (minutes * 60);
        return [minutes, seconds < 10 ? '0' + seconds : seconds].join(':');
    },
    
    stop_playhead: function () {
        // console.log('Kaltura Player: Stopping Playhead');
        clearInterval(this.playhead_timer);
    },
    
    set_status: function (status) {
        var evt;
        switch (status) {
            case 'initializing':
                evt = KALTURA_PLAYER_INIT;
                break;
            case 'stopped':
                evt = KALTURA_PLAYER_VIDEO_END;
                break;
            case 'playing':
                evt = KALTURA_PLAYER_PLAY;
                break;
            case 'paused':
                evt = KALTURA_PLAYER_PAUSE;
                break;
            default:
                return;
        };
        // console.log('Kaltura Player Status: ', status);
        this.status = status;
        $(document).trigger(evt);
        this.redraw_controls();
    },

    assign_events: function () {
        // console.log('Kaltura Player: Assigning Events');
        var player = this;
        
        this.controls.playback.bind('click', function () {
            // console.log('Kaltura Player: Playback Clicked.');
            player.play();
        });
        
        this.controls.mute.bind('click', function () {
            // console.log('Kaltura Player: Mute Clicked.');
            player.mute();
        });
        
        this.controls.fullscreen.bind('click', function () {
            // console.log('Kaltura Player: Fullscreen Clicked.');
            player.fullscreen();
        });
        
        this.onscreenplay.bind('click', function () {
            player.play();
        });

        $('#video .afterplay .button').bind('click', function () {
            $(this).parent().hide();
        })

        $('#afterplay_share', this.afterplay).bind('click', function () {
            // console.log('Share');
            $('#video .share').show();
        });
        $('#afterplay_browse', this.afterplay).bind('click', function () {
            // console.log('Browse');
            window.location = 'http://myteachermyhero.com/story/browse/';
        });
        $('#afterplay_replay', this.afterplay).bind('click', function () {
            // console.log('Replay');
            player.play();
        });
        $('#afterplay_embed', this.afterplay).bind('click', function () {
            // console.log('Embed');
            $('#video .embed').show();
        });
        
        $('#video .embed a.close, #video .share a.close').bind('click', function () {
            $('#video .embed, #video .share').hide();
            $('#video .afterplay').show();
            return false;
        });
        
        $(document).bind(KALTURA_PLAYER_VIDEO_END, function () {
            player.afterplay.show();
            player.onscreenplay.hide();
            try {
              pageTracker._trackPageview("/story/watched/");
            } catch (e) {}
            // console.log('Video ended.');
        });

        $(document).bind(KALTURA_PLAYER_PLAY, function () {
            // console.log('Kaltura Player: Playing');
            player.duration = this.player.evaluate('{duration}');
            player.onscreenplay.hide();
            player.afterplay.hide();
            player.start_playhead();
        });
        
        $(document).bind(KALTURA_PLAYER_PAUSE, function () {
            // console.log('Kaltura Player: Paused');
            player.stop_playhead();
        });
        
        $(document).bind(KALTURA_PLAYER_READY, function () {
            // console.log('Kaltura Player: Ready');
        });
        
        this.player.addJsListener('playerPlayed','KalturaPlayer.listener.play');
        this.player.addJsListener('doPause','KalturaPlayer.listener.pause');
        this.player.addJsListener('doStop','KalturaPlayer.listener.stop');
        this.player.addJsListener('fastForward','KalturaPlayer.listener.ff');
        this.player.addJsListener('playerPlayEnd','KalturaPlayer.listener.end');
        this.player.addJsListener('playerProgress', 'KalturaPlayer.listener.progress');
    },

    unload: function () {
        // console.log('Kaltura Player: Unloading.');

        swfobject.removeSWF(this.settings.player);

        // Recreate Camera Container (It was just removed by removeSWF). 
        // Preserve stacking order with prependTo.
        $(['<div id="', this.settings.player, '"></div>'].join('')).prependTo(this.container);
    },

    build: function () {
        var player = KalturaPlayer;
        var s = player.settings;
        // console.log('Kaltura Player: Building.');
        
        $('#'+s.player).css({
            width: '1px',
            height: '1px',
            overflow: 'hidden'
        });

        var flashvars = {
            readyF: 'KalturaPlayer.ready',
            entryId: this.container.attr('rel') || '',
            k_backgroundColor: '000000'
        }, params = {
            allowScriptAccess: 'always',
            allowFullScreen: 'true'
        }, attributes = {
            wmode: 'transparent',
            name: s.player
        };
        
        // console.dir(s);
        // console.dir(flashvars);
        // console.dir(params);
        // console.dir(attributes);
        
        swfobject.embedSWF(s.src, s.player, s.width, s.height, s.min_flash_version, null, flashvars, params, attributes);
    },
    ready: function () {
        if (this.player === null) {
            this.player = document.getElementById(KalturaPlayer.settings.player);
            this.onscreenplay.show();
            this.assign_events();
            // setTimeout("$('#video .loading').fadeOut(500)", 500);
            $(document).trigger(KALTURA_PLAYER_READY);
        };
    },
    
    listener: {
        play: function () {
            // console.log('Kaltura Player: Playing');
            KalturaPlayer.set_status('playing');
        },
        pause: function () {
            // console.log('Kaltura Player: Paused');
            KalturaPlayer.set_status('paused');
        },
        stop: function () {
            // console.log('Kaltura Player: Stopped');
            KalturaPlayer.set_status('stopped');
        },
        ff: function () {
            // console.log('Kaltura Player: Fast Forward');
            KalturaPlayer.set_status('ff');
        },
        end: function () {
            // console.log('Kaltura Player: Play End');
            KalturaPlayer.set_status('stopped');
        },
        progress: function (args) {
            // console.log('Kaltura Player: Progress: ', args);
        }
    },

    // Player Commands
    play: function () {
        this.execute(this.status === 'playing' ? 'pause' : 'play');
    },

    pause: function () {
        this.execute('pause');
    },
    
    mute: function () {
        this.volume = this.volume === 0 ? 1 : 0
        this.execute('setvolume', this.volume);
        this.redraw_controls();
    },

    seek: function (second) {
        this.execute('seek', second);
    },

    ff: function (speed) {
        this.execute('ff', speed);
    },

    fullscreen: function () {
        this.execute(this.IS_FULLSCREEN ? 'closefs' : 'openfs');
    },

    set_volume: function (level) {
        this.execute('setvolume', level);
    },
    
    set_entry: function (id) {
        this.execute('setmedia', id);
    },

    get_playhead_position: function () {
        return this.player.getMediaSeekTime();
    },

    execute: function (command, arg) {
        // console.log('Kaltura Player: Execute Player Command: ', command, ' : ', arg);
        this.player.dispatchKdpEvent(KALTURA_PLAYER_COMMAND[command], arg);
    }
}

$(window).bind('load', function (event, args) {
    KalturaPlayer.initialize(args);
});

/*
    JS-dispatched Commands
*/

KALTURA_PLAYER_COMMAND = {
    // Command the player to pause
    pause: 'doPause',
    play: 'doPlay',
    seek: 'doSeek',
    openfs: 'openFullScreen',
    closefs: 'closeFullScreen',
    setvolume: 'volumeChange',
    setmedia: 'changeKshow',
    ff: 'fastForward',
    stopff: 'stopFastForward'
};