//document.write('<script type="text/javascript" src="/jportal/js/jquery.js"></scr' + 'ipt>'); 

/* zuerst einmal Funktionen zum Navigieren auf der Tabelle und dem dynamischen Aendern der Anzeige */
var suggestPortalInputField;
// Die Rubriken fuer das aktuelle Eingabefeld
var rubricsString;
// True, waehrend sich der Mauszeiger ueber dem Suggest-Div-befindet
var lockTable = false;
// Die zuletzt gewaehlte Rubrik, bevor in der Tabelle selektiert wird
var startRubric = "";
// der aktuelle Hashcode
var curHashcode;
// der aktuelle Hashcode Typ
var curHashTyp;
//die Anzahl der darzustellenden Zeilen
var curSugRow;
//soll die Relevanz nicht dargestellt werden
var showNoRelevanz;
// das aktuelle Portal
var curPortal;
// der aktuelle PortalPort
var curPortalPort;
// der aktuelle CMS-Pfad
var curCmsPath;
// Vom Suggest-Server geliefert: Fuer jede Zeile Suchbegriff und Rubrik
var valuesArray;
var rubricsArray;

// merken des letzten Requests
var lastRequestBatch;

var wasDidYouMean;
var suggest_nr = 0;
var did_you_mean_row = 0;

function addEventList() 
{
	// zum Setzen von eventlistenern auf Tabellenzeilen
	for (i = 0 ; i < rows.length ; i++)
	{
		if (window.addEventListener)
		{
			rows[i].addEventListener("mouseover", setBG, false);
			rows[i].addEventListener("click", setSelValue, false);
		}
		else
		{
			rows[i].attachEvent("onmouseover", setBG, false);
			rows[i].attachEvent("onclick", setSelValue, false);
		}
	}
}	

function removeEventList() 
{
	// zum Aufheben von eventlistenern auf Tabellenzeilen
	for (i = 0; i < rows.length; i++)
	{
		var row = rows[i];
		if (window.removeEventListener)
		{
			row.removeEventListener("mouseover", setBG, false);
			row.removeEventListener("click", setSelValue, false);
		}
		else
		{
			row.detachEvent("onmouseover", setBG);
			row.detachEvent("onclick", setSelValue);
		}
	}
}	

function changeBG(selElem, bvalue)
{
	var elem = eval(selElem);
	if (bvalue)
		elem.style.backgroundColor = "#CCC";
	else
		elem.style.backgroundColor = "";
}	

function setBG(event)
{
	// bevor wir die neue Zeile setzen sollten wir die alte l�schen, das w�rde
	// auch den Listener auf mouseout �berfl�ssig machen
	var zeile = getCurrLine();
	if (zeile > -1)
		changeBG(rows[zeile], false);

	if (!event) 
		event = window.event;
	
	var element = event.currentTarget ? event.currentTarget : event.srcElement.parentElement;
	while (element.tagName != "TR")
	{
		// dann hat ein inneres Element das Mouseover geworfen (z.B. Strong) =>
		// es muss sich das Parentelement
		if (element.parentNode)
			element = element.parentNode;
		else
			return;
	}
	changeBG(element, true);
	setCurrLine(getCorrectedRowNr(element.rowIndex));
}	


function setSelValue(event)
{
	// wird sowohl beim ClickEvent der Maus als auch bei Druecken der Entertaste auf der Table aufgerufen
	// macht nur Sinn, wenn es eine aktive Tabelle gibt
	if (document.getElementById("jurissuggestdiv").style.visibility != "visible")
		return;

	// hole dir die aktuelle Zeile
	var curZeile = getCurrLine()
	if (curZeile != -1)
	{
		// nur wenn wir ueberhaupt in der Tabelle stehen ist die uebernahnme moeglich
		var iField = document.getElementById(suggestPortalInputField);
		var rField = rows[curZeile];
		if (event.keyCode)
		{
			// beim der Druecken der Eingabe auf einer Tabellenzeile
			if (event.keyCode == 13) 
				setSuggestInputField(iField,curZeile);
			else
			{
				// hier sollte fuer den Fall ESC, der Ursprungswert gesetzt werden !
				if (iField != null)
					restoreStartValue();
			}
		}
		else 
		{
			// Click auf eine Tabellenzeile
			setSuggestInputField(iField, curZeile); 
		}
		changeBG(rField,false);
	}

	closeSuggestTable();
}

function handleInput(keyEvent, rubrics, suggestID) 
{
	handleInput(keyEvent, rubrics, suggestID, false);
}	

