function Player(sound_manager) {
    var self = this;
    this.sound_manager = sound_manager;
    this.current_row = null;
    this.current_button = null;
    this.current_track = null;
    this.loading = false;
    this.ready = false;

    this.sound_manager.onload = function() {
        self.ready = true;
    }

    this.play = function() {
        if (!self.ready) {
            return false;
        }
        if (self.is_playing()) {
            self.stop();
        }
        sm_status = self.sound_manager.play(this.href, {
            url: this.href, 
            whileplaying: self.whileplaying,
            onfinish: self.onfinish
        });
        if (sm_status != false) {     // need to check if sound_manager is enabled.
            self.current_button = this;
            self.current_row = $(this).parents('tr').get(0);
            self.current_track = this.href;
            self.loading = true;
            $(self.current_row).addClass('loading');
            $(self.current_button)
                .unbind('click', self.play)
                .text('Loading');
        }
    }

    this.is_playing = function() {
        return self.current_track ? true : false;
    }

    this.whileplaying = function() {
        if (self.loading) {
            self.loading = false;
            $(self.current_row)
                .removeClass('loading')
                .addClass('playing');
            $(self.current_button)
                .click(self.stop)
                .text('Stop');
        }
    }

    this.stop = function() {
        self.sound_manager.stop(self.current_track);
        self.onfinish();
    }

    this.onfinish = function() {
        $(self.current_row).removeClass('playing');
        $(self.current_button)
            .unbind('click', self.stop)
            .click(self.play)
            .text('Play');
        self.current_track = null;
        self.current_row = null;
        self.current_button = null;
    }

}
player = new Player(soundManager);

function prevent_default_action(event) {
    event.preventDefault();
}

var visible_tab_content;
var loading_tab;
var checked_checkboxes = new Array();

function reset_loading_tab() {
    if (loading_tab) {
        $(loading_tab).trigger('reset');
    }
    loading_tab = null;
}

function update_buttons() {
    sel_count = checked_checkboxes.length;
    if (sel_count > 0) {
        var msg = "Clear " + sel_count + " selected";
        $("#clear_selection_button")
            .attr("value", msg)
            .removeAttr("disabled");
        $("#make_radio_button").removeAttr("disabled");
    }
    else {
        disable_buttons();
    }
}

function disable_buttons() {
    $("#clear_selection_button")
        .attr("value", "Clear selected")
        .attr("disabled", "disabled");
    $("#make_radio_button").attr("disabled", "disabled");
}

/* 
 * Initialization
 */

$(function(){

    // Process tabs
    $('#tabs a').each(function(){
        var tab = this;
        
        // Prevent the default behavior on the tab.
        $(tab).bind('click', prevent_default_action);

        // Install a click handler while loading the tab.
        var loading_click_handler = function(){
            reset_loading_tab();
            var saved_text = $(this).html();
            $(this)
                .html('<em>Loading...</em>')
                .bind('reset', null, function(){
                    $(this).html(saved_text);
                });
            loading_tab = this;
        };
        $(tab).one('click', null, loading_click_handler);

        // Load the tab content.
        var tab_content = $('<div></div>');
        $(tab_content).css('display', 'none');
        $.get(tab.href, {}, function(data){
            $(tab_content).html(data);
            $("#tabs").append(tab_content);

            // Install click handlers on checkboxes.
            $(":checkbox", tab_content).click(function(){
                var checkbox = this;
                if (checkbox.checked) {
                    checked_checkboxes.push(checkbox);
                }
                else {
                    checked_checkboxes = $.grep(checked_checkboxes, function(item, idx){
                        return item != checkbox;
                    });
                }
                update_buttons();
            });

            // Install click handlers on play links.
            $(".play_link", tab_content)
                .bind('click', prevent_default_action)
                .click(player.play);

            // Install the final click handler on the tab link.
            $(tab)
                .unbind('click', loading_click_handler)
                .click(function(){
                    reset_loading_tab();
                    if (visible_tab_content) {
                        $(visible_tab_content).hide();
                    }
                    $(tab_content).show();
                    visible_tab_content = tab_content;
                });

            // If this tab was loading, show it.
            if (loading_tab == tab) {
                $(tab).click();
            }

        });
    });

    // Install a click handler on the 'Clear selected' button.
    $("#clear_selection_button").click(function() {
        if ($.browser.safari || $.browser.msie) {
            $(checked_checkboxes).removeAttr("checked");
        }
        checked_checkboxes = new Array();
        disable_buttons();
    });

    // Buttons start disabled.
    disable_buttons();

});
