onSubmitAufgerufen = new Array();
echtesOnSubmit = true;
echterBlur = true;
zeigeFehlerSofort  = new Array();
zeigeFehlerMeldung = true;
mussFelder = new Array();
aktfeld = "";

alteFarbe = new Array();
warnFarbe = new Array();

zeigtMeldung = false;
/////////////////////////////////////////////////////////////////////////////
// Hilfsfunktionen
/////////////////////////////////////////////////////////////////////////////
function trim(string) {
// entfernt Leerzeichen am Anfang und Ende des Strings
	string = string.replace(/^\s*/,"");
	string = string.replace(/\s*$/,"");
	return string;
}
function fehler(text) {
// zeigt eine Fehlermeldung, wenn das Feld-Flag gesetzt ist
// und liefert immer false zurück
	if (zeigeFehlerMeldung && zeigeFehlerSofort[aktfeld]) {
		zeigtMeldung = true;
		alert("Bitte überprüfen Sie den eingegeben Wert:\n"+text);
		zeigtMeldung = false;
	}
	return false;
}
function englischeZahl(zahl) {
// Konvertiert eine deutsche Zahl in eine englische Zahl
// damit JavaScript damit arbeiten kann
	// Kommas mit Punkten tauschen
	// Alle Leerzeichen entfernen
	zahl = zahl.replace(/\s/g,"");
	if ((! zahl.match(/^\-?\d*\.\d*$/)) || zahl.match((/^\-?\d*\.\d\d\d$/))) {
		// Alle Punkte entfernen
		zahl = zahl.replace(/\./g, "");
		// Kommas gegen Punkte tauschen
 	 	zahl = zahl.replace(/,/,".");
	}
	return zahl;
}	
function pruefeGrenzen( wert, untereGrenze, obereGrenze ) {
// Überprüft, ob eine Zahl innerhalb gewisser Grenzen liegt
	if (wert < untereGrenze && untereGrenze!=0)
		return fehler( (obereGrenze!=0) ? 
			"Die Zahl muss zwischen "+untereGrenze+" und "+obereGrenze+" liegen." :
			"Die Zahl muss größer gleich "+untereGrenze+" sein." );
	if (obereGrenze!=0 && wert > obereGrenze)
		return fehler("Die Zahl soll zwischen "+untereGrenze+" und "+obereGrenze+" liegen.");
	return true;
}
function leeresFeld(feld) {
// Überprüft, ob ein Feld leer ist
	if (trim(feld.value)=="") return true;
	return false;
}
function vergleiche(str1, str2) {
// Vergleicht zwei Strings, ohne die Groß-/Kleinschreibung zu beachten
	if (!str1) return false;
	if (!str2) return false;
	if (String(str1).toLowerCase() == String(str2).toLowerCase()) return true;
	return false;
}
function harmlosesSubmit(formular) {
// Führt die OnSubmit-Funktion einmal aus
// Setzt dabei das Flag echtesOnSubmit auf false um anzuzeigen
// das dies kein echtes Submit durch den Benutzer darstellt
	if (onSubmitAufgerufen[formular.id]) return;
	onSubmitAufgerufen[formular.id] = true;
	echtesOnSubmit = false;
	formular.onsubmit();
	echtesOnSubmit = true;
}
function init(feld) {
// Führt einige Initialisierungen durch, die bei
// jedem Feld durchgeführt werden müssen, um
// alle Flags richtig zu setzen
	aktfeld = feld.name;
	if (!onSubmitAufgerufen[feld.form.id]) {
		harmlosesSubmit(feld.form);
	}
	if (!echterBlur) return false;
	if (zeigeFehlerMeldung && leeresFeld(feld)) return false;
	return true;
}