function handleInput(keyEvent, rubrics, suggestID, typ)
{
	// wir stehen auf dem Inputfield und reagieren auf Keyeingaben
	if (document.getElementsByName("sugactive")[0].value != "true")
		return;
	
	// nur wenn suggest aktiv ist duerfen Vorschlaege gemacht werden
	if (typ == undefined) 
		curHashTyp = false;
	else 
		curHashTyp = typ;

	if (!keyEvent)
		keyEvent= window.event;

	if (!keyEvent || !keyEvent.keyCode)
		return;
	
	// zuerst mal das Element merken escape
	if (keyEvent.keyCode == 27 || keyEvent.keyCode == 13)
	{
		// => ausblenden der Tabelle
		setSelValue(keyEvent);
		return;
	}
	
	// Pfeil nach unten
	if (keyEvent.keyCode == 40)
	{
		// pfeil nach unten bedeutet in der Tabelle 1 Zeile nach
		// unten oder 1.te Zeile wenn noch nicht in der Tabelle
		if (!setFocusToZeile(1))
			// Wenn Focus nicht gesetzt werden konnte, muss Box erst noch angezeigt werden
			createSuggest(keyEvent,rubrics,suggestID);
		return;
	}
	
	// Pfeil nach oben
	if (keyEvent.keyCode == 38)
	{
		// pfeil nach oben bedeutet in der Tabelle 1 Zeile nach
		// oben oder in der 1.te Zeile verweilen
		setFocusToZeile(-1);
		return;
	}
	
	// Box nur anzeigen/aktualisieren, wenn Text veraendert oder Pfeil nach unten gedrueckt
	if (!isFunctionKey(keyEvent.keyCode) && !isCursorKey(keyEvent.keyCode))
	{
		// dann war es eine gew�hnliche Eingabe, im Framework muss die CallBackfunktion f�r
		// Visibility sorgen. hier wechseln wir nur die Tabelle
		createSuggest(keyEvent,rubrics,suggestID);
	}
}

// Feststellen, ob eine nicht textver�ndernde Funktionstaste gedr�ckt wurde (au�er Cursortasten)
function isFunctionKey(keyCode)
{
	// siehe http://www.mediaevent.de/javascript/Extras-Javascript-Keycodes.html
	return (keyCode == 9 || (keyCode >= 16 && keyCode <= 20) || (keyCode >= 33 && keyCode <= 36) || keyCode == 45 || (keyCode >= 91 && keyCode <= 93) || (keyCode >= 112 && keyCode <= 123) || keyCode == 144 || keyCode == 145);
}

// Feststellen, ob eine Cursortaste gedr�ckt wurde
function isCursorKey(keyCode)
{
	return (keyCode >= 37 && keyCode <= 40);
}

// Blaettern in den Suggest-Results handeln
function handleBrowse(pageNr)
{
	var inputEle = document.getElementById(suggestPortalInputField);
	var qinput =  inputEle.value;

	dwr.engine._abortRequest(lastRequestBatch);
	lastRequestBatch = JurisAjaxUtils.getSuggests(qinput, rubricsString, pageNr, curHashcode, curPortal, curPortalPort, window.location.pathname, curSugRow,
			{	callback: function(domArray) {
		showSuggest(document.getElementById(suggestPortalInputField), domArray, qinput);},
		errorHandler:doErrorAusgabe,
		timeout: 3000
			});
	inputEle.focus();
	lockTable = false;						
}

// Schalter setzen der voruebergehend verhindert, dass die Tabelle bei onBlur versteckt wird.
function lockSuggestTable(lock)
{
	lockTable = lock;
}

function getIndex() 
{
	var control = document.getElementsByName("controlElement")[0];
	if (control != null) 
		return control.selectedIndex;

	return null;
}

