/*form_pruefen.js
* by Thorsten Ruppenstein. v2.1
* 02.03.2005	Fehler bei "nid" und "aid" beseitigt (Überprüfung auf NULL reichte nicht aus)
*		Erweiterung um Zeitfeld hh:mm
* 08.06.2005	Fehler bei parseInt(x) behoben (führende Null); jetzt: parseInt(x, 10)
* 27.09.2005	Erweiterung um oid's ("Optionsfelder")
* 05.10.2005	Erweiterung um Parameter init_ok, init_fehlertext ("Einbindung" vorgeschalteter Prüfungen); 
*               vgl. Travelprotect.de
* 10.10.2005	Erweiterung:  Es werden nur Felder geprüft, die auch sichtbar sind.
* 28.02.2007    Erweiterung um pid 64 Prüfen auf E-Mail-Adresse
*
* !!! Spezielle Anpassung (Datum: String "TT.MM.JJJJ" wird als leer interpretiert)
*
* 17.08.2006	Fehler: bspw. !flag_sid[el_sid], Lösung verwende "1" als init-Wert und "2" als Flag
*	
*/
//Rückgabe: TRUE oder FALSE



function pruefen(form, init_ok, init_fehlertext){
	
	ok = true;

	fehlertext = "FEHLER BEI DER EINGABE\n\nFolgende Fehler sind aufgetreten:\n";
	
	if (!init_ok) {
		if (init_fehlertext) {
			fehlertext += init_fehlertext;
			ok = false;
		}
	}
	
	//Felder prüfen
	/* pid's (kombinierbar, z.Bsp. : 1+2=3)
	*	1	Feld UNTER KEINEN UMSTÄNDEN LEER
	*	2	Feld positive ganze Zahl (>=0)
	*	4	Feld muss Datumsformat TT.MM.JJJJ haben oder leer
	*	8	checkbox: mindestens eins ausgewählt
	*	16	select: mindestens eins ausgewählt
	*	32	Feld muss Uhrzeit sein HH[:|.]MM oder leer
	*	64	Feld muss E-Mail-Adresse sein w.+[@]w.+[.]w.+ oder leer
	*/
	
	/* aid's
	*	bei gleichem Wert muss mindestens eins grösser 0 sein (verwenden mit pid=2)
	*/
	
	/* oid's
	*	wie aid's, jedoch speziell für Radiobuttons (Optionsfelder)
	
	/* sid's
	*	bei gleichem Wert müssen die betreffenden Felder auch den gleichen Inhalt haben
	*/
	
	/* nid's
	*	bei gleichem Wert dürfen nicht alle betreffenden leer sein
	*/
	
	flag_nid = new Array();
	flag_message_nid = new Array();
	
	flag_aid = new Array();
	flag_message_aid = new Array();
	
	flag_oid = new Array();
	flag_message_oid = new Array();
	
	flag_sid = new Array();
	flag_value_sid = new Array();
	flag_message_sid = new Array();
	
	for (i=0; i<form.length; i++){
		el = form.elements[i];
		
		if (ist_sichtbar(el)) {
		
		var el_pid;
		el_pid = el.getAttribute("pid");
		var el_aid;
		el_aid = el.getAttribute("aid");
		var el_sid;
		el_sid = el.getAttribute("sid");
		var el_nid;
		el_nid = el.getAttribute("nid");
		var el_oid;
		el_oid = el.getAttribute("oid");
		
		var el_message;
		el_message = el.getAttribute("message");
	
		if (el_oid>0) {
			if (flag_oid[el_oid]==null || !flag_oid[el_oid]) {
				flag_oid[el_oid] = 1;
				flag_message_oid[el_oid] = el_message;
			}
			
			if (getOptionValue(form[el.name])>0) {
				flag_oid[el_oid] = 2;
			}
		}
	
		if (el_aid>0) {
			
			if (flag_aid[el_aid]==null || !flag_aid[el_aid]) {
				flag_aid[el_aid] = 1;
				flag_message_aid[el_aid] = el_message;
			}
			if (el.value>0) {
				flag_aid[el_aid] = 2;
			}
		}

		if (el_sid>0) {
			
			if (flag_sid[el_sid]==null || !flag_sid[el_sid]) {
				flag_sid[el_sid] = 1;
				flag_message_sid[el_sid] = el_message;
				flag_value_sid[el_sid] = el.value;
				
			}
			if (el.value!=flag_value_sid[el_sid]) {
				flag_sid[el_sid] = 2;
				
			}
			
			
		}
		
		if (el_nid>0) {			
			if (flag_nid[el_nid]==null || !flag_nid[el_nid]) {
				flag_nid[el_nid] = 1;
				flag_message_nid[el_nid] = el_message;
			}
			
			if (el.value!=""){
				flag_nid[el_nid] = 2;
				
			}
		}
		
		if (el_pid & 1) {
			if (el.value=="" || el.value == "TT.MM.JJJJ") {
				ok = false;
				fehlertext += "- Das Feld " + el_message + " darf nicht leer sein.\n";
			}
		}
		
		if (el_pid & 2) {
			if(parseInt(el.value, 10)!=el.value || parseInt(el.value, 10)<0) {
				ok = false;
				fehlertext += "- Das Feld " + el_message + " muss eine positive ganze Zahl oder 0 sein.\n";
			}
		}
		
		if (el_pid & 32) {
			if (el.value.length>0) {
				
				var AusdruckNum = /^(\d{1,2})$/
				
				if (AusdruckNum.test(el.value)==true) {
					var ErgebnisNum = AusdruckNum.exec(el.value);
					var stundeNum = parseInt(RegExp.$1, 10);
					var stunde_okNum = true;
					if (stundeNum<0 || stundeNum>24) stunde_okNum = false;
					
					if (stunde_okNum) {
						//ersetze 24 durch 00
						if (stundeNum==24) {
							stundeNum=0;
						}
						//bringe die Eingabe auf das passende Format (Mit Nullen auffüllen)
						str_hNum = "" + stundeNum;
						str_mNum = "0";
						if(str_hNum.length<2) str_hNum = "0" + str_hNum;
						if(str_mNum.length<2) str_mNum = "0" + str_mNum;
						el.value = str_hNum + ":" + str_mNum;
					}
					else {
						ok = false;
						fehlertext += "- Das Feld " + el_message + " muss im Format HH:MM sein.";
						if (!stunde_okNum) fehlertext += "(Fehler bei Stunde)";
						fehlertext += "\n";
					}
					
				}
				
				
				var Ausdruck = /^(\d{1,2})[:|.](\d{1,2})$/
				if (Ausdruck.test(el.value)==false) {
					ok = false;
					fehlertext += "- Das Feld " + el_message + " muss im Format HH:MM sein.\n";
				}
				else {
					var Ergebnis = Ausdruck.exec(el.value);
					
					var stunde = parseInt(RegExp.$1, 10)
					var minute = parseInt(RegExp.$2, 10)
					var stunde_ok = true;
					var minute_ok = true;
					
					if (stunde<0 || stunde>24) stunde_ok = false;
					
					if (minute<0 || minute>59) minute_ok = false;
					
					if (stunde_ok && minute_ok) {
						//ersetze 24 durch 00
						if (stunde==24) {
							stunde=0;
						}
						//bringe die Eingabe auf das passende Format (Mit Nullen auffüllen)
						str_h = "" + stunde;
						str_m = "" + minute;
						if(str_h.length<2) str_h = "0" + str_h;
						if(str_m.length<2) str_m = "0" + str_m;
						el.value = str_h + ":" + str_m;
					}
					else {
						ok = false;
						fehlertext += "- Das Feld " + el_message + " muss im Format HH:MM sein.";
						if (!minute_ok && stunde_ok) fehlertext += "(Fehler bei Minute)";
						if (!minute_ok && !stunde_ok) fehlertext += "(Fehler bei Stunde und Minute)";
						if (minute_ok && !stunde_ok) fehlertext += "(Fehler bei Stunde)";
						fehlertext += "\n";
					}
				}
				
			}
		}
		if (el_pid & 64) {
			if (el.value.length>0) {
			
				var Ausdrucke = /^(.+)@(.+)\.\w.+$/
				if (Ausdrucke.test(el.value)==false) {
					ok = false;
					fehlertext += "- Das Feld " + el_message + " muss im Format myname@provider.com sein.\n";
				}
			}
		}
		
		if (el_pid & 4) {
			if (el.value.length>0 && el.value != "TT.MM.JJJJ") {
			
				var Ausdruck = /^(\d{1,2})\.(\d{1,2})\.\d{4}$/
				if (Ausdruck.test(el.value)==false) {
					ok = false;
					fehlertext += "- Das Feld " + el_message + " muss im Format TT.MM.JJJJ sein.\n";
				}
				else {
					var Ergebnis = Ausdruck.exec(el.value);
					
					var tag = parseInt(RegExp.$1, 10);
					var monat = parseInt(RegExp.$2, 10);
					
					switch(monat) {
					// 31 Tage
						case 1:
						case 3:
						case 5:
						case 7:
						case 8:
						case 10:
						case 12:
							if ((tag<1) || (tag>31)) {
								ok = false;
								fehlertext += "- Das Feld " + el_message + " muss im Format TT.MM.JJJJ sein. (Tag ung\u00fcltig)\n";
							}
							break;
							
					// 30 Tage
						case 4:
						case 6:
						case 9:
						case 11:
							if ((tag<1) || (tag>30)) {
								ok = false;
								fehlertext += "- Das Feld " + el_message + " muss im Format TT.MM.JJJJ sein. (Tag ung\u00fcltig: " + tag + ")\n";
							}
							break;						
						
					//Februar maximal 29
						case 2:
							if ((tag<1) || (tag>29)) {
								ok = false;
								fehlertext += "- Das Feld " + el_message + " muss im Format TT.MM.JJJJ sein. (Tag ung\u00fcltig)\n";
							}
							break;
						default:
							ok = false;
							fehlertext += "- Das Feld " + el_message + " muss im Format TT.MM.JJJJ sein. (Monat ung\u00fcltig)\n";
							break;
					}
					
				}
			}
		}
		if (el_pid & 8) {
			if (form[el.name].length>0) {
				zaehler = 0;
				for (k = 0 ; k < form[el.name].length; k++){
					if (form[el.name][k].checked) zaehler = zaehler + 1;
				}
				if(zaehler==0) {
					ok = false;
					fehlertext += "- Bei " + el_message + " muss mindestens eine Alternative gew\u00e4hlt sein.\n";
				}
			}
			else {
				if (!(form[el.name].checked)) {
					ok = false;
					fehlertext += "- Das Feld " + el_message + " muss angeklickt sein.\n";
				}
			}
		}
		if (el_pid & 16) {
			if (el.selectedIndex==-1){
				ok = false;
				fehlertext += "- Bei " + el_message + " muss mindestens eine Alternative gew\u00e4hlt sein.\n";
			}
		}
		
		} // ist_sichtbar?
	}//ENDE FOR
	
	
	for (l=0; l<flag_nid.length; l++) {
		if (flag_nid[l]==1) {
			fehlertext += "- Die Felder " + flag_message_nid[l]+ " d\u00fcrfen nicht alle leer sein.\n";
			ok = false;
		}
	}
	
	for (n=0; n<flag_aid.length; n++) {
		if (flag_aid[n]==1) {
			fehlertext += "- Die Felder " + flag_message_aid[n]+ " d\u00fcrfen nicht alle 0 sein.\n";
			ok = false;
		}
	}
	
	for (n=0; n<flag_oid.length; n++) {
		if (flag_oid[n]==1) {
			fehlertext += "- " + flag_message_oid[n]+ "\n";
			ok = false;
		}
	}
	
	for (m=0; m<flag_sid.length; m++) {
		if (flag_sid[m]==2) {
			fehlertext += "- Die Felder " + flag_message_sid[m]+ " m\u00fcssen den gleichen Inhalt haben.\n";
			ok = false;
		}
	}
	
	
	//Abschiscken ODER Fehlermeldung
	if (ok) {
		return true;
	}
	else {
		alert(fehlertext);
		return false;
	}
}

function getOptionValue(rObj) {
	for (var i=0; i<rObj.length; i++) if (rObj[i].checked) return rObj[i].value;
    return false;
}

function ist_sichtbar(el){
	if (el.parentNode) {
		if (el.parentNode.style && el.parentNode.style.display) {
			switch(el.parentNode.style.display){
			
			//Elternelement unsichtbar (nur wenn unsichtbar, ist der Fall klar und es kann abgebrochen werden)
			case "none":
				return false
				break;
			//nichts von beiden -> bei Grossvater weitermachen
			default:
				return ist_sichtbar(el.parentNode);
				break;
			}
		}
		else {
			return ist_sichtbar(el.parentNode);
		}
	}
	//keine Eltern mehr
	else return true;
}
