/*
 * (c) fairtec Kommunikationstechnik GmbH Bremen
 */

/*
	Pruefe, ob das Event durch die <Enter>-Taste ausgeloest wurde
*/
function isEnterEvent(ev) {
	return (ev && ev.type && ev.type == "keyup" && ((ev.keyCode && ev.keyCode == 13) || (ev.which && ev.which == 13)));
}

/*
	Formular abschicken, falls Enter-Taste gedrueckt wurde.
	Folgenden Code unveraendert in das <form> oder ein <input>-Tag einfuegen:
		onKeyup="submitOnEnter(this,event);"
	Falls angegeben wird vor dem Abschicken die Funktion validate mit dem <form>-Objekt als Parameter aufgerufen
	und das Formular nur abgeschickt, wenn diese true zurueckgibt.
*/
function submitOnEnter(obj,ev,validate) {
	if (!ev)
		ev = window.event;
	if (isEnterEvent(ev)) {
/*
		var f = obj.form;
		while (f && f.nodeName.toLowerCase() != "form") {
			f = f.parentNode;
			if (f && (f.nodeName.toLowerCase() == "td" || f.nodeName.toLowerCase() == "tr" || f.nodeName.toLowerCase() == "tbody")) {
				// Suche <form> "zwischen den Zeilen"
				var tb = f;
				while (tb && tb.nodeName.toLowerCase() != "form")
					tb = tb.previousSibling;
				if (tb)
					f = tb;
			}
		}
*/
		var f = obj.nodeName.toLowerCase() == "form" ? obj : obj.form;
		if (f) {
			if (validate && !validate(f))
				return false;
			f.submit();
			return true;
		}
	}
	return false;
}

/*
	Zeige den Text aller gewaehlten select-Optionen in einer alert-Meldung an.
	Parameter:
	- elem: select-Objekt
	- msg: Überschrift
	- msgnone: Text, falls keine Optionen gewaehlt wurden
	- optgroupsep: Trennzeichen zwischen Option und übergeordneter OPTGROUP (sofern vorhanden), null = OPTGROUP ignorieren
*/
function showSelection(elem,msg,msgnone,optgroupsep) {
	var str = msg + "\n";
	var num = 0;
	for (var i=0; i<elem.options.length; i++) {
		if (elem.options[i].selected) {
			var group = "";
			if (optgroupsep != null && elem.options[i].parentNode.nodeName == 'OPTGROUP')
				group = elem.options[i].parentNode.label + optgroupsep;
			str += "- " + group + elem.options[i].text + "\n";
			num++;
		}
	}
	if (num == 0)
		str += msgnone + "\n";
	alert(str);
}

// Gibt einen String zurueck, dessen fuehrende und abschliessende "white-spaces" entfernt wurden.
function trim(val) {
	return val.replace(/^\s+/,'').replace(/\s+$/,'');
}

// entfernt aus dem "value" eines <input type="text"> fuehrende und abschliessende "white-spaces" und gibt zusaetzlich den neuen String zurueck
function trimInput(elem) {
	return (elem.value = trim(elem.value));
}

/*
	Durchsuche eine select-Box nach einem per input-Feld einzugebenden Wert.
	Parameter:
	- textid: "id" des <input type="text"> mit dem Suchtext
	- selectid: "id" des zu durchsuchenden <select>
	- msgid: "id" eines <span> oder <div>, in welches Statusmeldungen geschrieben werden oder "null", falls keine Meldung erwuenscht
	- msgfound: Auszugebender Statustext, falls der Suchtext gefunden wurde ("%d" kann als Platzhalter fuer die Trefferanzahl verwendet werden)
	- msgnotfound: Auszugebender Statustext, falls der Suchtext nicht gefunden wurde
	- submit: eine auszufuehrende Javascript-Anweisung, wenn die Enter-Taste gedrueckt wurde (Uebergabe analog zu setInterval()/setTimeout() als String, nicht als Funktionspointer!)
	Beispielcode:
		<script type="text/javascript">
			var SuDP = new selectSearch('SuchtextDP','SelectDP','StatusDP','%d Treffer zum Suchbegriff','nicht gefunden','document.suchform.submit()');
		</script>
		<form name="suchform">
			<input id="SuchtextDP" type="text" onkeyup="SuDP.first(event);">
			<input type="button" value="next" onclick="SuDP.next(event);">
			<div id="StatusDP">&nbsp;</div>
			<select id="SelectDP" name="DP">
				<!-- ... -->
			</select>
			<input type="submit" value="Suchen">
		</form>
*/
function selectSearch(textid,selectid,msgid,msgfound,msgnotfound,submit) {
	this.textid = textid;
	this.selectid = selectid;
	this.msgid = msgid;
	this.msgfound = msgfound;
	this.msgnotfound = msgnotfound;
	this.submit = submit;
	this.setText = function(txt) {
		if (!this.msgid) return;
		var txtobj = document.createTextNode(txt);
		var msgobj = document.getElementById(this.msgid);
		if (msgobj.hasChildNodes()) {
			msgobj.replaceChild(txtobj,msgobj.firstChild);
		} else {
			msgobj.appendChild(txtobj);
		}
	};
	this.setFound = function(num) {
		this.setText((num == 0) ? this.msgnotfound : this.msgfound.replace(/%d/, num));
	};
	this.search = function (ev,first) {
		if (!ev) ev = window.event;
		if (this.submit && isEnterEvent(ev)) {
			eval(this.submit);
			return;
		}
		var sel = document.getElementById(this.selectid);
		var str = document.getElementById(this.textid).value.toLowerCase();
		if (str == '') {
			this.setText('\u00A0');
			return;
		}
		var found = 0;
		var firsthit = -1;
		var nexthit = -1;
		for (i=(sel.options[0].value == '' ? 1 : 0); i<sel.options.length; i++) {
			if (sel.options[i].text.toLowerCase().indexOf(str) >= 0) {
				if (firsthit == -1)
					firsthit = i;
				if (nexthit == -1 && i > sel.selectedIndex)
					nexthit = i;
				found++;
			}
		}
		if (found > 0)
			sel.selectedIndex = (first || nexthit == -1) ? firsthit : nexthit;
		this.setFound(found);
	};
	this.first = function (ev) {
		this.search(ev,true);
	}
	this.next = function (ev) {
		this.search(ev,false);
	}
}