/////////////////////////////////////////////////////////////////////////////
// Feldüberprüfungen
/////////////////////////////////////////////////////////////////////////////
function istText( feld ) {
	if (!init(feld)) return true;
	laenge = (istText.arguments.length > 1) ? istText.arguments[1]-1 : 0;
	if (trim(feld.value).length > laenge)
		return true;
	return fehler((laenge > 0) ? "Die Länge des Wertes sollte mindestens "+(laenge+1)+" Zeichen betragen."
	                           : "Es muss ein Wert eingegeben werden." );
}
function istZahl( feld ) {
	if (!init(feld)) return true;
	obereGrenze  = (istZahl.arguments.length > 1) ? istZahl.arguments[1]:0;
	untereGrenze = (istZahl.arguments.length > 2) ? istZahl.arguments[2]:0;
	wert = englischeZahl(feld.value);
	if (isNaN(wert) || parseInt(wert) != parseFloat(wert))
		return fehler("Hier dürfen nur ganze Zahlen eingegeben werden.");
	return pruefeGrenzen( wert, untereGrenze, obereGrenze );
}
function istKommaZahl( feld ) {
	if (!init(feld)) return true;
	nachKommaStellen  = (istKommaZahl.arguments.length > 1) ? istKommaZahl.arguments[1]:-1;
	obereGrenze       = (istKommaZahl.arguments.length > 2) ? istKommaZahl.arguments[2]:0;
	untereGrenze      = (istKommaZahl.arguments.length > 3) ? istKommaZahl.arguments[3]:0;
	wert = parseFloat(englischeZahl(feld.value));
	if (isNaN(wert))
		return fehler("Hier dürfen nur Kommazahlen eingegeben werden.");
	if (!pruefeGrenzen( wert, untereGrenze, obereGrenze ))
		return false;
	if (nachKommaStellen > -1) {
		for (i=0, teilSuchMuster=""; i < nachKommaStellen; i++) teilSuchMuster += "\\d";
		if (eval("String(wert).search(/\\."+teilSuchMuster+"\\d+/)")>-1)
			return fehler("Es sind maximal "+nachKommaStellen+" Nachkomma-Stellen anzugeben.");
	}
	return true;
}
function istEmail( feld ) {
	if (!init(feld)) return true;
	if (trim(feld.value).search(/[\.a-zöäü0-9_-]+@([a-z0-9_\-öäü]+\.)+[a-z][a-z][a-z]?[a-z]?[a-z]?/i)
	                     > -1) return true;
	return fehler("Hier wird eine Emailadresse erwartet.");
}
protocols = "(https?|ftp)";
domains = "(([a-z0-9_öäü\\-]+\\.)+[a-z][a-z][a-z]?[a-z]?[a-z]?)";
ports = "(\\:\\d+)";
file = "([a-z0-9_äöü%,.\\/\\-]+)";
params = "([a-z0-9_äöü%&=,.\\/\\-]+)";
urlSuchMuster = protocols+"\\:\\/\\/?"+domains+ports+"?(\\/"+file+")?(\\?"+params+")?";
function istURL( feld ) {
	if (!init(feld)) return true;
	if (eval("trim(feld.value).search(/"+urlSuchMuster+"/i);")
	                     > -1) return true;
	return fehler("Hier wird eine URL einer Internetseite in der Form:\n"+
	              "protocol://domain[:port]/[file][?params] erwartet.");
}
function istIn(feld, zeichen) {
	if (!init(feld)) return true;
	laenge = (istIn.arguments.length > 2) ? istIn.arguments[2]-1 : 0;
	if (laenge!=0 && !istText(feld, laenge)) return false;
	zeichenMuster = zeichen; //Extra Variable wegen Fehlermeldung
	zeichenMuster = zeichenMuster.replace(/\^/,"\\^");
	zeichenMuster = zeichenMuster.replace(/\]/,"\\]");
	zeichenMuster = zeichenMuster.replace(/\[/,"\\[");
	if (eval("trim(feld.value).search(/^["+zeichenMuster+"]+$/);") == -1)
		return fehler("In diesem Feld sind nur die Zeichen '"+zeichen+"' zulässig.");
}
/////////////////////////////////////////////////////////////////////////////
// Felder-Attribute
/////////////////////////////////////////////////////////////////////////////
function mussFeld(feld) {
	init(feld);
	mussFelder[aktfeld] = feld;
    return true;
}
function zeigeFehler(feld) {
	init(feld);
	zeigeFehlerSofort[aktfeld] = true;
	return true;
}

/////////////////////////////////////////////////////////////////////////////
// Formular-Einstellungen
/////////////////////////////////////////////////////////////////////////////
function formularPruefen(formular) {
	if (zeigtMeldung) return false; // Wenn bereits eine Meldung gezeigt wird,
	                                // nicht auf Submit-Klick reagieren
	if (!echtesOnSubmit) return true;
	if (!onSubmitAufgerufen[formular.id]) harmlosesSubmit(formular);
	// Fehlermeldung der Felder ausschalten, da nur eine Fehlermeldung
	// über falsch ausgefüllte Muss-Felder angezeigt werden soll:
    zeigeFehlerMeldung = false;
	// Alle Felder durchgehen, damit alle Muss-Felder eingetragen sind:
	for (i=0; i<formular.elements.length; i++) {
		if (formular.elements[i].onblur) {
			echterBlur = false;
			formular.elements[i].onblur();
			echterBlur = true;
		}
	}
	exit = true;
	meineWarnFarbe = (warnFarbe[formular.id]) ? warnFarbe[formular.id] : "Red";
	for (feld in mussFelder) {
		if (mussFelder[feld].form != formular) continue;
		if (mussFelder[feld].onblur) {
			if (!mussFelder[feld].onblur()) {
				// Feld falsch ausgefüllt:
				if (!vergleiche(mussFelder[feld].style.backgroundColor, meineWarnFarbe)) {
					// Feld bisher noch nicht falsch ausgefüllt, deshalb
					// alte Farbe speichern
					alteFarbe[feld] = (mussFelder[feld].style.backgroundColor) ? 
										mussFelder[feld].style.backgroundColor :
										"White";
				}
				// Farbe auf falsch ausgefüllt setzen:
				mussFelder[feld].style.backgroundColor = meineWarnFarbe;
				// Rückgabewert darf jetzt nicht mehr true sein
				exit = false;
			}
			else {
				if (alteFarbe[feld] && vergleiche(mussFelder[feld].style.backgroundColor, meineWarnFarbe)) {				
					// Eventuell war das Feld bisher als falsch gekennzeichnet
					// und muss jetzt auf die alte Farbe gesetzt werden, da
					// es inzwischen richtig ausgefüllt ist
					mussFelder[feld].style.backgroundColor = alteFarbe[feld];
				}
			}
		}
	}
	if (!exit) alert("Bitte überprüfen Sie ob alle Felder richtig ausgefüllt wurden.\n"+
	                 "Die farblich hervorgehobenen Felder müssen korrekt ausgefüllt sein.");
	// Fehlermeldungen der Felder wieder anschalten:
	zeigeFehlerMeldung = true;
	return exit;
}
function setzeWarnFarbe(formular, farbe) {
	warnFarbe[formular.id] = farbe;
	return true;
}
function warneSofort(formular) {
	for (i = 0; i < formular.elements.length; i++) {
		zeigeFehlerSofort[formular.elements[i].name] = true;
	}
	return true;
}