function createSuggest(keyEvent,rubrics, suggestID)
{
	suggestPortalInputField = suggestID;
	rubricsString = rubrics;
	if (curHashTyp)
		curHashcode = document.getElementsByName("sugwebhashcode")[0].value;
	else 
	{
		var index = getIndex();
		if (index == null) 
		{
			curHashcode = document.getElementsByName("sughashcode")[0].value;
		} 
		else 
		{
			suginput = document.getElementsByName("sughashcode" + index);
			if (suginput != null && suginput.length > 0)
				curHashcode = suginput[0].value; 
			else
				curHashcode = document.getElementsByName("sughashcode")[0].value;
		}
	}

	curPortal = document.getElementsByName("sugportal")[0].value;
	curPortalPort = document.getElementsByName("sugportalport")[0].value;
	curCmsPath = document.getElementsByName("sugcmspath")[0].value;
	curSugRow = getCurrRows();
		
	var inputEle = document.getElementById(suggestPortalInputField);
	// Wenn der Inhalt des Suchfeldes ge�ndert wurde, urspr. Suggest-Vorgabe f�r
	// Suchaspekt aufheben
	if (!isCursorKey(keyEvent.keyCode))
		setSearchLock(inputEle, "");
	var qinput =  inputEle.value;
	// findet kein Whitspace
	var isNurLeer = qinput.match(/\S/);
	if (isNurLeer != null)
	{
		// dann liegt eine Eingabe vor
		dwr.engine._abortRequest(lastRequestBatch);
		lastRequestBatch = JurisAjaxUtils.getSuggests(qinput, rubrics, 0, curHashcode, curPortal, curPortalPort, window.location.pathname, curSugRow,
		{	callback: function(domArray) 
			{
				showSuggest(document.getElementById(suggestPortalInputField), domArray, qinput);
			},
			errorHandler:doErrorAusgabe,
			timeout: 5000
		});
	}
	else
	{
		// beende SuggestTable
		closeSuggestTable();
	}
}

function showSuggest(inputEle, domArray, inputByCall)
{
	// das wird die Callbackfunktion des DWR-Frameworks
	// Tabelle in die alles eingef�gt wird
	wasDidYouMean = false;
	suggest_nr = 0;
	showNoRelevanz = document.getElementsByName("sugshownorelevanz")[0].value == "true";

	var insertObject = document.getElementById("jurissuggest");
	// Div unterhalb der Tabelle, in das Bl�tterbuttons etc. reinkommen
	var controlObject = document.getElementById("jurissuggestcontrol");

	// Die Tabelle umgebendes div, zur Positionierung und �berdeckung
	// nachfolgender Elemente
	var divObject = document.getElementById("jurissuggestdiv");
	// jetzt sollte hier eine Pr�fung stattfinden, ob die Liste noch zu der
	// aktuellen Eingabe passt => wenn ja , kann es losgehen
	// wenn nein gibt es mit Sicherheit einen weiteren Request
	if (document.getElementById(suggestPortalInputField).value == inputByCall)
	{
		// die Liste passt zu dem Inhalt des Inputfeldes
		if (domArray != null && domArray.length > 0)
		{
			// mache neue Werte sichtbar
			// setze noch die aktuelle Zeile auf -1, d.h. noch nicht in der Tabelle
			setCurrLine(-1);
			removeSuggestRows(insertObject, controlObject);
			fillSuggestRows(domArray,insertObject,controlObject);
			doVisible(inputEle, divObject, insertObject);
		}
		else
		{
			// beende SuggestTable
			closeSuggestTable();
		}
	}
	
	$("#standardsuche_copy").hide();
	$("#neuesuche_copy").hide();
	
	var org = $("#standardsuche");
	if (org != null && org.is(":visible"))
	{
		var btn = $("#standardsuche_copy");		
		btn.addClass(org.attr("class"));
		btn.attr("value", org.attr("value"));
		btn.show();
	}

	org = $("#neuesuche");
	if (org != null  && org.is(":visible"))
	{
		var btn = $("#neuesuche_copy");
		btn.addClass(org.attr("class"));
		btn.attr("value", org.attr("value"));
		btn.show();
	}
}

function createDidYouMean(insertObject)
{
	var r = document.createElement("tr");

	r.style.backgroundColor = "#ECC";
	createNewAttribut("id", "didyoumean", r);

	did_you_mean_row = suggest_nr;

	var c = document.createElement("td");
	createNewAttribut("class", "tdsuggest tdrubrik tddidyou", c);
	createNewAttribut("colspan", "3", c);
	c.style.cursor = "default";
	
	var strong = document.createElement("strong")
	c.appendChild(strong);
	
	var t = document.createTextNode("Meinten Sie ... ?");
	strong.appendChild(t);
	
	r.appendChild(c);
	insertObject.appendChild(r);
}

