(function($){$.cobalt=$.cobalt||{};$.cobalt.combobox=function(el,o){this.init(el,o);};$.fn.combobox=function(o){return this.each(function(){this._combo=new $.cobalt.combobox(this,o);});};$.extend($.cobalt.combobox.prototype,{flyout:null,active:false,size:0,pos:-1,selected:null,isover:false,ajaxcall:false,ajaxresults:null,getResultsUrl:null,onsearch:null,onnav:null,onselect:null,onclose:null,flyoutOver:function(e){this._combo.isover=true;},flyoutOut:function(e){this._combo.isover=false;},onKeyup:function(e){var key=e.which;if(key!=8&&key!=32&&key<=48){return;}if(this._timeout){clearTimeout(this._timeout);this._timeout=null;}var fn=function(combo){return function(){combo.search(combo.input.val());combo=null;};}(this._combo);this._timeout=setTimeout(fn,50);},validSearch:function(){var text,current;if(!this.ajaxresults)return false;else if(!(text=this.ajaxresults.text))return false;else if(!(current=this.input.val()))return true;else if(current.toLowerCase().indexOf(text.toLowerCase())<0)return false;else return true;},search:function(text){if(this.ajaxcall)return;if(!text||text.length<this.options.minChars){if(this.active)this.close();return;}if(this.validSearch()){this.activate();this.displayResults(text);return;}if($.isFunction(this.options.onsearch)){if(this.options.onsearch.apply(this,arguments)===false){return false;}}var url=$.getAjaxUrl(this.getResultsUrl,{Terms:$.encode(text)});if(url){this.activate();this.flyout.loading();var combo=this;this.ajaxcall=true;var fn=function(combo){return function(results){combo.ajaxcall=false;combo.flyout.doneLoading();var newtext=combo.input.val();if(newtext&&newtext.toLowerCase().indexOf(text.toLowerCase())>=0){combo.ajaxresults={text:text,results:results};combo.displayResults(newtext);combo=null;}else combo.search(newtext);combo=null;};}(this);$.ajax({url:url,dataType:'json',success:fn});}},activate:function(){if(this.active)return;this.flyout.relativePos(this.input,this.options.position||$._DIR._LOWER_LEFT,this.options.direction||$._DIR._LOWER_RIGHT);this.active=true;$(document).bind('keydown',{combo:this},this.flyoutNav).bind('mousedown',{combo:this},this.checkClose);this.input.bind('mouseover',this.flyoutOver).bind('mouseout.combo',this.flyoutOut);},displayResults:function(text){this.flyout.empty();this.size=0;this.pos=-1;this.selected=null;var results=this.ajaxresults.results;for(var i=0;i<results.length;i++){var name=results[i][this.options.textField];if(name&&name.toLowerCase().indexOf(text.toLowerCase())>=0){var div=$('<div>'+name+'</div>');div.appendTo(this.flyout);div.hover(this.itemOver,this.itemOut).click(this.select);div[0]._combo=this;div[0].$value=results[i];div[0].$pos=this.size++;}}},itemOver:function(e){var combo=this._combo;var css=combo.options.cssActive;if(combo.pos>=0){combo.flyout.find('div.'+css).removeClass(css);combo.selected=null;}if(!this.$self){this.$self=$(this);}this.$self.addClass(css);combo.selected=this.$value;combo.pos=this.$pos;},itemOut:function(e){var combo=this._combo;var css=combo.options.cssActive;if(!this.$self){this.$self=$(this);}this.$self.removeClass(css);},checkClose:function(e){if(!e.data.combo.isover){e.data.combo.close.call(e.data.combo);}},close:function(){if(!this.active)return;if($.isFunction(this.onclose)){this.onclose(this);}this.flyout.empty().hide();this.active=false;$(document).unbind('keydown',this.flyoutNav).unbind('mousedown',this.checkClose);this.input.unbind('mouseover',this.flyoutOver).unbind('mouseout',this.flyoutOut);},flyoutNav:function(e){var combo=e.data.combo;switch(e.which){case 27:combo.close();break;case 38:combo.move(-1);break;case 40:combo.move(1);break;case 33:combo.move(-10);break;case 34:combo.move(10);break;case 13:combo.select();return false;}return true;},move:function(amount){if(amount<=0&&this.pos<=0)return;else if(amount>0&&this.pos+1>=this.size)return;else this.pos+=amount;if(this.pos<0)this.pos=0;if(this.pos+1>this.size)this.pos=this.size-1;var css=this.options.cssActive;if(this.selected){this.flyout.find('div.'+css).removeClass(css);this.selected=null;}var div=this.flyout.find('div:eq('+this.pos+')');div.addClass(css);this.selected=div[0].$value;if(amount<0){var pos=div[0].offsetTop;if(pos<div[0].offsetParent.scrollTop){div[0].offsetParent.scrollTop=pos}}else{var pos=div[0].offsetTop+div[0].offsetHeight-div[0].offsetParent.offsetHeight+$.toInt(div.css('borderBottomWidth'))+$.toInt(div.css('marginBottom'));if(pos>div[0].offsetParent.scrollTop){div[0].offsetParent.scrollTop=pos}}},select:function(e){var combo=(e&&e.data&&e.data.combo)||this._combo||this;var result;if(combo.selected){combo.input.val(combo.selected[combo.options.textField]);if($.isFunction(combo.onselect))result=combo.onselect.apply(combo,[combo.selected]);}combo.close();return result;},init:function(el,o){o=jQuery.extend({cssClass:'comboBox',cssActive:'comboActive',width:300,height:180,position:$._DIR._LOWER_LEFT,direction:$._DIR._LOWER_RIGHT,minChars:3,textField:'',showOnFocus:true},o||{});this.options=o;this.getResultsUrl=o.getResultsUrl;this.onsearch=o.onsearch;this.onnav=o.onnav;this.onselect=o.onselect;this.onclose=o.onclose;this.input=$(el).bind('keyup',this.onKeyup);if(this.options.showOnFocus)this.input.bind('focus',function(e){if(!this._combo.active)this._combo.search(this.value);});this.flyout=$('<div class="'+o.cssClass+'"></div>').css({position:'absolute',display:'none',width:o.width,height:o.height}).appendTo(document.body).hover(this.flyoutOver,this.flyoutOut);this.flyout[0]._combo=this;}});})(jQuery);
