
(function($){$.fn.suggest2=function(opt){if(!(opt&&opt.dataSource)){alert("suggest2:\nInvalid dataSource argument");return this;}
if(this.length>1){this.each(function(){$(this).suggest2(opt);});return this;}
opt=$.extend({dataSource:null,asyncFunction:false,container:'<ul class="suggest2"></ul>',itemRoot:null,item:'<li>{text}</li>',activeClass:"active",minLength:3,delay:400,complete:null,error:null,cacheSize:50,requestByEnterOnly:false,ignoreCase:true,captureTab:true,highlight:true,listStyles:{}},opt);controls.push(new Suggest(this[0],opt));return this;};var controls=[];destructor=function(){var i,s2;for(i=0;i<controls.length;++i){s2=controls[i];$(s2.obj).unbind("keydown.suggest2").unbind("keyup.suggest2").unbind("click.suggest2");if(s2.request&&s2.request.abort){s2.request.abort();}
if(s2.listBox){$(s2.listBox).remove();s2.listBox=null;}
s2.cache=null;}
controls.length=0;}
if($.browser.msie&&$.browser.version<=7){$(window).unload(destructor)}
function setTimer(fn,ms,ths,arg){var t=setInterval(function(){clearInterval(t);fn.call(ths,arg);},ms);return t;}
var uqid={"uqid":0};function uniqueId(sd){var n=sd||"uqid",c;if(!uqid[n]){uqid[n]=0;}
c=uqid[n];while(document.getElementById(n+c.toString())){++c;}
uqid[n]=c;return n+c.toString();}
String.prototype.supplant=function(o){return this.replace(/{([^{}]*)}/g,function(a,b){var r=o[b];return typeof r==='string'||typeof r==='number'?r:a;});};function highlightText(txt,obj,tag){var o,res={},rx=new RegExp("("+txt+")","gi"),s=tag||"strong";if(typeof obj=="string"){return obj.replace(rx,"<"+s+">$1</"+s+">");}
for(o in obj){if(!obj.hasOwnProperty(o)){continue;}
if(typeof obj[o]=="string"){res[o]=obj[o].replace(rx,"<"+s+">$1</"+s+">");}else{res[o]=obj[o];}}
return res;}
function Cache(sz){this.keys=new Array(sz);this.vals=new Array(sz);this.cursor=-1;this.size=sz;}
Cache.prototype.store=function(key,val){if(this.cursor==this.size){this.cursor=0;}else{++this.cursor;}
this.keys[this.cursor]=key;this.vals[this.cursor]=val;return val;}
Cache.prototype.retrieve=function(key){var i;for(i=0;i<this.size;++i){if(this.keys[i]==key){return this.vals[i];}}
return null;}
function GenericListBox(init){var s2=init.suggest,T=$(init.container)[0];if(!T.id){T.id=uniqueId(s2.id+"_");}
if(!init.itemRoot){T.itemRoot=T;}
else if(typeof(init.itemRoot)=="string"){T.itemRoot=$(init.itemRoot,T);}
else{T.itemRoot=init.itemRoot;}
if(!T.itemRoot.id){T.itemRoot.id=uniqueId();}
T.suggest=s2.id;T.txt="";T.active=false;T.items=[];T.focused=-1;T.htimer=-1;T.hide=function(){T.active=false;T.focused=-1;init.hide.call(T);$("#"+s2.id).trigger("rollUp");}
T.show=function(noAct){if(T.items.length==0){T.hide();return;}
if(T.htimer!=-1){clearInterval(T.htimer);}
T.active=true;init.show.call(T);$("#"+s2.id).trigger("dropDown");if(!noAct){T.activate(true);}}
$(T).hide().appendTo(document.body);$("#"+T.itemRoot.id+" > *").live("click",function(e){if(e.button==0){init.clickHandler(this.val,s2);T.hide();document.getElementById(s2.id).focus();}});T.setList=function(txt,json){var tpl=init.item,it,i,hl=highlightText,$ir;if(json.len===0){T.items=[];T.hide();return;}
if(T.txt!=txt){T.items=[];T.txt=txt;$ir=$(T.itemRoot);$ir.empty();if(!init.highlight){hl=function(t,o){return o;};}
for(i=0;i<json.length;++i){var n=json[i],item;if(typeof n=="object"){item=tpl.supplant(hl(txt,n));}else{item=tpl.supplant({text:hl(txt,n.toString())});}
it=$(item)[0];it.val=n;T.items.push(it);$(it).appendTo($ir);};T.focused=-1;}
T.show();}
T.activate=function(nxt){if(!T.active){T.focused=-1;T.show(true);}
if(T.focused==-1){T.focused=0;}else{T.focused=(T.items.length+T.focused+(nxt?1:-1))%T.items.length;}
$(T.itemRoot).children().filter("."+s2.opt.activeClass).removeClass(s2.opt.activeClass).end().eq(T.focused).addClass(s2.opt.activeClass);}
var stop;$("#"+s2.id).bind("keydown.suggest2",function(e){stop=true;switch(e.keyCode){case 38:T.activate(false);break;case 40:T.activate(true);break;case 27:T.hide();return false;case 9:if(s2.opt.captureTab&&T.items.length&&(T.active||this.val===null)){T.activate(!e.shiftKey);return false;}
return;case 13:if(T.active){$(T.items[T.focused]).trigger({type:"click",button:0});}
if(s2.opt.requestByEnterOnly){stop=false;};return false;default:stop=false;return;}}).bind("keyup.suggest2",function(e){if(stop){return;}else if(this.value.length<s2.opt.minLength){if(this.val){$(this).trigger("reset");this.val=null;T.items.length=0;}
T.txt=this.value;T.len=0;T.hide();return;}
if(T.txt!=this.value){if(s2.timer!==null){clearInterval(s2.timer);}
if(s2.opt.requestByEnterOnly&&e.keyCode!=13){return;}
s2.timer=setTimer(s2.getData,s2.opt.delay,s2,this.value);$(this).trigger("reset");T.items.length=0;this.val=null;}});return T;}
function ListBox(s2,klik){var l=new GenericListBox({suggest:s2,clickHandler:klik,container:s2.opt.container,itemRoot:s2.opt.itemRoot,item:s2.opt.item,show:function(){$(this).fadeIn("fast");},hide:function(){$(this).fadeOut("fast");},highlight:true});return l;}
function Suggest(obj,opt){var T=this,pos=$(obj).offset();if(!obj.id){obj.id=uniqueId();}
obj.val=null
this.id=obj.id;opt.cacheSize=Math.max(opt.cacheSize,1);this.opt=opt;this.listBox=new ListBox(this,itemClick);pos.top+=$(obj).outerHeight();$(this.listBox).css($.extend({position:"absolute",zIndex:100,cursor:"pointer",display:"none",listStyleType:"none",margin:0,padding:0},pos,opt.listStyles))
this.request=null;this.timer=null;this.cache=new Cache(opt.cacheSize);$(obj).attr("autocomplete","off").bind("click.suggest2, focus.suggest2",this,click).bind("blur.suggest2",this,blur);}
Suggest.prototype.getData=function(txt){if(this.opt.ignoreCase){txt=txt.toLowerCase();}
var res=this.cache.retrieve(txt),T=this;if(res===null){if(typeof this.opt.dataSource==="function"){this.opt.dataSource(txt,function(k,v){T.ajaxProcess(k,v);});if(!this.opt.asyncFunction){this.ajaxProcess(txt,res);}}else{this.ajaxRequest(txt);}}else{this.ajaxProcess(txt,res);}};Suggest.prototype.ajaxRequest=function(txt){var T=this;T.request=$.ajax({async:true,beforeSend:null,cache:true,complete:this.opt.complete,data:txt,dataType:"json",error:this.opt.error,global:false,success:function(d){T.ajaxProcess(txt,d);},timeout:500,type:"get",url:this.opt.dataSource});}
Suggest.prototype.ajaxProcess=function(key,val){this.request=null;this.cache.store(key,val);this.listBox.setList(key,val);}
function itemClick(val,s2){var $obj=$("#"+s2.id),v=(typeof val=="string"?{text:val}:val);s2.val=$obj[0].val=v;s2.listBox.txt=v.text;$obj.val(v.text).trigger("updated",[v]);}
function click(e){if(this.value.length<e.data.opt.minLength||(e.type=="click"&&e.button!=0)||(e.type=="focus"&&this.val!==null)||e.data.listBox.active){return false;}
if(e.data.timer!==null){clearInterval(e.data.timer);e.data.timer=null;}
if(!e.data.listBox.active&&e.data.listBox.items.length){e.data.listBox.show();}
return false;}
function blur(e){if(e.data.listBox.active){e.data.listBox.hide();}}}(jQuery));