// Erzeugen der Tabelleneintraege fuer die aktuellen Vorschlaege
function createSuggestEntry(insertObject, showRubric, rubric, label, t1, t2, t3, t4, relevance, didyoumean)
{
	if (didyoumean && !wasDidYouMean)
	{
		createDidYouMean(insertObject);
		wasDidYouMean = true;
	}

	suggest_nr ++;

	var z ; // Variable f�r den Zeilenknoten (tr)
	var k ; // Variable f�r alle Kindknoten (td,th), aber Achtung bei Kind von Kindknoten
	var t ; // Variable f�r alle Textknoten
	var a ; // Variable f�r alle Attributte
	var img ; // Varibale f�r alle Bilder

	z = document.createElement("tr");
	if (didyoumean)
		createNewAttribut("class", "isdidyoumean", z);

	// 1. Spalte: Rubrik
	if (showRubric)
	{
		k = document.createElement("td");
		createNewAttribut("class", "tdsuggest tdrubrik", k);
		createNewAttribut("width", "70", k);
		
		t = document.createTextNode(label);
		k.appendChild(t);
		z.appendChild(k);
	}

	// 2.Spalte: der eigentliche Text, wobei t2 markiert wird
	k = document.createElement("td");
	createNewAttribut("class", "tdsuggest", k);
	if (didyoumean)
	{
		createNewAttribut("colspan", 2, k);
		var result = "";
		if (t1)
			result = result + t1;
		if (t2)
			result = result + t2;
		if (t3)
			result = result + t3;
	
		var was_incl = true;
		var parent = null;
		var matched = -1;
		
		
		for (var c = 0; c < result.length; c++)
		{
			var char = result.substring(c, c+ 1);
			var align = didyoumean.substring(c, c+ 1);
			var matches = 0; 
			if (align != "" && align != "°")
				matches = 1;
			
			if (matches != matched)
			{
				var parent = document.createElement("span");
				k.appendChild(parent);
				if (matches)
				{
					parent.style.color = "#000";
					parent.style.fontWeight = "bold";
				}
				else
				{
					parent.style.color = "#A00";
					parent.style.fontWeight = "";
				}
			}
			
			parent.appendChild(document.createTextNode(char));
		}
	}
	else
	{
		// vor Markierung
		if (t1 != "")
		{
			k.appendChild(document.createTextNode(t1));
		}
	
		// Markierung
		t = document.createElement("strong");
		k.appendChild(t);
		t.appendChild(document.createTextNode(t2));
	
		// nach Markierung
		if (t3 != "")
		{
			k.appendChild(document.createTextNode(t3));
		}
	}

	// Referenz
	if (t4 != "")
	{
		t = document.createElement("i");
		k.appendChild(t);
		t.appendChild(document.createTextNode(t4));
	}

	createNewAttribut("class", "tdsuggest tdvorschlag", k);

	z.appendChild(k);

	//Ausgabe des Relevanzbalkens
	if (!curHashTyp && !didyoumean && !showNoRelevanz) 
	{
		// 3. Spalte:
		k = document.createElement("td");
		z.appendChild(k);
		
		createNewAttribut("class", "tdsuggest tdanzahl", k);
		k.style.verticalAlign = "middle";
		k.style.textAlign = "left";
		createNewAttribut("width", "50", k);
		
		img = document.createElement("img");

		createNewAttribut("src", curCmsPath + "juris/media/bilder/layout_bilder/suggest/grau_o_r.gif", img);
		createNewAttribut("height", 10, img);
		createNewAttribut("width", relevance, img	);
		
		k.appendChild(img);
	}

	insertObject.appendChild(z);
}

// Die Blaetterbuttons unterhalb der Tabelle erzeugen
function createSuggestButtons(parent, prevNr, nextNr)
{
	var arrow = curCmsPath + "juris/media/bilder/layout_bilder/icon/icon_pfeil";

	if (prevNr != -1)
		createSuggestButton(parent, "javascript:handleBrowse("+prevNr+")", arrow + "Links.gif", "Zur&uuml;ck bl&auml;ttern");
	else
		createSuggestButton(parent, null, arrow + "Links_inaktiv.gif", "Anfang der Vorschlagsliste");

	parent.appendChild(document.createTextNode(" "));

	if (nextNr != -1)
		createSuggestButton(parent, "javascript:handleBrowse("+nextNr+")", arrow + "Rechts.gif", "Weiter bl&auml;ttern");
	else
		createSuggestButton(parent, null, arrow + "Rechts_inaktiv.gif", "Ende der Vorschlagsliste");
}

function createSuggestButton(p, call, icon, info)
{
	// Bild
	var img = document.createElement("img");
	createNewAttribut("src", icon, img);
	createNewAttribut("alt", info, img);
	
	if (call == null)
	{
		p.appendChild(img);
		return;
	}
		
	// Link
	var a = document.createElement("a");
	createNewAttribut("href", call, a);
	a.appendChild(img);
	p.appendChild(a);
}

function removeSuggestRows(tObject, controlObject)
{
	var tBody = tObject.tBodies[0]; // immer den ersten Tablebody holen
	removeEventList();
	dwr.util.removeAllRows(tBody == null ? tObject : tBody);

	while(controlObject.firstChild)
		controlObject.removeChild(controlObject.firstChild);
}

