/*****************************************************************************************
DEFINITION OF MODULE  multiformcheck2.js

Author of Module:   Rainer Kuhn
Version:            2.3   (19/07/2001)
Copyright:          2001 BPS NETBASE AG, Karlsruhe, http://www.bps-netbase.de


Mod Description:
    
    Prueft Formulare auf fehlende Eingaben und falsche Datumseingaben.
    Die Parameter werden in der jeweiligen Formularseite lokal gesetzt, sodass fuer beliebige
    Formularseiten das gleiche allgemeine JavaScript verwendet werden kann.
    Folgende Optionen stehen zur Verfuegung:
    - Check optionaler Formularfelder (INPUT TYPE="text" / TEXTAREA / SELECT),
      wobei eine Eingabe/Auswahl in mindestens einem der gesetzten Felder notwendig ist
      (Funktion steht auch fuer mehrere OptionalCheck-Bloecke innerhalb eines Formulars zur Verfuegung)
    - Check zwingender Texteingabefelder (INPUT TYPE="text" und TEXTAREA),
      wobei eine Eingabe in jedem der gesetzten Felder notwendig ist
    - Check zwingender Pulldownmenues (SELECT),
      wobei eine Auswahl in jedem der gesetzten Menues notwendig ist
      (Voraussetzung: 1. Option des Pulldownmenues ist keine gueltige Auswahl)
    - Check von Datumseingaben auf korrektes Format und Gueltigkeit
    Bei fehlenden/falschen Eingaben/Auswahlen wird eine Fehlermeldung ausgegeben, der Fokus auf
    das erste in der Fehlermeldung genannte noch auszufuellende Feld gesetzt und das Formular
    nicht abgeschickt.
    
    Notwendige Einstellungen in der Formularseite:
    ---------------------------------------------
    1. Parameteruebergabe/-einstellung in der Formularseite erforderlich (*vor* BODY-Tag)
    2. Skriptaufruf muss *nach* Parameteruebergabe erfolgen,
        z.B. mit: SCRIPT LANGUAGE="JavaScript" SRC="../js/multiformcheck2.js" TYPE="text/javascript"
    3. Aufruf der Hauptfunktion alternativ ueber:
    a) INPUT TYPE="submit" ... ONCLICK="return checkRequiredFields(this.form);"
    b) FORM ACTION="..." ONSUBMIT="return checkRequiredFields(this);".


Change History:
    v2.2: multipler Optionalcheck integriert
    v2.3: Datumscheck integriert
*****************************************************************************************/
var EmailCheck=false;
//alert("EmailCheck:"+EmailCheck);


/*****************************************************************************************
	Functions:
*****************************************************************************************/


/*****************************************************************************************
	Function: checkRequiredFields(myForm)
	
	Description:
        Hauptfunktion (zentrale Skriptsteuerung):
        Aufruf der jeweils benoetigten Check-Routinen; anschliessend entweder 
        Ausgabe eines Alert-Fensters (bei falschen/unvollstaendigen Angaben)
        oder Abschicken des Formulars (wenn alles korrekt ausgefuellt wurde)
	
	Parameters:
		myForm:	    zu pruefendes Formular
*****************************************************************************************/
function checkRequiredFields(myForm) {
    
    //alert("checkRequiredFields");
	// globale Variablen vorbelegen
    sendForm = true;
    myFocus = false;
    TextfieldsOK = true; // (Bedingung fuer Datumscheck)
    FieldsNeeded = "DAS FORMULAR IST NICHT VOLLSTAENDIG AUSGEFUELLT !";
    
    // Aufruf der Unterfunktionen fuer einzelne Formularelementtypen
    if (optionalCheck){
        if (sendForm == true) sendForm = checkOptional(myForm);
        else { checkOptional(myForm); }
    }
    if (TextfieldCheck){
        if (sendForm == true) sendForm = checkTextfields(myForm);
        else { checkTextfields(myForm); }
    }
    if (SelectCheck){
        if (sendForm == true) sendForm = checkSelects(myForm);
        else { checkSelects(myForm); }
    }
    // Datumscheck nur ausfuehren, wenn alle notw. Textfelder ausgefuellt
    if (DateCheck && TextfieldsOK){
        if (sendForm == true) sendForm = checkDate(myForm);
        else { checkDate(myForm); }
    }
    
	if (EmailCheck){
        if (sendForm == true) {
			sendForm = checkEmail(myForm);
		}
       	else { 
			checkEmail(myForm); 
		}
	}
    // Ergebnis: evtl. Fehlermeldung, Formular abschicken?
    if (sendForm != true) alert(FieldsNeeded);
    return sendForm;
}


