//	JavaScript Dokument, 2. Juni 2005
//	Funktionsbibliothek fuer die Verwaltung von Benutzereingaben auf der Client-Seite, wodurch
//	bereits eingegebene Formulardaten vom Anwender leicht korrigiert und ergaenzt werden koennen.
//	Aus Sicherheitsgruenden (Hacker-Angriff, deaktiviertes JavaScript) muss auch eine
//	Server-seitige Pruefung (PHP) vorgenommen werden.
//
//	Hauptfunktionen:
//		BOOLEAN	pruefeAnmeldung	(STRING,STRING,STRING)	Pruefung der Eingabedaten
//		VOID	uncheckAuswahl	(STRING,STRING )		Bedingte Deselektiert alle Option-Felder.
//		STRING	holeMultipleOptionen(STRING,STRING )	Liefert Inhalte selektierter Option-Felder
//		STRING	pruefeLeer	(STRING s)					"" oder "(leer)"
//		STRING	pruefeEmail	(STRING s)					"" oder Fehlerbeschreibung
//		STRING	pruefePlz	(STRING s)					"" oder Fehlerbeschreibung
//
//	Nebenfunktionen:
//		BOOLEAN	istLeer		(STRING s)				true oder false	
//		BOOLEAN	istEmail	(STRING s [,BOOLEAN])	true oder false	
//		BOOLEAN	istPlz		(STRING s)				true oder false	
//		STRING	erstelleAusgabenamen				Entfernt Doppelpunkte
//		STRING	interneFormularpruefung				Unterfunktion von pruefeAnmeldung
//

	//	Auf DOM-Bibliothek pruefen
if( typeof(window['DOM_JS']) == 'undefined' || DOM_JS == false ) {
	var text =	(typeof(glSprachspezifischeDaten) == 'object' &&
				 typeof(glSprachspezifischeDaten['FEHLER_BIBLIOTHEK_FEHLT']) != 'undefined')
					? glSprachspezifischeDaten['FEHLER_BIBLIOTHEK_FEHLT']
					: 'Bibliothek muss vorab geladen werden (File not loaded)!';
	alert('"DOM_JS" ' + text);
}
	//	Konstante zeigt die Verfuegbarkeit dieses Moduls an, wird am Ende auf true gesetzt.
var LIB_EINGABEMASKE_JS	= false;

//	BOOLEAN istLeer (STRING s)
//
//	Liefert true, wenn der Text leer ist

function istLeer ( text ) {
	return ((text == null) || (text.length == 0));
} // istLeer

//	BOOLEAN istEmail (STRING s [, BOOLEAN leerOK])
//
//	Simple Pruefung auf eine syntaktisch gueltige EMail-Adresse in der Form "a_40b.c"
//	* die Zeichen "@" und "." muessen vorhanden sein
//	* es muss mindestens ein Zeichen vor dem "@" sein
//	* es muss mindestens ein Zeichen vor und hinter dem "." stehen

function istEmail( text ) {

	//	Leere Texte abfangen.
	//	Ueber einen optionalen Parameter koennen auch leere Texte als gueltig akzeptiert werden.
	if( istLeer(text) ) {
		return (istEmail.arguments.length == 1)
				? false
				: istEmail.arguments[1] == true;
	}

	//	auf unerlaubte Zeichen pruefen
	var	 idx	= 0
		,azChar	= text.length
		,azAts	= 0
		,azDots	= 0
		,fehler	= false;
	while( idx < azChar && fehler == false ) {
		switch( text.charAt(idx) ) {
				//	"@" soll nur einmal vorkommen und nicht am Anfang oder Ende stehen
			case "@":
				if( azAts++ > 0 ||
					idx == 0 || idx == (azChar - 1)
				) {
					fehler = true;
				}
				break;
			case ".":
				//	"." soll nicht am Anfang oder Ende stehen, mehrere Dots sind erlaubt
				if( idx == 0 || idx == (azChar - 1)
				) {
					fehler = true;
				}
				++azDots;
				break;
				//	Leerzeichen, Tabulatoren, Zeilenumbrueche und html-Anweisungen sind nicht erlaubt.
			case " ":
			case "\t":
			case "\n":
			case "\r":
			case "<":
				fehler = true;
				break;
			default:
				break;
		}
		++idx;
	}	

	return	fehler == false && azAts == 1 && azDots > 0;
} // istEmail