function fillSuggestRows(domArray, tObject, controlObject)
{
	var tBody = tObject.tBodies[0];
	// berechne nun die jedes Arrayelemnt
	createNewevalTable(domArray, tBody == null ? tObject : tBody, controlObject);
	getRows();
	addEventList();
}


function doVisible(inputEle, divEle, ele)
{
	// Initialisiert die SuggestTable
	if (divEle.style.visibility == "visible")
	{
		// wenn schon sichtbar, dann setze nur den neuen Input des Feldes
		storeStartValue();
		return;
	}
		
	// das Div unterhalb des aktuellen Eingabefeldes positionieren
	coords = getObjCoords(inputEle);
	var newWidth; 
	if (coords.width < 300)
		newWidth = 400;
	else
		newWidth = coords.width;

	var newLeft = coords.left;
	if (window.innerWidth && (coords.left + newWidth > window.innerWidth))
		newLeft = (coords.left + coords.width) - newWidth;
	else if (document.body.clientWidth && (coords.left + newWidth > document.body.clientWidth))
		newLeft = (coords.left + coords.width) - newWidth;

	// Auch sicherstellen, dass Fenster nicht nach links rausl�uft, ggf.
	// Breite verringern.
	if (newLeft < 0)
	{
		newLeft = coords.left;
		newWidth = coords.width;
	}

	divEle.style.left = newLeft+"px";
	divEle.style.top = (coords.top + coords.height + 2)+"px";
	divEle.style.width = newWidth+"px";

	// dann muss die Tabelle zuerst einmal angezeigt werden
	divEle.style.visibility = "visible";
	divEle.style.display = "block";
	setCurrLine(-1);
	// jetzt noch den Startwert merken
	storeStartValue();
}

function getCorrectedRowNr(rownr)
{
	var didyou = document.getElementById("didyoumean");
	if (!didyou)
		return rownr;

	if (did_you_mean_row == rownr)
		return -1;

	if (did_you_mean_row < rownr)
		return rownr - 1;

	return rownr;
}

function getCurrLine()
{
	var zObject = document.getElementsByName("sugline")[0];
	var value = parseInt(zObject.value);
	return value;
}

function getCurrRows()
{
	var zObject = document.getElementsByName("sugcountrows")[0];
	var value = parseInt(zObject.value);
	return value;
}

function setCurrLine(value)
{
	var zObject = document.getElementsByName("sugline")[0];
	zObject.value = value;
}

// Highlighten der aktuellen Cursorposition und Uebernahme des Inhaltes
function setFocusToZeile(nDirection)
{	
	if (document.getElementById("jurissuggestdiv").style.visibility != "visible")
		return false;

	var curZeile = getCurrLine();
	var aktZeile = curZeile + nDirection;

	if (aktZeile < rows.length && aktZeile > -1)
	{
		// der Focus kann auf einen gueltigen Bereich gesetzt werden
		var aktRow = rows[aktZeile];

		// merke den letzten Inputwert
		if (curZeile == -1)
		{
			// bei einem erneutem reinspringen in einer sichtbaren Tabelle muss
			// der Wert neu gesetzt werden
			storeStartValue();
		}
		// wechsle die Hintergrundfarbe
		if (curZeile > -1)
			changeBG(rows[curZeile], false);

		changeBG(aktRow, true);

		// setze den Wert
		setSuggestInputField(document.getElementById(suggestPortalInputField), aktZeile);

		// setze die Zeile
		setCurrLine(aktZeile);
		return true;
	}

	if (aktZeile == -1)
	{
		// dann setze den Wert auf den Ursprungswert
		restoreStartValue();
		// wechsel Hintergrundfarbe
		changeBG(rows[curZeile],false);
		// setze die Zeile
		setCurrLine(aktZeile);
	}

	return true;
}

function setSuggestInputField(iField,rowNr)
{
	iField.value = valuesArray[rowNr];
	iField.focus();
	setSearchLock(iField, rubricsArray[rowNr]);	
}

// Inhalt und Rubrik des Eingabefelds sichern
function storeStartValue()
{
	var inputEle = document.getElementById(suggestPortalInputField);
	document.getElementsByName("sugstart")[0].value = inputEle.value;
	startRubric = getSearchLock(inputEle);
}

// Inhalt und Rubrik des Eingabefelds wiederherstellen
function restoreStartValue()
{
	var inputEle = document.getElementById(suggestPortalInputField);
	inputEle.value = document.getElementsByName("sugstart")[0].value;
	setSearchLock(inputEle, startRubric);
	inputEle.focus();
}

