//
// JavaScript-Datei mit Funktionen die im Zusammenhang mit der 
// JavaServer Faces Components Tag Library verwendet werden.
// <p>
// </p>
// Diese JavaScript-Datei benoetigt die Prototype-Library in der Version 1.4.0.
//

var hint_delta_x = 0;
var hint_delta_y = 0;

// -- form methods -----------------------------------------------------------

//
// Selektiert das Element mit der uebergebenen ID.
//
// @param id ID.
//
function select(id) {
	var element = $(id);
	if (!element.disabled) {
		element.checked = true;
	}
}

//
// Deselektiert das Element mit der uebergebenen ID.
//
// @param id ID.
//
function deselect(id) {
	var element = $(id);
	if (!element.disabled) {
		element.checked = false;
	}
}

//
// Aendert die Selektion des Elementes mit der uebergebenen ID.
//
// @param id ID.
//
function toggleSelect(id) {
	var element = $(id);
	if (!element.disabled) {
		element.checked = !element.checked;
	}
}

//
// Wenn der Benutzer auf die Select-All-Checkbox klickt, werden alle
// zugehoerigen Checkboxen ebenfalls selektiert/deselektiert.
//
// @param checkboxElement Select-All-Checkbox.
//
function selectAllRowsClicked(checkboxElement) {
	if (checkboxElement) {
		var checkboxName = checkboxElement.name;
		var checkboxNamePrefix = checkboxName.substring(0,
				checkboxName.length - 11); // selectAllCB
		var checkboxNamePrefix2 = checkboxName.substring(0, checkboxName
				.indexOf("tableComponent"));

		var form = checkboxElement.form;
		for ( var i = 0; i < form.length; i++) {
			var element = form.elements[i];

			// Alle zugehoerigen Checkboxen selektieren/deselektieren.
			if (element.type == "checkbox" && element != checkboxElement) {
				if (element.name.indexOf(checkboxNamePrefix) >= 0) {
					element.checked = checkboxElement.checked;
				}
			}

			// Zusätzlich das zugehörige Hidden-Field setzen.
			if (element.type == "hidden") {
				if (element.name.indexOf(checkboxNamePrefix2) >= 0) {
					if (element.name.indexOf("selectAllHidden") >= 0) {
						if (checkboxElement.checked)
							element.value = "checked";
						else
							element.value = "unchecked";
					}
				}
			}
		}
	}
}

//
// Wenn der Benutzer auf eine Select-Row-Checkbox klickt, wird die
// Select-All-Checkbox deselektiert.
//
// @param checkboxElement Select-Row-Checkbox.
//
function selectRowClicked(checkboxElement) {
	if (checkboxElement) {
		var checkboxName = checkboxElement.name;
		var checkboxNamePrefix = checkboxName.substring(0, checkboxName
				.indexOf("tableComponent") + 14); // tableComponent

		// Behebt einen Bug in Firefox: wenn der Benutzer auf die Checkbox
		// klickt
		// werden zwei Events ausgelöst. Das eine Event von der Checkbox, das
		// andere Event von der zugehörigen Tabellenzelle. Da zwei Events
		// aufgerufen werden, wird der Selektionsstatus zweimal geändert, bleibt
		// also letztendlich unverändert. Um dies zu korrigieren, noch ein Event
		// senden. Opera und IE haben damit keine Probleme, dort wird nur ein
		// Event aufgerufen.
		checkboxElement.click();

		var form = checkboxElement.form;
		for ( var i = 0; i < form.length; i++) {
			var element = form.elements[i];
			if (element.type == "checkbox" && element != checkboxElement) {
				if (element.name.indexOf(checkboxNamePrefix) >= 0) {
					if (element.name.indexOf("selectAllCB") >= 0) {
						element.checked = false;
						break;
					}
				}
			}
		}
	}
}

//
// Wenn der Benutzer auf eine Zelle innerhalb einer Tabelle klickt, wird
// überprüft, ob die Zeile der Zelle ein CheckBox-Element beinhaltet. Ist dies
// der Fall, so wird das CheckBox-Element angeklickt. Funktioniert auch für
// RadioButton-Elemente.
//
// @param tdElement TD-Element der Tabelle.
//
function tableColClicked(tdElement) {
	if (tdElement) {
		var tableRowElement = tdElement.parentNode;
		for ( var i = 0; i < tableRowElement.childNodes.length; i++) {
			var tableCellElement = tableRowElement.childNodes[i];
			for ( var j = 0; j < tableCellElement.childNodes.length; j++) {
				var element = tableCellElement.childNodes[j];
				var elementName = element.name;
				if (elementName) {
					if (elementName.indexOf("_RSR") >= 0) {
						if (!element.disabled) {
							element.click();
							return true;
						}
					}
				}
			}
		}
	}
}

