// version: 0.9.2.21
/*
  conditions:
  oField.className.indexOf('integer')           - prueft auf zahlenwert
  oField.className.indexOf('intminmax')         - value muss innerhalb von 2 werten sein, steht in Klammern z.B. intminmax(10,200)
  oField.className.indexOf('agecheck')          - prueft auf volljaehrigkeit
  oField.className.indexOf('minlength')         - nach 'minlength' steht in Klammern die mindestlaenge z.B. minlength(4)
  oField.className.indexOf('numeral')           - es muss eine Zahl enthalten sein (hausnummer)
  oField.className.indexOf('ignore_safetyrule') - bei type 'password': es werden die aSafetyRule ignoriert
  oField.className.indexOf('msisdn')            - beginnt mit "0" oder "49", ist mind. 11-stellig?
  poField.className.indexOf('ignore_setup')     - feld wird bei do_setup_form_elements uebergangen
  poField.className.indexOf('legal_phonenumber')- es darf nicht jede (vorwahl) akzeptiert werden
*/

var sRgbIsError = '#e2001a';
var sRgbNoError = '#333333';

var bShowErrorInfo = 1; // sollen zusaetzliche error infos angezeigt werden? z.B. '(min. 5)' bei class minlength
var bIsSubmit = false;
/* aSafetyRule - so darf ein password nicht lauten */
//a = "1191"
//if (debug) alert(/\d{4}/.test(a));
var aSafetyRule = new Array();
aSafetyRule[0] = '0000';
aSafetyRule[1] = '1111';
aSafetyRule[2] = '2222';
aSafetyRule[3] = '3333';
aSafetyRule[4] = '4444';
aSafetyRule[5] = '5555';
aSafetyRule[6] = '6666';
aSafetyRule[7] = '7777';
aSafetyRule[8] = '8888';
aSafetyRule[9] = '9999';
aSafetyRule[10] = '0123';
aSafetyRule[11] = '1234';
aSafetyRule[12] = '2345';
aSafetyRule[13] = '3456';
aSafetyRule[14] = '4567';
aSafetyRule[15] = '5678';
aSafetyRule[16] = '6789';
aSafetyRule[17] = '7890';
aSafetyRule[18] = '3210';
aSafetyRule[19] = '4321';
aSafetyRule[20] = '5432';
aSafetyRule[21] = '6543';
aSafetyRule[22] = '7654';
aSafetyRule[23] = '8765';
aSafetyRule[24] = '9876';
aSafetyRule[25] = '0987';

var aMobilePhone = new Array();
aMobilePhone[0]  = '0150';  //Mobilfunk: Reservierung für Group3G/Quam; derzeit abgeschaltet
aMobilePhone[1]  = '01505'; // Mobilfunk: Group3G (Quam), derzeit abgeschaltet
aMobilePhone[2]  = '0151';  //  Mobilfunk: Reservierung für T-Mobile
aMobilePhone[3]  = '01511'; // Mobilfunk: T-Mobile
aMobilePhone[4]  = '01515'; // Mobilfunk: T-Mobile
aMobilePhone[5]  = '0152';  //  Mobilfunk: Reservierung für Vodafone
aMobilePhone[6]  = '01520'; // Mobilfunk: Vodafone
aMobilePhone[7]  = '0153';  //  Mobilfunk: (nicht vergeben)
aMobilePhone[8]  = '0154';  //  Mobilfunk: (nicht vergeben)
aMobilePhone[9]  = '0155';  //  Mobilfunk: Reservierung für E-Plus 3G Luxb.
aMobilePhone[10] = '0156';  //  Mobilfunk: Reservierung für Mobilcom
aMobilePhone[11] = '01566'; // Mobilfunk: Mobilcom
aMobilePhone[12] = '0157';  //  Mobilfunk: Reservierung für E-Plus
aMobilePhone[13] = '01570'; // Mobilfunk: Vistream
aMobilePhone[14] = '01577'; // Mobilfunk: E-Plus
aMobilePhone[15] = '0158';  //  Mobilfunk: (nicht vergeben)
aMobilePhone[16] = '0159';  //  Mobilfunk: Reservierung für O2 Germany
aMobilePhone[17] = '0160';  //  Mobilfunk: Zuteilung für T-Mobile
aMobilePhone[18] = '0161';  // (nicht vergeben, ehemals analoges C-Netz)
aMobilePhone[19] = '0162';  //  Mobilfunk: Zuteilung für Vodafone
aMobilePhone[20] = '0163';  //  Mobilfunk: Zuteilung für E-Plus
aMobilePhone[21] = '0164';  //  Funkmeldeempfänger: Cityruf (e*message)
aMobilePhone[22] = '0165';  // (nicht vergeben, ehemals Funkmeldeempfänger Quix)
aMobilePhone[23] = '0166';  //  Funkmeldeempfänger: Telmi (e*message)
aMobilePhone[24] = '0167';  //  Bündelfunknetze
aMobilePhone[25] = '01672'; // Bündelfunknetz: Dolphin Telecom
aMobilePhone[26] = '0168';  //  Funkmeldeempfänger: Scall (e*message)
aMobilePhone[27] = '0169';  //  Funkmeldeempfänger: Cityruf, Scall, Skyper (e*cityruf, e*message, e*skyper)
aMobilePhone[28] = '0170';  //  Mobilfunk: T-Mobile
aMobilePhone[29] = '0171';  //  Mobilfunk: T-Mobile
aMobilePhone[30] = '0172';  //  Mobilfunk: Vodafone
aMobilePhone[31] = '0173';  //  Mobilfunk: Vodafone
aMobilePhone[32] = '0174';  //  Mobilfunk: Vodafone
aMobilePhone[33] = '0175';  //  Mobilfunk: T-Mobile
aMobilePhone[34] = '0176';  //  Mobilfunk: O2 Germany
aMobilePhone[35] = '0177';  //  Mobilfunk: E-Plus
aMobilePhone[36] = '0178';  // Mobilfunk: E-Plus
aMobilePhone[37] = '0179';  // Mobilfunk: O2 Germany

