function SuggestClass ()
{
	var xmlhttpObject = null;
	var RequestURL = "";
	var ac_div = null;
	var ReturnData;
	var SelectedPosition = - 1;
	var LastSelectedPosition = - 1;
	var myForm;
	var myDoc;
	var myField;
	var WordsArray;
	var mySubmit;
	var enabled = false;
	var show_sugg = false;
	var rtimer;
	var requestdelay = 300;
	var nextrequest = true;
	var posY =  "0";
	var posX =  "0";
	this.setPos = _setPos;
	this.initialize = init;
	this.mkrq = makerequest;
	
	function _setPos(y,x)
	{
	    posY = y;
	    posX = x;
	}
	function init (inst, z,sform, suggestfield, rurl, sbmt)
	{
		if(suggestfield)
		{
		    myForm = sform;
		    myDoc = document;
		    myField = suggestfield;
		    RequestURL = rurl;
		    mySubmit = sbmt;
		    classinastancename = inst;
		    clearDebug ()
		    //adddebug ("init")
		    ac_div = myDoc.createElement ("DIV");
		    with(ac_div)
		    {
		    id = myField.name + "completeDiv";
		    style.borderRight = "black 1px solid";
		    style.borderLeft = "black 1px solid";
		    style.borderTop = "black 1px solid";
		    style.borderBottom = "black 1px solid";
		    style.zIndex = z;
		    style.paddingRight = "0px";
		    style.paddingLeft = "0px";
		    style.paddingTop = "0px";
		    style.paddingBottom = "0px";
		    style.left = 0
		    style.top = 0
		    //style.width = width + "px";
		    //style.height = "200px"
		    setposition(); //position errechnen
		    style.visibility = "hidden";
		    style.position = "absolute";
		    style.backgroundColor = "white";
		    }
		    myDoc.body.appendChild (ac_div);
		    window.onresize = setposition;
		    myDoc.onkeyup = RefreshSuggest;
		    myField.onblur = function ()
		    {
			    enabled = false;
			    hide_suggest ();
		    }
		    myField.onfocus = function ()
		    {
			    //adddebug ("focus")
			    enabled = true;
		    }
		}
	}
	function setposition()
	{
	    if(posX != "0")
	    {
	    ac_div.style.top = posY + "px";
	    ac_div.style.left = posX + "px";
	    ac_div.style.width = myField.offsetWidth - 2 + "px" 	    
	    }
	    else
	    {
	    myField.style.position = "absolute"
	    ac_div.style.top = myField.offsetTop + myField.offsetHeight + "px"
	    ac_div.style.left = myField.offsetLeft + "px"
	    ac_div.style.width = myField.offsetWidth - 2 + "px" 
	    myField.style.position = "relative"
	    }   
	}
	function hide_suggest ()
	{
		show_sugg = false;
		ac_div.style.visibility = "hidden";
	}
	function show_suggest ()
	{
		if (enabled == true)
		{
			show_sugg = true;
			ac_div.style.visibility = "visible";
		}
	}
	function getRequestURL ()
	{
		var query = myField.value;
		return RequestURL + encodeURI (query);
	}
	function RefreshSuggest (e)
	{
		if (enabled)
		{
			
			var keycode;
			if (window.event) keycode = window.event.keyCode;
			else if (e)
			keycode = e.which;
			//adddebug (keycode)
			if (keycode != 38 && keycode != 40 && keycode != 13 && keycode != 16 && keycode != 17 && keycode != 18 && keycode != 37 && keycode != 39 )
			{
				SelectedPosition = - 1;
				var query = myField.value;
				searchposition (myField.value);
				nextrequest = false;
				clearTimeout (this.rtimer);
				this.rtimer = setTimeout (classinastancename + ".mkrq()", requestdelay);
			}
			if (keycode == 40 && SelectedPosition < (WordsArray.length - 2))
			{
				SelectedPosition ++;
				hilight ();
				myField.value = myDoc.getElementById (myField.name + "ac_word" + SelectedPosition).innerHTML;			
			}
			if (keycode == 38 && SelectedPosition > -1 )
			{
				SelectedPosition --;
				hilight ();
				myField.value = myDoc.getElementById (myField.name + "ac_word" + SelectedPosition).innerHTML;
			}
			if (keycode == 13)
			{
				if(SelectedPosition > -1)
				{
				    fill_myFieldandSubmit ();
				}
				else
				{
				    adddebug("submit js");
				    myForm.submit ();
				}
			}
			if (keycode == 9)
			{
				fill_myField ();
			}
		}
	}
	function searchposition (searchtext)
	{
		if (WordsArray != null)
		{
			var i;
			for (i = 0; i < WordsArray.length - 1; i ++)
			{
				if (searchtext == myDoc.getElementById (myField.name + "ac_word" + i).innerHTML.substring (0, searchtext.length).toLowerCase ())
				{
					SelectedPosition = i;
					break;
				}
			}
			//adddebug ("serach" + searchtext);
			hilight ();
		}
	}
	function hilight ()
	{
		var i;
		for (i = 0; i < WordsArray.length - 1; i ++)
		{
			if (i == SelectedPosition)
			{
				myDoc.getElementById (myField.name + "ac_word" + i).style.backgroundColor = "#08246B";
				myDoc.getElementById (myField.name + "ac_word" + i).style.color = "#FFFFFF";
			} 
			else
			{
				myDoc.getElementById (myField.name + "ac_word" + i).style.backgroundColor = "#FFFFFF";
				myDoc.getElementById (myField.name + "ac_word" + i).style.color = "#000000";
			}
		}
	}
	function fill_myField ()
	{
		if (myDoc.getElementById (myField.name + "ac_word" + SelectedPosition) != null)
		{
			myField.value = myDoc.getElementById (myField.name + "ac_word" + SelectedPosition).innerHTML;
			//mySubmit.focus ();
		}
	}
	function fill_myFieldandSubmit ()
	{
		if (myDoc.getElementById (myField.name + "ac_word" + SelectedPosition) != null)
		{
			myField.value = myDoc.getElementById (myField.name + "ac_word" + SelectedPosition).innerHTML;
			myForm.submit ();
		}
	}
	function fill_ac_div (data)
	{
		if (data == "---")
		{
			hide_suggest ();
			ac_div.innerHTML = "";
		} 
		else
		{
			show_suggest ();
		}
		ac_div.innerHTML = "";
		WordsArray = data.split ("|");
		for (var i = 0; i < WordsArray.length - 1; i ++)
		{
			var ac_word;
			ac_word = myDoc.createElement ("DIV");
			ac_word.id = myField.name + "ac_word" + i;
			ac_word.name = i;
			ac_word.style.fontFamily = "arial,sans-serif";
			ac_word.style.fontSize = "11px";
			ac_word.style.paddingLeft = "3px";
			ac_word.style.paddingRight = "3px";
			ac_word.style.height = "14px";
			ac_word.style.overflow = "hidden";
			ac_word.style.cursor = "pointer";
			ac_word.onmouseover = ac_word_over;
			ac_word.onmousedown = fill_myFieldandSubmit;
			//ac_word.onmouseup = fill_myField
			ac_word.innerHTML = WordsArray [i];
			ac_div.appendChild (ac_word);
		}
		SelectedPosition = -1;
		hilight ();	
	}
	function ac_word_over ()
	{
		SelectedPosition = this.name;
		hilight ();
	}
	function CreateXmlHttpObject ()
	{
		var xmlhttp = null;
		try
		{
			xmlhttp = new ActiveXObject ("Msxml2.XMLHTTP");
		}
		catch (e)
		{
			try
			{
				xmlhttp = new ActiveXObject ("Microsoft.XMLHTTP");
			}
			catch (sc)
			{
				xmlhttp = null;
			}
		}
		if ( ! xmlhttp && typeof XMLHttpRequest != "undefined")
		{
			xmlhttp = new XMLHttpRequest ();
		}
		return xmlhttp;
	}
	function makerequest ()
	{
		//adddebug ("mqr: " + myField.value)
		if (xmlhttpObject && xmlhttpObject.readyState != 0)
		{
			xmlhttpObject.abort ();
		}
		xmlhttpObject = CreateXmlHttpObject ();
		if (xmlhttpObject)
		{
			xmlhttpObject.open ("GET", getRequestURL () , true);
			xmlhttpObject.onreadystatechange = function ()
			{
				if (xmlhttpObject.readyState == 4 && xmlhttpObject.responseText)
				{
					fill_ac_div (xmlhttpObject.responseText);
				}
			};
			xmlhttpObject.send (null)
		}
	}
	function adddebug (instr)
	{
		if (myDoc.getElementById ("debugf"))
		{
		myDoc.getElementById ("debugf").value = instr + "\n" + myDoc.getElementById ("debugf").value;
		}
	}
    function clearDebug ()
	{
		if (myDoc.getElementById ("debugf"))
		{
		myDoc.getElementById ("debugf").value = "";
		}
	}
}
