jQuery(function(){
	
	jQuery.fn.d_combobox= function(type,values){
		return this.each(function(){
			
			var curItems= new Array();
			var select=jQuery(this);
			if(!select.siblings().hasClass("d_combobox_input")){
				
			var container=jQuery("<div></div>").addClass("d_combobox_container");
			
			container.insertAfter(select);
			container.append(select);
			select.css("display","none");
			var classes=select.attr("class");
			var tmpclasses="";
			classes=classes.split(" ");
			for(var i=0;i<classes.length;i++){
			if(classes[i]=="combobox"){
			classes[i]="";	
			}else{
				classes[i]=classes[i]+"combo";
				tmpclasses+=classes[i];
			}
			}
			var displayContainer=jQuery("<span></span>").addClass("d_combobox_displayContainer").insertAfter(select);
			var input=jQuery("<input></input>").addClass(tmpclasses).removeClass("combobox").addClass("d_combobox_input").appendTo(displayContainer);
			var button=jQuery("<span></span>").addClass("d_combobox_button").insertAfter(input);
			var ulContainer= jQuery("<div></div>").addClass("d_combobox_ulContainer").insertAfter(button);
			var width=input.css("width").replace("px","")*1+button.css("width").replace("px","")*1;
			
			var itemDisplay= jQuery("<ul></ul>").addClass("d_combobox_itemDisplay").css("width",width+"px").appendTo(ulContainer);
			if(type==1){
				var wertspeicher=jQuery("<ul></ul>").addClass("d_combobox_wertspeicher").html(values).css("width",width+"px").appendTo(ulContainer);
				}
			var clear= jQuery("<div></div>").addClass("clear").insertAfter(ulContainer);
			
			}else{
				var input= select.siblings("d_combobox_input");
				var button=select.siblings("d_combobox_button");
				var itemDisplay = select.siblings("d_combobox_itemDisplay");
				if(type==1){
					var wertspeicher= select.siblings("d_combobox_wertspeicher");
				}
			}
			itemDisplay.hide();
			refresh();
			if(wertspeicher!=null){
			wertspeicher.blur(function(){
				initWertSpeicher();
			});
			}
			button.click(function(event){	
				select.trigger("d_combobox_open",select);
				if(itemDisplay.css("display")=="none") {
					switchDisplaySpeicher();
				}else{
					switchDisplaySpeicher();
				}
				refresh();			
			});
			
			function refresh(){
				itemDisplay.html("");
				curItems=[];
				select.children("option").each(function(){
					var html=jQuery(this).html();
					curItems.push(html)
					var item=jQuery("<li>"+html+"</li>").addClass("d_combobox_item");
					itemDisplay.append(item);
					
					item.click(function(){
						if(type==1){
						input.val("");
						wertVorhanden();
						itemDisplay.children(".d_combobox_active").css("height","0px");
						
						}else{
							input.val(jQuery(this).html());
							select.children("option").each(function(){
								
							if(jQuery.trim(jQuery(this).val())==jQuery.trim(input.val())){
							jQuery(this).attr("selected","selected");
							}else{
								jQuery(this).removeAttr("selected");	
							}
							});
						}
						select.trigger("d_combobox_recieve",select);
						switchDisplaySpeicher();
						input.blur();
					});
					item.mouseover(function(){
						var i=jQuery(this)
						if(i.siblings('.d_combobox_active').size()>0){
							i.siblings().removeClass("d_combobox_active");
						}						
						i.addClass("d_combobox_active");
						});
					item.mouseout(function(){
						var i=jQuery(this)
						setTimeout(function(){;if(i.siblings('.d_combobox_active').size()>0){i.removeClass('d_combobox_active');}else{}},100)
						
						});
					});	
			}
			function search(val,type){
				
			itemDisplay.show();
			if(type!=2){
			itemDisplay.show();
			if(wertspeicher!= null && wertspeicher != undefined){
				wertspeicher.toggle();
				}
			}
				var found=new Array();
				var items = new Array();
				
				itemDisplay.children(".d_combobox_active").removeClass("d_combobox_active");			
				itemDisplay.children("li").each(function(){
					items.push(jQuery(this));
				});
				for (var i = 0; i < items.length; i++){
				if(curItems[i].toLowerCase().indexOf(val.toLowerCase())==-1){
					items[i].hide();
				}else{
					found.push(items[i]);
					items[i].show();
				}
				}	
				return found;
			}
			function wertVorhanden(){
				var eq=0;
				wertspeicher.children("li").children(".d_combobox_value").each(function(){
				if(jQuery(this).html()==itemDisplay.children(".d_combobox_active").html()){
					eq=1;
					return;
				}
				});
				if(eq==0 && itemDisplay.children(".d_combobox_active").html()!=null){
					var wert = jQuery("<li onmouseover='deldisplay(this)' onmouseout='delhide(this)'></li>");
					var wertvalue=jQuery("<span>"+itemDisplay.children(".d_combobox_active").html()+"</span>").addClass("d_combobox_value");
					var wertdelete=jQuery("<span></span>").addClass("d_combobox_delete");
					wertdelete.click(function(){
						var del=jQuery(this);
						itemDisplay.children().each(function(){
						if(jQuery(this).html()==del.siblings(".d_combobox_value").html()){
							jQuery(this).css("height","");
						}
						});						
						del.parent("li").remove();
						select.trigger("d_combobox_delete",select);
					});
					wert.append(wertvalue).append(wertdelete);
					wertspeicher.append(wert);							
				}	
			}
			
			function initWertSpeicher(){
				wertspeicher.children("li").children(".d_combobox_delete").each(function(){
					jQuery(this).click(function(){
						var del=jQuery(this);
						itemDisplay.children().each(function(){
						if(jQuery(this).html()==del.siblings(".d_combobox_value").html()){
							jQuery(this).css("height","");
						}
						});						
						del.parent("li").remove();
						select.trigger("d_combobox_delete",select);
					});
				});
				
			}
			function switchDisplaySpeicher(){

				itemDisplay.toggle();
				if(wertspeicher!= null && wertspeicher != undefined){
					wertspeicher.toggle();
					}
			}
					
			input.keyup(function(event){
			
				var cur=itemDisplay.children(".d_combobox_active");
				if(event.keyCode == '27') {
					input.val("");
					return
					}
				
				var res=search(this.value);
				if(res.length>0){
					jQuery(this).css("background","");
				}else{
					jQuery(this).css("background","red");
					return
				}
				if(cur.length<1){
					res[0].addClass("d_combobox_active");
				}
				if(event.keyCode == '13'){
					if(type==1){
					wertVorhanden();
					}else{
						
						input.val(cur.html());
					}
					cur.removeClass("d_combobox_active");			
					switchDisplaySpeicher();
					input.blur();
					return
				}
				if(event.keyCode == '40'){					
					for(var i=0; i<res.length;i++){
					if(cur.html()==res[i].html()){
						res[i+1].addClass("d_combobox_active");
						res[i].removeClass("d_combobox_active");
					}
				}
				}
				if(event.keyCode == '38'){					
					for(var i=0; i<res.length;i++){
					if(cur.html()==res[i].html()){
						if(i>0){
						res[i-1].addClass("d_combobox_active");
						res[i].removeClass("d_combobox_active");
						}
					}
				}
				}
				
			});
			
			refresh();
		});
	}
	
	
	
});

