(function()
{    

    var query = null;
    var searchTimer = null;

    var resetSearchTimer = function()
    {
        window.clearTimeout(searchTimer);
        searchTimer = null;
    }
    
    var startSearchTimer = function()
    {
        searchTimer = window.setTimeout(function(){runSearch(query)}, 450);
    }

    
    var get_register_url = function(domain)
    {
        var sp = domain.split(".");
        domain = sp[0];
        var tld = sp[1];
        return "http://order.1and1.com/dcjump?domain=" + domain + "&k_id=19548713&tld=" + tld + "&Submit=Check+Domain"
    }

    var runSearch = function(query)
    {
        if(!query)
        {
            return;
        }
        else
        {
            $("ul.suggestion-list").slideUp("slow");        
            $("#suggestly").addClass("searching");
            $.getJSON("/api/suggest/" + query + "/",
                function(data)
                {
                    var suggestion_list = $("<ul class='suggestion-list'></ul>");
                    for(var i = 0; i < data.length; i++)
                    {
                        var suggestion = data[i];
                        //var s = ("<b><i>" + suggestion + "</i></b>").replace(query, "</i></b>" + query + "<b><i>");
                        var a_domain_name = $("<a class='domain-name' href='#'></a>").append(suggestion);
                        var li = $("<li class='a-suggestion searching'></li>").append(a_domain_name);
                        suggestion_list.append(li);

                        (function(suggestion, a_domain_name, li)
                        {
                            $.getJSON("/api/check/" + suggestion + "/",
                                function(data)
                                {
                                    var ul = $("<ul class='domain-status'></ul>");
                                    var num_available = 0;
                                    var tlds = [".com", ".net", ".org"];
                                    for(var i = 0; i < tlds.length; i++)
                                    {   
                                        var tld = tlds[i];
                                        var a = $("<a class='a-domain'></a>");
                                        if(!data[tld])
                                        {
                                            a.addClass("domain-registered");
                                            a.attr("href", "http://" + suggestion + tld);
                                            a.attr("target", "_blank");
                                            a.attr("onClick", 
                                                "javascript: pageTracker._trackPageview('/outgoing/visit/" + suggestion + tld + "');");
                                            a.append(tld + " (visit)");
                                        }
                                        else
                                        {
                                            a.addClass("domain-available");
                                            a.attr("href", get_register_url(suggestion + tld));
                                            a.attr("target", "_blank");
                                            a.attr("onClick", 
                                                "javascript: pageTracker._trackPageview('/outgoing/register/" +suggestion + tld + "');");
                                            a.append(tld + " (register)");
                                            num_available += 1;
                                        }
                                        ul.append($("<li></li>").append(a));
                                    }
                                    ul.hide();
                                    li.append(ul);

                                    a_domain_name.click(function()
                                    {
                                        ul.slideToggle("normal");
                                    });

                                    li.removeClass("searching");
                                    li.append(ul);
                                    if(num_available == 3)
                                    {
                                        li.addClass("all-available");
                                    }
                                    else if(num_available == 0)
                                    {
                                        li.addClass("none-available");
                                    }
                                    else
                                    {
                                        li.addClass("some-available");
                                    }
                                }
                            );
                        })(suggestion, a_domain_name, li);

                    }

                    $("ul.suggestion-list").slideUp("slow", function()
                    {
                        suggestion_list.hide();
                        $("#suggestion-results").empty().append(suggestion_list);
                        $("#suggestly").removeClass("searching");
                        suggestion_list.slideDown();
                    });
                }
            );
        }
    }        
    
    
    $(document).ready(function()
    {
        $("form#search-form").submit(function(e)
        {
            e.preventDefault();
            resetSearchTimer();
            runSearch($("#search-input").attr("value"));
        });

        var inputChanged = function()
        {
            if(this.value == query)
            {
                return;
            }
            resetSearchTimer();
            query = this.value;
            startSearchTimer();
        }
        $("#search-input").focus(inputChanged).change(inputChanged)
            .keypress(inputChanged).keydown(inputChanged).keyup(inputChanged)
            .mouseup(inputChanged).mousedown(inputChanged).mouseout(inputChanged)
            .blur(inputChanged);
            
        $("#search-input").focus();
    });
})();

        