(function(b){b.fn.extend({suggest:function(c){if(typeof c==="string"){c={url:c}}else{if(b.isArray(c)){c={data:c}}}return this.each(function(){new a(b(this),c)})}});var a=function(h,o){var d={BACKSPACE:8,ENTER:13,CTRL:17,ALT:18,ESCAPE:27,UP:38,RIGHT:39,DOWN:40,PRINTSCREEN:44,INSERT:45,DELETE:46};var l={TEXT:0,COUNT:1,SEARCH:2,ID:3};var r=null;var t=null;var f={url:"",data:[],callback:null,submitOnSelect:true,customClass:"",scroll:null};var i;var u;var w=[];var c=null;var v=(new Date()).getTime();x(h,o);function x(C,B){f=b.extend(f,B);v++;var D=C.attr("id")||v;r=C.data("suggest",true).attr("autocomplete","off").keyup(y).keydown(s).click(p).blur(function(){u=window.setTimeout(q,500)}).focus(function(){n()});t=b("<ul/>").appendTo("body").attr("id",D+"Suggest").addClass("suggest "+f.customClass);e();b(window).resize(e);if(null!==f.scroll){f.scroll.bind("scroll",e)}}function e(){var B=r.offset();t.css({position:"absolute",top:(B.top+r.outerHeight())+"px",left:B.left+"px",width:r.innerWidth()+"px"})}function y(B){switch(B.keyCode){case d.ENTER:case d.CTRL:case d.ALT:case d.ESCAPE:case d.PRINTSCREEN:case d.INSERT:break;case d.BACKSPACE:case d.DELETE:window.clearTimeout(i);p();i=window.setTimeout(n,100);break;default:if(B.keyCode>40){window.clearTimeout(i);i=window.setTimeout(n,100)}break}}function s(B){switch(B.keyCode){case d.ENTER:case d.RIGHT:var C=[];if(c){C=c.data("data");r.val(C[l.TEXT])}q();if(b.isFunction(f.callback)){f.callback(C)}if(d.ENTER===B.keyCode){return f.submitOnSelect}return true;case d.UP:case d.DOWN:k(B.keyCode);return false;case d.ESCAPE:q();return true;default:return true}}function n(){var D=r.val().toLowerCase();if(D){if(w[D]){A(w[D],D)}else{if(f.url){b.get(f.url+(-1===f.url.indexOf("?")?"?":"&")+"out=json&q="+encodeURIComponent(D),{},function(F){w[D]=F;A(F,D)},"jsonp")}else{if(f.data){var C=[],E;for(var B in f.data){E=f.data[B][l.SEARCH]||f.data[B][l.TEXT];if(0===E.toLowerCase().indexOf(D)){C.push(f.data[B])}if(C.length>=10){break}}w[D]=C;A(C,D)}}}}else{q()}}function A(E,D){window.clearTimeout(u);t.empty();var C=new RegExp("(^|\\s)("+j(D)+")","ig");var F,B;b.each(E,function(G,H){F=b("<span>").text(H[l.TEXT]).html();F=F.replace(C,"$1<b>$2</b>");B=b("<li>").click(g).mouseenter(m).mouseleave(z).append(b("<span>").html(F));if(H[l.COUNT]){B.append('<span class="count">'+H[l.COUNT]+"x</span>")}t.append(B);B.data("data",H)});if(E.length>0){t.show()}}function q(){p();t.hide()}function k(B){if(c){c.removeClass();if(d.DOWN===B){c=c.next();if(0===c.length){c=t.children(":first")}}else{c=c.prev();if(0===c.length){c=t.children(":last")}}}else{c=t.children(":first")}c.addClass("active")}function p(){if(c){c.removeClass();c=null}}function g(C){var B=b(this);r.val(B.data("data")[l.TEXT]);r.focus();if(b.isFunction(f.callback)){f.callback(B.data("data"))}if(f.submitOnSelect){r.parent("form").submit()}return false}function m(B){if(c){c.removeClass()}c=b(this).addClass("active")}function z(B){p()}function j(B){return B.replace(/(\||\-|\.|\/|\\|\(|\)|\[|\]|\{|\}|\^|\$|\?|\+|\*)/,"\\$1")}}})(jQuery);