/*
 * @author Wills
 */
(function(e){var d="wrapper";var c="suggest-text";var g="suggest-list";var b="separator";var a="suggest-addition";var f="margin";e.suggest=function(t,u,k){k=k||{};k.maxHeight=k.maxHeight>0?k.maxHeight:0;k.waitMillis=k.waitMillis>0?k.waitMillis:0;k.whenNoKeyword=k.whenNoKeyword||null;k.whenNoMatches=k.whenNoMatches||null;k.plugins=k.plugins||{};var j=k.plugins;j.selectItem=function(){var v=p.find(".selected");if(!v.length){v=p.find("tr:not('."+b+"')")}j.selectedItem=v.length?v.data("item"):null};var s=e("input:text#"+t);if(!s.length){return}var h=e("<div></div>").addClass(d);s.wrap(h).addClass(c).attr("autocomplete","off");var m={top:s.get(0).clientHeight+1,width:s.get(0).clientWidth};var l=t+"_suggest_list";var p=e("<div id='"+l+"'></div>").hide().addClass(g).css({top:m.top}).width(m.width);var o=e("<div></div>").hide().addClass(a).css({top:m.top}).width(m.width);if(j.tooltips){s.after(j.tooltips.hide().addClass(a).css({top:m.top}).width(m.width))}s.after(o).after(p).after("<br>");var n="",q=0;var i=function(v,x){if(!v||!x){return x}var w=new RegExp(v+"","gi");return x.replace(w,"<b>$&</b>")};var r=function(w,v){w=w||"";v=v||[];var z=e("<table></table>");for(var y=0;y<v.length;y++){if(v[y]){var x="";x+=i(w,v[y].n);if(v[y].m){x+="("+i(w,v[y].m)+")"}if(v[y].d){x+="&nbsp;-&nbsp;<span>"+i(w,v[y].d)+"</span>"}z.append(e("<tr><td>"+x+"</td></tr>").data("item",v[y]))}else{z.append(e("<tr class='"+b+"'><td></td></tr>"))}}if(z.is(":not(:empty)")){o.empty().hide();p.empty().append(z).height("auto");if(k.maxHeight&&p.height()>k.maxHeight){p.height(k.maxHeight)}p.find(".selected").mouseout();p.show();p.find("tr:first").mouseover()}else{p.empty().hide();if(w&&k.whenNoMatches){o.empty().append(e("<div></div>").addClass(f).html(k.whenNoMatches)).show()}else{if(!w&&k.whenNoKeyword&&k.whenNoKeyword!==true){o.empty().append(e("<div></div>").addClass(f).html(k.whenNoKeyword)).show()}else{o.empty().hide()}}}j.selectItem();j.isSearching=false};s.search=function(v){if(v){this.bind("search",v)}else{this.trigger("search")}return this};s.search(function(v){if(n||k.whenNoKeyword===true){u(n,r)}else{r();j.isSearching=false}}).blur(function(v){p.hide();o.hide();j.selectItem()}).keyup(function(w){var v=e.trim(s.val());if(!v||v!==(p.find(".selected").data("item")||{}).n){if(n!==v){n=v;if(q){clearTimeout(q)}j.isSearching=true;q=setTimeout(function(){s.search()},k.waitMillis)}}}).keydown(function(w){switch(w.keyCode){case 13:if(p.is(":visible")){p.find(".selected").mousedown();p.hide();j.selectItem()}else{if(o.is(":visible")){o.hide()}else{if(j.tooltips&&j.tooltips.is(":visible")){j.tooltips.hide();return false}}}break;case 27:if(p.is(":visible")){s.val(n);p.hide();p.find(".selected").mouseout();j.selectItem();return false}else{if(o.is(":visible")){o.hide();return false}else{if(j.tooltips&&j.tooltips.is(":visible")){j.tooltips.hide();return false}}}break;case 38:if(p.is(":visible")){var x=p.find(".selected");x=x.length?x.mouseout().prev():p.find("tr:last");while(x.length&&x.is("."+b)){x=x.mouseout().prev()}if(x.length){s.val(x.mouseover().data("item").n);j.selectItem();if(k.maxHeight&&x.offset().top<p.offset().top){x.get(0).scrollIntoView(true)}else{if(k.maxHeight&&x.offset().top+x.height()>p.offset().top+p.height()){x.get(0).scrollIntoView(false)}}}else{s.val(n)}}else{if(o.is(":visible")){}else{n=e.trim(s.val());s.search()}}break;case 40:if(p.is(":visible")){var x=p.find(".selected");x=x.length?x.mouseout().next():p.find("tr:first");while(x.length&&x.is("."+b)){x=x.mouseout().next()}if(x.length){s.val(x.mouseover().data("item").n);j.selectItem();var v=x.offset().top;var y=p.offset().top;if(k.maxHeight&&v<y){x.get(0).scrollIntoView(true)}else{if(k.maxHeight&&v+x.height()>y+p.height()){x.get(0).scrollIntoView(false)}}}else{x=p.find("tr:first");if(k.maxHeight&&x.length){x.get(0).scrollIntoView(true)}s.val(n)}}else{if(o.is(":visible")){}else{n=e.trim(s.val());s.search()}}break;default:}});e("#"+l+" tr:not('."+b+"')").live("mousedown",function(v){n=(e(this).data("item")||{}).n;j.selectItem();s.val(n).closest("form").submit()}).live("mouseover",function(v){e(this).addClass("selected").siblings(".selected").removeClass("selected")}).live("mouseout",function(v){e(this).removeClass("selected")})}})(jQuery);

