// ------------------------------------------------------------------
// Setzt den Fokus auf das uebergebene Element.
// ------------------------------------------------------------------
function marke_setzen(element)
{
    element.focus();
}

// ------------------------------------------------------------------
// Utility Funktion zum Testen auf Whitespaces.
// ------------------------------------------------------------------
function isBlank(s) {
    for (var i = 0; i < s.length; i++) {
        var c = s.charAt(i);
        if ((c != ' ') && (c != '\n') && (c != '\t'))
            return false;
    }
    return true;
}

// ------------------------------------------------------------------
// Utility Funktion die überprüft, ob ein String nur Ziffern enthält.
// ------------------------------------------------------------------
function isNumeric(s) {
    for (var i = 0; i < s.length; i++) {
        var c = s.charAt(i);
        if ((c < '0' || c > '9'))
            return false;
    }
    return true;
}

// ------------------------------------------------------------------
// Jahr 2000 Bug Workaround.
// ------------------------------------------------------------------
function y2k(number) { return (number < 1000) ? number + 1900 : number; }

// ------------------------------------------------------------------
// Umwandeln eines Date Objekts in String der Form TT.MM.JJJJ
// ------------------------------------------------------------------
function dateToStr(d) {
    var s = (d.getDate() < 10) ? ("0" + d.getDate()) : (d.getDate());
    s    += ".";
    s    += ((d.getMonth() + 1) < 10) ? ("0" + (d.getMonth() + 1)) : (d.getMonth() + 1);
    s    += ".";
    s    += y2k(d.getYear());
    return s;
}

// ------------------------------------------------------------------
// Utility Funktion, die aus den übergebenen Parametern ein neues
// Datumobjekt erzeugt und zurückgibt. Kann aus den übergebenen
// Parametern kein gültiges Datum erzeugt werden, so wird null
// zurückgegeben.
// ------------------------------------------------------------------
function buildDate(day, month, year) {
    if (day == null || day == "") 
        return null;
    var today = new Date();
    year      = (year == null  || year == "")  ? y2k(today.getYear()) : year;
    month     = (month == null || month == "") ? today.getMonth()     : month - 1;
    var test  = new Date(year, month, day);
    if ((y2k(test.getYear()) == year) && (month == test.getMonth()) && (day == test.getDate()))
        return test;
    return null;
}

// ------------------------------------------------------------------
// Testen auf gültige EMail Adresse
// ------------------------------------------------------------------
function isEMail(s) {
    if (s.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1) 
        return true;
    else 
        return false;
}

// ------------------------------------------------------------------
// Validierung von Forminhalten. Parameter 'f' ist eine Referenz
// auf die zu überprüfende Form.
//
// Folgende Attribute der Eingabefelder werden ausgewertet:
//
// optional  :  true = Pflichtfeld, false = kein Pflichtfeld
// numeric   :  true = Es handelt sich um ein rein numerisches Feld
// email     :  true = Feld enthält eine E-Mail Adresse
// date      :  true = Feld enthält eine Datumsangabe
// min       :  Minimaler Wert, den ein Feld haben kann.
//              - Bei numerischen Felder eine Zahl
//              - Bei Datumsangaben ein Datum
//              - Bei Select-Boxen der minimale Index
//              - Bei Textfeldern Mindestanzahl an Zeichen
// max       :  Maximaler Wert, den ein Feld haben kann.
//              Es gilt analog das bei "min" beschriebene
// msgName   :  Name/Bezeichnung des Feldes für Fehlermeldungen
// ------------------------------------------------------------------


