//combo - box
//14 .7.1999
//Harald Radi
//
//Diese Zeile einfügen
//
//<select name="list" onChange="CBchange(this)" onKeyDown="CBpressed(this)" onFocus="CBfocused(timeout)" onBlur="window.clearInterval(CBtimer)">
//
// timeout ... timeout in ms bis der suchstring wieder gelöscht wird
//
// !! WICHTIG: die Einträge in der Listbox müssen sortiert sein.
//______________________________________________________________________


var CBtimer, CBstrlen=0, CBindex=0;
var CBlock=1;
var CBin_time = 0;
var CBsuch_string = "";


function CBremoveuml(string)
{
	// umlaute durch vokale und 'ß' durch 'SS' ersetzen
	string = string.replace(/Ä/g,"A");
	string = string.replace(/Ö/g,"O");
	string = string.replace(/Ü/g,"U");
	string = string.replace(/ß/g,"SS");
	return string;
}
//CBremoveuml()




function CBclearBuffer()
{
	// suchbuffer löschen, wenn [timeout] ms vergangen sind
	if(!CBin_time)
	{
		CBsuch_string="";
		i=0;
		CBstrlen=0;
		CBlock = 1;
	}
	CBin_time=0;
}
// CBclearBuffer()



function CBpressed( list )
{
	//bei tastendruck
	
	CBlock = 1;
	CBin_time = 1;
	CBindex = 0;
	CBstrlen++;
	depth = 0;
	error = 0;
	topitem = 0;
	bottomitem = list.length - 1;
	i = Math.floor( ( topitem + bottomitem ) / 2 );
		
	keycode = window.event.keyCode;

	switch(keycode)
	{
		case 13:
			if(list.form)
				list.form.submit();
				// wenn enter, dann formular abschicken
			break;
		case 32:
			keycode = 65;
			key = " ";
			break;
		case 186:
			keycode = 85;
			key = "U";
			break;
		case 188:
			keycode = 65;
			key = ",";
			break;
		case 189:
			keycode = 65;
			key = "-";
			break;
		case 190:
			keycode = 65;
			key = ".";
			break;
		case 191:
			keycode = 65;
			key = "#";
			break;
		case 192:
			keycode = 79;
			key = "O";
			break;
		case 219:
			keycode = 83;
			key = "SS";
			CBstrlen++;
			break;
		case 222:
			keycode = 65;
			key = "A";
			break;
		default:
			key = String.fromCharCode(keycode);
		// sonderzeichen und umlaute konvertieren
	}
	
	if(( keycode > 64 ) && ( keycode < 91 ))
	{
		// wenn ein gültiger buchstabe eingegeben wurde
		CBsuch_string += key;
		var searching = 1;
		while(searching)
		{
			// solange kein gültiger eintrag gefunden ist
			if( CBremoveuml(list.options[i].text.substring( 0, CBstrlen ).toUpperCase()) == CBsuch_string )
			{
				// wenn der aktuelle listeneintrag mit dem suchstring übereinstimmt,
				// wird in der liste solange nach oben gegangen, bis der erste eintrag, der mit dem
				// suchstring übereinstimmt, gefunden ist
				depth = 0;
				while ( searching && (i > 0))
					if( CBremoveuml(list.options[i - 1].text.substring( 0, CBstrlen ).toUpperCase()) == CBsuch_string )
						i--;
					else
						searching = 0;
						// suche abbrechen
				searching = 0;
			}
			else
			{
				// suchstring stimmt nicht mit dem aktuellen listeneintrag überein
				difference = 0;
				while(!difference)
				{
					char = CBremoveuml(list.options[i].text.toUpperCase()).charAt(depth);

					if( char == CBsuch_string.charAt( depth ))
					{
							// wenn alle buchstaben bis zur tiefe [depth] übereinstimmen
							// suchtiefe erhöhen
							depth++;
							if (depth >= CBstrlen)
								// wenn die suchtiefe die länge des suchstrings überschreitet ist
								// ein gültiger eintrag gefunden
								difference = 1;
					}
					else
					{
						if( char < CBsuch_string.charAt( depth ) )
						{
							// wenn der suchstring grösser als der listeneintrag ist,
							// so muss der gültige eintrag unterhalb des aktuellen listenelements
							// liegen -> liste wird halbiert
							difference = 1;
							topitem = i + 1;
						}
						else
						{
							// wenn der suchstring kleiner als der listeneintrag ist,
							// so muss der gültige eintrag oberhalb des aktuellen listenelements
							// liegen -> liste wird halbiert
							difference = 1;
							bottomitem = i - 1;
						}
						depth=0;

						i = Math.floor( ( topitem + bottomitem ) / 2 );
						// aktueller listeneintrag liegt in der mitte der neuen liste
						// vorgang wird so lange wiederholt, bis ein treffer erfolgt
						// oder die suchliste keine einträge mehr hat (wenn sie so oft halbiert wurde)
					}
				}
			}
			if (bottomitem < topitem)
			{
				// wenn die suchliste keine einträge mehr hat
				// wird die suche abgebrochen
				// ausgewählt ist der näheste eintrag
				CBindex = i;
				searching = 0;
			}
		}
		CBlock = 0;
		CBchange(list);
		// richtigen listeneintrag setzen
		CBlock = 0;
	}
}
//CBpressed()

function CBchange( list )
{
	// richtigen listeneintrag setzen
	if(!CBlock)
	{
		if(i < 0)
			CBindex = 0;
		else
			if (i >= list.length)
				CBindex = list.length - 1;
			else
				CBindex = i;
		list.options[CBindex].selected = true;
		CBlock = 1;
	}
}
//CBchange()



function CBfocused(timeout)
{
	// bei fokuserhalt wird der timer und der suchstring zurückgesetzt
	CBsuch_string = "";
	CBtimer = window.setInterval("CBclearBuffer()",timeout);
}
// CBfocused()