//
// Initialisiert alle Eingabefelder innerhalb eines Form-Objektes.
//
function prepareFormElements(node) {
	if (node) {
		if (node.childNodes) {
			for ( var i = 0; i < node.childNodes.length; i++) {
				prepareFormElements(node.childNodes[i]);
			}
		}

		if (node.form) {
			// Es werden nur alle Elemente innerhalb eines Forms benötigt.

			if (node.type == "text" || node.type == "password"
					|| node.type == "checkbox" || node.type == "file") {
				// Es werden nur alle Textfelder benötigt.
				prepareFormElementEvents(node);
			} else if (node.nodeName == "SELECT") {
				// Es werden nur alle Select-Felder benötigt.
				prepareFormElementEvents(node);
			} else if (node.nodeName == "TEXTAREA") {
				// Es werden nur alle Textarea-Felder benötigt.
				prepareFormElementEvents(node);
			}
		}
	}

}

//
// 
//
function prepareFormElementEvents(node) {
	// TODO (HQ) : Implementierung in Abstimmung mit den anderen
	// Style-Attributen.

	if (node) {
		if (!node.onfocus) {
			node.onfocus = function() {
				// this.style.backgroundColor = "yellow";
				// this.style.border="1px solid gray";
			};
		}

		if (!node.onblur) {
			node.onblur = function() {
				// this.style.backgroundColor = "white";
				// this.style.border="1px solid gray";
			};
		}
	}
}

// -- scroll position methods ------------------------------------------------

//
// Setzt die innerhalb des Dokumentes gespeicherte Scroll-Position für die
// angezeigte Seite. Muss innerhalb des onload-Events des BODY-Tags gesetzt
// werden.
//
function setScrollPosition() {
	setScrollPositionImpl(document);
}

//
// Interne Implementierung des Setzens der gespeicherten Scroll-Position.
//
// @param node Knotenelement von dem aus die Suche nach dem Hidden-Field
// gestartet werden soll, in dem die Scroll-Position gespeichert ist.
//
function setScrollPositionImpl(node) {
	if (node) {
		if (node.form && node.value) {
			if (node.value.indexOf("_SHE_") >= 0) {
				var scrollPos = node.value;
				if (scrollPos) {
					var i = scrollPos.indexOf(",");
					var scrollX = scrollPos.substring(5, i);
					var scrollY = scrollPos.substring(i + 1, scrollPos.length);
					window.scrollTo(scrollX, scrollY);
					return;
				}
			}
		}

		if (node.childNodes) {
			for ( var i = 0; i < node.childNodes.length; i++) {
				setScrollPositionImpl(node.childNodes[i]);
			}
		}
	}
}

//
// Setzt die innerhalb des Dokumentes gespeicherte Scroll-Position für die
// angezeigte Seite. Muss innerhalb des onload-Events des BODY-Tags gesetzt
// werden.
//
// @param divId ID des DIV-Elements über das die Scroll-Position bestimmt wird.
// Muss dann verwendet werden, wenn nur ein innerer Bereich der Seite gescrollt
// wird.
//
function setScrollPositionFor(divId) {
	var div = $(divId);
	if (div) {
		setScrollPositionForImpl(div, document);
	}
}

//
// Interne Implementierung des Setzens der gespeicherten Scroll-Position.
//
// @param node Knotenelement von dem aus die Suche nach dem Hidden-Field
// gestartet werden soll, in dem die Scroll-Position gespeichert ist.
//
function setScrollPositionForImpl(div, node) {
	if (node) {
		if (node.form && node.value) {
			if (node.value.indexOf("_SHE_") >= 0) {
				var scrollPos = node.value;
				if (scrollPos) {
					var i = scrollPos.indexOf(",");
					div.scrollLeft = scrollPos.substring(5, i);
					div.scrollTop = scrollPos
							.substring(i + 1, scrollPos.length);
					return;
				}
			}
		}

		if (node.childNodes) {
			for ( var i = 0; i < node.childNodes.length; i++) {
				setScrollPositionForImpl(div, node.childNodes[i]);
			}
		}
	}
}

//
// Speichert die aktuelle Scroll-Position der Seite in einem Hidden-Field, um
// bei erneutem Seitenaufruf die Scroll-Position wieder herstellen zu können.
// Muss innerhalb des onsubmit-Events des BODY-Tags gesetzt werden.
//
function storeScrollPosition() {
	var scrollX = 0;
	if (window.pageXOffset)
		scrollX = window.pageXOffset;
	else
		scrollX = document.body.scrollLeft;

	var scrollY = 0;
	if (window.pageYOffset)
		scrollY = window.pageYOffset;
	else
		scrollY = document.body.scrollTop;

	var scrollPos = scrollX + "," + scrollY;
	storeScrollPositionImpl(document, scrollPos);
}

//
// Speichert die aktuelle Scroll-Position der Seite in einem Hidden-Field, um
// bei erneutem Seitenaufruf die Scroll-Position wieder herstellen zu können.
// Muss innerhalb des onsubmit-Events des BODY-Tags gesetzt werden.
//
// @param divId ID des DIV-Elements über das die Scroll-Position bestimmt wird.
// Muss dann verwendet werden, wenn nur ein innerer Bereich der Seite gescrollt
// wird.
//
function storeScrollPositionFor(divId) {
	var scrollX = 0;
	var scrollY = 0;

	var div = $(divId);
	if (div) {
		scrollX = div.scrollLeft;
		scrollY = div.scrollTop;
	}

	var scrollPos = scrollX + "," + scrollY;
	storeScrollPositionImpl(document, scrollPos);
}

