(function($) {
    $.fn.jSuggest = function(options) {
        var opts = $.extend({}, $.fn.jSuggest.defaults, options); var jH = ".jSuggestHover"; var jsH = "jSuggestHover"; var iniVal = this.value; var textBox = this; var textVal = this.value; var jC = "#jSuggestContainer"; var defaultData = opts.data; $("body").append('<div id="jSuggestContainer"></div>'); $(jC).hide(); $(this).bind("keyup click", function(e) {
            textBox = this; textVal = this.value; if (this.value.length >= opts.minchar && $.trim(this.value) != "Search Terms") {
                var offSet = $(this).offset(); $(jC).css({ position: "absolute", top: offSet.top + $(this).outerHeight() + "px", left: offSet.left, width: $(this).outerWidth() - 2 + "px", opacity: opts.opacity, zIndex: opts.zindex }).show(); if (e.keyCode == 27) { $(jC).hide(); }
                else if (e.keyCode == 13) {
                    if ($(jH).length == 1)
                        $(textBox).val($(jH).text()); $(jC).hide(); iniVal = textBox.value;
                }
                else if (e.keyCode == 40) {
                    if ($(jH).length == 1) {
                        if (!$(jH).next().length == 0) {
                            $(jH).next().addClass(jsH); $(".jSuggestHover:eq(0)").removeClass(jsH); if (opts.autoChange)
                                $(textBox).val($(jH).text());
                        } 
                    }
                    else {
                        $("#jSuggestContainer ul li:first-child").addClass(jsH); if (opts.autoChange)
                            $(textBox).val($(jH).text());
                    } 
                }
                else if (e.keyCode == 38) {
                    if ($(jH).length == 1) {
                        if (!$(jH).prev().length == 0) {
                            $(jH).prev().addClass(jsH); $(".jSuggestHover:eq(1)").removeClass(jsH); if (opts.autoChange)
                                $(textBox).val($(jH).text());
                        }
                        else { $(jH).removeClass(jsH); $(textBox).val(iniVal); } 
                    } 
                }
                else if (textBox.value != iniVal) {
                    iniVal = textBox.value; $(jC).find('ul').remove(); if (opts.data == '')
                        opts.data = $(this).serialize(); else
                        opts.data = defaultData + "=" + $(this).val(); setTimeout(function() {
                            $.ajax({ type: opts.type, url: opts.url, data: opts.data, success: function(msg) {
                                $(jC).find('ul').remove(); $(jC).append(msg); $("#jSuggestContainer ul li").bind("mouseover", function() {
                                    $(jH).removeClass(jsH); $(this).addClass(jsH); textVal = $(this).text(); if (opts.autoChange)
                                        $(textBox).val($(jH).text());
                                }); $("#jSuggestContainer ul li").click(function() { $(this).addClass(jsH); $(textBox).val(textVal); }); $(".jSuggestLoading").hide();
                            } 
                            });
                        }, opts.delay);
                } 
            }
            else { $(jH).removeClass(jsH); $(jC).hide(); }
            return false;
        }); $(document).bind("click", function() { $(jC).hide(); iniVal = textBox.value; });
    }; $.fn.jSuggest.defaults = { minchar: 3, opacity: 1.0, zindex: 20000, delay: 2500, autoChange: false, url: "", type: "GET", data: "" };
})(jQuery);