// Ermitteln, welche Rubrik f�r das Eingabefeld zuletzt festgelegt wurde
function getSearchLock(fieldEle)
{
	lockEle = getLockEle(fieldEle);
	if (lockEle)
		return lockEle.value;
	return "";
}

// Die �ber Suggest getroffene Auswahl als Hidden-Parameter f�r das aktuelle
// Eingabefeld festsetzen
function setSearchLock(fieldEle, rubricID)
{
	lockEle = getLockEle(fieldEle);
	if (lockEle)
		lockEle.value = rubricID;
}

// Fuer das Eingabefeld das hidden-field ermitteln, in der die Rubrik fuer
// anschl. Suche festgesetzt wird
function getLockEle(fieldEle)
{
	var frm = fieldEle.form;
	var len = frm.length;
	var lockEle = undefined;
	// Das Suggest-Hidden-Field suchen, es muss vor dem Eingabefeld stehen!
	for(x=0; x<len; x++)
	{
		if(frm[x] == fieldEle)
			break;
		
		if(frm[x].type == "hidden" && frm[x].name.indexOf("sug_") > -1)
			lockEle = frm[x];
	}
	return lockEle;
}

function createNewevalTable(evalArray, insertObject, controlObject) 
{
	// Arrays mit Werten fuer die Suche loeschen
	rubricsArray = new Array();
	valuesArray = new Array();

	// dann berechne jeden einzelnen Ausdruck, Test fuer eine Zeile
	for (i=0; i < evalArray.length; i++)
		eval(evalArray[i]);
}

var rows = new Array();
function getRows()
{
	var table = document.getElementById("jurissuggest");
	var all = table.rows;
	rows = new Array();
	for (var i = 0; i < all.length; i++)
	{
		if (all[i].getAttribute("id") == "didyoumean")
			continue;

		rows[rows.length] = all[i];
	}
}

// erzeuge ein neues HTML-Element
function createNewElement(element, ltext, refObject)
{
	// element z.B.= "strong", ltext = zugeh�riger Textknoten, refObject =
	// Knoten wird Kind dieses Objekts
	var ele = document.createElement(element);
	var textnode;

	if (ltext != null)
	{
		// dann erzeuge noch einen Textknoten
		textnode = document.createTextNode(ltext);
		ele.appendChild(textnode);
	}

	refObject.appendChild(ele);
	return ele;
} 

// erzeuge ein neues Element-Attribut
function createNewAttribut(type, value, refObject)
{
	// type z.B. = "class", value = Attributwert z.B. "css-Klassenname",
	// refObject = Knoten wird Kind dieses Objekts
	var att = document.createAttribute(type);

	if (value != null)
	{
		// dann erzeuge den Knotenwert
		att.nodeValue = value; 
	}

	refObject.setAttributeNode(att);
	return att;
} 

// Werte, die f�r die Suche ben�tigt werden, f�r eine Suggest-Zeile speichern
function storeSearchData(rubric, value)
{
	rubricsArray[rubricsArray.length] = rubric;
	valuesArray[valuesArray.length] = value;
}

function createNewhtmlTable(htmlArray, insertObject) 
{
	// Einfuegen von fertigem HTML-Code
	// leider gibe es keine Moeglichkeit beim IE auf das innerHTML-Objekt von
	// Tabellentraegen zuzugreifen
	insertObject.innerHTML = "";
	for (i=0; i < htmlArray.length; i++)
	{
		// dann berechne jeden einzelnen Ausdruck, Test f�r eine Zeile
		var hilf = insertObject.innerHTML + htmlArray[i] + "\n";
		insertObject.innerHTML =  hilf;
	}
}		


function closeSuggestTable()
{
	var dObject = document.getElementById("jurissuggestdiv"); 
	var tObject = document.getElementById("jurissuggest");
	if (dObject.style.visibility == "visible")
	{
		setCurrLine(-1);
		// haenge die eventListener wieder ab
		removeEventList(tObject);
		// Div aus Fenster schieben, damit Eingabefelder nicht �berlagert
		// werden.
		dObject.style.visibility = "hidden";
		dObject.style.display = "none";
	}
}

// falls Fehler ausgegeben werden m�chten, sollte dies hier geschehen, da diese
// Funktion an den Errorhandler gebunden wird
function doErrorAusgabe(wert)
{
	//console.log(wert);
}


function handleOutput(event)
{
	// das Inputfeld wird verlassen, Frage: Weshalb ? Tab , Mouseevent in der
	// Tabelle oder ausserhalb usw.
	// da nach dem Schlie�en der Tabelle die Mauseevents dieser abgeh�ngt
	// werden, darf das Schlie�en erst verz�gert eintreten um evt. noch ein
	// Clickevent auf der Tabelle zu garantieren
	if (!lockTable)
		window.setTimeout("closeSuggestTable()",300);
	else
		lockTable = false;
}

