$.player = {
        __items: [],
        __index: 0,
        __nowPlaying: null,
        __visible: true,
        __playing: false,
        __currentSmSound: null,
        __streamUrlResolver: null,
		VOLUME_COOKIE_NAME: 'JS_PLAYER_VOLUME'
    };
    /*
    __defaultOptions: {
            'sm_url' : '/static/swf/soundmanager/',
            'sm_debugMode : false,
        }
    */
    $.player.__setVolumeCookie = function(val){
		$.cookie($.player.VOLUME_COOKIE_NAME, val, { expires: 365, path: '/' });
	},
    $.player.__getVolumeCookieValue = function(){
		return $.cookie($.player.VOLUME_COOKIE_NAME);
	},
    $.player.init = function(opts){
        var __loadDeps = function(callback){
            callback.apply($.player);
        };
        if($.player.__getVolumeCookieValue()==null){
			$.player.__setVolumeCookie(50);
		}
        __loadDeps(function(){
			soundManager.url = '/static/swf/soundmanager/'; 
            soundManager.debugMode = false;
            soundManager.onload = $.player.__sm_callback_smlibrary_loaded;
            soundManager.useWaveformData = true;
            soundManager.useMovieStar = false;
            soundManager.defaultOptions.useWaveformData = true;
            soundManager.flash9Options.useWaveformData = true;
			soundManager.flashLoadTimeout = 0;
        });
    };
    
    
    //------------------------------------------------------------------//
    //            All events triggered by  $.player (as3 style)
    //------------------------------------------------------------------//
    $.player.EVENTS = {
        ITEMS_CHANGED : 'player:items_changed',
        NOW_PLAYING_SET : 'player:now_playing_set',
        SOUND_MANAGER_READY : 'player:sound_manager_ready',
        PLAYLIST_COMPLETE: 'player:playlist_complete',
		PLAY_STATE_CHANGED: 'player:play_state_changed'
    };    
    
    //------------------------------------------------------------------//
    //                        Sound Manager Callbacks
    //------------------------------------------------------------------//
    $.player.soundManagerReady = false,
    
    $.player.__sm_callback_smlibrary_loaded = function(){
        $.player.broadcast($.player.EVENTS.SOUND_MANAGER_READY);
        $.player.soundManagerReady = true;
    };
    $.player.__sm_callback_loading = function(){
        var s = $.player.__currentSmSound;
        var newWidth = $('#progress-bar').width() * (s.bytesLoaded/s.bytesTotal);        
        $('#progress-bar-loaded').width(newWidth + 'px');
    };
    $.player.__sm_callback_finish = function() {
        if($.player.__index == ($.player.getItems().length-1)){
            $.player.close();
            // playlist is complete
            $.player.broadcast($.player.EVENTS.PLAYLIST_COMPLETE, false); // false indicates not a skip
        } else {
            $.player.next();
        }
        Amie.Ads.rotateAds();
    };
    
    $.player.__sm_callback_playing = function(){
        var s = $.player.__currentSmSound;
        var d;
        
            d = $.player.__nowPlaying.duration * 1000;
        
        
        var newWidth = $('#progress-bar').width() * (s.position/d);
        $('#progress-bar-played').width(newWidth + 'px');
        
        $('#time-ellapsed').html($.player.formatTime(s.position, true));
		
        $('#time-total').html($.player.formatTime(d, true));
        $.player.updateGraph();
    };
    
    //------------------------------------------------------------------//
    //                        Setters/Getters
    //------------------------------------------------------------------//
    $.player.setStreamUrlResolver = function(r){
        $.player.__streamUrlResolver = r;
    };
    
    $.player.getPlaylistSongIds = function(){
        return $.map($.player.getItems(), function(n,i){return n.id;});
    };
    
    //------------------------------------------------------------------//
    //                        Is/has
    //------------------------------------------------------------------//
    $.player.isVisible = function(){
        return $.player.__visible;
    };
    
    $.player.isPlaying = function(){
        return $.player.__playing;
    };
    
    //------------------------------------------------------------------//
    //                        Player Controls
    //------------------------------------------------------------------//
    $.player.close = function(){
        $('#playerbox').slideUp();
        $.player.__playing = true;
        $.player.__visible = false;
    };
    
    $.player.open = function(){
        $('#playerbox').slideDown();
        $.player.__visible = true;
    };
    
    //------------------------------------------------------------------//
    //                        Playback control
    //------------------------------------------------------------------//
    $.player.playSongAt = function(index){
        $.player.playSong($.player.getItems()[index]);
    };
    
    $.player.next = function(){
        if($.player.__index == ($.player.getItems().length-1)){
            $.player.close();
            // playlist is complete
            $.player.broadcast($.player.EVENTS.PLAYLIST_COMPLETE, true); // true indicates that this was a skip
        }
        else{
            $.player.playSongAt($.player.__index + 1);
        }
        Amie.Ads.rotateAds();
    };
    
    $.player.previous = function(){
        $.player.playSongAt($.player.__index - 1);
    };
    
    $.player.resume = function(){
        soundManager.resumeAll();
        $('#play-or-pause').removeClass('play').addClass('pause');
        $('#play-btn, #pause-btn').removeClass('paused').addClass('playing');
        $.player.__playing = true;
		$.player.broadcast($.player.EVENTS.PLAY_STATE_CHANGED);
    };
    
    $.player.play = function(){
        soundManager.resumeAll();
        $('#play-or-pause').removeClass('play').addClass('pause');
        $('#play-btn, #pause-btn').removeClass('paused').addClass('playing');
        $.player.__playing = true;
		$.player.broadcast($.player.EVENTS.PLAY_STATE_CHANGED);
    };
    
    $.player.pause = function(){
        soundManager.pause('song-'+$.player.__nowPlaying.id)
        $('#play-or-pause').removeClass('pause').addClass('play');
        $('#play-btn, #pause-btn').removeClass('playing').addClass('paused');
        $.player.__playing = false;
		$.player.broadcast($.player.EVENTS.PLAY_STATE_CHANGED);
    };
    
    $.player.playOrPause = function(){
        if($.player.__playing){
            $.player.pause();
        }
        else{
            $.player.play();
        }
    };
    
    $.player.playSongInPlaylistWithId = function(id){
        var index  = $.inArray(id, $.player.getPlaylistSongIds());
        $.player.playSong($.player.getItems()[index]);
    };
    
    $.player.playSong = function(song){
        if(!$.player.soundManagerReady){
            setTimeout(function(){
                $.player.playSong(song);
            }, 250);
        }
        else{
            soundManager.stopAll();
            $('.playing').removeClass('playing');
            $('.song-'+song.id).addClass('playing');
            $.player.__index = $.inArray(song.id, $.player.getPlaylistSongIds());
            
            $('#play-or-pause').removeClass('play').addClass('pause');
            $('#play-btn, #pause-btn').removeClass('paused').addClass('playing');
            
            if($.player.__nowPlaying){
				try{
					soundManager.destorySound('song-'+$.player.__nowPlaying.id);
				}
				catch(e){}
			}

            var currentSmSound = soundManager.createSound({
             	 id: 'song-'+song.id, // required
	             url: $.player.__streamUrlResolver.apply(this, [song]), // required
	             // optional sound parameters here, see Sound Properties for full list
	             volume: (($.player.__getVolumeCookieValue() * $.player.__getVolumeCookieValue()) / 100),
	             whileloading: $.player.__sm_callback_loading,
	             whileplaying: $.player.__sm_callback_playing,
	             onfinish: $.player.__sm_callback_finish,
	             autoPlay: true
            });
            
            $.player.__currentSmSound = currentSmSound;
            
            soundManager.play('song-'+song.id);
            $.player.__playing = true;
			$.player.broadcast($.player.EVENTS.PLAY_STATE_CHANGED);
            $.player.setNowPlaying(song);
        }
    };
    
    $.player.broadcast = function(eName, data){
        $(document).trigger(eName, data);
    };
    
    $.player.setItems = function(items){
        $.player.__items = items; 
        $.player.broadcast(this.EVENTS.ITEMS_CHANGED, this.__items);
    };
    
    $.player.getItems = function(){
        return $.player.__items;
    };
    
    $.player.appendItem = function(item){
        $.player.__items.push(item);
        $.player.broadcast(this.EVENTS.ITEMS_CHANGED, this.__items);
    };
    
    $.player.clearItems = function(){
        $.player.__items = [];
        $.player.broadcast($.player.EVENTS.ITEMS_CHANGED, $.player.__items);
    };
    
    $.player.removeItemAt = function(index){
        this.__items.splice(index, 1);
        this.broadcast(this.EVENTS.ITEMS_CHANGED, this.__items);
    };
    /**
     * Called whenever a new song starts playing.
     * You should bind on $.player.EVENTS.NOW_PLAYING_SET to update your display.
     */
    $.player.setNowPlaying = function(song){
        $.player.__nowPlaying = song;
        $.player.logEvents();
        $.player.broadcast(this.EVENTS.NOW_PLAYING_SET, song);
    };
    
    $.player.getNowPlaying = function(){
        return $.player.__nowPlaying;
    };
    
    
    /// MMMMM visualizations
    $.player.updateGraph = function(){
        var scale = 32; // Y axis (+/- this distance from 0)
        $('#player-waveform').find('div').each(function(){
            $(this).css('height', (1+scale+Math.ceil($.player.__currentSmSound.waveformData.left[i]*-scale))+'px');
        });
        /**
         * @todo (lucas) See how this performs and possibly add in right data 
         * as well to stretch the full width
         */
    };
    
    $.player.renderUi = function(){
        $("#volume-slider").slider({
            orientation: 'orizontal', 
            min:0, 
            max:100, 
            value:$.player.__getVolumeCookieValue(), 
            animate:true,
            change: function(event, ui){
                soundManager.setVolume('song-'+$.player.__nowPlaying.id, (ui.value * ui.value) / 100);
				$.player.__setVolumeCookie(ui.value);
            }
        });
    };
    
    $.player.renderPlaylistContents = function(){
        var items = $.player.getItems();
        var html = '';
        if(items.length==0){
            html = 'nothing in your queue... yet';
        }
        else{
            $.each(items, function(){
                console.debug(this);
                html += '<a class="playlist-item song-' + this.id +' album-' + this.album.id + '" rel="song-' + this.id + '">'+this.artist.name+' - '+this.title+'</a>';
            });
        }
        $('#playlist-title').html('Your Queue ('+items.length+')');
        $('#playlist-contents').html(html);
        $('a.playlist-item').click(function(){
            var i = $(this).prevAll('a.playlist-item').length;
            var songs = $.player.getItems();
            $.player.playSong(songs[i]);
        });
    };
    
    $.player.formatTime = function(nMSec,bAsString) {
        // convert milliseconds to mm:ss, return as object literal or string
        var nSec = Math.floor(nMSec/1000);
        var min = Math.floor(nSec/60);
        var sec = nSec-(min*60);
        // if (min == 0 && sec == 0) return null; // return 0:00 as null
        return (bAsString?(min+':'+(sec<10?'0'+sec:sec)):{'min':min,'sec':sec});
    }
    $.player.showPlaylist = function(){
       $('#playlist-box').fadeIn()
       $('#playlist-box').slideDown();
       return false;
    };
    $.player.hidePlaylist = function(){
       $('#playlist-box').fadeOut();
       $('#playlist-box').slideUp();
       return false;
    };
    
    $.player.showVolume = function(){
       $('#volume-box').show();
       return false;
    };
    
    $.player.hideVolume = function(){
       $('#volume-box').hide();
       return false;
    };

    $.player.logEvents = function () {
        if (typeof(_gat) == 'object') {
            var pageTracker = _gat._getTracker("UA-468380-11");
            pageTracker._initData();
            pageTracker._trackEvent("Play","Started");
        }
        clearTimeout($.player._thirty_timer);
        $.player._thirty_timer = setTimeout(function () {
            /* make sure analytics is loaded */
            if (typeof(_gat) == 'object') {
                var pageTracker = _gat._getTracker("UA-468380-11");
                pageTracker._initData();
                pageTracker._trackEvent("Play","Thirty");
            }
        }, 30000);
    }
    
    // These are events that should only be bound once on document.ready
    $.player.bindInitialEvents = function(){
       $('#close-playlist-button').click($.player.hidePlaylist);
       $('#playlist-button').click($.player.showPlaylist);
       $('#close-button').click($.player.close);
       $('#next').click($.player.next);
       $('#previous').click($.player.previous);
       $('#play-or-pause').click($.player.playOrPause);
       $('#play-btn, #pause-btn').click($.player.playOrPause);
       
       $('#volume-button').toggle($.player.showVolume, $.player.hideVolume);
    };
    
    //------------------------------------------------------------------//
    //                        Initialization
    //------------------------------------------------------------------//
    $(document).ready($.player.renderUi);
    $(document).ready($.player.bindInitialEvents);
    //$(window).resize($.player.renderUi);
    //$(document).bind($.player.EVENTS.ITEMS_CHANGED, $.player.renderPlaylistContents);
    
    $.player.init();
    /*
    $(document).bind($.player.EVENTS.NOW_PLAYING_SET, function(e, d){
        $('#now-playing').html(d.artist.name + ' - ' + d.title);
    });
    */
    $.player.setStreamUrlResolver(function(song){
        return '/stream/song/'+song.id+'.mp3';
    });