/*****************************************************************************************
	Function: checkOptional(myForm)
	
	Description:
        Pruefung von optionaler Formularfeldern (INPUT TYPE="text" / TEXTAREA / SELECT);
        Logische Bedingung: in mindestens einem der zu pruefenden Felder muss eine 
                            Eingabe/Auswahl erfolgen
	
	Parameters:
		myForm:	    zu pruefendes Formular
*****************************************************************************************/
function checkOptional(myForm) {
    
    var OptionalOK = true;

    //alert("In checkOptional");
	// Einzelarrays der OptionalCheck-Bloecke in zweidimensionale Gesamtarrays schreiben
    var optionalRequired_All = new Array();
    var optionalTypes_All = new Array();
    var optionalTitles_All = new Array();
    for (var n=0; n < Number_of_optionalChecks; n++) {
        optionalRequired_All[n] = eval("optionalRequired_"+(n+1));
        optionalTypes_All[n] = eval("optionalTypes_"+(n+1));
        optionalTitles_All[n] = eval("optionalTitles_"+(n+1));
    }
    // Alle OptionalCheck-Bloecke pruefen
    for (var n=0; n < Number_of_optionalChecks; n++) {
        var optionalValue = false;

        // Pruefung aller relevanten Formularfelder auf fehlende Eingabe
        for (var i=0; i < optionalRequired_All[n].length; i++) {
            if (optionalValue != true) {
                // Pruefung der Textfelder auf fehlende Eingabe (=Eingabefeld leer oder Eingabe besteht nur aus Leerzeichen)
                if (optionalTypes_All[n][i] == "t")
                    {
                    if (myForm.elements[optionalRequired_All[n][i]].value != "") {
                        for (var j=0; j < myForm.elements[optionalRequired_All[n][i]].value.length; j++) {
                            if (myForm.elements[optionalRequired_All[n][i]].value.charAt(j) != " ") optionalValue=true;
                        }
                    }
                }
                // Pruefung der Pulldownmenues auf fehlende Auswahl (=erste Option gewaehlt)
                else if (optionalTypes_All[n][i] == "s") {
                    if (myForm.elements[optionalRequired_All[n][i]].selectedIndex >= 1) {
                        optionalValue=true;
                    }
                }
                // Pruefung der Checkboxen auf fehlende Auswahl (=erste Option gewaehlt)
                else if (optionalTypes_All[n][i] == "c") {
					if (myForm.elements[optionalRequired_All[n][i]].checked) {
                        optionalValue=true;
                    }
                }
            }
        }

        // bei fehlender Eingabe/Auswahl in allen Feldern: Fehlermeldung zusammenstellen und Focus setzen
        if (optionalValue == false) {
            FieldsNeeded += "\n\nMindestens eines der folgenden Formularfelder muss ausgefuellt/ausgewaehlt werden:";
            OptionalOK = false;
            // Focus setzen
            if (myFocus != true) {
                myForm.elements[optionalRequired_All[n][0]].focus();
                myFocus = true;
            }
            // Fehlermeldung zusammenstellen
            FieldsNeeded += "\n\t";
            for (var i=0; i < optionalRequired_All[n].length; i++) {
                FieldsNeeded += "\""+optionalTitles_All[n][i]+"\"";
                if (i < optionalRequired_All[n].length-2) FieldsNeeded += ", ";
                else if (i == optionalRequired_All[n].length-2) FieldsNeeded += " oder ";
            }
        }
    }
    
    if (OptionalOK == true) return true;  // Mindestens eines der optionalen Felder wurde ausgefuellt
    else { return false; }                // Keines der optionalen Felder Felder wurde ausgefuellt
}