//
// Interne Implementierung des Setzens der aktuellen Scroll-Position.
//
// @param node Knotenelement von dem aus die Suche nach dem Hidden-Field
// gestartet werden soll, in dem die aktuelle Scroll-Position gespeichert
// werden soll.
//
function storeScrollPositionImpl(node, scrollPos) {
	if (node) {
		if (node.form && node.value) {
			if (node.value.indexOf("_SHE_") >= 0) {
				node.value = "_SHE_" + scrollPos;
			}
		}

		if (node.childNodes) {
			for ( var i = 0; i < node.childNodes.length; i++) {
				storeScrollPositionImpl(node.childNodes[i], scrollPos);
			}
		}
	}
}

// -- collapsible header -----------------------------------------------------

//
// Wechselt den Status der CollapsibleHeader Komponente.
//
// @param imageId Id der Grafik die ausgetauscht werden soll.
// @param tableId Id des Tabellenelement, welches den Inhalt darstellt.
// @param titleSpanId Id der Titel-Komponente.
// @param collapsedTitleText Text der angezeigt wird, wenn der Inhalt nicht
// angezeigt wird.
// @param expandedTitleText Text der angezeigt wird, wenn der Inhalt angezeigt
// wird.
// 
function swapState(imageId, tableId, titleSpanId, collapsedTitleText,
		expandedTitleText) {
	var collapsed = false;

	var image = $(imageId);
	if (image) {
		var imageSrc = image.src;
		if (imageSrc && imageSrc.indexOf("ch_collapse.gif") >= 0) {
			image.src = "images/ch_expand.gif";
			collapsed = true;
		} else if (imageSrc && imageSrc.indexOf("ch_expand.gif") >= 0) {
			image.src = "images/ch_collapse.gif";
			collapsed = false;
		}
	}

	var table = $(tableId);
	if (table) {
		if (table.style) {
			if (table.style.display == "none") {
				table.style.display = "";
			} else {
				table.style.display = "none";
			}
		}
	}

	var titleSpan = $(titleSpanId);
	if (titleSpan) {
		if (collapsed)
			titleSpan.firstChild.nodeValue = collapsedTitleText;
		else
			titleSpan.firstChild.nodeValue = expandedTitleText;
	}
}

// -- validate methods -------------------------------------------------------

// TODO (HQ) : Die client-validate-Methoden verfeinern und in JSF Seiten
// verwenden.

//
// Ueberprueft beim Druecken einer Taste, ob es sich um einen nummerischen
// Wert handelt.
//
function checkNumberKeyPressed() {
	// keyCode == 43 : +
	// keyCode == 44 : ,
	// keyCode == 45 : -

	var keyCode = window.event.which;
	if (!keyCode) {
		keyCode = window.event.keyCode;
	}

	var fieldValue = window.event.srcElement.value;

	if (fieldValue.indexOf(',') != -1) {
		if (((keyCode >= 48 && keyCode <= 57) || keyCode || keyCode == 43 || keyCode == 45) == false) {
			window.event.keyCode = 0;
		}
	} else {
		if (((keyCode >= 48 && keyCode <= 57) || keyCode == 44 || keyCode == 43 || keyCode == 45) == false) {
			window.event.keyCode = 0;
		}
	}
}

//
// Ueberprueft beim Druecken einer Taste, ob es sich um einen ganzzahligen
// Wert handelt.
//
function checkIntegerKeyPressed() {
	// keyCode == 43 : +
	// keyCode == 44 : ,
	// keyCode == 45 : -

	var keyCode = window.event.which;
	if (!keyCode) {
		keyCode = window.event.keyCode;
	}

	var fieldValue = window.event.srcElement.value;

	if (((keyCode >= 48 && keyCode <= 57) || keyCode == 43 || keyCode == 45) == false) {
		window.event.keyCode = 0;
	}
}

// -- misc methods -----------------------------------------------------------

//
// Setzt die Durchsichtigkeit eines Elementes.
//
function setOpacity(element, opacity) {
	var style = element.style;
	style.opacity = (opacity / 100);
	style.MozOpacity = (opacity / 100);
	style.KhtmlOpacity = (opacity / 100);
	style.filter = "alpha(opacity=" + opacity + ")";
}

//
// HookIn-Methode für die autopostback-Methode. Kann innerhalb der verwendeten
// HTML Seite überschrieben werden, um weiteren JavaScript-Code vor dem
// Post Befehl auszuführen.
//
function autopostbackHookIn() {
	// Keine Implementierung an dieser Stelle. Kann innerhalb der verwendeten
	// HTML Seite überschrieben werden.
}

//
// Fuehrt ein Submit der Seite aus.
//
function autopostback(formId, hiddenId) {
	var hidden = $(hiddenId);

	var form = $(formId);

	// Aufruf der Hook-In Methode.
	autopostbackHookIn();

	// Wird für die Umstellung auf JDK 1.6.0 benötigt, da dort der Aufruf über
	// form.submit() nicht funktioniert.
	// var goButtonId = hiddenId.substring(0, hiddenId.length-6) + "go";
	// var goButton = $(goButtonId);
	// goButton.click();
	
	// IE Bug 3504 verhindert das mehrfach Submit des Formulars.
	if (hidden.value != 'true') {
		hidden.value = 'true';
		form.submit();
	}
	
}