//	BOOLEAN istPlz (STRING s [, BOOLEAN emptyOK])
//
//	Eine Postleitzahl besteht in Deutschland aus genau fuenf Ziffern.

function istPlz( text ) {
	if( istLeer(text) ) {
		return (arguments.length == 1)
				? false
				: arguments[1] == true;
	}

	var regExp = getSpeechData('PRUEFE_PLZ');
	switch( regExp ) {
		case '0':	// alles erlaubt, ausser leer
			return true;
			break;
		case '1':	// deutsche PLZ als ZZZZZ oder D-ZZZZZ
			regExp = /\d{5}|D\-\d{5}/g;
			break;
		case '2':	// Buchstaben a-z, Ziffern, Leer- und Trennzeichen, mind. 3 Stellen
			regExp = /[a-zA-Z0-9- ]{3,}/g;
			break;
		default:	// JS-RegExp String, als 2. Param. ist z.B. "ig" moeglich
			if( regExp.length < 3 ) return true;// zukuenftige Sonderkodes ignorieren
			regExp = new RegExp(regExp);
			break;
	}
	return text.match(regExp) == text;
} // istPlz

//	STRING pruefeLeer (STRING s)
//
//	Wenn der angegebene Text leer ist, wird als Fehlerbeschreibung "(leer)", andernfalls ein
//	Leertext ("") zurueckgeliefert.

function pruefeLeer(
			 inText
) {
	return	istLeer(inText) ? getSpeechData('FEHLER_EINGABE_LEER') : '';
} // pruefeLeer

//	STRING pruefeAusgewaehlt (Object s)
//
//	Prueft ob eine Checkbox ausgewaehlt/angekreuzt wurde.
//	(Anm. in diesem Fall unabhaengig vom DOM)

function pruefeAusgewaehlt ( inCheckbox ) {
	return	inCheckbox.checked
				? ''
				: getSpeechData('FEHLER_EINGABE_LEER');
} // pruefeAusgewaehlt

//	STRING pruefeEMail (STRING s)
//
//	Wenn der angegebene Text eine syntaktisch gueltige EMail-Adresse darstellt,
//	wird ein Leertext ("") zurueckgeliefert, andernfalls eine Fehlerbeschreibung.

function pruefeEMail(
			 inText
) {
	var fehler = pruefeLeer(inText);
	if ( fehler == "" && istEmail(inText) == false ) {
		fehler = getSpeechData('FEHLER_EINGABE_UNGUELTIG');
	}
	return fehler;
} // pruefeEMail

//	STRING pruefePlz (STRING s)
//
//	Wenn der angegebene Text eine syntaktisch gueltige Postleitzahl darstellt
//	("D-zzzzz", "zzzzz" etc.), wird ein Leertext ("") zurueckgeliefert,
//	andernfalls eine Fehlerbeschreibung.

function pruefePlz(
			 inText
) {
	var fehler = pruefeLeer(inText);
	if ( fehler == "" && istPlz(inText) == false ) {
		fehler = getSpeechData('FEHLER_EINGABE_UNGUELTIG');
	}
	return fehler;
} // pruefePlz

//	STRING	erstelleAusgabenamen ( STRING )
//
//	Entfernt Satz- und Leerzeichen, so dass z. B. aus "  eMail:*" "eMail" wird.

function erstelleAusgabenamen ( inName ) {
	var outName = "" + inName;
	if( outName == "" || outName == "undefined" ) return "";
	var idx = outName.length;
	if( idx-- ) {
			//	Textende von Leerzeichen, Doppelpunkten und Sternchen bereinigen
		var fertig = false;
		while( idx && !fertig ) {
			switch( outName.charAt(idx) ) {
				case ':':
				case '*':
				case ' ':
					--idx;
					break;
				default:
					fertig = true;
					break;
			}
		}
		outName = fertig ? outName.substr(0, idx + 1) : "";
			//	Textanfang von Leerzeichen und Sternchen bereinigen
		fertig = false;
		for(idx = 0; idx < outName.length && !fertig;) {
			switch( outName.charAt(idx) ) {
				case '*':
				case ' ':
					idx++;
					break;
				default:
					fertig = true;
					break;
			}
		}
		if( fertig && idx && idx < outName.length ) {
			outName = outName.substr(idx, outName.length - idx);
		}
			//	Text von fehlerhaften, bedingten Umbruechen bereinigen
		var text = outName;
		outName = '';
		for(idx = 0; idx < text.length;++idx) {
			if( text.charCodeAt(idx) != 173 ) outName += text.charAt(idx);
		}
	}
	return outName;
} // erstelleAusgabenamen