/*****************************************************************************************
	Function: checkTextfields(myForm)
	
	Description:
        Pruefung von Textfeldern (INPUT TYPE="text" / TEXTAREA);
        Logische Bedingung: in jedem zu pruefenden Feld ist eine Eingabe erforderlich
	
	Parameters:
		myForm:	    zu pruefendes Formular
*****************************************************************************************/
function checkTextfields(myForm) {

    TextfieldsOK = true;

    for (var i=0; i < requiredTextfields.length; i++) {
        // Pruefung auf fehlende Eingabe (=Eingabefeld leer oder Eingabe besteht nur aus Leerzeichen)
		//alert(requiredTextfields[i]);
        var myValue=false;
        if (myForm.elements[requiredTextfields[i]].value != "") {
            for (var j=0; j < myForm.elements[requiredTextfields[i]].value.length; j++) {
                if (myForm.elements[requiredTextfields[i]].value.charAt(j) != " ") myValue=true;
            }
        }
        // bei fehlender Eingabe: Fehlermeldung zusammenstellen und Focus setzen
        if (myValue == false) {
			if (TextfieldsOK   ==  true) {
                FieldsNeeded += "\n\nFolgende Textfelder muessen noch ausgefuellt werden:";
			    TextfieldsOK = false;
                // Focus setzen
                if (myFocus != true) {
                    myForm.elements[requiredTextfields[i]].focus();
                    myFocus = true;
                }
			}
            FieldsNeeded += "\n\t\""+TextfieldTitles[i]+"\"";
        }
    }

    if (TextfieldsOK == true) return true;  // Alle zwingenden Felder wurden ausgefuellt
    else { return false; }                  // Einige zwingende Felder wurden nicht ausgefuellt
}


/*****************************************************************************************
	Function: checkSelects(myForm)
	
	Description:
        Pruefung von Pulldownmenues (SELECT):
        Logische Bedingung: in jedem zu pruefenden Pulldownmenue ist eine Auswahl erforderlich
	
	Parameters:
		myForm:	    zu pruefendes Formular
*****************************************************************************************/
function checkCheckBox(myForm) {

    var CheckboxOK = false;

    for (var i=0; i < requiredCheckbox.length; i++) {
        // bei fehlender Auswahl (=erste Option gewaehlt): Fehlermeldung zusammenstellen und Focus setzen
        if (myForm.elements[requiredCheckbox[i]].checked) {
            CheckboxOK   =  true; 
        }
    }
	if (CheckboxOK == false) {
          FieldsNeeded += "\n\nSie muessen mindestens eine der checkBoxen anwaehlen:";
          FieldsNeeded += "\n\t\""+CheckboxTitles[i]+"\"";
		alert(FieldsNeeded);
	}
	
    if (CheckboxOK == true) return true;   // Alle zwingenden Selects wurden ausgewaehlt
    else { return false; }                // Einige zwingende Auswahlen wurden nicht getroffen
}


/*****************************************************************************************
	Function: checkSelects(myForm)
	
	Description:
        Pruefung von Pulldownmenues (SELECT):
        Logische Bedingung: in jedem zu pruefenden Pulldownmenue ist eine Auswahl erforderlich
	
	Parameters:
		myForm:	    zu pruefendes Formular
*****************************************************************************************/
function checkSelects(myForm) {

    var SelectsOK = true;

    for (var i=0; i < requiredSelects.length; i++) {
        // bei fehlender Auswahl (=erste Option gewaehlt): Fehlermeldung zusammenstellen und Focus setzen
        if (myForm.elements[requiredSelects[i]].selectedIndex < 1) {
            if (SelectsOK   ==  true) {
                FieldsNeeded += "\n\nIn folgenden Pulldownmenues muessen Sie noch eine Auswahl treffen:";
			    SelectsOK = false;
                // Focus setzen
                if (myFocus != true) {
                    myForm.elements[requiredSelects[i]].focus();
                    myFocus = true;
                }
			}
            FieldsNeeded += "\n\t\""+SelectTitles[i]+"\"";
        }
    }

    if (SelectsOK == true) return true;   // Alle zwingenden Selects wurden ausgewaehlt
    else { return false; }                // Einige zwingende Auswahlen wurden nicht getroffen
}