/* diese Rufnummern duerfen z.B. bei FaF nicht akzeptiert werden */
var aForbiddenPhoneNumber = new Array();
//aForbiddenPhoneNumber[0] = '00..'; //- Ausland - wird speziell abgefragt
aForbiddenPhoneNumber[0]  = '0190'; // Service
aForbiddenPhoneNumber[1]  = '0180'; // Service
aForbiddenPhoneNumber[2]  = '0137'; // Service
aForbiddenPhoneNumber[3]  = '0900'; // Service
// 2007-04-25 RB, neue nummern
aForbiddenPhoneNumber[4]  = '0137'; //XY
aForbiddenPhoneNumber[5]  = '0138'; //XY
aForbiddenPhoneNumber[6]  = '0180'; //XY
aForbiddenPhoneNumber[7]  = '0181';
aForbiddenPhoneNumber[8]  = '0182';
aForbiddenPhoneNumber[9]  = '0183';
aForbiddenPhoneNumber[10] = '0184';
aForbiddenPhoneNumber[11] = '0185';
aForbiddenPhoneNumber[12] = '0186';
aForbiddenPhoneNumber[13] = '0187';
aForbiddenPhoneNumber[14] = '0188';
aForbiddenPhoneNumber[15] = '0189';
aForbiddenPhoneNumber[16] = '0190'; //XY
aForbiddenPhoneNumber[17] = '0700'; //XY
aForbiddenPhoneNumber[18] = '0701'; //XY
aForbiddenPhoneNumber[19] = '0800'; //XY
aForbiddenPhoneNumber[20] = '00800'; //XY
aForbiddenPhoneNumber[21] = '0801'; //XY
aForbiddenPhoneNumber[22] = '0900'; //XY
aForbiddenPhoneNumber[23] = '0901';
aForbiddenPhoneNumber[24] = '0902';
aForbiddenPhoneNumber[25] = '0903';
aForbiddenPhoneNumber[26] = '0904';
aForbiddenPhoneNumber[27] = '0905';
aForbiddenPhoneNumber[28] = '118'; //XY
aForbiddenPhoneNumber[29] = '1180'; //XY

//Satelitentelefonie: '00..'; //- Ausland - wird speziell abgefragt
// aForbiddenPhoneNumber[18] = '008816';
// aForbiddenPhoneNumber[19] = '008817';
// aForbiddenPhoneNumber[20] = '00871';
// aForbiddenPhoneNumber[21] = '00872';
// aForbiddenPhoneNumber[22] = '00873';
// aForbiddenPhoneNumber[23] = '00874';
// aForbiddenPhoneNumber[24] = '0088216';


function check_mobilephone(poField)
{
    // checkt, ob es sich um eine Mobilfunknummer handelt
    var bIsMobilePhone = inArray(poField.value, aMobilePhone);
    
    document.getElementById('span_error_mobilphone').innerHTML = bIsMobilePhone ? '' : aErrorCause['no_mobilephone'];
    do_mark_field(poField, !bIsMobilePhone);
}