//	STRING	holeMultipleOptionen ( STRING (,INT oder ARRAY) ,STRING )
//
//	Liefert die Auswahl(en) eines select-option Bereichs als Aufzaehlung oder einen
//	Leertext ('').
//
//		inId		ID des select-Tags
//		inTrenner	Trennzeichen oder Text, ueblicherweise ','
//
//	Mittels der Abfrage 'if(holeMultipleOptionen(...) == '') ...' kann
//	geprueft werden, ob ueberhaupt etwas ausgewaehlt wurde.

function holeMultipleOptionen(
			 inId
			,inTrenner
) {
	var inObj	= getDocumentElementById(inId, false);
	var outText = '';
	for(var idx = 0; idx < inObj.options.length; idx++)
		with( inObj.options[idx] )
			if( selected ) {
				if( '' + value != '' ) {
					outText += inTrenner + value;
				} else
				if( '' + innerText != 'undefined' ) {
					outText += inTrenner + innerText;
				} else {
					outText += inTrenner + internGetChildData(inObj.options[idx]);
				}
			}
	return outText.substring(inTrenner.length);
} // holeMultipleOptionen

//	VOID	uncheckAuswahl ( STRING, STRING )
//
//	Deselektiert alle Option-Felder einer Select-Auswahl wenn die umgebende Checkbox
//	nicht selektiert ist.
//
//		inNameCheckbox		Name der Checkbox
//		inNameSelect		Name der Select-Auswahl

function uncheckAuswahl(	 inNameCheckbox
							,inNameSelect
) {
	if( getValueOfDocumentElementById(inNameCheckbox, 'checked') != true ) {
		var inObj = getDocumentElementById(inNameSelect, false);
		for(var idx = 0; idx < inObj.options.length; idx++)
			with( inObj.options[idx] )
				if( selected ) selected = false;
	}
} // uncheckAuswahl

//	BOOLEAN	interneFormularpruefung	( STRING, ARRAY )
//
//	Liefert true, wenn mindestens eine Kombination der uebergebenen Eingabefelder gueltige
//	Daten enthaelt.
//
//		inFormularname		Eindeutiger Formularname, z. B. "Anmeldung"
//		inKombinationen		Mehrdimenionales Array
//								1. Ebene: Kombination
//								2. Ebene: Feld
//								 Index 0: Prueffunktion (Adresse)
//								 Index 1: Feldname
//								 Index 2: true, wenn die Prueffunktion einen Fehler als Text meldet (ok="")
//										  false, wenn Fehler als true (BOOLEAN) gemeldet werden. (ok=false)
//							Von mehreren Kombinationen wird im Fehlerfall nur die erste angezeigt.
//	Fehler werden durch eine Textmeldung und das Einfaerben der Feldbeschriftung signalisiert,
//	wozu der Feldname mit vorangestelltem "label_" verwendet wird!
//	Hinweis: Das Auslesen eines Feldwertes mittels "objekt.value" ist konform zu dem W3C-, ALL-
//	und Layer-DOM.

