/*
 *  golf/chain.js
 *  moviegolf
 *
 *  Created by Ross Light on 6/7/09.
 */

var gGolf_Chain = {};

gGolf_Chain.setup = function()
{
    $(".chain")
        .find(".goal > a")
            .click(gGolf_Chain.onShowPath)
        .end()
        .find(".voteaction")
            .click(gGolf_Chain.onVote)
        .end()
        .find(".delete_link")
            .click(gGolf_Chain.onDelete)
        .end();
};

gGolf_Chain.onShowPath = function(event)
{
    // Don't follow location
    event.stopPropagation();
    event.preventDefault();
    // Get parameters
    var target = $(event.target).closest("a");
    var chain = $(event.target).closest(".chain");
    // Did we already do this?
    if ($(".golf_results", chain).length > 0)
    {
        var visible = ($(".golf_results", chain).css("display") != "none");
        $(".golf_results", chain).slideToggle("fast");
        $(".flippy", chain)
            .toggleClass("flippyright", visible)
            .toggleClass("flippydown", !visible);
        return;
    }
    if ($(".flippy", chain).hasClass("load"))
    {
        // We're already loading! Cut it out!
        return;
    }
    // Okay, let's send off the query
    chain
        .find(".flippy")
        .addClass("load");
    $.getJSON(target.attr("href"), {"format": "json"},
              gGolf_Chain.onLoadedPath);
};

gGolf_Chain.onLoadedPath = function(chain, status)
{
    var chainElem = $("#chain-" + chain.id);
    var pathList = $('<ul class="golf_results"/>');
    // Stop the loading icon
    chainElem
        .find(".flippy")
        .removeClass("load");
    // Helper functions
    var addFilm = function(film)
    {
        var url = $.siteURL("film/") + film.guid + "/";
        pathList
            .append("<li/>")
            .children(":last")
                .append('<a href="' + url + '"/>')
                .children(":last")
                    .text(film.canonical_string);
        return pathList.children(":last");
    };
    var addActorLink = function(actorList)
    {
        var listItem = pathList
            .append('<li class="actor_link"/>')
            .children(":last");
        $.each(actorList, function(i, actor)
        {
            var url = $.siteURL("actor/") + actor.guid + "/";
            if (i > 0)
                listItem.append(", ");
            listItem
                .append('<a href="' + url + '"/>')
                .children(":last")
                    .text(actor.name);
        });
        return pathList.children(":last");
    };
    // Add start point
    addFilm(chain.film1)
        .addClass("start_film")
        .prepend("Start: ");
    // Build intermediaries
    $.each(chain.actor_links, function(i, actors)
    {
        addActorLink(actors);
        if (i < chain.intermediaries.length)
            addFilm(chain.intermediaries[i]);
    });
    // Add end point
    addFilm(chain.film2)
        .addClass("end_film")
        .prepend("End: ");
    // Insert new list
    chainElem
        .find(".goal")
            .after(pathList.hide().slideDown("fast"))
        .end()
        .find(".flippy")
            .removeClass("flippyright")
            .addClass("flippydown");
};

gGolf_Chain.vote = function(id, choice)
{
    var url = $.siteURL("chain/" + id + "/+vote/")
    $.post(url, {"choice": choice}, function(data, status)
    {
        // Explicit error messages should be alerted.
        if (!data.success)
        {
            alert(data.error_message);
            return;
        }
        // Tweak UI
        $("#chain-" + id)
            .find(".upvote")
                .toggleClass("clearvote", choice == "up")
            .end()
            .find(".downvote")
                .toggleClass("clearvote", choice == "down")
            .end()
            .find(".score")
                .text(data.score.score)
            .end()
            .find(".num_votes")
                .text(data.score.num_votes)
            .end();
    }, "json");
};

gGolf_Chain.onVote = function(event)
{
    // Stop propagation
    event.stopPropagation();
    event.preventDefault();
    // Get parameters
    var target = $(event.target);
    var elem_id = target.closest(".chain").attr("id");
    var chain_id = /chain-([0-9]+)/.exec(elem_id)[1];
    // Figure out what to do
    if (target.hasClass("clearvote"))
        gGolf_Chain.vote(chain_id, "clear");
    else if (target.hasClass("upvote"))
        gGolf_Chain.vote(chain_id, "up");
    else if (target.hasClass("downvote"))
        gGolf_Chain.vote(chain_id, "down");
};

gGolf_Chain.onDelete = function(event)
{
    // Don't follow link
    event.preventDefault();
    event.stopPropagation();
    // Prompt user
    var msg = "Are you sure you want to delete this chain?  This action cannot be undone.";
    if (window.confirm(msg))
    {
        var self = $(event.target);
        $.post(self.attr("href"), null, function()
        {
            var chainElem = self.closest(".chain");
            chainElem.fadeOut("normal", function()
            {
                chainElem.remove();
            });
        });
    }
};

/* Create chain functionality */

gGolf_Chain.setupCreate = function()
{
    $("#create_chain_form")
        .submit(gGolf_Chain.onCreate)
        .find(".film_field")
            .filmAutoComplete(gGolf_Chain.onSelectFilm)
            .change(gGolf_Chain.onFilmFieldChange)
        .end()
        .find(".addicon")
            .click(gGolf_Chain.onAddIntermediate)
        .end()
        .find(".removeicon")
            .click(gGolf_Chain.onRemoveIntermediate)
        .end();
};

gGolf_Chain.onAddIntermediate = function(event)
{
    event.preventDefault();
    event.stopPropagation();
    // Create row
    var newRow = $("<tr/>");
    newRow
        .append("<th/>")
        .append("<td/>")
        .children(":last")
            .append('<input type="hidden" class="film_id" name="path">')
            .append('<input type="text" class="film_field">')
            .children(":last")
                .filmAutoComplete(gGolf_Chain.onSelectFilm)
                .change(gGolf_Chain.onFilmFieldChange)
            .end()
        .end()
        .append("<td/>")
        .children(":last")
            .append('<a href="#" class="removeicon">Remove</a>')
            .children(":last")
                .click(gGolf_Chain.onRemoveIntermediate)
            .end()
            .append('<a href="#" class="addicon">Add</a>')
            .children(":last")
                .click(gGolf_Chain.onAddIntermediate)
            .end();
    $(event.target)
        .closest("tr")
        .after(newRow);
};

gGolf_Chain.onRemoveIntermediate = function(event)
{
    event.preventDefault();
    event.stopPropagation();
    // Delete row
    $(event.target)
        .closest("tr")
        .fadeOut("normal", function()
        {
            $(this).remove();
        });
};

gGolf_Chain.onFilmFieldChange = function(event)
{
    // Invalidate film ID
    $(event.target)
        .siblings(".film_id")
        .val("");
};

gGolf_Chain.onSelectFilm = function(event, data)
{
    var guid = data.guid.slice(1);
    $(event.target)
        .siblings("input[type='hidden'].film_id")
            .val(guid);
};

gGolf_Chain.onCreate = function(event)
{
    // Let's do the validation!
    var hasErrors = false;
    $("#create_chain_form .film_field").each(function()
    {
        var film_id = $(this).siblings("input[type='hidden'].film_id").val();
        var film_name = $(this).val();
        $(this)
            .siblings(".error")
                .remove();
        if (film_id == "" && film_name != "")
        {
            hasErrors = true;
            $(this)
                .parent()
                    .append('<div class="error"/>')
                    .children(":last")
                        .text("Please choose a film from the pop-up list")
                        .hide()
                        .slideDown();
        }
    });
    if (hasErrors)
    {
        event.preventDefault();
        event.stopPropagation();
    }
};