//
// Fuehrt ein Submit der Seite aus.
//
function ajaxAutopostback(formId, hiddenId) {
	// var hidden = $(hiddenId);
	// hidden.value = 'true';
	//
	// var form = $(formId);

	// Aufruf der Hook-In Methode.
	autopostbackHookIn();

	doSubmitAJAX();
}

//
// HookIn-Methode für die submitAJAX-Methode. Kann innerhalb der verwendeten
// HTML Seite überschrieben werden, um weiteren JavaScript-Code vor dem
// Post Befehl auszuführen.
//
function doSubmitAJAXHookIn() {
	// Keine Implementierung an dieser Stelle. Kann innerhalb der verwendeten
	// HTML Seite überschrieben werden.
}

//
// Ausführung der ajaxAnywhere.submitAJAX() Implementierung.
//
function doSubmitAJAX() {
	// Aufruf der Hook-In Methode.
	doSubmitAJAXHookIn();

	ajaxAnywhere.submitAJAX();
}

// TODO (HQ) : Implementierung der JavaScript Methoden.
function showInvalidMessage(summary, detail) {
	alert(summary + "\n" + detail);
}

// -- event handling ---------------------------------------------------------

//
// Allgemeine Key Listener Implementierung mit dessen Hilfe beim Drücken der
// Enter-Taste ein Submit der Seite durchgeführt werden kann.
//
// Beispiel:
// FormSubmitKeyListenerHelper.addForm("SysEinst2");
//
var formSubmitKeyListenerHelperIdArray = new Array();
var FormSubmitKeyListenerHelper = {

	init : function() {
		// KeyListener registrieren.
		document.onkeydown = FormSubmitKeyListenerHelper.keyListener;
	},

	addForm : function(formId) {
		if (formId) {
			formSubmitKeyListenerHelperIdArray[formSubmitKeyListenerHelperIdArray.length] = formId;
		}
	},

	keyListener : function(event) {
		// Unterscheidung zw. W3C (Mozilla, Opera) und IE (MSIE).
	event = event || window.event;

	if (event.keyCode == 13) {
		// Auslöser bestimmen W3C (Mozilla, Opera) und IE.
		var targetElement = event.target || event.srcElement;

		// Mehrzeilige Textfelder ignorieren, da diese einen Zeilenumbruch
		// benötigen.
		if (targetElement.type == "textarea") {
			return;
		}

		// Zugehöriges Form-Objekt bestimmen.
		var targetForm = targetElement.form;

		// Submit nur dann aufrufen, wenn das Form-Objekt entsprechend
		// registriert
		// wurde.
		for ( var i = 0; i < formSubmitKeyListenerHelperIdArray.length; i++) {
			var formId = formSubmitKeyListenerHelperIdArray[i];
			if (targetForm.id.indexOf(formId) >= 0) {
				// Submit ausführen.
				targetForm.submit();
				return;
			}
		}
	}
}
};
FormSubmitKeyListenerHelper.init();

//
// Allgemeine Key Listener Implementierung mit dessen Hilfe beim Drücken der
// Enter-Taste ein Klick eines Buttons auf der Seite durchgeführt werden kann.
//
// Beispiel:
// ButtonClickKeyListenerHelper.addButton("buttonId", "filter");
//
// buttonId : Id des Buttons der gedrückt werden soll, wenn die Enter-Taste
// gedrückt wurde.
//
// filter : Teilstring der Ids der Elemente, die das Enter-Event auslösen
// können.
//

var buttonClickKeyListenerHelperIdArray = new Array();
var buttonClickKeyListenerHelperNamingContainerArray = new Array();
var ButtonClickKeyListenerHelper = {

	init : function() {
		// KeyListener registrieren.
	document.onkeydown = ButtonClickKeyListenerHelper.keyListener;
},

addButton : function(buttonId, namingContainer) {
	if (buttonId && namingContainer) {
		buttonClickKeyListenerHelperIdArray.push(buttonId);
		buttonClickKeyListenerHelperNamingContainerArray.push(namingContainer);
	}
},

keyListener : function(event) {
	// Unterscheidung zw. W3C (Mozilla, Opera) und IE (MSIE).
	event = event || window.event;

	if (event.keyCode == 13) {
		// Auslöser bestimmen W3C (Mozilla, Opera) und IE.
	var targetElement = event.target || event.srcElement;

	// Mehrzeilige Textfelder ignorieren, da diese einen Zeilenumbruch
	// benötigen.
	if (targetElement.type == "textarea") {
		return;
	}

	// Alle NamingContainer-Einträge durchlaufen und Vergleich mit Id des
	// Auslösers durchführen.
	for ( var i = 0; i < buttonClickKeyListenerHelperNamingContainerArray.length; i++) {
		var namingContainer = buttonClickKeyListenerHelperNamingContainerArray[i];
		if (targetElement.id.indexOf(namingContainer) >= 0) {
			var buttonId = buttonClickKeyListenerHelperIdArray[i];
			var button = $(buttonId);
			button.focus();
			button.click();
			return false;
		}
	}
}
}
};
ButtonClickKeyListenerHelper.init();

//
// Java-Script Implementierung für die TextCounter-Komponente.
//

