Suggest = Class.create();
Suggest.prototype = {
	initialize: function(input, source) {
		this.input = $('sfText');
		// Musste tx_wecstaffdirectory_pi1[searchFulltext] durch sfText ersetzen! PW
		$('sfText').setAttribute('autocomplete', 'off');
		// Musste tx_wecstaffdirectory_pi1[searchFulltext] durch sfText ersetzen! PW
		this.source = source || [];
		this.values_size=this.source.size()-1;
		this.key_selected=-1;
		this.curr_value='';
		this.values=[];
		this.values_ids=[];
		var container = new Element("ul", {});
		//this.MBIframe = new Element("iframe", { id: "MB_overlay_frame", opacity: "0", src:"about:blank", scrolling:"no", frameborder:"0", style:"width: 200px; height: 100px; border: none; visibility: visible; display: block; filter:Alpha(opacity=0, finishopacity=0, style=1)"});
		container.id = (this.input.id || 'suggest_') + parseInt(Math.random() * 1000000);
		container.style.display = "none";
		document.body.appendChild(container);
		this.container = $(container.id);
		this.container.addClassName('suggest');
		this.init();
		this.input.observe('focus', this.suggest.bindAsEventListener(this)).observe('keyup', this.suggest.bindAsEventListener(this));
//		$(this.input.form).observe('submit', function(e){Event.stop(e);return false;});
//			this.input.observe('focus', this.suggest.bindAsEventListener(this)).observe('keypress', this.suggest.bindAsEventListener(this));
		document.observe('click', this.hide.bindAsEventListener(this))
		},
	adjust : function(){
			this.curr_value=this.input.value;
			this.key_selected=this.source.indexOf(this.curr_value);
			if(this.key_selected!=-1)
			{
				var next_element=$(''+this.key_selected);
				if(this.container.scrollTop>=(next_element.positionedOffset().top+next_element.getHeight()))
					$(this.container.id).scrollTop -= next_element.positionedOffset().top;
				if((this.container.getHeight()+this.container.scrollTop)<=next_element.positionedOffset().top)
					this.container.scrollTop += next_element.positionedOffset().top;
					$(''+this.key_selected).down('A').addClassName('hover');
			}
		},
	suggest : function(e) {

/*		if($$('ul.suggest'))
			$$('ul.suggest').invoke('hide');*/

		if(e.keyCode==27){//Esc
			this.container.hide();
			this.input.value=this.curr_value;
			this.input.blur();
			Event.stop(e);
			return true;
		}
		if(e.keyCode==38){//up
			this.container.show();
			if(this.key_selected!=-1)
			{
				$(this.values_ids[this.key_selected]).down('A').removeClassName('hover');
				$(this.values_ids[this.key_selected]).down('A').innerHTML=$(this.values_ids[this.key_selected]).getAttribute('rel');
				this.key_selected--;
				if(this.key_selected!=-1)
				{
					var next_element=$(this.values_ids[this.key_selected]);
					if(this.container.scrollTop>=(next_element.positionedOffset().top+next_element.getHeight()))
						$(this.container.id).scrollTop -= next_element.getHeight();
					$(this.values_ids[this.key_selected]).down('A').addClassName('hover');
					this.input.value = this.values[this.values_ids[this.key_selected]].stripTags();					
				}
			}
			Event.stop(e);
			return;
		}
		if(e.keyCode==40){//down
			this.container.show();
			if(this.key_selected!=this.values_size)
			{
				if(this.key_selected!=-1 && this.values_ids.size())
				{
					$(this.values_ids[this.key_selected]).down('A').removeClassName('hover');
					$(this.values_ids[this.key_selected]).down('A').innerHTML=$(this.values_ids[this.key_selected]).getAttribute('rel');
				}
				this.key_selected++;
				var next_element=$(this.values_ids[this.key_selected]);
				this.input.value = this.values[this.values_ids[this.key_selected]].stripTags();
				if((this.container.getHeight()+this.container.scrollTop)<=next_element.positionedOffset().top)
					this.container.scrollTop += next_element.getHeight();
				$(this.values_ids[this.key_selected]).down('A').addClassName('hover');
			}
			Event.stop(e);
			return;
		}
		if(e.keyCode==13){//Enter
			if(this.key_selected!=-1 && this.values_ids.size())
			{
				this.input.value = this.values[this.values_ids[this.key_selected]].stripTags();
				var val=this.input.value;
				this.key_selected=-1;
			}
			this.input.blur();
			this.container.hide();
			$($$('#'+this.container.id+' li')).each(function(elem){
				$(elem).down('A').innerHTML = elem.getAttribute('rel');
			});
			if (Prototype.Browser.IE)
				this.input.form.submit();
		//	Event.stop(e);
			return;
		}
		if(e.keyCode!=38 && e.keyCode!=40 && e.keyCode!=13 && this.key_selected!=-1)
		{
			this.key_selected=-1;
		}
		var el = Event.element(e);
		if (el)
		{
			var search = el.value.toLowerCase();
			//search=search.replace('ue','ü');
			//search=search.replace('oe','ö');
			//abteilung search=search.replace('ae','ä');
		//	if (search)
			{
				this.values.clear();
				this.values_ids.clear();
				var cp=this;
				var iid=0;
				if (search == 'name')
					search = '';
				if(search!='')
				{
					var has_empty_value = false;
					$A($(this.container.id).getElementsByTagName('li')).each(function(elem){
						elem = $(elem);
						if(elem.title==cp.no_value)
						{
							has_empty_value = true;
							elem.show();
							cp.values[elem.getAttribute('id')]=elem.getAttribute('rel');
							cp.values_ids[iid]=elem.getAttribute('id');
							iid++;
						}else if((elem.title.indexOf(search)!=-1/*==0*/ && elem.title!=search))
						{
//							elem.down('A').innerHTML = elem.getAttribute('rel').replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + search.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<b style=\"color:#fff;background-color: #009;\">$1</b>");
							elem.show();
							cp.values[elem.getAttribute('id')]=elem.getAttribute('rel');
							cp.values_ids[iid]=elem.getAttribute('id');
							iid++;
						}else if(elem.title==search)
						{
							elem.down('A').addClassName('hover');
							iid++;
						}else{
							elem.hide();
						}
					});
				}else{
					$A($$('#'+this.container.id+' li')).each(function(elem){
						elem = $(elem);
						elem.down('A').innerHTML = elem.getAttribute('rel');
						elem.show();
						cp.values[elem.getAttribute('id')]=elem.getAttribute('rel');
						cp.values_ids[iid]=elem.getAttribute('id');
						iid++;
					});
					this.input.select();
					Event.stop(e);
				}
				this.values_size=this.values_ids.size()-1;
				var container = this.container;
				var dim = Position.cumulativeOffset(el);
				this.container.setStyle( {top : dim.top + el.getHeight() + 'px', left : dim.left + 'px', width: el.getWidth() + 'px'})	
				this.container.show();
				this.adjust();
			}
		}
	},
	paste : function(e) {
		this.input.value = Event.element(e).innerHTML.stripTags();
		this.container.hide();
		Event.stop(e);
	},
	hide : function(e)
	{
		var el = Event.findElement(e, 'UL');
		if (el != this.container)
		{
			el = Event.findElement(e, 'INPUT');
			if (el != this.input)
				this.container.hide();
		}
	},
	init: function(){
			var inputCpy=this.input;
			var source=[];
			var i=0;

			this.container.innerHTML = "";
			var cp=this;
			
			var container = this.container;
			var iid=0;
			this.source.each(function(name) {
						if (Prototype.Browser.IE)
							var html = "<li id=\""+iid+"\" title=\""+name.toLowerCase()+"\" rel=\""+name+"\"><a href=\"\" onclick=\"Suggest.iepaste(this, '" + container.id +"', '"+inputCpy.id+"'); return false;\">"+name+"</a></li>"; 
						else
							var html = "<li id=\""+iid+"\" title=\""+name.toLowerCase()+"\" rel=\""+name+"\"><a href=\"\">"+name+"</a></li>"; 
						container.insert(html);
						cp.values_ids[iid]=name;
						iid++;
					});
			if (!Prototype.Browser.IE)
				$A(this.container.getElementsByTagName('A')).invoke('observe', 'click', this.paste.bindAsEventListener(this));
			///////////////
	}
}
// Static Fix for IE
Suggest.iepaste = function(el, container, input)  {
	$(input).value = $(el).innerHTML.stripTags();
	$(container).hide();
}

