﻿/*
 * DrillSpot.Search
*/
var SuggestPanel = function() {
    this.container = $("<div></div>").attr("id", "search-suggest").hide().appendTo(document.body);

    var table = $("<table></table>").appendTo(this.container);
    var tbody = $("<tbody></tbody>").appendTo(table);

    this.table = tbody;

    var panel = this;

    $(document).click(function() { panel.hide(); });
};
SuggestPanel.prototype.position = function(element) {
    var r = element.region();
    this.container.css("left", r.left);
    this.container.css("top", r.bottom + 2);
    this.container.width(element.outerWidth() - 2);
};
SuggestPanel.prototype.hide = function() {
    this.container.slideUp("fast");
};
SuggestPanel.prototype.show = function() {
    this.container.slideDown("fast");
};
SuggestPanel.prototype.select = function(callback) {
    if (typeof (callback) == "function") {
        this.container.bind("_select", callback);
        return this;
    } else {
        this.container.triggerHandler("_select", callback);
        return this;
    }
};
SuggestPanel.prototype.selectItem = function(item) {
    if (typeof (item) == "function") {
        this.container.bind("_selectItem", item);
        return this;
    } else {
        this.container.triggerHandler("_selectItem", item.data("query"));
        return this;
    }
};
SuggestPanel.prototype.scrollDown = function() {
    var current = this.table.children("tr.current");
    if (current.size() == 0) {
        current = this.table.children(":first").addClass("current");
        this.selectItem(current);
        return;
    } else {
        var item = current.removeClass("current").next("tr:first").addClass("current");
        this.selectItem(item);
        return;
    }
};
SuggestPanel.prototype.scrollUp = function() {
    var current = this.table.children("tr.current");
    if (current.size() == 0) {
        this.table.children(":first").addClass("current");
        return;
    } else {
        var item = current.removeClass("current").prev("tr:first").addClass("current");
        this.selectItem(item);
        return;
    }
};
SuggestPanel.prototype.render = function(list) {

    if (!$.isArray(list)) {
        list = eval(list);
    }

    var panel = this;

    var table = this.table;
    table.empty();

    for (var i = 0; i < list.length; i++) {
        var item = list[i];

        var row = $("<tr></tr>").appendTo(table);
        row.data("query", item.t.replace(/<\/?[^>]+>/g, ""));

        var textCell = $("<td></td>").appendTo(row);
        var numCell = $("<td></td>").addClass("num").appendTo(row);

        textCell.html(item.t);
        numCell.text("(" + item.n + ")");

        row.click(function(e) {
            e.preventDefault();
            panel.select($(this).data("query"));
        });
    }

    this.show();
};

DrillSpot.Search = {

    go: function(query) {
        query = query || this.queryInput.val();
        if (query && query.length > 0 && query != this.cfg.defaultText)
            document.location.href = this.cfg.searchUrl + "?" + this.cfg.queryParam + "=" + escape(query);
    },

    init: function() {

        var me = this;

        this.cfg = {
            defaultText: "Search",
            searchUrl: "http://" + document.location.host + "/search/",
            queryParam: "q",
            suggestUrl: "http://216.24.138.210/Suggest",
            suggestParam: "phrase"
        };

        var ssl = false;

        if (document.location.protocol == "https:") {
            ssl = true;
            //this.cfg.searchUrl = this.cfg.searchUrl.replace("http:", "https:");
            //this.cfg.suggestUrl = this.cfg.suggestUrl.replace("http:", "https:");
        }


        this.queryInput = $("#q");

        this.queryInput.click(function() {
            var q = $(this);
            if (q.val() == me.cfg.defaultText)
                q.val("");
        });

        this.queryInput.blur(function() {
            var q = $(this);
            if (q.val() == "")
                q.val(me.cfg.defaultText);
        });

        this.queryInput.enterKey(function() { me.go($(this).val()); });

        var query = me.cfg.defaultText;
        var queryObj = $.deparam.querystring();
        if (queryObj.q)
            query = queryObj.q;

        this.queryInput.val(query);

        var suggest = function(query) {
            if (!query) return;
            if (ssl == false) {
                $.ajax({
                    url: me.cfg.suggestUrl,
                    dataType: "jsonp",
                    jsonp: "jsonp",
                    data: { phrase: query.toLowerCase(), callback: "DrillSpot.Search.renderSuggest" },
                    global: false
                });
            }
        };

        this.queryInput.keyup(function(e) {
            var code = e.keyCode;
            if (code == 40) {
                me.getSuggestPanel().scrollDown();
            } else if (code == 38) {
                me.getSuggestPanel().scrollUp();
            } else if (code == 27 || code == 13) {
                me.getSuggestPanel().hide();
            } else if (code == 37 || code == 39 || code == 35 || code == 36) {
            } else {
                suggest($(this).val());
            }
        });
    },

    getSuggestPanel: function() {
        if (!this.suggestPanel) {
            var me = this;
            this.suggestPanel = new SuggestPanel();
            this.suggestPanel.position(this.queryInput.parents("div"));
            this.suggestPanel.select(function(e, query) { me.go(query); });
            this.suggestPanel.selectItem(function(e, item) { me.queryInput.val(item); });
        }
        return this.suggestPanel;
    },

    renderSuggest: function(data) {
        this.getSuggestPanel().render(data);
    }
};


$(function() {
    DrillSpot.Search.init();
});