function interneFormularpruefung(
			 inFormularname
			,inKombinationen
) {
	var fehler	= new Array();
	var fokus	= new Array();
	var farbe	= new Array();
	var idk, idf, prueffunktion, pruefergebnis, objekt, objektname, farbeNeu, text;
	var farbeFehler	= "red";
	var farbeOk		= "black";

	for(idk = 0; idk < inKombinationen.length; idk++) {
		farbe[idk]	= new Array();
		fokus[idk]	= null;
		fehler[idk]	= "";
		for(idf = 0; idf < inKombinationen[idk].length; idf++) {
			prueffunktion		= inKombinationen[idk][idf][0];
			objektname			= inKombinationen[idk][idf][1];
			labelname			= "label_" + objektname;
			funktionLiefertText	= inKombinationen[idk][idf][2];
			if( typeof(document.forms[inFormularname][objektname]) == 'undefined' ) {
				fehler[idk] += "\n    " + objektname;
			} else {
				objekt				= document.forms[inFormularname][objektname];
				if( inKombinationen[idk][idf].length > 3 && inKombinationen[idk][idf][3] ) {
					pruefergebnis	= (prueffunktion)(objekt);
				} else {
					pruefergebnis	= (prueffunktion)(objekt.value);
				}
				if( (funktionLiefertText == false && pruefergebnis == true) ||
					(funktionLiefertText != false && pruefergebnis != "")
				) {
					text =	erstelleAusgabenamen( getInnerText( labelname ) );
					if( text == "" ) text = objektname;
					fehler[idk] += "\n    " + text;
					if( funktionLiefertText ) {
						fehler[idk] += " " + pruefergebnis;
					}
					if( fokus[idk] == null ) {
						fokus[idk] = objekt;
					}
					farbeNeu = farbeFehler;
				} else {
					farbeNeu = farbeOk;
				}
				farbe[idk][farbe[idk].length] = new Array(labelname, farbeNeu);
			}
		}
		if( fehler.length != 0 && fehler[idk].length == 0 ) {
			fehler = new Array();
			break;
		}
	}
		//	Ergebnis auswerten.
		//	Eine Farbaenderung oder Fokusierung wird nur im Fehlerfall ausgefuehrt.
	if( fehler.length != 0 ) {
		for(idf = 0; idf < farbe[0].length; idf++) {
			setColor( farbe[0][idf][0], farbe[0][idf][1] );
		}
		alert(unescape('' + getSpeechData('FEHLER_PFLICHTFELDER_PRUEFEN') + ": " + fehler[0]));
		if( fokus[0] != null ) fokus[0].focus();
		return	false;
	}
	return	true;
} // interneFormularpruefung

//	Boolean	pruefeAnmeldung	(void)
//
//		inNameFormular		Formularname
//		inNameCheckbox		Name der Checkbox
//		inNameSelect		Name der Select-Auswahl
//
//	Liefert true, wenn alle sichtbaren Eingabefelder gueltige Daten enthalten.
//	Anwendung: <form ... onsubmit="return pruefeAnmeldung()"

function pruefeAnmeldung( ) {
		//	Optionalen Formularnamen uebernehmen
	var inNameFormular = arguments.length > 0 ? arguments[0] : "Anmeldung";
	var inNameCheckbox = arguments.length > 1 ? arguments[1] : "Teilnahme_auswahl";
	var inNameSelect   = arguments.length > 2 ? arguments[2] : "Auswahl";
		//	Gueltige Kombinationen deklarieren, angezeigt wird nur die erste.
		//		Prueffunktion, Feldname, Prueftyp, [Object (statt Objectvalue)]
		//	Prueftyp:	true bei Textergebnissen, "" = in Ordnung
		//				false bei Wahrheitswerten, false = in Ordnung
	var kombi			=	new Array();
		//	Auf ein optionales Array mit den Namen / IDs der Pflichtfelder
		//	pruefen. Wenn nicht gefunden werden die Standardfelder der
		//	deutschen Domain verwendet.
	if(	(typeof(glSprachspezifischeDaten) == 'object' &&
		 typeof(glSprachspezifischeDaten['FORMULAR_PFLICHTFELDER']) != 'undefined')
	) {
		var az = glSprachspezifischeDaten['FORMULAR_PFLICHTFELDER'].length;
		var feld;
		kombi[0] = new Array();
		for(var idx = 0;idx < az;++idx) {
			aktFeld = glSprachspezifischeDaten['FORMULAR_PFLICHTFELDER'][idx];
			switch( aktFeld ) {
				case "Datenschutzhinweis":
					kombi[0][ kombi[0].length ] = new Array(pruefeAusgewaehlt	,aktFeld	,true	,true	);
					break;
				case "eMail":
					kombi[0][ kombi[0].length ] = new Array(pruefeEMail			,aktFeld	,true			);
					break;
				case "prvPlz":
				case "Plz":
					kombi[0][ kombi[0].length ] = new Array(pruefePlz			,aktFeld	,true			);
					break;
				default:
					kombi[0][ kombi[0].length ] = new Array( pruefeLeer			,aktFeld	,true			);
					break;
			}
		}
	} else {
		kombi[kombi.length] =	new Array(	 new Array(pruefeEMail	,"eMail"	,true	)
											,new Array(pruefeLeer	,"Vorname"	,true	)
											,new Array(pruefeLeer	,"Nachname"	,true	)
											,new Array(pruefeLeer	,"Firma"	,true	)
											,new Array(pruefeLeer	,"Strasse"	,true	)
											,new Array(pruefePlz	,"Plz"		,true	)
											,new Array(pruefeLeer	,"Ort"		,true	)
		);
	}
		//	In Verbindung mit einer Kundennummer, die aber nur in einigen Formularen
		//	angelegt ist, kann auf eine vereinfachte Kombination geprueft werden.
	if( typeof(document.forms[inNameFormular]["KNr"]) != 'undefined' ) {
		kombi[kombi.length] =	new Array(	 new Array(pruefeLeer	,"KNr"		,true	)
											,new Array(pruefeEMail	,"eMail"	,true	)
											,new Array(pruefeLeer	,"Vorname"	,true	)
											,new Array(pruefeLeer	,"Nachname"	,true	)
		);
	}

		//	Wenn die optionale Auswahl mit Checkbox und Menue vorhanden ist,
		//	aber kein Vortrag ausgewaehlt wurde, muss sie an alle Kombinationen
		//	angehaengt werden, um in der Aufzaehlung zu erscheinen.
	var hatFehlendeAuswahl = false;
	if( typeof(document.forms[inNameFormular][inNameCheckbox]) != 'undefined'
	 &&	typeof(document.forms[inNameFormular][inNameSelect])   != 'undefined'
	 && getValueOfDocumentElementById(inNameCheckbox, 'checked') == true &&
		holeMultipleOptionen(inNameSelect, ',') == ''
	) {
		hatFehlendeAuswahl = true;
		var az = kombi.length;
		for(var idx = 0;idx < az;++idx) {
			kombi[idx][ kombi[idx].length ] = new Array(pruefeLeer	,inNameSelect ,true	);
		}
	}

	var ergebnis = interneFormularpruefung(inNameFormular, kombi);

		//	Wenn keine Meldung ausgegeben wurde sind zwei Aktionen moeglich
		//	a) Meldung ausgeben oder
		//	b) Selektion loeschen
	if( ergebnis ) {
		if( hatFehlendeAuswahl ) {
			alert(unescape('' + getSpeechData('FEHLER_AUSWAHL_VORNEHMEN')));
			ergebnis = false;
		} else
		if( typeof(document.forms[inNameFormular][inNameCheckbox]) != 'undefined'
		 &&	typeof(document.forms[inNameFormular][inNameSelect])   != 'undefined'
		 && getValueOfDocumentElementById(inNameCheckbox, 'checked') == false
		) {
			var inObj	= getDocumentElementById(inNameSelect, false);
			for(var idx = 0; idx < inObj.options.length; idx++)
				with( inObj.options[idx] )
					if( selected ) selected = false;
		}
	}

	return ergebnis;
} // pruefeAnmeldung