function do_validate_form()
{   
    var oForm                = document.forms[0];
    var bFieldsComplete      = true;
    var oFieldIsMissingFirst = false;
    var aMissingField        = new Array();
    
    var debug = false;
    /*var aRequiredFieldNames = oForm.fld_required.value.split(',');*/
    
    // alert("Hallo");
    // alert("document.forms[0].action: " + document.forms[0].action);
    
    if (oForm.fld_required && oForm.fld_required.value.trim() == '')
    {
        //alert(oForm.fld_required.maxLength)
        // sicherheitsmechanismus, hidden field wurde mit js geleert !!!??
        alert("Bitte Seite neu laden!");
        return;
    }
    
    if (typeof(do_before_validate_form) != 'undefined')
    {
        // 2008-02-11 RB, return-wert nicht vergessen!
        if (!do_before_validate_form()) return false;
    }
    
    // reset der label-farbe (es gibt labels, die fuer mehrere inputs stehen z.b. plz/prt)
    for(var i=0; i<oForm.elements.length;i++)
    {
        var oField = oForm.elements[i];
        if (oField.label)
        {
            oField.label.style.color = sRgbNoError;
        }
    }

    /* 1. alle fields durchgehen */
    for(var i=0,j=0; i<oForm.elements.length;i++)
    {
        var oField     = oForm.elements[i];
        oField.isWrong = false;
        /* 2. momentanes field auf required pruefen */

        if (oField.name.indexOf('fld_') != -1 && (oForm.fld_required.value.indexOf(oField.name) != -1 /*|| (oField.type == 'text' && oField.value.trim() != '')*/ ) )
        {
            /* required fields stehen jeweils im hidden field am anfang der seite */
            var bFieldIsMissing = false;
            
            switch (oField.type)
            {
                case 'text':
                case 'textarea':
                case 'password':
                case 'hidden':
                {
                    var sTmpValue = oField.value.trim();
                    
                    var bMisstake1 = sTmpValue == ''; // darf nicht leer sein
                    var bMisstake2 = (oField.name.indexOf('email') != -1 && !checkEmail(sTmpValue)); // muss valide email-adresse sein
                    var bMisstake3 = oField.className.indexOf('integer') != -1 && /\D/.test(sTmpValue); // muss integer sein
                    var bMisstake4 = oField.name.indexOf('_wiederholen') != -1 && oField.value != oForm.elements[oField.name.replace('_wiederholen', '')].value; // wiederholungsfeld - mit ersteingabe vergleichen
                    
                    var bIsError = false;
                    if (oField.className.indexOf('minlength') != -1)
                    {
                        var iPosPre = oField.className.indexOf('(') + 1;
                        var iPosSuf = oField.className.indexOf(')');
                        var iFieldLength = oField.className.substring(iPosPre, iPosSuf);
                        bIsError = oField.className.indexOf('minlength') != -1 && sTmpValue.length < iFieldLength;
                        oField.errorinfo = bIsError && !bMisstake1 && bShowErrorInfo ? ' (min. '+iFieldLength+')' : '';
                    }
                    var bMisstake5 = bIsError;
                    
                    var bMisstake6 = oField.type == 'password' && oField.className.indexOf('ignore_safetyrule') == -1 && inArray(sTmpValue, aSafetyRule);// nicht konform mit Sicherheitsregeln fuer Passwoerter 
                    if (0 && bMisstake6)
                    {
                        alert ("bMisstake6:"+oField.value+" ; "+oField.name);
                    }
                    var bMisstake7 = oField.className.indexOf('numeral') != -1 && !/.*[0-9]+.*/.test(sTmpValue); // muss eine zahl enthalten
                    var bMisstake8 = oField.name.indexOf('fld_pkk') != -1 && oForm.fld_required.value.indexOf('fld_pkk_1') != -1 && oForm.fld_required.value.indexOf('fld_pkk_2') != -1 && oForm.fld_pkk_1.value == oForm.fld_pkk_2.value; // pkk_1 muss ungleich pkk_2 sein

                    if (oField.className.indexOf('intminmax') != -1)
                    {
                        var iPosPre = oField.className.indexOf('(') + 1;
                        var iPosSuf = oField.className.indexOf(')');
                        var sSubstr = oField.className.substring(iPosPre, iPosSuf);
                        var aMinMax = sSubstr.split(',');
                    }
                    var bMisstake9 = oField.className.indexOf('intminmax') != -1 && (Number(sTmpValue) < aMinMax[0] || Number(sTmpValue) > aMinMax[1]); // zahl muss innerhalt einer min- und maxgroesse sein

                    var bMisstake10 =false; 
                    // bMisstake10 = oField.className.indexOf('msisdn') != -1 && ((oField.value.substr(0,1) != '0' && oField.value.substr(0,2) != '49') || oField.value.length < 11); // msisdn muss mit 0 bzw 49 beginnen, und mind. 11 zeichen lang sein
                    if (oField.className.indexOf('msisdn') != -1)
                    {
                        /*
                             +49 170 1234567 = len = 13 
                            0049 170 1234567 = len = 14
                               0 170 1234567 = len = 10
                              49 170 1234567 = len = 11
                        */

                        
                        /* 2008-02-19 RB, alte msisdn-validierung
                        if ((sTmpValue.substr(0,3) == '+49'  && oField.value.length >= 13) ||                        
                            (sTmpValue.substr(0,4) == '0049' && oField.value.length >= 14) ||
                            (sTmpValue.substr(0,2) == '01'   && oField.value.length >= 10) ||
                            (sTmpValue.substr(0,2) == '49'   && oField.value.length >= 11))
                            bMisstake10 = false ;
                        else
                            bMisstake10 = true ;
                        */
                        
                        sTmpValue = sTmpValue.replace(/\s/g, ''); // alle leerzeichen weg
                        // alle msisdn-anfangsmoeglichkeiten auf 0 bringen
                        if (sTmpValue.substr(0,3)      == '+49')  sTmpValue = '0' + sTmpValue.substr(3);
                        else if (sTmpValue.substr(0,4) == '0049') sTmpValue = '0' + sTmpValue.substr(4);
                        else if (sTmpValue.substr(0,2) == '49')   sTmpValue = '0' + sTmpValue.substr(2);
                        //oField.value = sTmpValue; // eingabe-value "optisch" ueberschreiben, damit es auch richtig abgesendet wird
                                                
                        /* 2008-02-19 RB, neue msisdn validierung */
                        iMsisdnMinLength  = typeof(iMsisdnMinLength) == 'undefined' ? 9 : iMsisdnMinLength;// 2009-03-03 RB, man kann die msisdn mindestlaenge jetzt ueberschreiben
                        bMsisdnCondition0 = sTmpValue.length > iMsisdnMinLength; // die MSISDN ist minimal 10 Zeichen lang
                        bMsisdnCondition1 = sTmpValue.length < 15; // die MSISDN ist maximal 15 Zeichen lang -> 15 wenn sie mit 49 beginnt. 14 wenn sie mit 0 brginnt
                        bMsisdnCondition2 = sTmpValue.substr(0,1) == '0' || sTmpValue.substr(0,2) == '49'; // die MSISDN beginnt mit einer „0“ oder „49“
                        bMsisdnCondition3 = sTmpValue.substr(1,1) != '0'; // das zweite Zeichen in der MSISDN ist keine „0“
                        bMsisdnCondition4 = !isNaN(sTmpValue); // die MSISDN beinhaltet ausschließlich Ziffern
                        bMsisdnCondition5 = sTmpValue.indexOf(' ') == -1; // die MSISDN beinhaltet keine Leerzeichen
       
                        bMsisdnCondition6_CompareValue1 = sTmpValue.substr(0,2) == '49' ? sTmpValue.substr(0,4) : sTmpValue.substr(0,3);
                        bMsisdnCondition6_CompareValue2 = sTmpValue.substr(0,2) == '49' ? sTmpValue.substr(0,5) : sTmpValue.substr(0,4);
                        bMsisdnCondition6 = inArray(bMsisdnCondition6_CompareValue1, aMobilePhone) || inArray(bMsisdnCondition6_CompareValue2, aMobilePhone); // die Vorwahl der MSISDN bekannt ist.

                        //alert(bMsisdnCondition0+' && '+bMsisdnCondition1+' && '+bMsisdnCondition2+' && '+bMsisdnCondition3+' && '+bMsisdnCondition4+' && '+bMsisdnCondition5+' && '+bMsisdnCondition6)
                        bMisstake10 = (bMsisdnCondition0 &&bMsisdnCondition1 && bMsisdnCondition1 && bMsisdnCondition2 && bMsisdnCondition3 && bMsisdnCondition4 && bMsisdnCondition5 && bMsisdnCondition6) ? false : true;
                        
                        if (!bMisstake10) oField.value = '49' + sTmpValue.substr(1); // wieder 49 davor (service aktzeptiert nur 49er)
                        //alert(bMisstake10)
                    }
                    
                    var bIsError = false;
                    if (oField.className.indexOf('legal_phonenumber') != -1)
                    {
                        if (sTmpValue.substr(0,2) == '00' || sTmpValue.substr(0,1) != '0')
                        {
                            bIsError = true;
                        }
                        else
                        {
                            for (e in aForbiddenPhoneNumber)
                            {
                                if (sTmpValue.indexOf(aForbiddenPhoneNumber[e]) != -1)
                                {
                                    bIsError = true;
                                    break;
                                }
                            }
                        }
                    }
                    var bMisstake11 = bIsError;
                    
                    if ( 
                         bMisstake1  ||
                         bMisstake2  ||
                         bMisstake3  ||
                         bMisstake4  ||
                         bMisstake5  ||
                         bMisstake6  ||
                         bMisstake7  ||
                         bMisstake8  ||
                         bMisstake9  ||
                         bMisstake10 ||
                         bMisstake11
                       )
                    {
                        oField.isWrong  = true;
                        bFieldIsMissing = true;

                        oField.error_cause =
                        bMisstake1  ? 'is_empty' :
                        bMisstake2  ? 'wrong_email' :
                        bMisstake3  ? 'no_integer' :
                        bMisstake4  ? 'wrong_repitition' :
                        bMisstake5  ? 'wrong_length' :
                        bMisstake6  ? 'password_unsafe' :
                        bMisstake7  ? 'without_number' :
                        bMisstake8  ? 'pkk1_equal_pkk2' :
                        bMisstake9  ? 'outside_minmax' :
                        bMisstake10 ? 'no_msisdn' :
                        'illegal_phonenumber';
                    }
                    
                    break;
                }
                
                case 'radio':
                {           
                    var bOneIsChecked   = false;
                    var oRadioboxParent = oForm.elements[oField.name]; // virtueller parent, alle radioboxen gehoeren ja zu einem objekt
                    
                    if (oRadioboxParent.ignore_checking) continue;
                    
                    if (typeof(oRadioboxParent.length) == 'undefined') //wenn nur eine radiobox da ist, gibt es keine length!!!
                    {
                        bOneIsChecked = true;
                    }
                    for(var iRadio=0; iRadio<oRadioboxParent.length;iRadio++)
                    {
                        if (oRadioboxParent[iRadio].checked)
                        {
                            bOneIsChecked = true;
                            oRadioboxParent.ignore_checking = true; /* hierdurch wissen alle zugehoerigen radio's, dass schon einer gechecked ist */
                            break;
                        }
                    }
                    
                    if (!bOneIsChecked)
                    {
                        var isAlreadyIn = false;
                        for (e in aMissingField)
                        {
                            if (aMissingField[e].name == oField.name)
                            {
                                isAlreadyIn = true;
                            } 
                        }
                        
                        if (1 || !isAlreadyIn)
                        {
                            oField.isWrong  = true;
                            bFieldIsMissing = true;
                            oField.error_cause = 'radio_not_checked';
                        }
                    }
                    
                    break;
                }
                
                case 'checkbox':
                {
                    if (!oField.checked)
                    {
                        oField.isWrong     = true;
                        oField.error_cause = 'not_checked';
                        bFieldIsMissing    = true;
                        
                        // pruefen ob ich vielleicht zu einer gruppe gehoere (name ist dann gleich)
                        for (var iii=0; iii<document.getElementsByName(oField.name).length; iii++)
                        {
                            if (document.getElementsByName(oField.name)[iii].checked)
                            {
                                oField.isWrong  = false;
                                bFieldIsMissing = false;
                                oField.error_cause = '';
                            }
                        }
                    }

                    break;
                }

                case 'select-one':
                {
                    var bDate          = oField.name.indexOf('tag') != -1 || oField.name.indexOf('monat') != -1 || oField.name.indexOf('jahr') != -1;
                    var bDateNotSelect = oField.value.indexOf('TT') != -1 || oField.value.indexOf('MM') != -1 || oField.value.indexOf('JJJJ') != -1;
                    
                    var bAgeCheck      = oField.className.indexOf('agecheck') != -1; // ist nur bei Tag vorhanden
                    var bIsAdult       = false;
                    
                    if (bAgeCheck)
                    {                
                        var bDateSiblingsNotSelect =
                            (oField.value.indexOf('TT') == -1 && oForm.elements[(i+1)].value.indexOf('MM') != -1 || oForm.elements[(i+2)].value.indexOf('JJJJ') != -1)
                            || (oField.value.indexOf('MM') == -1 && oForm.elements[(i-1)].value.indexOf('TT') != -1 || oForm.elements[(i+1)].value.indexOf('JJJJ') != -1)
                            || (oField.value.indexOf('JJJJ') == -1 && oForm.elements[(i-2)].value.indexOf('TT') != -1 || oForm.elements[(i-1)].value.indexOf('MM') != -1)
                        ;
                        // zusammengehoerige felder sind noch nicht komplett!
                        // die fehlende Felder melden dann einen fehler, nicht dieses feld
                        // erst dann auf agecheck testen
                        if (!bDateNotSelect && bDateSiblingsNotSelect) continue;
                    
                        /* geburtsdatum mit aktuellen datum vergleichen und auf volljaehrigkeit pruefen */
                        var sUserD = parseInt(oForm.elements[i].value);
                        var sUserM = parseInt(oForm.elements[(i+1)].value);
                        var sUserY = oForm.elements[(i+2)].value;
                        
                        var oDate = new Date();
                        var sNowD = oDate.getDate();
                        var sNowM = oDate.getMonth() + 1;// zaehlung beginnt bei 0!
                        var sNowY = oDate.getFullYear();
                        
                        var sMinAge          = 16;// mindestalter
                        var bAdultCondition1 = sUserY <  (sNowY - sMinAge);
                        var bAdultCondition2 = sUserY == (sNowY - sMinAge) && sUserM <  sNowM;
                        var bAdultCondition3 = sUserY == (sNowY - sMinAge) && sUserM == sNowM && sUserD <= sNowD;
                        
                        bIsAdult = bAdultCondition1 || bAdultCondition2 || bAdultCondition3;
                    }
                    
                    if (bDate && bDateNotSelect || bAgeCheck && !bIsAdult)
                    {
                        bFieldIsMissing = true;
                        oField.isWrong  = true;
                        
                        oField.error_cause = bDate && bDateNotSelect ? 'wrong_date' : 'not_adult';
                    }
                    
                    if (!bDate && !bAgeCheck)
                    {
                        if (oField.value == "") 
                        {
                            bFieldIsMissing = true;
                            oField.isWrong = true;
                            oField.error_cause = 'no_selection';
                        }
                        
                        // 2009-05-05 RB, anrede hat jetzt die erste option 'bitte waehlen'
                        if (oField.value == "select_salutation")
                        {
                            bFieldIsMissing = true;
                            oField.isWrong = true;
                            oField.error_cause = 'no_salutation';
                        }
                    }
                    //alert(oField.name+" :pruef: "+oField.isWrong)
                    break;
                }
            }
            
            do_mark_field(oField,bFieldIsMissing);
            
            if (bFieldIsMissing)
            {
                if (bFieldsComplete)
                {
                    /* das erste feld merken -> focus */
                    oFieldIsMissingFirst = oField;
                }
                
                bFieldsComplete = false;
                
                if (oField.type == 'radio' && isAlreadyIn)
                {
                    /*
                    2008-04-22 RB, fehlermeldung zu zusammenhaengenden radio-boxen sollen nur einmal erscheinen
                    feld nicht in aMissingField aufnehmen
                    */
                    
                }
                else
                  aMissingField[j++] = oField;
            }
        }
        
        /* 3. field-type exceptions behandeln */
        if (0 && !bFieldIsMissing && oField.type == 'checkbox')
        {
            if (oField.name.indexOf('fld_') != -1)
            {
                if (!oField.checked)
                {
                    /* damit checkbox immer abgeschickt wird, und ggf. db eintrag ueberschrieben wird */
                    oField.checked = true;
                    oField.value   = '';
                }
            }
        }
    }

    /* 4. abschicken */
    if (bFieldsComplete)
    {
        /*---- content abdecken ----*/
        if (document.getElementById('div_content_cover'))
        {
            var oDiv = document.getElementById('div_content_cover');
            var oFrm = document.getElementById('frm_content_cover');
    
            if(oBrowser.sName == 'ie')
            {
                oDiv.style.position    = 'absolute';
                oDiv.style.top         = document.body.scrollTop + 'px';
                document.body.onscroll = function () { oDiv.style.top = document.body.scrollTop + 'px'; }
            }
            else
            {
                oDiv.style.position = 'fixed';
                oDiv.style.top      = '0px'; // + (window.pageYOffset ? window.pageYOffset : document.body.scrollTop) + 'px';
            }
            oDiv.style.visibility = 'visible';
            if (oBrowser.sName == 'ie') oFrm.style.display    = 'block';
        }
        /*----/content abdecken ----*/

        if (typeof(do_after_validate_form) != 'undefined')
        {
            // 2008-03-07 RB, return-wert nicht vergessen!
            if (!do_after_validate_form()) return false;
        }
        
        if (!bIsSubmit)
        {
            bIsSubmit = true;
            oForm.submit();
        }    
        return false;
    }
    else // error
    {
//         var sError = '<b class="error_headline">'+txt_error+' ('+aMissingField.length+' Fehler):</b><br /><br />';
//         sError += '<table cellpadding="0" cellspacing="0" border="0">';
//         for (e in aMissingField)
//         {
//             sError += '<tr>';
//             sFieldName  = aMissingField[e].name;
//             // z.B. angabe der minlength
//             var sExtraInfo = typeof(aMissingField[e].errorinfo) != 'undefined' ? aMissingField[e].errorinfo : '';
//             sErrorCause = aErrorCause[aMissingField[e].error_cause] + sExtraInfo; 
//             //sError += sFieldName + ' - '+sErrorCause+'<br />';
//             sError += '<td valign="top">' + aFieldName[sFieldName] + ':&nbsp;&nbsp;</td><td valign="top">' + sErrorCause + '</td>';
//             sError += '</tr>';
//         }
//         sError += '</table>';

        var sError = '<b class="error_headline"><i>' + txt_error + '</i></b>';
        sError += '<table cellpadding="0" cellspacing="0" border="0">';
        
        for (e in aMissingField)
        {
            if (aMissingField[e].error_cause == 'is_empty')
            {
                continue;
            }
            sError += '<tr>';
            sFieldName  = aMissingField[e].name;
            var sExtraInfo = typeof(aMissingField[e].errorinfo) != 'undefined' ? aMissingField[e].errorinfo : '';
            sErrorCause = aErrorCause[aMissingField[e].error_cause] + sExtraInfo; 
            sError += '<td class="txt_error" valign="top">' + aFieldName[sFieldName] + ':&nbsp;&nbsp;</td><td class="txt_error" valign="top">' + sErrorCause + '</td>';
            sError += '</tr>';
        }
        sError += '</table>';
        
        document.getElementById('span_input_error').innerHTML = sError;
        document.getElementById('div_input_error').style.display = 'block';
        
        //if (oFieldIsMissingFirst.type != 'hidden') oFieldIsMissingFirst.focus();
        //Wenn Fehlermeldungen auftauchen, soll der Kunde zum Seitenbeginn geführt werden, damit er die FM dann auch sieht
        window.scrollTo(0, 0);

        /* muss auf error noch speziell reagiert werden? */
        if (typeof(do_on_validation_error) != 'undefined') 
            do_on_validation_error();
        
        return false;
    }
}