/*
	Neues Formular erzeugen und (versteckt) an das Dokument anhängen.
	Existiert ein Formular mit dieser ID bereits, wird es wiederverwendet. Position und Style bleiben
	unveraendert, aber action, method und target werden ueberschrieben sowie alle Kindknoten geloescht
	und neu angelegt!
	Parameter:
	- id: "id" des Formular, muß eindeutig sein bzw. auf ein vorhandenes oder vorher erzeugtes Formular verweisen!
	- action: "action"-Wert des Formular
	- method: "method"-Wert des Formular
	- target: "target"-Wert des Formular
	- elements: Assoziatives "Array" (mit 'new Object()' anlegen, nicht 'new Array()'!) der Formularfelder. Name des Array-Element = Name des Input-Element.
*/
function dynamicForm(id, action, method, target, elements) {
	var f = document.getElementById(id);
	if (f == null) {
		f = document.createElement("form");
		f.id = id;
		try {
			f.style.display = 'none';
		} catch (e) {
			// Workaround fuer IE 5 (neuere Versionen noch nicht getestet)
			f.setAttribute("style","display: none;");
		}
		document.body.appendChild(f);
	}
	f.action = action;
	f.method = method;
	f.target = target;
	f.enctype = 'application/x-www-form-urlencoded';
	var ch;
	while (ch = f.firstChild)
		f.removeChild(ch);
	for (var name in elements) {
		var e = document.createElement("input");
		e.setAttribute('type','hidden');
		e.setAttribute('name',name);
		e.setAttribute('value',elements[name]);
		f.appendChild(e);
	}
	return f;
}

/*
	Zeige nur eine bestimmte <optgroup> innerhalb einer <select>-Box an.

	Parameter:
	- idsel: ID der <select> Box
	- idgroup: ID der anzuzeigenden <optgroup> (null = alle anzeigen)
	- keepgroupless: true = alle <option> außerhalb einer <optgroup> immer anzeigen (z.B. fuer Single-Select der Punkt 'keine Auswahl'), false = ausschließlich passende <optgroup> anzeigen
*/
function showOptgroup(idsel,idgroup,keepgroupless) {
	var sel = document.getElementById(idsel);
	if (typeof cache_showOptgroup == 'undefined') {
		cache_showOptgroup = {};
		cache_showOptgroup_selected = {}; // IE Workaround: cloneNode() kopiert defaultSelected, defaultValue, defaultChecked nicht mit ...
	}
	if (typeof cache_showOptgroup[idsel] == 'undefined') {
		cache_showOptgroup[idsel] = sel.cloneNode(true);
		cache_showOptgroup_selected[idsel] = {};
		for (var i=0; i<sel.options.length; i++) {
			cache_showOptgroup_selected[idsel][sel.options[i].value] = sel.options[i].defaultSelected;
		}
	}
	var cache = cache_showOptgroup[idsel];
	while (sel.hasChildNodes())
		sel.removeChild(sel.firstChild);
	for (var i=0; i<cache.childNodes.length; i++) {
		var elem = cache.childNodes[i];
		if (elem.nodeType != 1)
			continue;
		if (elem.nodeName.toUpperCase() == 'OPTGROUP' && (idgroup == null || elem.id == idgroup)) {
			sel.appendChild(elem.cloneNode(true));
		} else if (elem.nodeName.toUpperCase() == 'OPTION' && keepgroupless) {
			sel.appendChild(elem.cloneNode(true));
		}
	}
	for (var i=0; i<sel.options.length; i++) { // IE Workaround: getrennt gespeicherten defaultSelected zurueckkopieren
		sel.options[i].defaultSelected = cache_showOptgroup_selected[idsel][sel.options[i].value];
		sel.options[i].selected = sel.options[i].defaultSelected;
	}
}

