﻿/* Copyright 2009 ZZEE. All rights reserved.
http://zzee.com
No part of this code can be used, copied or distributed
without written permission of ZZEE.*/

(function($){var ns='zzSuggestSelector',nsul=ns+'UL',z=[];var R={r:false,e:'',q:'',l:100,p:0,d:[]};function CI(ps,q,pr){var T=this;T.ps=ps;T.q=q;T.pr=pr;T.i=[];T.p=0;T.P=[];T.PG=[];T.nm=false;T.c=0;T.rn=false;}CI.prototype={r:function(q){CI.call(this,this.ps,q,this.pr);},hr:function(r,e,t){var T=this,a=typeof r=='object',i,j,L;if(a){i={};r=$.extend(i,R,r);}else{}if((!a)||(!r.r)){if(e&&$.isFunction(e)){e.call(t,r);}return false;}if(T.q!=r.q){return false;}if(r.p in T.PG){return false;}if(!(r.p in T.P)){return false;}L=r.d.length;T.PG[r.p]=L;for(i in r.d){j=r.d[i];T.c+=j.value.length+j.text.length;}i=r.p*r.l;if(i<T.i.length){for(j=0;j<L;j++){T.i.splice(i+j,0,r.d[j]);}T.rn=true;}else{T.i=T.i.concat(r.d);}if(L<r.l){T.nm=true;if(T.pr.n){T.pr.n(T);}}return T.i;},gp:function(){var T=this;if(T.nm){return false;}T.P[T.p]=1;return T.p;},gi:function(){return this.i.length?this.i:null;},gc:function(){return this.i;},m:function(){if(this.nm){return this.i;}this.p++;return null;}};function CC(pr,ps,ms){var T=this;T.pr=pr;T.ps=ps;T.ms=ms;T.i={};T.c=null;T.s('');}CC.prototype={s:function(t){var T=this;if(typeof(T.i[t])=='undefined'){T.i[t]=new CI(T.ps,t,this);T.cc(T.i[t]);}else{if(T.c!=T.i[t]){T.cc(T.i[t]);}}return T.c;},cc:function(i){var T=this,q;T.c=i;if(T.gs()>T.ms){for(q in T.i){if(T.i[q]!=i){delete T.i[q];}}}},ch:function(t){if(typeof(this.i[t])=='undefined'){return null;}return this.i[t];},gi:function(){return this.c;},gs:function(){var q,i=0;for(q in this.i){i+=this.i[q].c;}return i;},z:function(){var q;for(q in this.i){delete this.i[q];}},n:function(item){var T=this;if(item==T.c){if(T.pr.n){T.pr.n();}}}};$.widget('ui.'+ns,{_init:function(){var T=this,O=T.options,j=T.element,x,y,w;R.l=O.pageSize;T._x=false;T._q='';T._vi=[];T._fi=-1;T._ci=-1;T._va=false;T._t=null;T._j=j;if(T.element[0].tagName.toLowerCase()=='select'){T._s=j;y=T.element[0];if((O.value===false)&&(y.selectedIndex>=0)){x=y.options[y.selectedIndex];O.value=x.value;O.text=x.text;}w=j.css('width');j.addClass('ui-helper-hidden');}else{T._s=null;}T._va=!(T._s||O.items);if(T._va){T._c=new CC(T,O.pageSize,O.cacheMaxSize);T._c.s(T._q);}else{T._c=null;}y='<div class="zzsuggestselectorinline ui-widget ui-helper-clearfix"></div>';if(T._s){T._d=$(y).insertAfter(j);}else{T._d=$(y).appendTo(j);}T._h=null;if(O.name){y='<input type="hidden" name="'+O.name+'"'+' value=""/>';T._h=$(y).appendTo(T._d);}y='<input type="text" class="input" readonly="readonly"'+((O.inlineCSS&&(!T._s))?(' style="'+O.inlineCSS+'"'):'')+'/>';T._i=$(y).appendTo(T._d).bind('keyup.'+ns,function(e){e=e||window.event;if(e.keyCode==13){T._p();}return false;});T._sv(false);T._bc(T._i);if(T._s&&w){T._i.css('width',w);}if(O.showButton){y='<span class="button ui-corner-all ui-state-default" style="width: 24px; display: inline-block;"><span class="ui-icon ui-icon-circle-triangle-s"></span><span class="text"></span></span>';T._b=$(y).insertAfter(T._i).bind('mousedown.'+ns,function(){$(this).addClass('ui-state-active');}).bind('mouseup.'+ns,function(){$(this).removeClass('ui-state-active');}).bind('mouseover.'+ns,function(){$(this).addClass('ui-state-hover');}).bind('mouseout.'+ns,function(){$(this).removeClass('ui-state-hover');});T._bc(T._b);T._b.find('span.text').append(document.createTextNode(O.buttonCaption));}else{T._b=null;}},_cq:function(q,k){var T=this;q+='';q=$.trim(q).toLowerCase();if(q==T._q){return;}T._q=q;if(T._va){T._c.s(q);}T._f(k);T._mc();},_gi:function(a,m){m=m||false;a=a||m;var T=this,i;if(T._s){return T.element[0].options;}else if(T.options.items){return T.options.items;}else if(a){i=T._c.gi()[m?'m':'gi']();if(i===null){T._a();}return i;}else{return T._c.gi().gc();}},_an:function(){var T=this,u=T._ul,x=T._w,off=u.position();x.css('left',off.left+(u.width()-x.width())/2).css('top',off.top+(u.height()-x.height())/2).css('display','block');},_anx:function(){this._w.css('display','none');},_a:function(){var T=this,O=T.options,d={},t=T._q,p=T._c.gi().gp();if(p===false){return;}d[O.urlParamKeyword]=t;d[O.urlParamPagesize]=O.pageSize;d[O.urlParamPage]=p;d[O.urlParamTimestamp]=+new Date();T._an();$.getJSON(O.url,$.extend(d,O.urlParamsUser),function(r){if(T._x){return;}var c;if(T._q==r.q){c=T._c.gi();if(c.hr(r,O.ajaxError,this)){T._anx();T._f2(false,c.rn?0:r.p);c.rn=false;}else{}}else{c=T._c.ch(r.q);if(c){if(!c.hr(r,O.ajaxError,this)){}}}});},_m:function(){var T=this;if(!T._va){return;}T._gi(true,true);},_f:function(k){k=k||false;var T=this;if(!k){T._f2(true,0);return;}T._ct();function g(){T._f2(true,0);}T._t=setTimeout(g,T.options.delay);},_cu:function(){var T=this;T._fi=-1;T._ci=-1;T._vi=[];T._ul.empty();T._anx();},_ft:function(s){if(this._va||(!this._q.length)){return true;}return(s.toLowerCase().indexOf(this._q)>=0);},_nr:function(d,s){s=s||1;var T=this,a=T._gi(false,false),L=a?a.length:0,i=T._ci,ni=-1,u,l,j=0,o=-1;if(!L){return;}if(d){i+=1;if(i>=L){i=0;}for(;i<L;i++){if(T._ft(a[i].text)){o=i;j++;if(j>=s){ni=i;break;}}}}else{i-=1;if(i<0){i=L-1;}for(;i>=0;i--){if(T._ft(a[i].text)){o=i;j++;if(j>=s){ni=i;break;}}}}if(j&&((ni<0)||(ni>=L))){ni=o;}if(d){if((ni==-1)&&(T._ci>=0)){if(T._c&&(!T._c.gi().nm)){ni=T._ci;T._m();}}}T._ul.find('li.ui-state-highlight').toggleClass('ui-state-highlight',false);T._ci=ni;u=T._ul.get(0);if((ni>=0)&&(ni<L)){i=T._vi[ni];if(i>=0){i=T._ul.find('li:eq('+i+')').toggleClass('ui-state-highlight',true);if(i){l=i.get(0);if(!((l.offsetTop>=u.scrollTop)&&((l.offsetTop+l.offsetHeight)<=(u.scrollTop+u.clientHeight)))){l.scrollIntoView();}}}}else{T._fi2();u.scrollTop=0;}},_f2:function(x,p){x=x||false;p=p||0;var T=this,O=T.options,t=T._q,l=t.toLowerCase(),a=T._gi(x,false),L=a?a.length:0,ul=T._ul.get(0),i,n,s,j;if(!L){if(a===null){}else{T._cu();}return;}if(!p){T._cu();}j=T._ul.children('li').length;for(i=p*O.pageSize;i<L;i++){s=a[i].text;if(!T._ft(s)){T._vi[i]=-1;continue;}T._vi[i]=j++;if(T._fi<0){T._fi=i;}n=document.createElement('li');if(!n){return;}if(!ul.appendChild(n)){return;}if(O.showNumbers){n.appendChild(document.createTextNode((i+1)+'. '));}T._ap(n,s,l);n.className=(a[i].value==O.value)?'ui-state-active':'';$(n).bind('click.'+nsul,function(e){var k=T._ul.children('li').index(this),b;if(k>=0){k=$.inArray(k,T._vi);if(k>=0){b=T._gi(false,false);if(b&&(b.length>k)){T._os2(b[k].value,b[k].text);}}}return false;}).bind('mouseover.'+nsul,function(e){T._ul.find('li.ui-state-highlight').toggleClass('ui-state-highlight',false);$(this).addClass('ui-state-highlight');return false;}).bind('mouseout.'+nsul,function(e){$(this).toggleClass('ui-state-highlight',false);return false;});}},_ap:function(n,s,l){var x=s.toLowerCase(),L=s.length,j=0,i=0,b,M=l.length,y;if(!L){return;}if(!M){n.appendChild(document.createTextNode(s));return;}while(j<L){j=x.substring(i,L).indexOf(l);if(j<0){j=L;}else{j+=i;}if(j>0){y=s.substring(i,j);n.appendChild(document.createTextNode(y));}if(j<L){i=j+M;b=document.createElement('span');if(!b){return;}b.className='b';if(!n.appendChild(b)){return;}y=s.substring(j,i);if(!b.appendChild(document.createTextNode(y))){return;}}}},_kd:function(e){if(!e){return;}var T=this,O=T.options,a=T._gi(false,false),L=a?a.length:0,i,r=true;switch(e.keyCode){case 9:T._hd();r=false;break;case 13:i=(T._ci>=0)?T._ci:T._fi;if((0<=i)&&(i<L)){T._os2(a[i].value,a[i].text);}else{T._hd();}r=false;break;case 27:T._hd();r=false;break;case 33:T._nr(false,O.pageSize);r=false;break;case 34:T._nr(true,O.pageSize);r=false;break;case 38:T._nr(false,1);r=false;break;case 40:T._nr(true,1);r=false;break;}return r;},_ku:function(e,t){this._cq(t,true);return false;},_os:function(){this._sv(true);this._hd();return false;},_os2:function(v,t){var T=this;if(T.options.value!=v){T.options.value=v;T.options.text=t;return T._os();}T._hd();return false;},_cp:function(){var T=this,O=T.options,x,y;y='<div class="ui-widget ui-widget-content zzsuggestselectorpopup"></div>';T._d2=$(y).insertAfter(T._d).css('z-index',O.popupZindex);$('<div class="caption"></div>').appendTo(T._d2).text(O.popupHint);T._i2=$('<input type="text"/>').appendTo(T._d2).attr("autocomplete","off").bind('keydown.'+ns,function(e){T._kd(e||window.event);}).bind('keyup.'+ns,function(e){T._ku(e||window.event,this.value);});T._ul=$('<ul class="ui-widget-content ui-widget"></ul>').appendTo(T._d2).bind('scroll',function(){var a=this;if(a.clientHeight&&((a.scrollTop+a.clientHeight+4)>a.scrollHeight)){T._m();}}).bind('keydown.'+ns,function(e){T._kd(e||window.event);});T._dm=null;if(T._va){T._dm=$('<div class="ui-state-highlight caption" style="margin-top: 4px"></div>').appendTo(T._d2);}T._B=$('<div class="buttons"></div>').appendTo(T._d2);y='<button class="ui-corner-all ui-state-default"><span class="ui-icon ui-icon-circle-close"></span><span class="text"></span></button>';$(y).appendTo(T._B).bind('click.'+ns,function(){T._hd();return false;}).bind('mousedown.'+ns,function(){$(this).addClass('ui-state-active');}).bind('mouseup.'+ns,function(){$(this).removeClass('ui-state-active');}).bind('mouseover.'+ns,function(){$(this).addClass('ui-state-hover');}).bind('mouseout.'+ns,function(){$(this).removeClass('ui-state-hover');}).find('span.text').append(document.createTextNode(O.closeButtonCaption));T._w=$('<div class="wait ui-widget-content ui-state-highlight"></div>').appendTo(T._d2).text(O.loadingCaption).css('display','none');x=T._i.width();y=T._d2.width();if(x>y){T._d2.width(x);}},n:function(){this._mc();},_mc:function(){var T=this,m;if(T._dm){m=T._c.gi().nm;T._dm.toggleClass('ui-state-highlight',(!m)).text(m?T.options.noMoreDataCaption:T.options.scrollDownCaption);}},_hd:function(){var T=this,x=parseInt(T._d2.css('z-index'),10);x=jQuery.inArray(x,z);if(x>=0){z.splice(x,1);}T._d2.css('z-index',T.options.popupZindex).css('display','none');},_sw:function(){var T=this,x;T._d2.css('display','block');if(z.length){x=z[z.length-1]+1;z[z.length]=x;}else{x=T.options.popupZindex;z[0]=x;}T._d2.css('z-index',x);this._mc();T._fi2();T._f(false);},_fi2:function(){var x=this._i2.get(0);x.select();x.focus();},_p:function(){var T=this;if(T._d2){if(T._d2.css('display')=='block'){T._hd();return;}}else{T._cp();}T._sw();},_sv:function(u){var T=this,O=T.options,s=T._s;if((O.value===false)){return;}if(T._h){T._h.val(O.value);}T._i.val(O.text);if(u){if(s){s.val(O.value);if(s.get(0).onchange){s.get(0).onchange.call(s.get(0));}}else if(O.onselect){O.onselect.call(T);}}},_bc:function(j){var T=this;j.bind('click.'+ns,function(e){T._p();return false;});},_ct:function(){if(this._t){clearTimeout(this._t);}},destroy:function(){var T=this;T._x=true;this._ct();if(T._c){T._c.z();}if(T._d2){T._d2.remove();}if(T._d){T._d.remove();}T._d2=null;T._d=null;if(T._s){T._s.removeClass('.ui-helper-hidden');}T._j.removeData(ns);}});$.extend($.ui.zzSuggestSelector,{version:'1.1.0',defaults:{value:false,text:'',name:false,onselect:function(){},items:null,url:false,pageSize:30,cacheMaxSize:50*1024,urlParamKeyword:'q',urlParamPagesize:'l',urlParamPage:'p',urlParamTimestamp:'t',urlParamsUser:{},ajaxError:function(response){},delay:500,inlineCSS:false,showButton:true,buttonCaption:String.fromCharCode(160),popupHint:'Select an item from the list. Type a few letters to narrow the list.',loadingCaption:'Loading...',closeButtonCaption:'Close',scrollDownCaption:'Scroll down for more data',noMoreDataCaption:'All data for your query is in the list',popupZindex:500,showNumbers:false}});})(jQuery);