var TextCounterHelper = {
	addInput : function(inputId) {
		if (inputId) {
			var input = $(inputId);

			input.onchange = TextCounterHelper.changeListener;
			input.onkeyup = TextCounterHelper.changeListener;
			TextCounterHelper.update(input);
		}
	},

	changeListener : function(event) {
		// Unterscheidung zw. W3C (Mozilla, Opera) und IE (MSIE).
	event = event || window.event;

	// Auslöser bestimmen W3C (Mozilla, Opera) und IE.
	var targetElement = event.target || event.srcElement;

	if (targetElement
			&& (targetElement.type == "textarea" || targetElement.type == "text")) {
		TextCounterHelper.update(targetElement);
	}
},

update : function(targetElement) {
	var targetOutputElementId = targetElement.id + "_counter";
	var targetOutputElement = $(targetOutputElementId);
	if (targetOutputElement) {
		var length = 0;
		var value = targetElement.value;
		if (value) {
			length = value.length;
		}
		targetOutputElement.innerHTML = length;
	}
	return;
}

}

//
// Choice Komponente
//

function enableChoiceObserving() {
	Event.observe(document, 'click', choiceDocumentClick);
}

function disableChoiceObserving() {
	Event.stopObserving(document, 'click', choiceDocumentClick);
	if (currentChoiceComponentId) {
		Choice.closeChoiceComponent(currentChoiceComponentId);
	}
}

function choiceDocumentClick(event) {
	if (currentChoiceComponentId) {
		// var currentChoiceComponent = $(currentChoiceComponentId + '_choice');

		var eventElement = $(Event.element(event));
		if (eventElement.descendantOf(currentChoiceComponentId + '_choice')) {
			//
		} else {
			disableChoiceObserving();
		}
	} else {
		disableChoiceObserving();
	}

}

var currentChoiceComponentId = null;
var Choice = {
	isChoiceState : function(id) {
		// state = true : opened
		// state = false : closed
		var choiceStateHidden = $(id + '_choice_state');
		return choiceStateHidden.value.indexOf('true') == 0;
	},

	//

	setChoiceStateHiddenValue : function(id, value) {
		// state = true : opened
		// state = false : closed
		var choiceStateHidden = $(id + '_choice_state');
		choiceStateHidden.value = value;
	},

	//

	isChoiceSingle : function(id) {
		var choiceStateSingle = $(id + '_choice_single');
		return choiceStateSingle.value.indexOf('true') == 0;
	},

	//

	initChoiceComponent : function(id, noneSelectedText, allSelectedText, disabled) {
		var choiceButton = $(id + '_choice_button');
		var choiceBox = $(id + '_choice_box');
		var choicePanel = $(id + '_choice_panel');
		var choiceTable = $(id + '_choice_table');
		var choiceTextbox = $(id + '_choice_textbox');

		if(!disabled)
		{
			choiceButton.onclick = function() {
				Choice.changeChoiceState(id, choicePanel, choiceButton,
						choiceTable, choiceBox);
			}
	
			choiceTextbox.onclick = function() {
				Choice.changeChoiceState(id, choicePanel, choiceButton,
						choiceTable, choiceBox);
			}
	
			choiceBox.onclick = function() {
				Choice.updateChoiceTextbox(id, noneSelectedText, allSelectedText);
			}
		}
		
		Choice.updateChoiceTextbox(id, noneSelectedText, allSelectedText);
	},

	// 

	changeChoiceState : function(id, choicePanel, choiceButton, choiceTable,
			choiceBox) {
		if (Choice.isChoiceState(id)) {
			choicePanel.style.display = 'none';
			choiceButton.className = 'choice_button_open';
			Choice.setChoiceStateHiddenValue(id, 'false');
		} else {
			choicePanel.style.display = 'block';
			choiceButton.className = 'choice_button_close';
			Choice.setChoiceStateHiddenValue(id, 'true');

			// Ermöglicht das Schließen der Komponente bei einem Event außerhalb
			// der Komponente.
			if (currentChoiceComponentId != id) {
				disableChoiceObserving();
				currentChoiceComponentId = id;
			}
			enableChoiceObserving();
		}

		// Breite der Komponente setzen, damit keine horizontale Scrollbar
		// angezeigt
		// wird.
		var tableWidth = choiceTable.offsetWidth + 30;
		choiceBox.style.width = tableWidth;
		choicePanel.style.width = tableWidth;

		return false;
	},

	updateChoiceTextbox : function(id, noneSelectedText, allSelectedText) {
		var choiceTextbox = $(id + '_choice_textbox');

		var text = "";
		var checkBoxInputElements = document.getElementsByName(id);
		if (checkBoxInputElements) {
			if (Choice.isChoiceSingle(id)) {
				for ( var i = 0; i < checkBoxInputElements.length; i++) {
					if (checkBoxInputElements[i].checked) {
						text = checkBoxInputElements[i].alt;
						break;
					}
				}
			} else {
				var noneSelected = true;
				var allSelected = true;
				for ( var i = 0; i < checkBoxInputElements.length; i++) {
					if (checkBoxInputElements[i].checked) {
						if (text.length != 0) {
							text = text.concat(', ');
						}
						text = text.concat(checkBoxInputElements[i].alt);

						noneSelected = false;
					} else {
						allSelected = false;
					}
				}

				if (noneSelectedText && noneSelected) {
					text = noneSelectedText;
				} else {
					if (allSelectedText && allSelected
							&& checkBoxInputElements.length > 1) {
						text = allSelectedText;
					}
				}
			}
		}
		choiceTextbox.value = text;
	},

	//

	clickChoiceEntry : function(id, value) {
		var checkBoxInputElements = document.getElementsByName(id);
		if (checkBoxInputElements) {
			if (Choice.isChoiceSingle(id)) {
				for ( var i = 0; i < checkBoxInputElements.length; i++) {
					checkBoxInputElements[i].checked = false;
				}
			}

			for ( var i = 0; i < checkBoxInputElements.length; i++) {
				if (checkBoxInputElements[i].value == value) {
					checkBoxInputElements[i].click();
					break;
				}
			}

			if (Choice.isChoiceSingle(id)) {
				Choice.closeChoiceComponent(id);
			}
		}
	},

	//

	closeChoiceComponent : function(id) {
		var choiceButton = $(id + '_choice_button');
		var choicePanel = $(id + '_choice_panel');

		choicePanel.style.display = 'none';
		choiceButton.className = 'choice_button_open';
		Choice.setChoiceStateHiddenValue(id, 'false');
	},

	//

	firstEntryChoiceComponentAllHandling : function(id, firstEntry) {
		var checkBoxInputElements = document.getElementsByName(id);
		if (checkBoxInputElements) {
			if (firstEntry) {
				checkBoxInputElements[0].checked = true;
				for ( var i = 1; i < checkBoxInputElements.length; i++) {
					checkBoxInputElements[i].checked = false;
				}
			} else {
				if (checkBoxInputElements[0].checked) {
					checkBoxInputElements[0].checked = false;
				} else {
					var elementChecked = false;
					for ( var i = 1; i < checkBoxInputElements.length; i++) {
						if (checkBoxInputElements[i].checked) {
							elementChecked = true;
							break;
						}
					}
					if (!elementChecked) {
						checkBoxInputElements[0].checked = true;
					}
				}
			}
		}
	}

};

