;
(function() {
	$.fn.sexyCombo=function(a) {
		return this.each(function() {
			new $sc(this,a)
		}
		)
	}
	;
	var i= {
		skin:"sexy",suffix:"__sexyCombo",hiddenSuffix:"__sexyComboHidden",initialHiddenValue:"",emptyText:"",autoFill:false,triggerSelected:false,filterFn:null,dropUp:false,separator:",",showListCallback:null,hideListCallback:null,initCallback:null,initEventsCallback:null,changeCallback:null,textChangeCallback:null
	}
	;
	$.sexyCombo=function(b,d) {
		if(b.nodeName!="SELECT")return;
		this.config=$j.extend( {
		}
		,i,d|| {
		}
		);
		this.selectbox=$j(b);
		this.options=this.selectbox.children().filter("option");
		this.wrapper=this.selectbox.wrap("<div>").hide().parent().addClass("combo").addClass(this.config.skin);
		this.input=$j("<input type='text' />").appendTo(this.wrapper).attr("autocomplete","off").attr("value","").attr("name",this.selectbox.attr("name")+this.config.suffix);
		this.hidden=$j("<input type='hidden' />").appendTo(this.wrapper).attr("autocomplete","off").attr("value",this.config.initialHiddenValue).attr("name",this.selectbox.attr("name")+this.config.hiddenSuffix);
		this.icon=$j("<div />").appendTo(this.wrapper).addClass("icon");
		this.listWrapper=$j("<div />").appendTo(this.wrapper).addClass("invisible").addClass("list-wrapper");
		this.updateDrop();
		this.list=$j("<ul />").appendTo(this.listWrapper);
		var c=this;
		this.options.each(function() {
			var a=$j.trim($j(this).text());
			$j("<li />").appendTo(c.list).text(a).addClass("visible")
		}
		);
		this.listItems=this.list.children();
		if($j.browser.opera) {
			this.wrapper.css( {
				position:"relative",left:"0",top:"0"
			}
			)
		}
		this.filterFn=("function"==typeof(this.config.filterFn))?this.config.filterFn:this.filterFn;
		this.lastKey=null;
		this.overflowCSS=$j.browser.opera?"overflow":"overflowY";
		this.multiple=this.selectbox.attr("multiple");
		this.notify("init");
		this.initEvents()
	}
	;
	$sc=$.sexyCombo;
	$sc.fn=$sc.prototype= {
	}
	;
	$sc.fn.extend=$sc.extend=$.extend;
	$sc.fn.extend( {
		initEvents:function() {
			var b=this;
			this.icon.bind("click",function() {
				b.iconClick()
			}
			);
			this.listItems.bind("mouseover",function(a) {
				b.highlight(a.target)
			}
			);
			this.listItems.bind("click",function(a) {
				b.listItemClick($j(a.target))
			}
			);
			this.input.bind("keyup",function(a) {
				b.keyUp(a)
			}
			);
			this.input.bind("keypress",function(a) {
				if($sc.KEY.RETURN==a.keyCode)a.preventDefault();
				if($sc.KEY.TAB==a.keyCode)b.hideList()
			}
			);
			$j(document).bind("click",function(a) {
				if((b.icon.get(0)==a.target)||(b.input.get(0)==a.target))return;
				b.hideList()
			}
			);
			this.triggerSelected();
			this.applyEmptyText();
			this.notify("initEvents")
		}
		,getTextValue:function() {
			return this.__getValue("input")
		}
		,getCurrentTextValue:function() {
			return this.__getCurrentValue("input")
		}
		,getHiddenValue:function() {
			return this.__getValue("hidden")
		}
		,getCurrentHiddenValue:function() {
			return this.__getCurrentValue("hidden")
		}
		,__getValue:function(a) {
			a=this[a];
			if(!this.multiple)return $j.trim(a.val());
			var b=a.val().split(this.config.separator);
			var d=[];
			for (var c=0,e=b.length;c<e;++c) {
				d.push($j.trim(b[c]))
			}
			d=$sc.normalizeArray(d);
			return d
		}
		,__getCurrentValue:function(a) {
			a=this[a];
			if(!this.multiple)return $j.trim(a.val());
			return $j.trim(a.val().split(this.config.separator).pop())
		}
		,iconClick:function() {
			if(this.listVisible())this.hideList(); else this.showList();
			this.input.focus()
		}
		,listVisible:function() {
			return this.listWrapper.hasClass("visible")
		}
		,showList:function() {
			if(!this.listItems.filter(".visible").length)return;
			this.listWrapper.removeClass("invisible").addClass("visible");
			this.wrapper.css("zIndex","99999");
			this.listWrapper.css("zIndex","99999");
			this.setOverflow();
			this.setListHeight();
			this.highlightFirst();
			this.listWrapper.scrollTop(0);
			this.notify("showList")
		}
		,hideList:function() {
			if(this.listWrapper.hasClass("invisible"))return;
			this.listWrapper.removeClass("visible").addClass("invisible");
			this.wrapper.css("zIndex","0");
			this.listWrapper.css("zIndex","99999");
			this.notify("hideList")
		}
		,getListItemsHeight:function() {
			return this.listItems.height()*this.liLen()
		}
		,setOverflow:function() {
			if(this.getListItemsHeight()>this.getListMaxHeight())this.listWrapper.css(this.overflowCSS,"scroll"); else this.listWrapper.css(this.overflowCSS,"hidden")
		}
		,highlight:function(a) {
			if(($sc.KEY.DOWN==this.lastKey)||($sc.KEY.UP==this.lastKey))return;
			this.listItems.removeClass("active");
			$j(a).addClass("active")
		}
		,setComboValue:function(a,b,d) {
			var c=this.input.val();
			var e="";
			if(this.multiple) {
				e=this.getTextValue();
				if(b)e.pop();
				e.push($j.trim(a));
				e=$sc.normalizeArray(e);
				e=e.join(this.config.separator)+this.config.separator
			} else {
				e=$j.trim(a)
			}
			this.input.val(e);
			this.setHiddenValue(a);
			this.filter();
			if(d)this.hideList();
			this.input.removeClass("empty");
			if(this.multiple)this.input.focus();
			if(this.input.val()!=c)this.notify("textChange")
		}
		,setHiddenValue:function(a) {
			var b=false;
			a=$j.trim(a);
			var d=this.hidden.val();
			if(!this.multiple) {
				for (var c=0,e=this.options.length;c<e;++c) {
					if(a==this.options.eq(c).text()) {
						this.hidden.val(this.options.eq(c).val());
						b=true;
						break
					}
				}
			} else {
				var f=this.getTextValue();
				var h=[];
				for (var c=0,e=f.length;c<e;++c) {
					for (var g=0,j=this.options.length;g<j;++g) {
						if(f[c]==this.options.eq(g).text()) {
							h.push(this.options.eq(g).val())
						}
					}
				}
				if(h.length) {
					b=true;
					this.hidden.val(h.join(this.config.separator))
				}
			}
			if(!b) {
				this.hidden.val(this.config.initialHiddenValue)
			}
			if(d!=this.hidden.val())this.notify("change")
		}
		,listItemClick:function(a) {
			this.setComboValue(a.text(),true,true);
			this.inputFocus()
		}
		,filter:function() {
			var d=this.input.val();
			var c=this;
			this.listItems.each(function() {
				var a=$j(this);
				var b=a.text();
				if(c.filterFn.call(c,c.getCurrentTextValue(),b,c.getTextValue())) {
					a.removeClass("invisible").addClass("visible")
				} else {
					a.removeClass("visible").addClass("invisible")
				}
			}
			);
			this.setOverflow();
			this.setListHeight()
		}
		,filterFn:function(a,b,d) {
			if(!this.multiple) {
				return b.toLowerCase().search(a.toLowerCase())==0
			} else {
				for (var c=0,e=d.length;c<e;++c) {
					if(b==d[c]) {
						return false
					}
				}
				return b.toLowerCase().search(a.toLowerCase())==0
			}
		}
		,getListMaxHeight:function() {
			return parseInt(this.listWrapper.css("maxHeight"),10)
		}
		,setListHeight:function() {
			var a=this.getListItemsHeight();
			var b=this.getListMaxHeight();
			var d=this.listWrapper.height();
			if(a<d) {
				this.listWrapper.height(a)
			} else if(a>d) {
				this.listWrapper.height(Math.min(b,a))
			}
		}
		,getActive:function() {
			return this.listItems.filter(".active")
		}
		,keyUp:function(a) {
			this.lastKey=a.keyCode;
			var b=$sc.KEY;
			switch(a.keyCode) {
				case b.RETURN:this.setComboValue(this.getActive().text(),true,true);
				if(!this.multiple)this.input.blur();
				break;
				case b.DOWN:this.highlightNext();
				break;
				case b.UP:this.highlightPrev();
				break;
				case b.ESC:this.hideList();
				break;
				default:this.inputChanged();
				break
			}
		}
		,liLen:function() {
			return this.listItems.filter(".visible").length
		}
		,inputChanged:function() {
			this.filter();
			if(this.liLen()) {
				this.showList();
				this.setOverflow();
				this.setListHeight()
			} else {
				this.hideList()
			}
			this.setHiddenValue(this.input.val());
			this.notify("textChange")
		}
		,highlightFirst:function() {
			this.listItems.removeClass("active").filter(".visible:eq(0)").addClass("active");
			this.autoFill()
		}
		,highlightNext:function() {
			var a=this.getActive().next();
			while(a.hasClass("invisible")&&a.length) {
				a=a.next()
			}
			if(a.length) {
				this.listItems.removeClass("active");
				a.addClass("active");
				this.scrollDown()
			}
		}
		,scrollDown:function() {
			if("scroll"!=this.listWrapper.css(this.overflowCSS))return;
			var a=this.getActiveIndex()+1;
			if($.browser.opera)++a;
			var b=this.listItems.height()*a-this.listWrapper.height();
			if($.browser.msie)b+=a;
			if(this.listWrapper.scrollTop()<b)this.listWrapper.scrollTop(b)
		}
		,highlightPrev:function() {
			var a=this.getActive().prev();
			while(a.length&&a.hasClass("invisible"))a=a.prev();
			if(a.length) {
				this.getActive().removeClass("active");
				a.addClass("active");
				this.scrollUp()
			}
		}
		,getActiveIndex:function() {
			return $.inArray(this.getActive().get(0),this.listItems.filter(".visible").get())
		}
		,scrollUp:function() {
			if("scroll"!=this.listWrapper.css(this.overflowCSS))return;
			var a=this.getActiveIndex()*this.listItems.height();
			if(this.listWrapper.scrollTop()>a) {
				this.listWrapper.scrollTop(a)
			}
		}
		,applyEmptyText:function() {
			if(!this.config.emptyText.length)return;
			var a=this;
			this.input.bind("focus",function() {
				a.inputFocus()
			}
			).bind("blur",function() {
				a.inputBlur()
			}
			);
			if(""==this.input.val()) {
				this.input.addClass("empty").val(this.config.emptyText)
			}
		}
		,inputFocus:function() {
			if(this.input.hasClass("empty")) {
				this.input.removeClass("empty").val("")
			}
		}
		,inputBlur:function() {
			if(""==this.input.val()) {
				this.input.addClass("empty").val(this.config.emptyText)
			}
		}
		,triggerSelected:function() {
			if(!this.config.triggerSelected)return;
			var a=this;
			this.options.each(function() {
				if($(this).attr("selected")) {
					a.setComboValue($(this).text(),false,true)
				}
			}
			)
		}
		,autoFill:function() {
			if(!this.config.autoFill||($sc.KEY.BACKSPACE==this.lastKey)||this.multiple)return;
			var a=this.input.val();
			var b=this.getActive().text();
			this.input.val(b);
			this.selection(this.input.get(0),a.length,b.length)
		}
		,selection:function(a,b,d) {
			if(a.createTextRange) {
				var c=a.createTextRange();
				c.collapse(true);
				c.moveStart("character",b);
				c.moveEnd("character",d);
				c.select()
			} else if(a.setSelectionRange) {
				a.setSelectionRange(b,d)
			} else {
				if(a.selectionStart) {
					a.selectionStart=b;
					a.selectionEnd=d
				}
			}
		}
		,updateDrop:function() {
			if(this.config.dropUp)this.listWrapper.addClass("list-wrapper-up"); else this.listWrapper.removeClass("list-wrapper-up")
		}
		,setDropUp:function(a) {
			this.config.dropUp=a;
			this.updateDrop()
		}
		,notify:function(a) {
			if(!$j.isFunction(this.config[a+"Callback"]))return;
			this.config[a+"Callback"].call(this)
		}
	}
	);
	$sc.extend( {
		KEY: {
			UP:38,DOWN:40,DEL:46,TAB:9,RETURN:13,ESC:27,COMMA:188,PAGEUP:33,PAGEDOWN:34,BACKSPACE:8
		}
		,log:function(a) {
			var b=$("#log");
			b.html(b.html()+a+"<br />")
		}
		,createSelectbox:function(a) {
			var b=$("<select />").appendTo(a.container).attr( {
				name:a.name,id:a.id,size:"1"
			}
			);
			if(a.multiple)b.attr("multiple",true);
			var d=a.data;
			var c=false;
			for (var e=0,f=d.length;e<f;++e) {
				c=d[e].selected||false;
				$("<option />").appendTo(b).attr("value",d[e].value).text(d[e].text).attr("selected",c)
			}
			return b.get(0)
		}
		,create:function(b) {
			var d= {
				name:"",id:"",data:[],multiple:false,container:$(document),url:"",ajaxData: {
				}
			}
			;
			b=$.extend( {
			}
			,d,b|| {
			}
			);
			if(b.url) {
				return $.getJSON(b.url,b.ajaxData,function(a) {
					delete b.url;
					delete b.ajaxData;
					b.data=a;
					return $sc.create(b)
				}
				)
			}
			b.container=$(b.container);
			var c=$sc.createSelectbox(b);
			return new $sc(c,b)
		}
		,normalizeArray:function(a) {
			var b=[];
			for (var d=0,c=a.length;d<c;++d) {
				if(""==a[d])continue;
				b.push(a[d])
			}
			return b
		}
	}
	)
}
)(jQuery);