(function($){$.fn.combobox=function(options){return this.filter("input[type=text]").each(function(){options=$.extend({idName:"",idValue:0},options);var ajaxContext=this;var $this=$(this).addClass("combobox");$.extend(this,{$selected:$("<input type='hidden' name='"+options.idName+"' value='"+options.idValue+"'>").insertAfter($this),$list:$("<div class='listbox'>").hide().appendTo(document.body).bind("mouseover mouseout",function(){this.capture=!this.capture}),oldValue:this.value,dropOnKey:true,eBorderWidth:1,dependents:[],beforeDrop:$.emptyHandler,onChangeValue:$.emptyHandler,addDependents:function(dependents){var combo=this;$(dependents).each(function(){combo.dependents[combo.dependents.length]=this})},disDependents:function(){var id=this.selectedId();return(id=="all")||($(this).readonly()?!id||(id==0):!this.value)},ajaxURL:"",ajaxParams:{},ajaxSuccess:function(xml){ajaxContext.$list.empty();$(xml).find("list>item").each(function(){ajaxContext.add(ajaxContext.xmlToObj(this))})},xmlToObj:function(){return{}},items:function(){return this.$list.find(".item:not([disabled])")},count:function(){return this.$list.find(".item:not(:has(hr))").length},dropped:function(){return this.$list.visible()},selected:function(){return this.$list.find(".ui-state-hover").filter(".item")},selectedId:function(){return this.$selected.val()},selectItem:function(item){this.$list.find(".item").removeClass("ui-state-hover");if(item){var $item=$(item);if(!$item.disable()){$item.addClass("ui-state-hover");var list=this.$list[0];var st=0;var items=this.items();if(item!=items[0]){if(item==items[items.length-1]){st=list.scrollHeight}else{var t=item.offsetTop;var h=item.offsetHeight;st=list.scrollTop;if((st+list.offsetHeight)<(t+h)){st+=h+h}if(t<st){st-=h+h}}}list.scrollTop=st}}},selectNext:function(next){if(this.dropped()){var selected=this.selected();var first=this.items();var last=first[first.length-1];first=first[0];if((next&&(selected[0]==last))||(!next&&(selected[0]==first))){selected=null}this.selectItem(selected&&selected.length?selected[next?"nextAll":"prevAll"](".item:not([disabled])",this.$list)[0]:next?first:last)}else{this.dropdown(true)}},getItem:function(id){return id?this.$list.find(".item#"+id):null},findId:function(value,all){var id=0;var $items=all?this.$list.find(".item"):this.items();$items.each(function(){if($.equalsIgnoreCase(this.value,value)){id=all&&$(this).disable()?null:this.id;return false}});return id},setId:function(id,nocheck){if(!(nocheck&&(id==this.selectedId()))){this.$selected.val(id);var disabled=this.disDependents();$.each(this.dependents,function(){if(this.clearText){this.clearText()}if(this.setId){this.setId(this.idValue)}if(this.disable){this.disable(disabled)}else{$(this).disable(disabled)}})}return this},setValue:function(value,id){this.onChangeValue(value=value||"",id);this.value=this.oldValue=value;return this.setId(id||this.findId(value),true)},clearText:function(){this.value=this.oldValue=""},disable:function(disabled){if(disabled){this.clearText()}$(this).disable(disabled)},add:function(node){var combo=this;if(node instanceof Array){$.each(node,function(){combo.add(this)});return combo}if(typeof node=="string"){node={text:node}}var $item=$("<div class='item'>").appendTo(combo.$list).click(function(){with(combo){if(!$(this).disable()){setValue(this.value,this.id);dropdown(false);select()}focus()}});var item=$item[0];item.value="";with($item){for(var prop in node){switch(prop.toLowerCase()){case"text":append("<label>"+(item.value=$.trim(node[prop])||"&nbsp;")+"</label>");item.value=$.trim(item.value.replace(/&nbsp;/," "));break;case"alt":var alt=$.trim(node[prop]);if(alt){append("<label class='alt'>"+alt+"</label>")}break;case"prefix":var prefix=$.trim(node[prop]);break;default:attr(prop,node[prop])}}if(prefix){html("<span class='prefix'>"+prefix+"</span> "+html())}filter(":has(hr)").disable(true).css("background-color","transparent");if(!disable()){mousemove(function(){combo.$list[0].capture=true;combo.selectItem(this)})}}return item},dropdown:function(show,all,complete){var $this=$(this);if(show=show&&!$this.disable()){this.beforeDrop();if(this.ajaxURL&&!complete){$.ajax({url:this.ajaxURL,data:$.extend({},this.ajaxParams,{filter:!all?this.value:""}),success:this.ajaxSuccess,complete:function(){ajaxContext.dropdown(true,all,true)}});return}else{if(show=show&&this.count()){var r=$this.offset();r.top+=this.clientHeight+this.eBorderWidth;this.$list.css(r).width(this.clientWidth);var current=this.getItem(this.selectedId());if(current){current=current[0]}if(current&&!$.equalsIgnoreCase(current.value,$.trim(this.value))){current=null}this.selectItem(current)}}}this.$list[show?"addClass":"removeClass"]("ui-state-focus").visible(show)}},options);$this.click(function(){if($(this).hasClass("ui-state-focus")){this.dropdown(!this.dropped(),true)}}).blur(function(){if(!this.$list[0].capture){this.dropdown(false)}}).keyup(function(e){switch(e.keyCode){case $.keyCodes.VK_ENTER:if(this.dropped()){this.selected().click()}return false;case $.keyCodes.VK_ESC:this.dropdown(false);return false;case $.keyCodes.VK_UP:this.selectNext(false);return false;case $.keyCodes.VK_DOWN:this.selectNext(true);return false;default:var value=$.trim(this.value);if(value!=this.oldValue){var id=this.findId(value,true);if(id==null){this.clearText();return false}this.oldValue=value;this.setId(id);if(this.dropOnKey){this.dropdown(true)}}}})})}})(jQuery);