/*****************************************************************************************
	Function: checkDate(myForm)
	
	Description:
        Pruefung von Datumseingaben auf korrektes Datumsformat und Gueltigkeit (Tag/Monat/Jahr)
        Hinweis: die Pruefung, ob ein Feld ueberhaupt ausgefuellt wurde, 
                 ist ueber die Funktion "checkTextfields(myForm)" zu steuern
	
	Parameters:
		myForm:	    zu pruefendes Formular
*****************************************************************************************/
function checkDate(myForm) {

    var dateOK = true;
    var dateCheck = new Array;
    var dateMsg;

    for (var i=0; i < dateInputs.length; i++) {
        // Datumsfeld nur pruefen, wenn etwas eingegeben wurde
        if (myForm.elements[dateInputs[i]].value != "") {
        
        	var dateArray = myForm.elements[dateInputs[i]].value.split("."); // Array mit den Datumsteilen Tag/Monat/Jahr durch Zerlegen am "." erzeugen
        	var dateDay = dateArray[0];
            var dateMonth = dateArray[1];
            var dateYear = dateArray[2];
            dateCheck[i] = true;
            
            // Pruefung auf korrektes Datumsformat (hat dateArray 3 Elemente mit Zahlenwerten sinnvoller Ziffernanzahl ?)
        	if (dateArray.length != 3 || isNaN(dateArray[0]) || isNaN(dateArray[1]) || isNaN(dateArray[2]) || dateDay.length > 2 || dateMonth.length > 2 || (dateYear.length !=2 && dateYear.length != 4)) {
        		dateMsg = "Das Datum muss das Format TT.MM.JJ bzw. TT.MM.JJJJ haben.";
        		dateCheck[i] = false;
        	}
            // Pruefung auf allg. Gueltigkeit der Eingaben (Tag, Monat)
        	else if (dateDay < 1 || dateDay > 31 || dateMonth < 1 || dateMonth > 12) {			
        	    if (dateDay < 1 || dateDay > 31) dateMsg = "Der eingegebene Tag ist ungueltig.";
        		else if (dateMonth < 1 || dateMonth > 12 ) dateMsg = "Der eingegebene Monat ist ungueltig.";
                dateCheck[i] = false;
        	}
            // Pruefung auf 31. Tag des Monats
        	else if (dateDay == 31 && (dateMonth==2 || dateMonth==4 || dateMonth==6 || dateMonth==9 || dateMonth==11)) {
                dateMsg = "Der eingegebene Monat hat keine 31 Tage.";
                dateCheck[i] = false;
            }
            // Pruefung auf Schaltjahr/29. Februar
        	else if (dateMonth==2 && dateDay > 28) {
                if (dateDay > 29) {
                    dateMsg = "Der Februar hat keine "+dateDay+" Tage.";
                    dateCheck[i] = false;
                }
        		else if (dateYear%4 != 0) {
                    dateMsg = "Im Jahr "+dateYear+" hat der Februar nur 28 Tage.";
                    dateCheck[i] = false;
                }
        	}
            
            //Ausgabe Fehlermeldung, Fokus setzen
            if (dateCheck[i] == false) {
                if (myFocus != true) {
                    myForm.elements[dateInputs[i]].focus();
                    myForm.elements[dateInputs[i]].select();
                    myFocus = true;
                }
                FieldsNeeded += "\n\nFehler bei der Datumseingabe in Feld \""+dateTitles[i]+"\":";
                FieldsNeeded += "\n"+dateMsg+"\nBitte korrigieren Sie Ihre Eingabe.";
                //myForm.elements[dateInputs[i]].value="";
                dateOK = false;
            }
        }
    }
    
    if (dateOK == true) return true;    // Datum korrekt und gueltig
    else { return false; }              // Datum nicht korrekt und gueltig
}


