//*************************
//*** Globale Variablen ***
//*************************

//Useragent ist Internet Explorer
var is_gecko = /gecko/i.test(navigator.userAgent);

//Useragent ist Mozilla
var is_ie    = /MSIE/.test(navigator.userAgent);

//Useragent ist Opera
var is_opera    = /Opera/.test(navigator.userAgent);

//Startposition der Auswahl
var startPos = 0;

//Endposition der Auswahl
var endPos = 0;

//Cursorposition - X
var cursorX = 0;

//Cursorposition - Y
var cursorY = 0;

//Kontext
var context ="";

//Zeilenumrüche im IE
var ieBreaks = 0;

//Keycode Buchstaben für Gecko
var geckoKey = 0;

//Status Alttaste für Gecko
var geckoAlt = 0;

//Status der Vorschlagseinfügung
var updateActive = false;

//Hintergrundfarbe der Textarea Elemente
var lastColor;

var lastfColor; 

//Mausposition über Vorhersagen?
var propSelection = false;

//Handle der aktiven Textarea
var currentArea = null;

//Debugging - Status
var _DEBUG = true;

//Bewegung der Vorschläge im IE am Caret?
var AT_CARET = false;

//Anzeige der AJAX XML - Daten
var SHOW_XML = false;

var numberOfPredicts = 10;

var langOfPredicts = "de";

var maxPredictLength = 16;

var minPredictLength = 3;

var sortingOfPredicts = "Value";


//Debugging - Definition von Variablen
//für Ausgabe in der Browser-Statuszeile
if (_DEBUG)
{
	var test1 = 0;
	var test2 = 0;
	var test3 = 0;
	var test4 = 0;
	var test5 = 0;
	var test6 = 0;
	var test7 = 0;
	var test8 = 0;
	var test9 = 0;
	var test10 = 0;
}

//****************************
//*** Globale Eventhandler ***
//****************************

//Registrierung des Eventhandlers
//für Tastendrücke
if (is_gecko || is_opera)
{
  	document.onkeydown = geckoSaveEvents;
};

//************************
//*** Helperfunktionen ***
//************************