//
// Deaktivierung der Buttons nach dem ersten Klick (für eine bestimmte
// Zeitspanne).
//

var disabledAfterSubmit = false;

var FormDisabledHelper = {
	disableByEvent : function(event) {
		if (disabledAfterSubmit) {
			event.preventDefault();
		} else {
			var form = Event.element(event);
			disabledAfterSubmit = true;
			window.setTimeout("FormDisabledHelper.enableAfterSubmit('"
					+ form.id + "')", 2000);
		}
	},

	enableAfterSubmit : function(formId) {
		disabledAfterSubmit = false;
	}
};

function addDisabledListener() {
	var formsInPage = document.forms;
	for ( var i = 0; i <= formsInPage.length; i++) {
		if (formsInPage[i]) {
			Event.observe(formsInPage[i], 'submit',
					FormDisabledHelper.disableByEvent
							.bindAsEventListener(FormDisabledHelper));
		}
	}
}

function addDisabledListeners(e) {
	addDisabledListener();
}

//
// Tab Komponente mit JavaScript Support.
//

function sel_tab(item)
{
	var cls = item.className.substr(item.className.search(/n\d\d/),3);
	if(item.className.search(/ tab_toptitle/) > 0) 
	{
		return;
	}
	
	var tabs = item.parentNode.parentNode.getElementsByTagName('DIV')[1].childNodes;	
	 	  
	for (n in tabs)
	{
		var elem = tabs[n];  	  
		if(elem.nodeName=='DIV')
		{
			if(elem.className.match(cls))
			{
				elem.className = elem.className +=' tab_toppage';
			}
			else
			{
				elem.className = elem.className.replace(/ tab_toppage/g,'')
			}
		}
	}
	for (n in item.parentNode.childNodes)
	{
		var elem = item.parentNode.childNodes[n];    
		if(elem.nodeName =='A') 
		{
			elem.className = elem.className.replace(/ tab_toptitle/,'');
			if(elem.className.match(cls)) 
			{ 
				elem.className += ' tab_toptitle';
			}
		} 
	}
}


//
// Shuttle Komponente mit JavaScript Support.
//

var ShuttleHelper = {

	allRight : function(button) {
		ShuttleHelper.move(button, 'leftListbox', 'rightListbox', true);
	},

	right : function(button) {
		ShuttleHelper.move(button, 'leftListbox', 'rightListbox', false);
	},

	left : function(button) {
		ShuttleHelper.move(button, 'rightListbox', 'leftListbox', false);
	},

	allLeft : function(button) {
		ShuttleHelper.move(button, 'rightListbox', 'leftListbox', true);
	},

	move : function(button, sourceListboxId, targetListboxId, selectedAll) {
		var prefixId = ShuttleHelper.getPrefixId(button);
		var sourceListbox = $(prefixId + sourceListboxId);
		var targetListbox = $(prefixId + targetListboxId);
		var targetMap = new Array();

		for (i = targetListbox.length - 1; i >= 0; i--) {
			targetMap[targetListbox.options[i].value] = targetListbox.options[i];
			targetListbox.options[i] = null;
		}

		for (i = sourceListbox.length - 1; i >= 0; i--) {
			if (selectedAll || sourceListbox.options[i].selected) {
				targetMap[sourceListbox.options[i].value] = sourceListbox.options[i];
				// targetListbox.options[targetListbox.length] =
				// sourceListbox.options[i];
				sourceListbox.options[i] = null;
			}
		}

		for (i = 0; i < targetMap.length; i++) {
			if (targetMap[i]) {
				targetListbox.options[targetListbox.length] = targetMap[i];
			}
		}
	},

	getPrefixId : function(button) {
		var buttonId = button.id;
		var prefixId = buttonId.substr(0, buttonId.lastIndexOf(':') + 1);
		return prefixId;
	}

};