function toggleSuggestActive()
{
	var elem = document.getElementsByName("sugactive")[0]
	if (elem.value == "true")
		elem.value = "false";
	else
		elem.value = "true";

	JurisAjaxUtils.toggleSuggest();		
}

function closeSuggest()
{
	// dann setze Suggest f�r die Session und die aktuelle Eingabe aus
	closeSuggestTable();
	document.getElementsByName("sugactive")[0].value = "false";
	JurisAjaxUtils.closeSuggest();
}

function showRes(result)
{
	if(result != null)
	{
		document.getElementById("jurisSuggestSelectionDiv").style.visibility = "visible";
		document.getElementById("jurisSuggestSelectionDiv").style.display = "block";
		dwr.util.removeAllOptions("jurisSuggestSelection");
		dwr.util.addOptions("jurisSuggestSelection",result);
	}
	else
	{
		document.getElementById("jurisSuggestSelectionDiv").style.visibility = "hidden";
		document.getElementById("jurisSuggestSelectionDiv").style.display = "none";
	}
}

function jurisSuggest(keyEvent)
{
	if (!keyEvent)
		keyEvent= window.event;

	if (keyEvent && keyEvent.keyCode)  
	{
		// escape
		if(keyEvent.keyCode == 27)
		{
			document.getElementById("jurisSuggestSelectionDiv").style.visibility = "hidden";
			document.getElementById("jurisSuggestSelectionDiv").style.display = "none";
		}
		// Pfeil nach unten
		else if(keyEvent.keyCode == 40)
		{
			document.getElementById("jurisSuggestSelection").options[0].selected=true;
			document.getElementById("jurisSuggestSelection").focus();
		}

		else if((keyEvent.keyCode >= 48 && keyEvent.keyCode <= 90)||(keyEvent.keyCode >= 96 && keyEvent.keyCode <= 111)||(keyEvent.keyCode >= 186 && keyEvent.keyCode <= 192)||(keyEvent.keyCode >= 219 && keyEvent.keyCode <= 222))
		{
			JurisAjaxUtils.getFilenumbers(DWRUtil.getValue("fastsearchquery"),showRes);
		}
	}
}

function jurisClickSubmit(inputField)
{
	document.getElementById("jurisSuggestSelectionDiv").style.visibility = "hidden";
	document.getElementById("jurisSuggestSelectionDiv").style.display = "none";
	document.getElementById(inputField).value=document.getElementById('jurisSuggestSelection').options[document.getElementById('jurisSuggestSelection').selectedIndex].value;document.searchForm.submit();
}

function jurisKeydownSubmit(keyEvent,inputField)
{
	if (!keyEvent)
	{
		keyEvent= window.event;
	}
	if (keyEvent && keyEvent.keyCode)  
	{
		// return
		if (keyEvent.keyCode == 13)
		{
			document.getElementById("jurisSuggestSelectionDiv").style.visibility = "hidden";
			document.getElementById("jurisSuggestSelectionDiv").style.display = "none";
			document.getElementById(inputField).value=document.getElementById('jurisSuggestSelection').options[document.getElementById('jurisSuggestSelection').selectedIndex].value;document.searchForm.submit();
		}
		// escape
		else if (keyEvent.keyCode == 27)
		{
			document.getElementById("jurisSuggestSelectionDiv").style.visibility = "hidden";
			document.getElementById("jurisSuggestSelectionDiv").style.display = "none";
		}
	}
}

function setJavaScriptActive()
{
	JurisAjaxUtils.setJavaScriptActive();
}

// Abmessungen eines Objekts (links, rechts, Breite, H�he) feststellen
function getObjCoords(o) 
{
	var coords =  new Object();
	coords.left = 0;
	coords.top = 0;
	coords.width = 0;
	coords.height = 0;

	try 
	{
		if (o.offsetParent)
		{
			coords.width = o.offsetWidth;
			coords.height = o.offsetHeight;
			while(o)
			{
				coords.left += o.offsetLeft;
				coords.top += o.offsetTop;
				o = o.offsetParent;
			}
		}
		else if (o.x) 
		{
			coords.left = o.x;
			coords.top = o.y;
			coords.width = o.width;
			coords.height = o.height;
		}
	}
	catch(error) 
	{
	}
	return coords;
}


// Funktion zum Setzen des Attributs Autocomplete auf off, wegen Validierung
// notwendig
function setAutocompletteOff(id)
{
	var refObject = document.getElementById(id);

	if (refObject != null)
		createNewAttribut("autocomplete","off", refObject);
}