//Entfernung von Leerzeichen
//vor Satzendezeichen
function smartPunctuation(myField)
{
  	//Speicherung des alten Status
  	selStart = startPos;
  	selEnd = endPos;
  	oldLength = myField.value.length;

  	//Bereinigen der Benutzereingaben
	myField.value = myField.value.replace(/ ([",.;!?:] )/, "$1");
	myField.value = myField.value.replace(/ ([",.;!?:]\n)/, "$1");
	myField.value = myField.value.replace(/ ([",.;!?:]\r\n)/, "$1");

	newLength = myField.value.length;

	deleted = oldLength - newLength;

	selStart = selStart - deleted;
	selEnd = selEnd - deleted;

	
	if(is_gecko)
	{
		//Berechnung der bereinigten Werte für
		//Beginn und Ende der Markierung
		var myBegin = myField.value.substring(0, startPos);
		
		//Anzahl der vorhandenen Zeilenumbrüche.
		var zeilenumbruch = myBegin.split("\n").length ;

		var sichtbareZeilen = myField.rows+1;
		var sichtbareSpalten = myField.cols+2;
		
		//Die Höhe einer Zeile der Textarea ermitteln
		var zeilenhoehe = myField.clientHeight/sichtbareZeilen;

		zeilenhoehe = Math.round(zeilenhoehe);
		
		//Ermitteln der Anzahl der Zeilenumbrüche
		var textSplit = myBegin.split("\n");
		var splitLength = textSplit.length;

		var zeilenDrauf = 0;
		var reste = 0;

		// Ermitteln der Umbrüche, die nicht durch Zeilenumbrüche hervorgerufen werden.
		for(var i = 0 ; i < splitLength ;  i++ )
		{
			var tempText = textSplit[i];
			var tempTextLaenge = tempText.length;
			var gesamt = tempTextLaenge / sichtbareSpalten;
			var abgerundet = Math.floor(gesamt);
			zeilenDrauf += abgerundet;			
			var nachkomma = gesamt - abgerundet;
			reste += nachkomma;
		}		
		zeilenDrauf += Math.round(reste);
		
		//Gesamtzahl der Zeilen bis zur aktuellen Zeile + Offset
		var zeilenAnzahl = splitLength + zeilenDrauf + 1;
		var scrollHoehe = myField.scrollHeight;	
		var diffe = scrollHoehe - ((zeilenAnzahl - sichtbareZeilen) * zeilenhoehe);

		//Positionierung des Textfeldes
		myField.scrollTop = scrollHoehe - diffe;
	}
	//Update der Cursorposition

	setSelectionRange(myField, selStart, selEnd)
	getSelectionStart(myField);
	getSelectionEnd(myField);

	//Fokussierung der textarea
	myField.focus();
};

//Berechnung des letzten Leerzeichens
function getBlankPos(text)
{
	blank1 = text.lastIndexOf(" ") + 1;
	blank2 = text.lastIndexOf("\n") + 1;
	blank = (blank1 > blank2)?blank1:blank2;

  	return blank;
};

//Berechnung der Anzahl vorhandener
//Zeilenumbrüche im IE
//- Zeilenumbrüche werden im IE als 2
//  Zeichen behandelt
function getIEBreaks (value, length)
{
	var charCode = 0;
	var ieBreaks = 0;

	for (i = 0; i < length; i++)
	{
		charCode = value.charCodeAt(i);

		if (charCode == 13)
		{
		  	ieBreaks++;
			length++;
		}
	}

	return ieBreaks;
};

//Handling bei Eintritt des Mauscursors
//in Bereich eines Vorschlaglinks
function mouseOver(e)
{
	//Status für Maus über Vorschlag setzen
  	propSelection = true;
};

//Handling bei Austritt des Mauscursors
//in Bereich eines Vorschlaglinks
function mouseOut(e)
{
 	//Status für Maus über Vorschlag setzen
	propSelection = false;
};

//Berechnung der Eigenschaften des letzten
//Tastendruck für Gecko
function geckoSaveEvents(e)
{
  	var evt = e || window.event;

	//Setzen der Stati für letzten Tastendruck
 	geckoKey  = evt.which;
	geckoAlt  = evt.altKey;
}

//***************************************************
//*** Funktionen zur Bestimmung der Caretposition ***
//***************************************************

//Laden der Vorhersagefunktionen
function askit_init()
{
  	//Unterstützung der Vorhersage nur
	//für Gecko und InternetExplorer
  	if (!is_ie && ! is_gecko && !is_opera)
  		return;

	//Ersetzen der Textareas durch Vorhersagekontrollen
	for (var i = 0; i < document.getElementsByTagName("textarea").length; i++)
	{
		//Setzen der Eventhandler
		if (is_gecko || is_opera)
		{
			document.getElementsByTagName("textarea")[i].setAttribute("onselect", "handleEvents(this)");
			document.getElementsByTagName("textarea")[i].setAttribute("onclick", "handleEvents(this)");
			document.getElementsByTagName("textarea")[i].setAttribute("onkeyup", "handleEvents(this)");
			document.getElementsByTagName("textarea")[i].setAttribute("onfocus", "askitTextAreas(this)");
			document.getElementsByTagName("textarea")[i].setAttribute("onblur", "normalTextAreas(this)");
		}
		else if (is_ie)
		{
			document.getElementsByTagName("textarea")[i].setAttribute("onselect", handleEvents, 0);
			document.getElementsByTagName("textarea")[i].setAttribute("onclick", handleEvents, 0);
			document.getElementsByTagName("textarea")[i].setAttribute("onkeyup", handleEvents, 0);
		  	document.getElementsByTagName("textarea")[i].setAttribute("onfocus", askitTextAreas, 0);
			document.getElementsByTagName("textarea")[i].setAttribute("onblur", normalTextAreas, 0);
		}
	}

	for (var i = 0; i < document.getElementsByTagName("select").length; i++)
	{
		//Setzen der Eventhandler
		if (is_gecko || is_opera)
		{
			  document.getElementsByTagName("select")[i].setAttribute("onchange", "handleSelectEvents(this)");
		}
		else if (is_ie)
		{
			document.getElementsByTagName("select")[i].setAttribute("onchange", handleSelectEvents, 0);
		}
	}


	//Anzeige der AJAX XML - Daten
	if (SHOW_XML)
	{
	  	//Erzeugen des Fensters für XML - Ausgabe
	  	var xmlWindow = document.createElement("textarea");
	  	xmlWindow.setAttribute("cols", "100");
	  	xmlWindow.setAttribute("rows", "15");
	  	xmlWindow.setAttribute("readonly", "readonly");
	  	xmlWindow.setAttribute("id", "xml");

	  	//Erzeugen eines Umbruchs
	  	var lineBreak = document.createElement("br");

	  	//Einfügen des Fensters für XML - Ausgabe
	  	document.getElementsByTagName("textarea")[i-1].parentNode.appendChild(lineBreak);
	  	document.getElementsByTagName("textarea")[i-1].parentNode.appendChild(xmlWindow);
	  	document.getElementById("xml").style.backgroundColor = "#FCDCFC";
		document.getElementById("xml").style.fontSize = "small";
		document.getElementById("xml").style.fontWeight = "bold";
	}
}

//Aktivieren der Vorhersagefunktionalität für Textarea
function askitTextAreas(e)
{
  	//Vermeidung von mehrfacher Darstellung
  	//des Vorhersagefensters
  	if (is_opera)
  	{
	    normalTextAreas(e);
	}

 	//Speichern der aktiven Textarea
  	//(nötig für IE Funktionen)
  	currentArea = this;

  	if (is_ie)
  	{
  		e = currentArea;

		//Initialisierung der Informationen
		//für textarea
	  	handleEvents(e);
	}

	//Prüfen, ob Cursor über Vorschlag
  	if(!propSelection)
  	{
	  	//Optische Anpassung der Kontrollen
	  	lastColor  = e.style.backgroundColor;
		lastfColor = e.style.color;
		e.style.backgroundColor = "#FCFAE6";
		e.style.color ="#000000";

	  	//Einfügen der Vorschlagslisten
		var list = document.createElement("ol");
		list.setAttribute("id", "askit-list")

	  	//DIV für gesamte Liste Erzeugen
	  	var listDiv = document.createElement("div");
	  	//listDiv.setAttribute("class", "askit");
		listDiv.className = "askit";
	  	listDiv.setAttribute("id", "askit");

	  	//DIV für innere Liste
	  	var innerDiv = document.createElement("div");
	  	//innerDiv.setAttribute("class", "askit-inner");
	  	innerDiv.className = "askit-inner";
	  	innerDiv.setAttribute("id", "askit-inner");


	  	//DIV für Fußbereich
		var footDiv = document.createElement("div");
		var footText = document.createTextNode("");
	  	//footDiv.setAttribute("class", "askit-foot");
	  	footDiv.className = "askit-foot";
	  	footDiv.setAttribute("id", "askit-foot");
	  	footDiv.appendChild(footText);

		var odd = 1;

		if(is_ie)
			e = currentArea;

		setElements(e);

		for(var j=0; j < numberOfPredicts; j++)
		{
		  	//Span für Kontext erzeugen
		  	var context = " ";
		  	var contextSpan = document.createElement("span");
		  	var contextText = document.createTextNode(context);
		  	var contextID ="askit-context" + j;
		  	//contextSpan.setAttribute("class", "context");
			contextSpan.className = "context";
		  	contextSpan.setAttribute("id", contextID);
			contextSpan.appendChild(contextText);

		  	//Span für Vorhersage erzeugen
		  	var proposal = " ";
		  	var proposalSpan = document.createElement("span");
		  	var proposalText = document.createTextNode(proposal);
			// alert(proposalText);

			var proposalID ="askit-proposal" + j;
			//proposalSpan.setAttribute("class", "proposal");
			proposalSpan.className = "proposal";
			proposalSpan.setAttribute("id", proposalID);
			proposalSpan.appendChild(proposalText);
			//var prop = decode_utf8(proposal);
			//Link erzeugen
			setElements(e);
			var listLink = document.createElement("a");
			var listID = "askit-pred" + j;
			var listHREFTarget = "javascript:insertAtCursor(\"" + e.id + "\", \"" + context + proposal + "\")";
		  	listLink.setAttribute("href", listHREFTarget);
			listLink.setAttribute("id", listID);

			if (is_gecko || is_opera)
			{
				listLink.setAttribute("onmouseover", "mouseOver(this)");
				listLink.setAttribute("onmouseout", "mouseOut(this)");
			}
			else if (is_ie)
			{
				listLink.setAttribute("onmouseover", mouseOver, 0);
				listLink.setAttribute("onmouseout", mouseOut, 0);
			}

			//Listeneintrag erzeugen
			var listPoint = document.createElement("li");

		  	if(odd)
		  	{
		  		//listPoint.setAttribute("class", "askit-odd");
				listPoint.className = "askit-odd";
		  	}
		  	else
		  	{
			    //listPoint.setAttribute("class", "askit-even");
				listPoint.className = "askit-even";
			}

			odd = 1 - odd;

			//Zusammenfügen des Listeneintrags
			listLink.appendChild(contextSpan);
			listLink.appendChild(proposalSpan);
		  	listPoint.appendChild(listLink);
		  	list.appendChild(listPoint);
		}

		//Einfügen der Liste in umgebendes DIV
		innerDiv.appendChild(list);
		listDiv.appendChild(innerDiv);
		listDiv.appendChild(footDiv);

		//Einfügen der erzeugten Liste in den DOM-tree
		e.parentNode.insertBefore(listDiv, e);

		//Setzen der Vorschläge neben Kontrolle
		var topRightX = e.offsetLeft + e.offsetWidth + 10;
		var topRightY = e.offsetTop;

		document.getElementById("askit").style.left = topRightX + "px";
		document.getElementById("askit").style.top = topRightY + "px";
	}
}

//Deaktivieren der Vorhersagefunktionalität für Textarea
function normalTextAreas(e)
{
  	if (is_ie)
  	{
  		e = currentArea;
	}

	//Prüfen, ob Cursor über Vorschlag
  	if(!propSelection)
  	{
  		//Optische Anpassung der Kontrollen
		e.style.backgroundColor = lastColor;
		e.style.color = lastfColor;

		//Prüfen, ob Vorschlagsliste aktiv
		var list = document.getElementById("askit");

		//Entfernen der Vorschlagsliste
		if (list)
		{
		  	e.parentNode.removeChild(document.getElementById("askit"));
		}
	}
};

//Setzen der Auswahl in textarea
function setSelectionRange(input, start, end)
{
	if(input.value.charAt(0) == ' ' && input.value.charAt(1) != ' ')
	{
		input.value = input.value.substring(1, input.value.length);
		
	}

	if (is_gecko)
	{
		input.setSelectionRange(start, end);
	}
	else if (is_ie)
	{
		var range = input.createTextRange();
		range.collapse(true);
		range.moveStart("character", start);
		range.moveEnd("character", end - start);
		range.select();
	}

};

//Bestimmen des Auswahlanfangs in textarea
function getSelectionStart(input)
{
	if (is_gecko || is_opera)
	{
		startPos = input.selectionStart;
	}
	else if (is_ie)
	{
		var range = document.selection.createRange();

		//Berechnung der Cursorposition 0 für Textarea
		var parent = range.parentElement();
		var rangeClient = parent.createTextRange();
		var isClientCollapsed = range.compareEndPoints("StartToEnd", range) == 0;

		if (!isClientCollapsed)
			rangeClient.collapse(true);

		var bClient = rangeClient.getBookmark();

		//Berechnung der Cursorposition relativ zum Document
		var isCollapsed = range.compareEndPoints("StartToEnd", range) == 0;
		if (!isCollapsed)
			range.collapse(true);
		var b = range.getBookmark();

		//Ausgabe der bereinigten Cursorposition
		startPos = b.charCodeAt(2) - bClient.charCodeAt(2);
	}
};

//Bestimmen des Auswahlendes in textarea
function getSelectionEnd(input)
{
	if (is_gecko || is_opera)
	{
		endPos = input.selectionEnd;
	}
	else if (is_ie)
	{
		var range = document.selection.createRange();

		//Berechnung der Cursorposition 0 für Textarea
		var parent = range.parentElement();
		var rangeClient = parent.createTextRange();
		var bClient = rangeClient.getBookmark();

		//Berechnung der Cursorposition relativ zum Document
		var isCollapsed = range.compareEndPoints("StartToEnd", range) == 0;
		if (!isCollapsed)
			range.collapse(false);
		var b = range.getBookmark();

		//Ausgabe der bereinigten Cursorposition
		endPos = b.charCodeAt(2) - bClient.charCodeAt(2);
	}
};

//Bestimmen der Bildschirmkoordinaten
//des Carets in textarea
function getCaretCoord(e)
{
	if (is_ie && AT_CARET)
	{
	  	e = currentArea;

		range = document.selection.createRange();
	  	cursorX = range.boundingLeft - e.clientLeft;
		cursorY = range.boundingTop + range.boundingHeight - e.clientTop + e.scrollTop;

		if (document.getElementById("askit"))
		{
			document.getElementById("askit").style.left = (cursorX + 10);
			document.getElementById("askit").style.top = (cursorY + 10);
		}
	}
	else if (is_gecko)
	{
		//TBD
	}
};

//****************************
//*** Vorhersagefunktionen ***
//****************************

//Einfügung von Vorhersagen
function insertAtCursor(myFieldID, myValue)
{
  	//Zugriff auf aktuelle Textarea
  	//gewährleisten
	myField = document.getElementById(myFieldID);

	if (is_ie)
	{
		var text = myField.value;

	  	//Berechnung der im IE
	  	//enthaltenen Zeilenumbrüche
		var offsetStart = 0;
		var offsetEnd =   0;
		offsetStart = getIEBreaks(text, startPos);
		offsetEnd = getIEBreaks(text, endPos);

		//Berechnung der bereinigten Werte für
		//Beginn und Ende der Markierung
		myBegin = myField.value.substring(0, startPos + offsetStart);
		myEnd = myField.value.substring(endPos + offsetEnd, myField.value.length);

		//Berechnung des letzten "worttrennenden" Zeichens
		blank = getBlankPos(myBegin);

		//Einfügen des Vorschlags
		myField.value=myBegin.substring(0,blank) + myValue + myEnd;

		//Setzen des Carets an das Ende
		//des eingefügten Vorschlags
		if(myField.value.charAt(0) == " ")
		{
			setSelectionRange(myField, blank+myValue.length - offsetStart-1, blank + myValue.length - offsetStart-1);
		}
		else
		{
			setSelectionRange(myField, blank+myValue.length - offsetStart, blank + myValue.length - offsetStart);
		}

		//Fokussierung der textarea
		myField.focus();
	}
	else if (is_gecko)
	{
		var scrollTop = myField.scrollTop;

		//Berechnung der bereinigten Werte für
		//Beginn und Ende der Markierung
		myBegin = myField.value.substring(0, startPos);
		myEnd = myField.value.substring(endPos, myField.value.length);


		//Berechnung des letzten "worttrennenden" Zeichens
		blank = getBlankPos(myBegin);

		//Einfügen des Vorschlags
		myField.value=myBegin.substring(0,blank) + myValue + myEnd;
		//Das erste Zeichen darf nicht das Leerzeichen sein
		if(myField.value.charAt(0) == " ")
			context = context.substring(1, context.length);

		//Fokussierung der textarea
		myField.focus();
			myField.selectionStart = blank + myValue.length;
			myField.selectionEnd = blank + myValue.length;
		//Setzen des Carets an das Ende
		//des eingefügten Vorschlags
		if(myField.value.charAt(0) == " ")
		{
			myField.selectionStart = blank + myValue.length - 1;
			myField.selectionEnd = blank + myValue.length - 1;
		}
		else
		{
			myField.selectionStart = blank + myValue.length;
			myField.selectionEnd = blank + myValue.length;
		}

	}
	else if (is_opera)
	{
		//Berechnung der bereinigten Werte für
		//Beginn und Ende der Markierung
		myBegin = myField.value.substring(0, startPos);
		myEnd = myField.value.substring(endPos, myField.value.length);

		//Berechnung des letzten "worttrennenden" Zeichens
		blank = getBlankPos(myBegin);

		//Einfügen des Vorschlags
		myField.value=myBegin.substring(0,blank) + myValue + myEnd;

		//Setzen des Carets an das Ende
		//des eingefügten Vorschlags
		myField.selectionStart = blank + myValue.length;
		myField.selectionEnd = blank + myValue.length;
	}

	//Aufruf der Funktion zur Berechnung der
	//Textinformationen der textarea
	handleEvents(myField);
};


//Kontextbestimmung
function getContext(myField)
{
  	//Automatische Entfernung von
  	//Leerzeichen vor Satzendezeichen
  	smartPunctuation(myField);

	if (is_ie)
	{
	  	//Berechnung der im IE
	  	//enthaltenen Zeilenumbrüche
	  	myField = currentArea;

		//Berechnung der bereinigten Caretposition
		//im Text der textarea
		var text = myField.value;
		var offset = getIEBreaks(text, endPos);
		var leng = 0;

		//Berechnung des Kontextes
		context=myField.value.substring(0, endPos + offset);
	}
	else if (is_gecko || is_opera)
	{
	  	//Berechnung des Kontextes
		context=myField.value.substring(0, endPos);
	}

	text = context;
	leng = text.length;
	// Der betrachtete Text wird auf 1000 Zeichen  begrenzt
	if(leng > 1000)
	{
		text = text.substring(leng-1000, leng);
	}

	//Der Kontext wird auf die letzten 10 Wörter beschränkt
	var Woerter = text.split(" ");
	leng = Woerter.length;
	var count = (leng > 10) ? leng - 10 : 0;
	text = "";
	while(leng > count)
	{
		text = text.concat(" ");
		text = text.concat(Woerter[count]);
		count++;
	}

	langOfPredicts = myField.lang;

	setElements(myField);

	//Aktualisieren der Vorschläge
	getProposals(myField.id, text, (SHOW_XML)?1:0, langOfPredicts, numberOfPredicts, maxPredictLength, sortingOfPredicts, minPredictLength );
	//setLanguage(myField.id, 2);
	//Fokussierung der textarea
	myField.focus();
};


function setElements(myField)
{
	if (is_ie)
	{
		myField = currentArea;
	}

	if (myField.lang == "own")
	{
		langOfPredicts = document.getElementById("select2").value;
		numberOfPredicts = document.getElementById("select1").value;
		sortingOfPredicts = document.getElementById("select3").value;
		maxPredictLength = document.getElementById("select4").value;
		minPredictLength = document.getElementById("select5").value;
	}
	else
	{
		numberOfPredicts = 10;
		sortingOfPredicts = "Value";
		maxPredictLength = 30;
		minPredictLength = 3;
	}
};

function setSortings(areaID)
{
	//**Holen der Vorschläge
	//**********************
	sortingOfPredicts = document.getElementById("select4").value;
	xajax_setSorting(areaID);
};


//Holen der Vorschläge
function getProposals(areaID, context, showXML, language , numberOfPredicts, maxPredictLength, sortingOfPredicts, minPredictLength)
{
    //Variable zur Speicherung der Vorschläge
  	var props = new Array;
	//**Holen der Vorschläge
	//**********************
	xajax_getProposal(areaID, context, showXML, language, numberOfPredicts, maxPredictLength, sortingOfPredicts, minPredictLength);
};


function handleSelectEvents(selectID)
{
	if (is_ie)
	{
		selectID = currentArea;
	}
	if(selectID.name == "select1")
		numberOfPredicts = selectID.value;
	else if(selectID.name == "select2")
		language = selectID.value;
	else if(selectID.name == "select3")
		sortingOfPredicts = selectID.value;
	else if(selectID.name == "select4")
	{
		maxPredictLength = document.getElementById("select4").value;
		minPredictLength = document.getElementById("select5").value;
		var maxZahl = parseInt(maxPredictLength);
		var minZahl = parseInt(minPredictLength);

 		if(minZahl > maxZahl)
		{
		 	document.getElementById("select5").value = maxZahl;
		}

	}
	else if(selectID.name == "select5")
	{
		maxPredictLength = document.getElementById("select4").value;
		minPredictLength = document.getElementById("select5").value;
		var maxZahl = parseInt(maxPredictLength);
		var minZahl = parseInt(minPredictLength);

 		if(minZahl > maxZahl)
		{
			document.getElementById("select4").value = minZahl;
		}
	}

};

//**************************************
//*** Helperfunktionen Eventhandling ***
//**************************************

//Handling für alle Events
//- Updating der Textinformationen für texteareas
function handleEvents(e)
{
  	//Kein Event-Handling während
  	//der Übernahme von Vorschlägen
  	if (updateActive)
  		return;

	setElements(e);

  	//Hotkey Behandlung
  	var keyMod = 0;
  	var keyCode = 0;

	if (is_ie)
  	{
  	  	e = currentArea;

  		var keyEvent = window.event;

  		if (keyEvent && keyEvent.type == "keyup")
		{
			keyMod = keyEvent.altKey;
			keyCode = keyEvent.keyCode;
		}
    }
    else if (is_gecko)
    {
		keyMod = geckoAlt;
		keyCode = geckoKey;
	}
	else if (is_opera)
	{
		//TBD
	}

	//Behandlung von Hotkeys
	//ALT+1 bis ALT+0
	if (keyMod && keyCode>=48 && keyCode<=57)
	{

	  	var sel = keyCode - 48-1;
	  	sel = (sel==-1)?9:sel;

	  	var context = "";
	  	var proposal = "";


		var contextNode = document.getElementById("askit-context" + sel).childNodes[0];
		var proposalNode = document.getElementById("askit-proposal" + sel).childNodes[0];

		if (contextNode)
		{
		  	context = contextNode.nodeValue;
		}

		if (proposalNode)
		{
		  	proposal = proposalNode.nodeValue;

		  	//Rückübersetzung von Sonderzeichen
		  	//für Leerzeichen im Vorschlag

		  		proposal = proposal.replace(/\xAC/, " ");

		}

		proposal = context + proposal;

	  	updateActive = true;
	  	insertAtCursor(e.id, proposal);
	  	geckoAlt = false;
	  	geckoKey = 0;
	  	updateActive = false;
	}

	//Berechnung der für die Vorhersage
	//relevanten Informationen nur wenn
	//keine Vorhersagen übernommen werden
	if (!updateActive)
	{
		getSelectionStart(e);
		getSelectionEnd(e);
		getContext(e);
		getCaretCoord(e);
	}

	//Setzen der Debug-Informationen in die Statuszeile
	if (_DEBUG)
	{
		window.status = "||" + startPos + ":" + endPos + "||"
							 + cursorX + ":" + cursorY + "||"
							 + test1 + ":" + test2 + ":" + test3 + ":" + test4 + ":" + test5 + ":"
							 + test6 + ":" + test7 + ":" + test8 + ":" + test9 + ":" + test10 + "||"
							 + context;
	}
}

function aufruf()
{
	askit_init();
}

function setActiveStyleSheet(title)
{
	var i, a, main;
	for(i=0; (a = document.getElementsByTagName("link")[i]); i++)
	{
	         if(a.getAttribute("rel").indexOf("style") != -1
	         && a.getAttribute("title"))
	         {
	                 a.disabled = true;
	                 if(a.getAttribute("title") == title)
	                 a.disabled = false;
	         }
	}
}

//***********************************************************************
//***                         General issues                          ***
//***********************************************************************
//- "TBD" kennzeichnet offene Punkte im Quelltextt
//- "???" kennzeichnet Probleme im Quelltext

//***********************************************************************
//***                          Discussions                            ***
//***********************************************************************
//- Einbindung auf Serverseite
//- Proxy als Dienst anbieten, der dynamisch onload und Includes anpasst
//  Was passiert mit anderen onload - Befehlen (Siehe ToDo-Both)?

//***********************************************************************
//***                          Open Issues                            ***
//***********************************************************************
//- Realisierung der Einstellungsmöglichkeiten
//  - z.B. Öffnung eines Dialogs in neuer Ebene als
//    eigenständiges Fenster bei Klick auf Ask-It Symbol?
//  - Sessionhandling muss gehandhabt werden
//  Vorschlag:
//  - Keine Einstellungsmöglichkeiten
//  - Sprache und Zeichenkodierung kann durch JavaScript aus den Seiten-
//    informationen und dem HTTP Header entnommen werden
//    (wahlweise auch Paramneterübergabe durch Seitenbetreiber in onload)
//  - Einstellungsmöglcihkeit für die Anzahl der angezeigten Vorschläge
//    (einzig sinnvolle Einstellung) kann durch JavaScript und
//    entsprechende CSS-Einstellungen realisiert werden.

//***********************************************************************
//***                             ToDo                                ***
//***********************************************************************
//All
//*****
//- Original Handler speichern und nach eigenen aufrufen?
//  Betrifft onload() und die Handler der originalen Textareas
//- Auswahl von Vorschlägen durch "Tabbing" führt zu Fokusverlust
//  Ist das wirklich ein Problem? - User wird in Kontrolle tabben,
//  dann kann er Hotkeys für Auswahl verwenden
//- Anpassen der Position des Vorhersagefensters bei Schriftvergrößerung
//  Definition von Maßangaben in em?
//- Änderung der Serveranfragen zur Unterstützung von "Sessions"
//- Prüfen der Existenz von Vorhersagefenster vor Setzen neuer Werte
//- Gesendeten Kontext längenmäßg begrenzen?

//IE
//*****
//- SHIFT&TAB funktioniert nicht zwischen Kontrollen
//- Einfärben von Kontext und Vorschlag funktioniert nicht
//  Seltsam: bei Speicherung des erfeugten Quellcodes und Betrachtung
//  der gespeicherten Datei im IE funkttioniert alles!
//- Refreshingprobleme bei Aufbau des Vorschlagsfensters
//  scheinen verschwunden zu sein!
//- Bei Eingabe von mehreren Worten ("und wieder e") wird ungültiger
//  XML-Code zurückgegeben

//Gecko
//*****
//- Abfrage der Bildschirmkoordinaten des Carets für Mozilla
//  Unwichtig, wollen wir Positionierung am Caret?
//- Vorhersagefenster mit veränderbarer Breite wird nur
//  breiter, nicht wieder schmaler

//Opera
//*****
//- Hotkeys funktionieren nicht
//  Alt wir nicht unterstützt, Strg ist komplett belegt
//- Beim wiederholten Übernehmen von Vorschlägen wechselt manchmal
//  der Fokus in eine andere Textarea
