$(document).ready(function() {
    $("input:text:visible:first").focus();
    $("form.vote").each(function() {
        $(this).submit(function() {
            vote($(this));
            return false;
        });
    });
});

function vote(form)
{        
    $.post(form.attr("action"), {HTTP_X_REQUESTED:'XMLHttpRequest'},
        function(data) {
            if (data.success == true) {
                processVoteResponse(form, data.score.score);
            } else if (data.error_message == "Not authenticated.") {
                window.location = "/auth/?next="+form.attr("action");
            }
        }, 'json'
    )
}

function processVoteResponse(form, score)
{
    var buttonElement = form.find("input[type=submit]");
    var button_id = buttonElement.attr("id");
    var tokens = button_id.split("-");
    var prefix = tokens[0];
    var buttontype = tokens[1];
    var id = tokens[2];

    var scoreElement = $('#'+prefix+'score'+id);
    var old_score = scoreElement.html();
    var new_score = old_score.replace(/(-?\d+)/, score).replace(/(point)s?/, 'point'+pluralize(score));
    scoreElement.html(new_score);
        
    if (buttontype == "plusbutton") {
        updateVoteButtons(form, buttonElement, "plus", $('#'+prefix+'-minusbutton-'+id));          
    } else if (buttontype == "minusbutton") {
        updateVoteButtons(form, buttonElement, "minus", $('#'+prefix+'-plusbutton-'+id));
    }        
}

function updateVoteButtons(form, button, button_type, opposite_button)
{
    if (button_type == "plus") {
        var opposite_type = "minus";
        var direction = "up";
        var opposite_direction = "down";
    } else if (button_type == "minus") {
        var opposite_type = "plus";
        var direction = "down";
        var opposite_direction = "up";
    }

    buttonClass = button.attr("class");

    if (buttonClass == button_type+"vote") {
        updateClass(button, button_type+"vote", "novote");
        updateAction(form, "clear", direction);
    } else if (buttonClass == "novote") {
        updateClass(button, "novote", button_type+"vote");
        updateAction(form, direction, "clear");
    }

    updateClass(opposite_button, opposite_type+"vote", "novote");
    var otherForm = opposite_button.parent("form");
    updateAction(otherForm, "clear", opposite_direction); 
}

function updateClass(element, from, to)
{
    element.removeClass(from).addClass(to);
}

function updateAction(form, from, to)
{
    form.attr("action", form.attr("action").replace(from, to));
}

function pluralize(value)
{
    if (value != 1)
    {
        return "s";
    }
    return "";
}

function toggle_form(id)
{
    var form = document.getElementById(id);
    if(form.style.display == "none")
        form.style.display = "inline";
    else
        form.style.display = "none";
}
