function _initCombobox(input, opt){
	input = $(input);
	var my = this;
	my.opt = opt || {}

	var selected = null;
	var marked = null;
	var lastValue = null;

	my.datalist = $(input.getAttribute('list')) || new Element('div');
	my.datalist.hide().addClass('options');
	my.datalist.addEvent('mousedown',function(e){
		e.target.unselectable='on'; e.stop();
	})
	var cont = 		new Element('span').setStyles({position: 'relative', display: 'inline-block'});
	var hidden = 	new Element('input', {type:'hidden',name:input.name});
	input.name = '';
	input.setAttribute('autocomplete','off');
	input.getV = function(){ return hidden.value; }
	input.setValue = function(v){ hidden.value = v; input.value = v; }

	cont		.inject(input, 'before');
	input		.inject(cont,'inside');
	my.datalist	.inject(input,'after');
	hidden		.inject(input,'after');

	my.searchOption = function(){
		my.init();
		var inputValue = input.value.toLowerCase();
		var hasOne = 0;
		my.datalist.getChildren().each(function(el){
			if(hasOne){return;}
			if( el.getText().toLowerCase().slice( 0,inputValue.length ) == inputValue ){
				mark(el);
				new Fx.Scroll(my.datalist).toElement(el.getPrevious() || el).start();
				hasOne = 1;
			}
		});
	}.wait(300);
	
	var select = function(el){
		mark(el);
		selected = el;
		input.value = el.getText();
		hidden.value = el.get('value');
	}
	var mark = function(el){
		marked && marked.removeClass('selected');
		marked = el;
		el.addClass('selected');
	}
	var hide = function(){ my.datalist.hide(); }
	var show = function(){ my.datalist.show(); }

	my.init = function(){
		my.datalist.setStyle('top',input.offsetHeight);
		if(!my.datalist.getFirst()){ hidden.value = input.value; return; }
		mark( my.datalist.getFirst() );
		my.datalist.getChildren().each(initOpt);

		var optH = Math.max(my.datalist.getFirst().offsetHeight, 10);
		var height = (400/optH).toInt()*optH;
		my.datalist.style.maxHeight = height+'px';
		my.datalist.style.minWidth = cont.offsetWidth+'px'; // input.offsetWidth geht bei opera nicht 

		if(my.datalist.getScrollSize().x > my.datalist.clientWidth+10 ){
			my.datalist.style.width = my.datalist.offsetWidth+16+'px';
		}

		if(Browser.Engine.trident4){
			my.datalist.style.height = '400px';
			if(my.datalist.offsetWidth < input.offsetWidth){
				my.datalist.style.width = input.offsetWidth+'px';
			}
		}
	}
	var initOpt = function(el){
		if(el.combobox_initialized){return;}
		el.combobox_initialized = 1;
		el.set({events:{
					mouseover	: function(){ mark(el); },
					click		: function(){ select(el); input.onchange && input.onchange(); }
				}
		}).addClass('option');
		el.getText =  function(){ return el.hasAttribute('text') ? el.getAttribute('text') : el.get('html').stripTags().clean(); }
		//el.getValue = function(){ return el.hasAttribute('value') ? el.getAttribute('value') : el.getText(); } // zzz nicht gebraucht?
	}
	var keydown = function(e){
		if(			e.key === 'down'	){ marked.getNext() 	&& select( marked.getNext() ) }
		else if(	e.key === 'up'		){ marked.getPrevious() && select( marked.getPrevious() ) }
	}
	var keyup = function(e){
		switch (e.key) {
			case 'down': case 'up': return;
			case 'enter': 
				my.opt.force && select(marked); //zzz eher nicht
//				select(marked);
				hide();
				input.onchange && input.onchange(); 
				return;
			case 'esc':
				hide(); 
				return;
		}
		if(input.value !== lastValue){
			!my.opt.force && (hidden.value = input.value);
			lastValue = input.value;
			my.searchOption();
		}
	}
	var focus = function(){
		my.init();
		show();
		input.select(); 
		lastValue = input.value;
	}
	var beforeBlur = function(){
		hide.delay(200);
		my.opt.force && selected && select(selected);
//		hide(1);
	}
	input.set({
		events:{
			focus		: focus,
			keydown		: keydown,
			keyup		: keyup,
			beforeBlur	: beforeBlur
		}
	})
	my.init();
	var first = my.datalist.getElement('.selected') || my.datalist.getFirst();
	first && select( first );
}

