window.tonightly = window.tonightly || {};

tonightly = function()
{
    return {
        focusForm : function()
        {
            $(":input.focus[value=]:first").focus();
        },

        init : function()
        {
            tonightly.search.init();
            tonightly.map.init();
            tonightly.focusForm();
            tonightly.rate.init();
            tonightly.link.init();
            tonightly.share.init();
            tonightly.history.init();
            tonightly.ajax.init();
            tonightly.kill.init();
        },

        setTimezone : function()
        {
            var now = new Date();
            var time = now.getTimezoneOffset()/-60;
            $.post('/ajax/set-timezone', {offset : time});
        }
    };
} ();

tonightly.link = function()
{
    var externalLink = function(e)
    {
        $(this).attr("target", "_blank");
    };
    
    var hidePostInstructions = function(e)
    {
        e.preventDefault();
        var postInstructions = $(this).parents(".postInstructions");
        $.post('/ajax/hide-post-instructions', {hide : 1}, function(data) {
            if (data.success == 1) {
                postInstructions.fadeOut(200);
            }
        }, "json");
    };
    
    var toggleFormInstructions = function(e)
    {
        e.preventDefault();
        $(".formInstructions").slideToggle();
    };

    return {
        init : function()
        {
            $("a[rel='external']").live("click", externalLink);
            $(".postInstructions > a.hide").live("click", hidePostInstructions);
            $("a.toggleFormInstructions").live("click", toggleFormInstructions);
        }
    }
} ();

tonightly.search = function()
{
    var clearedText = [];

    function clearText()
    {
        var value = $(this).val();
        var name = $(this).attr("name");
        if (clearedText[name] == undefined) {
            clearedText[name] = value;
        }

        if (value == clearedText[name]) {
            $(this).val("");
        }
    }

    function restoreText()
    {
        var name = $(this).attr("name");
        if (this.value == "") {
            $(this).val(clearedText[name]);
        }
    }

    return {
        init : function()
        {
            $("input.clearDefault").focus(clearText);
            $("input.clearDefault").blur(restoreText);
        }
    };
} ();

tonightly.map = function()
{
    function syncMap()
    {
        unselectAll();
        var section = $(this).attr("class");
        $(".map a#" + section).addClass("selected");
    }

    function syncLinks()
    {
        unselectAll();
        var section = $(this).attr("id");
        $("ul.neighborhoods a." + section).addClass("selected");
    }

    function unselectAll()
    {
        $(".section a").removeClass("selected");
    }

    function showTooltip(e)
    {
        var html = $(".tooltip", this).html();
        tonightly.tooltip.show(html, e.pageX, $(this).position().top, this);
    }

    function hideTooltip(e)
    {
        tonightly.tooltip.hide();
    }

    return {
        init : function()
        {
            $(".section ul.neighborhoods a").hover(syncMap, unselectAll);
            $(".section .map a").hover(syncLinks,  unselectAll);
        }
    };
} ();

tonightly.rate = function()
{
    var over = function()
    {
        $(".percent_rating").hide();
        $(".num_ratings").show();
    };
    
    var out = function()
    {
        $(".num_ratings").hide();
        $(".percent_rating").show();
    };
    
    var handleClick = function(e)
    {
        e.preventDefault();
        var hot = $(this).hasClass("hot");
        var eventId = $(this).attr("rel");

        var rateDiv = $(this).parents(".rate");
        rateDiv.html('');
        rateDiv.addClass("loading");
        $.post("/ajax/rate", {eventId : eventId, hot : hot}, function(result) {
            rateDiv.removeClass("loading");
            rateDiv.html('<p class="result">' + result.message + '</p>');
            
            if (!result.ratingChanged) {
                return;
            }
            
            rating = $(".rating");
            $(".num_ratings", rating).text(result.newCount);
            $(".percent_rating", rating).html(result.newRating + '<span>%</span>');
            rating.removeClass(result.oldClass);
            rating.addClass(result.newClass);
        }, "json");
    };

    return {
        init : function()
        {
            $("a.rate").live("click", handleClick);
            $(".rating").hover(over, out);
        }
    }
} ();

tonightly.share = function()
{
    var startHtml;
    var toggleOverlay = function(e)
    {
        e.preventDefault();
        
        var container = $("#shareBoxContainer");
        
        if (!container.is(':visible')) {
            $(this).addClass("toggle");
            container.fadeIn(200);
            return;
        }
        
        $(this).removeClass("toggle");
        container.fadeOut(200);
    };
    
    var handleSubmit = function(e)
    {
        e.preventDefault();
        var form = $(this).parents("form");
        $.post(form.attr("action"), form.serialize() + "&fragment=1", function(html) {
            $(".shareForm").html(html);
            $("#shareBoxContainer").show();
            tonightly.search.init();
            if ($("p.success").is(':visible')) {
                setTimeout(function() {
                    $("#shareBoxContainer").fadeOut(400, function() {
                        $("a.sendToFriend").removeClass("toggle");
                        $("#shareBoxContainer").html(tonightly.share.startHtml);
                        tonightly.search.init();
                    });
                }, 2500);
            }
        }, "html");
    };
    
    return {
        init : function()
        {
            tonightly.share.startHtml = $("#shareBoxContainer").html();
            $("a.sendToFriend").live("click", toggleOverlay);
            $(".submitShareForm").live("click", handleSubmit);
        }
    }
} ();

tonightly.history = function()
{
    var responses = new Array();
    
    function pageLoad(hash)
    {
        var browse_content = $("#browse_content");
        browse_content.html('').addClass('content_loading');
        var content = $(".content");
        var url = hash;

        var show_neighborhoods = $("#selectNeighborhood").is(":visible");
        var show_tags = $("#selectTag").is(":visible");

        var cache_key = url + "?n=" + show_neighborhoods + "&t=" + show_tags;

        if (html = responses[cache_key]) {
           content.html(html);
           return;
        }        
        
        $.get(cache_key, {fragment : 1}, function(html) {
            responses[cache_key] = html;
            content.html(html);
        }, "html");
    }

    return {
       init : function()
       {
           $.historyInit(pageLoad);
       }
    };
} ();

tonightly.ajax = function()
{
    var handleClick = function(e)
    {
        e.preventDefault();
        var sort = $(this).parents(".sort");
        $("a", sort).removeClass("selected");
        $(this).toggleClass("selected");
        var hash = this.href.replace(wwwUrl, '');
        hash = hash.replace(/^.*#/, '');
        $.historyLoad(hash);
    };
    
    return {
        init : function()
        {
            $("a[rel='ajax']").live("click", handleClick);
        }
    }
} ();

tonightly.kill = function()
{
    var show = function(e)
    {
        e.preventDefault();
        tonightly.kill.closeAll();
        var editDiv = $(this).parents(".edit");
        var deleteDiv = $(".delete", editDiv);
        deleteDiv.fadeIn(200);
    };

    var confirm = function(e)
    {
        e.preventDefault();
        var bits = $(this).attr("rel").split(':');
        $.post("/" + bits[0] + "/delete", {id : bits[1]}, function(data) {
            if (data.success) {
                window.location = data.redirect;
            }
        }, "json");
    };
        
    return {
        closeAll : function(e)
        {
            if (e) { e.preventDefault(); }
            $(".delete").fadeOut(200);            
        },
        
        init : function()
        {
            $(".showDeleteDialogue").live("click", show);
            $(".deleteCancel").live("click", this.closeAll);
            $(".deleteConfirm").live("click", confirm);
            
        }
    }
} ();

$(document).ready(tonightly.init);