/*****************************************************************************************
	Function: checkEmail(myForm)
	
	Description:
        Pruefung der Gültigkeit einer eingegebenen E-mail Adresse
		
	Parameters:
		myForm:	    zu pruefendes Formular
*****************************************************************************************/

  function checkEmail(myForm)
  {  
    var emailOK = true;
    var emailCheck = new Array;
    var emailMsg = "";
	//alert("In checkEmail::: ");
	//alert("In checkEmail "+emailInputs.length);
    for (var i=0; i < emailInputs.length; i++) {
		//alert("In checkEmail myForm "+myForm.elements[emailInputs[i]].value);
		
        // Datumsfeld nur pruefen, wenn etwas eingegeben wurde
        if (myForm.elements[emailInputs[i]].value != "") {
			//alert("In checkEmail myForm hat value "+myForm.elements[emailInputs[i]].value);
			var emailValue=myForm.elements[emailInputs[i]].value;
     		// Zulässige Zeichen für eMails definieren
     		var validCharacters = new String("abcdefghijklmnopqrstuvwxyz")
     		validCharacters += validCharacters.toUpperCase() + "0123456789.-_@"
			//alert("In checkEmail emailValue "+emailValue);
     		// Position des @ herausfinden
    		var PosEt = emailValue.indexOf("@")
     		// Position des ersten . nach dem @ herausfinden
     		var PosPt = emailValue.indexOf(".", PosEt)
   
     		if (PosEt == -1) {
       			emailMsg = "    Es fehlt ein @ ";
				emailCheck[i]=false;
       			//alert(emailMsg+":"+emailCheck[i]);
	   		}
	    	else if (PosEt == 0) {
        		emailMsg = "    Es fehlt der Empfänger";
       			emailCheck[i]=false;
	  		}
     		else if (emailValue.indexOf("@", PosEt + 1) > PosEt) {
       			emailMsg = "    Es darf nur ein @ enthalten sein";
       			emailCheck[i]=false;
	  		}


     		else if ((PosPt == -1) || (PosPt - PosEt < 2) || (emailValue.length - PosPt < 3)) {
				emailMsg += "    Eine eMail-Adresse muß so aufgebaut sein: x@x.xx "
       			emailMsg += "    Jedes x steht für mindestens ein Zeichen"
	   			emailCheck[i]=false;
	   		}

     		// eMail-Adresse auf zulässige Zeichen überprüfen
     		else {
				emailMsg = checkCharacters(emailValue, validCharacters);
				if (emailMsg) emailCheck[i] = false;
			}

            //alert("emailCheck "+emailCheck[i]);
            //Ausgabe Fehlermeldung, Fokus setzen
            if (emailCheck[i] == false) {
                // alert("Fehler in Email");
				if (myFocus != true) {
                    myForm.elements[emailInputs[i]].focus();
                    myForm.elements[emailInputs[i]].select();
                    myFocus = true;
                }
                FieldsNeeded += "\n\nFehler bei der Emailadresseingabe in Feld \""+emailTitles[i]+"\":";
                FieldsNeeded += "\n"+emailMsg;
                //myForm.elements[dateInputs[i]].value="";
                emailOK = false;
            }
    	}
	}
    if (emailOK == true) return true;    // email korrekt und gueltig
    else { return false; }              // Email nicht korrekt und gueltig
}
    
/*****************************************************************************************
	Function: checkCharacters(String, validCharacters)
	
	Description:
        Pruefung Eingabestring auf zul&auml;ssige Zeichen
		
	Parameters:
		String:	    		zu pruefender Eingabestring
		validCharacters:	gueltige Zeichen fuer Eingabestring
*****************************************************************************************/
function checkCharacters(String, validCharacters) {  
    //alert("PruefeZeichen"+Feld);
	for (var Pos = 0; Pos < String.length; Pos++) {
        if (validCharacters.indexOf(String.charAt(Pos)) == -1) {
       		Msg = "    Ihre Eingabe enthält das Zeichen '"
            Msg += String.charAt(Pos)
            Msg += "'. Sie dürfen nur diese Zeichen verwenden:\n"
            Msg += "    "+validCharacters
			//if (validCharacters.indexOf(" ") == -1)
            //   { Msg += "\nLeerzeichen sind nicht erlaubt" }
            //else
            //   { Msg += "\nund das Leerzeichen" }
            return Msg;
         }
    }
    return;	
}
	