//	Boolean	pruefeAuswahl	(void)
//
//		inNameFormular		Formularname
//		inNameCheckbox		Name der Checkbox
//		inNameSelect		Name der Select-Auswahl
//
//	Liefert true, wenn alle sichtbaren Eingabefelder gueltige Daten enthalten.
//	Anwendung: <form ... onsubmit="return pruefeAuswahl()"
//
//	pruefeAnmeldung verwenden!

function	pruefeAuswahl( ) {
		//	Optionalen Formularnamen uebernehmen
	var inNameFormular = arguments.length > 0 ? arguments[0] : "Anmeldung";
	var inNameCheckbox = arguments.length > 1 ? arguments[1] : "Teilnahme_auswahl";
	var inNameSelect   = arguments.length > 2 ? arguments[2] : "Auswahl";

	return	pruefeAnmeldung( inNameFormular
							,inNameCheckbox
							,inNameSelect
	);
} // pruefeAuswahl

	//	Konstante zeigt die Verfuegbarkeit dieses Moduls an.
LIB_EINGABEMASKE_JS = true;
//	Aenderungsstand:
//	2004-06-07 Erstellung, Juergen Deisenroth
//	2004-08-26 Funktionen ergaenzt, ueberarbeitet und an dom.js angepasst.
//	2005-03-30 interneFormularpruefung angepasst, so dass fehlende Eingabefelder
//			   keine Fehler verursachen.
//	2005-04-14 pruefeAuswahl, uncheckAuswahl
//	2005-04-28 pruefeAnmeldung und pruefeAuswahl zusammengelegt.
//	2005-05-04 istPlz internationalisiert, RegExp kann ausgewertet werden.
//	2005-06-02 prvPlz, Datenschutzhinweis ergaenzt. Bed. Wortumbrueche in erstelleAusgabenamen fuer IE korr., pruefeAusgewaehlt ergaenzt.
//	2005-06-02 Letzte Aenderung