function do_setup_form_elements()
{
    // um initial errror-icon(trans.gif) zu erstellen

    var oForm = document.forms[0];
    
    for(var i=0; i<oForm.elements.length;i++)
    {
        var oField = oForm.elements[i];
        
        if (oField.name.indexOf('fld_') != -1)
        {
            if (
                oField.name.indexOf('fld_') != -1 &&
                oField.name != 'fld_required' &&
                /*oField.name != 'fld_login_msisdn' &&*/
                oField.name != 'fld_login_password' &&
                oField.name != 'fld_login_typ' &&
                oField.name != 'fld_login_msisdn_instant' &&
                oField.name != 'fld_login_password_instant'
               )
            {
                do_mark_field(oField,false);
            }
        }
    }
}

function do_mark_field(poField,pbIsMissing)
{
    var oForm    = document.forms[0];
    var oParent  = poField.parentNode; // div drumrum

    /* 2007-12-11 RB, sonderbehandlung fuer select-felder, da neu gestylt (div drumrum )*/
    var bSelectException = false;
    if (oParent.className == 'div_select_clipping')
    {
        bSelectException = true;
        oParent = oParent.parentNode;
    }

    var bIsGroup = oParent.className.indexOf('div_fld_group') != -1;
      
    if (typeof(oParent.oIcon) == 'undefined')
    {
        // errror-icon erstellen und darstellen
        // oParent ist immer das div drumrum
        var oImg              = oParent.appendChild(document.createElement("img"));
        oParent.oIcon         = oImg;
        oImg.id               = poField.name+'_icon_error';
        oImg.style.width      = '15px';
        oImg.style.height     = '15px';
        oImg.style.marginLeft = '2px';
    
        if (poField.type == 'radio')
        {
            var oRadioboxParent = oForm.elements[poField.name];
            poField.oImg        = oImg;
            
            if (poField.checked || oRadioboxParent.bIsSetup || poField.className.indexOf('ignore_setup') != -1)
            {
                // radioboxen sind nicht abwaehlbar (eine is immer gechecked)!!!
                // wenn ein radio gechecked ist, kann er nicht mehr unausgewählt sein, icon nicht notwendig
                if (oRadioboxParent.length > 0)
                {
                    for (var i=0; i<oRadioboxParent.length; i++)
                    {
                        if (oRadioboxParent[i].oImg) oRadioboxParent[i].oImg.style.display = 'none';
                    }
                }
                else poField.oImg.style.display = 'none';
                
                oRadioboxParent.bIsSetup = true;
                return;
            }
        }
    }
    else var oImg = oParent.oIcon;
    
    if (0 && bIsGroup)
    {
        // bei gruppierungen soll nur ein fehlt-icon erscheinen (Geburtsdatum), sobald einer falsch ist sind alle falsch
        for (var ii=0;ii<=oParent.childNodes.length;ii++)
        {
            //if (oParent.childNodes[ii] && oParent.childNodes[ii].tagName == 'SELECT')
            if (oParent.childNodes[ii])
            {
                if (bSelectException) /* 2007-12-11 RB, sonderbehandlung fuer select-felder, untergeordnete durchsuchen */
                {
                    for (var iii=0;iii<=oParent.childNodes[ii].childNodes.length;iii++)
                    {
                        if (oParent.childNodes[ii].childNodes[iii])
                        {
                            if (oParent.childNodes[ii].childNodes[iii].isWrong)
                            {
                                pbIsMissing = true;
                                break;
                            }
                        }
                    }
                }
                else
                {
                    //alert("markieren: "+oParent.childNodes[ii].name+" "+oParent.childNodes[ii].isWrong)
                    if (oParent.childNodes[ii].isWrong)
                    {
                        pbIsMissing = true;
                        break;
                    }
                }
            }
        }
    }
    
    if (oImg)
    {
        //oImg.src = pbIsMissing ? sRoot+'/images/'+mandant+'/icon_error.gif' : sRoot+'/images/trans.gif';
        oImg.src = sRoot+'/images/trans.gif';
        oImg.style.display = 'none';
    }
    
    /*-------------------- 2009-09-28 RB, neue validierungskennzeichnung --------------------*/
    if (!poField.borderObject) // border-object bereitstellen
    {
        poField.borderObject = poField;
        
        if (poField.type == 'select-one')
        {
            //if (oBrowser.sVersion == '6.0' || oBrowser.sVersion == '7.0')
            if (oBrowser.sName == 'ie')
            {
                var parentNodeTmp = poField.parentNode;
                var parentNodeOffsetHeightTmp = poField.parentNode.offsetHeight;
                parentNodeTmp.style.height = parentNodeOffsetHeightTmp + 'px';
                //parentNodeTmp.style.border = '1px solid red';
                var oBorderObject = poField.parentNode.insertBefore(document.createElement('div'), poField);
                
                poField.parentNode.removeChild(poField);
                
                var iWidth = poField.offsetWidth;
                var iHeight = poField.offsetHeight;
                if (iWidth == 0) // object ist unsichtbar, sichtbar machen und ausmessen
                {
                    document.body.appendChild(poField)
                    iWidth = poField.offsetWidth;
                    iHeight = poField.offsetHeight;
                    document.body.removeChild(poField)
                    parentNodeTmp.style.height = '25px';
                }
                oBorderObject.appendChild(poField);
                poField.style.margin = '-2px';
                
                oBorderObject.style.position = 'relative';
                oBorderObject.style.left = '0px';
                oBorderObject.style.width = iWidth + 'px';
                oBorderObject.style.height = iHeight - 2 + 'px';
                
                oBorderObject.style.overflow = 'hidden';
                oBorderObject.style.margin = '0px 0px 0px 3px';
                oBorderObject.className = 'inputIsError';
                //oBorderObject.style.border = '2px solid blue';
                
                poField.borderObject = oBorderObject;
            }
        }
        else if (poField.type == 'radio' || poField.type == 'checkbox')
        {
            poField.borderObject = false;    
        }
    }
    
    if (!poField.label) // label suchen
    {
        poField.label = doFindLabel(poField);
    }
    
    poField.borderObject.className = poField.className.replace(' inputNoError','');
    poField.borderObject.className = poField.className.replace(' inputIsError','');
    
    if (pbIsMissing)
    {
        poField.borderObject.className += ' inputIsError';

        if (poField.label)
        {
            poField.label.style.color = sRgbIsError;
            poField.label.hasActiveError = true;
        }
    }
    else
    {
        poField.borderObject.className += ' inputNoError';
        
        if (poField.label)
        {
            if (poField.label.hasActiveError == false)
            {
                poField.label.style.color = sRgbNoError;
            }
        }
    }
    /*--------------------/2009-09-28 RB, neue validierungskennzeichnung --------------------*/
}

var iLabelSearchDepthIdx = 0;
var iLabelSearchDepthMax = 5;
function doFindLabel(poObj)
{
    ++iLabelSearchDepthIdx;
    //alert(iLabelSearchDepthIdx + ': ' +poObj.tagName)
    //alert(poObj.innerHTML)
    if (iLabelSearchDepthIdx > iLabelSearchDepthMax)
    {
        iLabelSearchDepthIdx = 0;
        return false;
    }
    
    var tmpLabel = poObj.parentNode.getElementsByTagName('div')[0];
    
    if (typeof(tmpLabel) != 'undefined')
    {
        if (tmpLabel.className == 'lbl')
        {
            iLabelSearchDepthIdx = 0;
            tmpLabel.hasActiveError = false;
            return tmpLabel;
        }
    }
    
    return doFindLabel(poObj.parentNode);
}

function show_error_box(psMsg)
{
    /* 2008-02-19 RB, falls man die error box direkt anzeigen will */
    if (document.getElementById('span_input_error')) document.getElementById('span_input_error').innerHTML = psMsg;
    if (document.getElementById('div_input_error')) document.getElementById('div_input_error').style.display = 'block';
    
    window.scrollTo(0, 0);
}