// Pushdienste
function showNewItems(id, newItems) {
	var select = document.getElementById(id);
	for ( var i = select.options.length-1; i >= 0; i--) {
		select.options[i] = null;
	}
	
	if (document.all) { // IE
		for ( var i = 0; i < newItems.length; i++) {
			select.options[i] = new Option(newItems[i], newItems[i]);
		}
	} else {
		for ( var i = 0; i < newItems.length; i++) {
			var option = document.createElement('option');
			option.text = '' + newItems[i];
			option.value = newItems[i];
			select.appendChild(option);
		}
	}
}

function showServices(newServices) {
	var table = document.getElementById('Services');
	for(var i = table.rows.length; i > 0;i--)
	{
		table.deleteRow(i-1);
	}
	
	if (newServices.length == 0) {
		var row = table.insertRow(0);
		var cell = document.createElement("td");
		var valn = document.createAttribute("valign");
		valn.nodeValue="top";
		cell.setAttributeNode(valn);
		cell.style.paddingBottom="15px";
		cell.style.backgroundColor = "#EEE";
		var textOfCell = document.createTextNode("Es sind keine passenden Informationsdienste verfügbar.");
		cell.appendChild(textOfCell);
		row.appendChild(cell);
	} else {
		for ( var i = 0; i < newServices.length; i++) {
			var attributes = newServices[i].split("|");
			var row = table.insertRow(i);
			var cell = document.createElement("td");
			
			var valn = document.createAttribute("valign");
			valn.nodeValue="top";
			cell.setAttributeNode(valn);
			cell.style.paddingBottom="15px";
			cell.style.backgroundColor = (i % 2 == 0) ? "#EEE" : "";
			
			var checkbox = document.createElement("input");
			checkbox.type ='checkbox'
			checkbox.name='pushservice';
			checkbox.value=attributes[1];
			cell.appendChild(checkbox);
			
			var textOfCell = document.createTextNode(attributes[0]);
			cell.appendChild(textOfCell);
			
			if(attributes[2]!="")
			{
				var description = document.createTextNode(attributes[2]);
				cell.appendChild(document.createElement("br"));
				cell.appendChild(description);
			}
			cell.appendChild(document.createElement("br"));
			
			var update = document.createTextNode("Update: ");
			cell.appendChild(update);
			
			var strong = document.createElement("strong");
			var updateText = document.createTextNode(attributes[3]);      
			strong.appendChild(updateText);
			
			cell.appendChild(strong);
			row.appendChild(cell);
		}
	}
}

function handleEvent(id) {
	var option;
	var field;
	var subject;
	var word;
	
	if (id == 'rechercheauswahl') {
		option = getComboValue(id);
		updateFields(option);
		updateSubjects(option, field);
	} else if (id == 'rechtsgebiete') {
		option = getComboValue('rechercheauswahl');
		field = getComboValue(id);
		updateSubjects(option, field);
	} else if (id == 'themengebiete') {
		option = getComboValue('rechercheauswahl');
		field = getComboValue('rechtsgebiete');
		subject = getComboValue(id);
	} else {
		option = getComboValue('rechercheauswahl','');
		field = getComboValue('rechtsgebiete','');
		subject = getComboValue('themengebiete','');
		word = getInputValue(id);
	}
		
	updateServices(option, field, subject, word);
}

function updateFields(option) {
	JurisAjaxUtils.getFields(option,
	{ callback: function(newItems) {
		showNewItems('rechtsgebiete', newItems);},
		errorHandler:doErrorAusgabe,
		timeout:3000
	});
}

function updateSubjects(option, field) {
	JurisAjaxUtils.getSubjects(option, field,
	{ callback: function(newItems) {
		showNewItems('themengebiete', newItems);},
		errorHandler:doErrorAusgabe,
		timeout:3000
	});	
}

function updateServices(option, field, subject, word) {
	JurisAjaxUtils.getServices(option, field, subject, word,
	{ callback: function(array) {
		showServices(array);},
		errorHandler:doErrorAusgabe,
		timeout:3000
	});
}

function getComboValue(id, reset) {
	var refObject = document.getElementById(id);

	if (refObject == undefined) {
		return null;
	}
	
	var value;
	if (refObject.selectedIndex != 0) {
		value = refObject.options[refObject.selectedIndex].value;
	}
	
	if (reset == undefined) {
		document.getElementById('stichwort').value = "";
	}

	return value;
}

function getInputValue(id) {
	var refObject = document.getElementById(id);
	
	var value;
	if (refObject != null) {
		value = refObject.value;
	}

	return value;
}