//
// Allgemeine Hilfsklasse.
//

var ToolkitHelper = {
	//
	// Fügt das übergebene Element in das Array an die Stelle index ein.
	// Bestehende Elemente werden verschoben.
	//
	insertIntoArray : function(array, element, index) {
		var resultArray = new Array();
		if (array && index >= 0 && index <= array.length) {
			for ( var i = 0; i < index; i++) {
				resultArray[resultArray.length] = array[i];
			}

			resultArray[resultArray.length] = element;

			for ( var i = index; i < array.length; i++) {
				resultArray[resultArray.length] = array[i];
			}
		}
		return resultArray;
	}

};

//
// InputTextHelp Komponente.
//

var InputTextHelp = {
	resetHelpValue : function(helpText, id) {
		var element = $(id);
		if (element && element.value == helpText) {
			element.value = "";
		}
	},

	selectText : function(helpText, id) {
		var element = $(id);
		if (element && element.value == helpText) {
			element.select();
		}
	}

};

function simulateDisabled(inputField, disabled) {
	inputField.readOnly = disabled;
	if (disabled) {
		inputField.style.color = 'gray';
		inputField.style.backgroundColor = '#d4d0c8';
	} else {
		inputField.style.color = '';
		inputField.style.backgroundColor = '';
	}
};

/**
 * Über diese Funktion kann der halbtransparente IFrame und der zugehörige
 * Ladebalken sichtbar geschaltet werden.
 * 
 */
function openTransparentIFrame(text) {
	if (document.getElementById('transparentIFrame') != null
			&& document.getElementById('transparentIFrameText') != null
			&& document.getElementById('loadingBox') != null) {
		if (text != null) {
			document.getElementById('transparentIFrameText').innerHTML = text;
		}
		document.getElementById('transparentIFrame').style.display = 'block';
		document.getElementById('loadingBox').style.display = 'block';
	}
}

/**
 * Über diese Funktion kann der halbtransparente IFrame und der zugehörige
 * Ladebalken unsichtbar geschaltet werden.
 * 
 */
function closeTransparentIFrame() {
	if (document.getElementById('transparentIFrame') != null
			&& document.getElementById('transparentIFrameText') != null
			&& document.getElementById('loadingBox') != null) {
		document.getElementById('transparentIFrameText').innerHTML = '';
		document.getElementById('transparentIFrame').style.display = 'none';
		document.getElementById('loadingBox').style.display = 'none';
	}
}

// Funktionen für den Tooltip
var initialisierung = 0;
var e_x, e_y, titelFarbe, textFarbe, contentInfo;

titelFarbe = "#ffd43e";
textFarbe = "#fff2a9";