function validate(f) {
    var empty  = "";
    var error  = "";
    var output = "";

    // Durchlaufen aller Elemente in der Form.
    for (var i = 0; i < f.elements.length; i++) {
        // Aktuelle betrachtetes Element
        var e = f.elements[i];

        if (e.type == "select-one" || e.type == "select-multiple" || e.type == "radio") {
            // Wurde etwas ausgewählt?
            if (e.optional == false && (e.selectedIndex == -1 || (e.min != null && e.selectedIndex < e.min))) {
                empty += "\n     <" + (e.msgName ? e.msgName : e.name) + ">";
            }
        }
        else if (e.type == "text" || e.type == "textarea" || e.type == "password") {
            // Ist Feld leer obwohl es ein Pflichtfeld ist?
            if (e.optional == false && (e.value == null || e.value == "" || isBlank(e.value))) {
                empty += "\n     <" + (e.msgName ? e.msgName : e.name) + ">";
                continue;
            }
            else if ((e.optional == null || e.optional == true) && 
                     (e.value == null || e.value == "" || isBlank(e.value))) {
                // Leere Felder, die keine Pflichtfelder sind, werden nicht geprüft.
                e.value="";
                continue;
            }

            // Handelt es sich um ein alphanumerisches Feld?
            if (e.numeric != true && e.date != true && e.email != true) {
                if ((e.min != null && e.value.length < e.min) || (e.max != null && e.value.length > e.max)) {
                    error += "- Die Länge des Feldes <" + (e.msgName ? e.msgName : e.name) + "> ";
                    if (e.min != null && e.max != null)
                        error += "muß zwischen " + e.min + " und " + e.max + " Zeichen betragen.\n";
                    else if (e.min != null)
                        error += "muß mindestens " + e.min + " Zeichen betragen.\n";
                    else
                        error += "darf höchstens " + e.max + " Zeichen betragen.\n";
                }
            } // Ende alphanumerisch

            // Soll das Feld nur numerische Werte enthalten?
            else if (e.numeric == true) {
                if (!isNumeric(e.value)) {
                    error += "- Das Feld <" + (e.msgName ? e.msgName : e.name);
                    error += "> muß eine Zahl enthalten.\n";
                    continue;
                }
                var v = parseFloat(e.value);
                if ((e.min != null && v < e.min) || (e.max != null && v > e.max)) {
                    error += "- Das Feld <" + (e.msgName ? e.msgName : e.name);
                    error += "> muß eine Zahl enthalten, die ";
                    if (e.min != null && e.max != null)
                        error += "im Bereich " + e.min + " bis " + e.max + " liegt.\n";
                    else if (e.min != null)
                        error += "größer gleich " + e.min + " ist.\n";
                    else
                        error += "kleiner gleich " + e.max + " ist.\n";
                }
            } // Ende if numeric

            // Datumsfelder
            else if (e.date == true) {
                var dmin, dmax;
                var dsplit = e.value.split(".");
                var d      = buildDate(dsplit[0], dsplit[1], dsplit[2]);
                if (d == null) {
                    error += "- Das Feld <" + (e.msgName ? e.msgName : e.name);
                    error += "> enthält kein gültiges Datum der Form TT.MM.JJJJ.\n";
                    continue;
                }
                // Datumsformat ist ok, setze Feld auf vollständiges Datumsformat
                e.value = dateToStr(d);
                if (e.min != null) {
                    dsplit = e.min.split(".");
                    dmin   = buildDate(dsplit[0], dsplit[1], dsplit[2]);
                    e.min  = (dmin == null) ? null : dateToStr(dmin);
                }
                if (e.max != null) {
                    dsplit = e.max.split(".");
                    dmax   = buildDate(dsplit[0], dsplit[1], dsplit[2]);
                    e.max  = (dmax == null) ? null : dateToStr(dmax);
                }
                if ((e.min != null && d < dmin) || (e.max != null && d > dmax)) {
                    error += "- Das Feld <" + (e.msgName ? e.msgName : e.name);
                    error += "> muß ein Datum enthalten, das ";
                    if (e.min != null && e.max != null)
                        error += "im Bereich vom " + e.min + " bis zum " + e.max + " liegt.\n";
                    else if (e.min != null)
                        error += "gleich dem " + e.min + " ist oder danach liegt.\n";
                    else
                        error += "gleich dem " + e.max + " ist oder davor liegt.\n";
                }
            } // Ende Datumsfelder

            // EMail Adresse
            else if (e.email == true && !isEMail(e.value)) {
                error += "- Das Feld <" + (e.msgName ? e.msgName : e.name);
                error += "> enthält keine gültige EMail Adresse\n";
            } // Ende EMail Adresse
        }
    } // Ende Durchlaufen aller Elemente in der Form

    if (!empty && !error) return true;

    output += "_____________________________________________________________________________\n\n";
    output += "Ihre Eingaben konnten NICHT verarbeitet werden!\n\n";
    output += "Bitte korrigieren Sie nachfolgende(n) Fehler und wiederholen Sie den Vorgang.\n";
    output += "_____________________________________________________________________________\n\n";

    if (empty) output += "- Die folgenden Pflichtfelder sind leer:" + empty + "\n";
    if (error) output += "\n" + error;

    alert(output);
    return false;
}