function getSize() {
	var myWidth = 0, myHeight = 0;
	if (typeof (window.innerWidth) == 'number') {
		// Non-IE
		myWidth = window.innerWidth;
		myHeight = window.innerHeight;
	} else if (document.documentElement
			&& (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
		// IE 6+ in 'standards compliant mode'
		myWidth = document.documentElement.clientWidth;
		myHeight = document.documentElement.clientHeight;
	} else if (document.body
			&& (document.body.clientWidth || document.body.clientHeight)) {
		// IE 4 compatible
		myWidth = document.body.clientWidth;
		myHeight = document.body.clientHeight;
	}
	return [ myWidth, myHeight ];
}

function doAktivieren() {
	initialisierung = 1;
}

function doDeaktivieren() {
	initialisierung = 0;
}

function doTooltipInit(e) {
	var tooltipElement = document.getElementById('tooltip');
	if (tooltipElement != null) {
		// Hack für den FF, um die Breitenbestimmung zu veranlassen.
		tooltipElement.style.width = "auto";
		if (initialisierung) {
			e_x = document.all ? window.event.x : e.pageX;
			e_y = document.all ? window.event.y : e.pageY;
			// empirischer Wert
			var breitenReserve = 90;
			var e_width = tooltipElement.offsetWidth;
			var e_height = tooltipElement.offsetHeight;

			var iFrameSize = getSize();
			var iFrameWidth = iFrameSize[0];
			var iFrameHeight = iFrameSize[1];
			var freierPlatzRechts = iFrameWidth - e_x - e_width
					- breitenReserve;
			if (freierPlatzRechts < 0) {
				// console.log('e_x='+e_x);
				// console.log('e_y='+e_y);
				// console.log('e_width='+e_width);
				// console.log('e_height='+e_height);
				// console.log('myWidth = ' + iFrameWidth );
				// console.log('myHeight = ' + iFrameHeight );
				// console.log('freierPlatzRechts= ' + freierPlatzRechts );

				// Den (negativen) Überstandwert abziehen
				e_x = e_x + freierPlatzRechts;
			}

			// Falls sich der Tooltip im einfachen Kalender Widget befindet
			// (Höhenanpassung nur für MSIE nötig).
			if (document.all
					&& e.srcElement.className
					&& e.srcElement.className
							.indexOf("einfacher_kalender_widget_tooltip") >= 0) {
				e_y = e_y + document.getElementById("scw_scb").offsetTop + 200;
				if (document.getElementById("main_div_content_area").scrollTop > 0) {
					e_y = e_y
							- document.getElementById("main_div_content_area").scrollTop;
				}
			}
			
			// Bug 3998
			if (!window.pageYOffset) {
				// Browserweiche: Für IE nötig
				// Im Portal wird der DIV gescrollt, im Backend die ganze Seite
				e_y = e_y + document.body.scrollTop;
			}
			
			// Wenn der Kalender in der rechten Toolbar liegt
			if (document.getElementById("toolbarRight:toolbarRightForm:scwpg") != null) {
				/*
				 * Breite des Tooltips = 190px. (Im SimpleCalendarWidget so
				 * angelegt). Ein Teil davon muss subtrahiert werden, da der
				 * Tooltip sonst rechts über den Rand des Layouts ragen würde
				 */
				if (document.all
						&& e.srcElement.className
						&& e.srcElement.className
								.indexOf("einfacher_kalender_widget_tooltip") >= 0) {
					e_x = e_x
							+ document.getElementById("toolbarRight_div").offsetLeft
							- 160;
				} else if (e.target.className
						&& e.target.className
								.indexOf("einfacher_kalender_widget_tooltip") >= 0) {
					e_x = e_x - 215;
				}
			}

			doTooltipBewegen("tooltip", e_y, e_x, e);
			tooltipElement.style.visibility = "visible";
		} else {
			doTooltipBewegen("tooltip", 0, 0);
			tooltipElement.style.visibility = "hidden";
		}
	}
}

function doTooltipBewegen(layerName, fromTop, fromLeft, e) {
	if (document.getElementById(layerName) != null) {
		var newTop = fromTop + (hint_delta_y ? hint_delta_y : 0);
		var newLeft = fromLeft + 15 + (hint_delta_x ? hint_delta_x : 0);
		document.getElementById(layerName).style.top = newTop;
		document.getElementById(layerName).style.left = newLeft;
	}
}

function doTooltip(layerName, tooltipTitel, tooltipInhalt, fontstyle,
		tablestyle) {
	doTooltip(layerName, tooltipTitel, tooltipInhalt, fontstyle, tablestyle, 0,
			0);
}

function doTooltip(layerName, tooltipTitel, tooltipInhalt, fontstyle,
		tablestyle, deltaX, deltaY) {
	hint_delta_x = deltaX;
	hint_delta_y = deltaY;
	// Falls Anführungszeichen im Text vorkommen, wurden diese vor Aufruf von
	// doTooltip mit @quot escaped. Hier erfolgt die Rückkonvertierung.
	tooltipInhalt = tooltipInhalt.replace(/@quot/g, "\"");
	tooltipTitel = tooltipTitel.replace(/@quot/g, "\"");

	if (tooltipTitel != '') {
		contentInfo = '<table border="0" cellspacing="0" cellpadding="0" class="tooltip_table main_border" style="'
				+ tablestyle
				+ '"><tr><td width="100%" class="tooltip_titel border_bottom">'
				+ tooltipTitel
				+ '</td></tr><tr><td width="100%" class="tooltip_inhalt" style="'
				+ fontstyle + '">' + tooltipInhalt + '</td></tr></table>';
	}
	// Wenn kein Titiel für den Tooltip übergeben wird, wird nur eine
	// Tabellenzeile mit dem Tooltipinhalt erstellt
	else {
		contentInfo = '<table border="0" cellspacing="0" cellpadding="0" class="tooltip_table main_border" style="'
				+ tablestyle
				+ '"><tr><td width="100%" class="tooltip_inhalt" style="'
				+ fontstyle + '">' + tooltipInhalt + '</td></tr></table>';
	}

	if (document.getElementById(layerName) != null) {
		document.getElementById(layerName).innerHTML = contentInfo;
		document.getElementById(layerName)
	}
}

function doClickByKeyPressed(event, login_button, targetType)
{
	var buttonElement = $(login_button);

	// Gedrückte Taste bestimmen.
	var keyCode = event.which;
	if(!keyCode)
	{
		keyCode = event.keyCode;
	}
	
	// Wenn es sich um die Return-Taste handelt, dann Berechnung ausführen.
	if(keyCode == 13)
	{
		if(buttonElement)
		{
		  buttonElement.focus();		  

		  if(targetType == 'commandButton')
		  {
			  buttonElement.click();
		  }
		  else if(targetType == 'commandLink')
		  {
			  fireEvent(buttonElement,'click');
		  }
		  else
		  {
			  console.log('function doClickByKeyPressed unknow targetType');
		  }
		}
		// false zurückgeben, damit das Event nicht weitergeleitet wird. 
		// Funktioniert so nicht mit Opera in der Version 9.
		return false;
	}
}