/*
================================================================================
= Naam             : Common Validation 2.1                                     =
= Programmeur      : Rob Timmers                                               =
= Laatst gewijzigd : 21 februari 2008                                          =
= Omschrijving     : Algemene functies om data te valideren                    =
= Afhankelijkheden : string_functions.js                                       =
================================================================================
	
================================================================================
= Changes																	   =
================================================================================
	
2007-08-16: E-mail validatie is compleet vervangen door de uitgebreidde variant die
ontwikkeld was voor Didoc Mailer. Echter is deze versie volledig Javascript
based en heeft geen ASP afhankelijkheden.
	
2008-02-12: De functie ValidateRekeningnummer herschreven zodat deze geen
afhankelijkheden meer heeft.
	
================================================================================
= Overzicht functies                                                           =
================================================================================
	
ValidateVoorletters(strIDVoorletters, blnMustEnter, blnUpdateText, blnShowAlerts, blnBackToText)
------------------------------------------------------------------------------------------------
Omschijving: Controleert of een opgegeven veld geldige voorletters bevat en maakt deze op.
	
Invoer     : - strIDVoorletters: De id van het veld
- blnMustEnter    : Bepaalt of het veld verplicht is
- blnUpdateText   : Bepaalt of de voorletters opgemaakt worden
- blnShowAlerts   : Bepaalt of de gebruiker een waarschuwing krijgt indien het veld leeg is of de voorletters ongeldig zijn
- blnBackToText   : Bepaalt of de focus op het veld word gezet indien deze leeg is of de voorletters ongeldig zijn
	
Geeft terug: - true : Voorletters zijn geldig (en niet leeg)
- false: Voorletters zijn ongeldig of het veld is leeg
================================================================================
	
	
ValidateVoornaam(strIDVoornaam, blnMustEnter, blnUpdateText, blnShowAlerts, blnBackToText)
------------------------------------------------------------------------------------------
Omschijving: Controleert of een opgegeven veld een geldige voornaam bevat en maakt deze op.
	
Invoer     : - strIDVoornaam: De id van het veld
- blnMustEnter : Bepaalt of het veld verplicht is
- blnUpdateText: Bepaalt of de voornaam opgemaakt wordt
- blnShowAlerts: Bepaalt of de gebruiker een waarschuwing krijgt indien het veld leeg is of de voornaam ongeldig is
- blnBackToText: Bepaalt of de focus op het veld word gezet indien deze leeg is of de voornaam ongeldig is
	
Geeft terug: - true : Voornaam is geldig (en niet leeg)
- false: Voornaam is ongeldig of het veld is leeg
================================================================================
	
	
ValidateAchternaam(strIDAchternaam, blnMustEnter, blnUpdateText, blnShowAlerts, blnBackToText)
----------------------------------------------------------------------------------------------
Omschijving: Controleert of een opgegeven veld een geldige achternaam bevat en maakt deze op.
	
Invoer     : - strIDAchternaam: De id van het veld
- blnMustEnter   : Bepaalt of het veld verplicht is
- blnUpdateText  : Bepaalt of de achternaam opgemaakt wordt
- blnShowAlerts  : Bepaalt of de gebruiker een waarschuwing krijgt indien het veld leeg is of de achternaam ongeldig is
- blnBackToText  : Bepaalt of de focus op het veld word gezet indien deze leeg is of de achternaam ongeldig is
	
Geeft terug: - true : Achternaam is geldig (en niet leeg)
- false: Achternaam is ongeldig of het veld is leeg
================================================================================
	
	
ValidateRekeningnummer(strIDRekeningnummer, blnMustEnter, blnUpdateText, blnShowAlerts, blnBackToText)
------------------------------------------------------------------------------------------------------
Omschijving: Controleert of een opgegeven veld een geldig rekeningnummer bevat en maakt deze op.
	
Invoer     : - strIDRekeningnummer: De id van het veld
- blnMustEnter       : Bepaalt of het veld verplicht is
- blnUpdateText      : Bepaalt of het rekeningnummer opgemaakt wordt
- blnShowAlerts      : Bepaalt of de gebruiker een waarschuwing krijgt indien het veld leeg is of het rekeningnummer ongeldig is
- blnBackToText      : Bepaalt of de focus op het veld word gezet indien deze leeg is of het rekeningnummer ongeldig is
	
Geeft terug: - true : Rekeningnummer is geldig (en niet leeg)
- false: Rekeningnummer is ongeldig of het veld is leeg
================================================================================
	
	
ValidateTelefoonnummer(strIDTelefoonnummer, blnMustEnter, blnUpdateText, blnShowAlerts, blnBackToField)
------------------------------------------------------------------------------------------------------
Omschijving: Controleert of een opgegeven veld een geldig Nederlands telefoonnummer bevat en maakt deze op.
Opmerking  : Deze functie vereist de library: netnummers.js (/refs/netnummers.js)
	
Invoer     : - strIDTelefoonnummer: De id van het veld
- blnMustEnter       : Bepaalt of het veld verplicht is
- blnUpdateText      : Bepaalt of het telefoonnummer opgemaakt wordt
- blnShowAlerts      : Bepaalt of de gebruiker een waarschuwing krijgt indien het veld leeg is of het telefoonnummer ongeldig is
- blnBackToText      : Bepaalt of de focus op het veld word gezet indien deze leeg is of het telefoonnummer ongeldig is
	
Geeft terug: - true : Telefoonnummer is geldig (en niet leeg)
- false: Telefoonnummer is ongeldig of het veld is leeg
================================================================================
	
	
TODO: ValidateTelefoonnummerBelgie (Dient nog geimplementeerd te worden)
	
	
ValidateNumberAsInt(strIDNumber, blnMustEnter, blnUpdateText, blnShowAlerts, strFieldname, blnBackToText)
---------------------------------------------------------------------------------------------------------
Omschijving: Controleert of een opgegeven veld een geldig geheel nummer bevat en maakt deze op.
	
Invoer     : - strIDNumber  : De id van het veld
- blnMustEnter : Bepaalt of het veld verplicht is
- blnUpdateText: Bepaalt of het nummer opgemaakt wordt
- blnShowAlerts: Bepaalt of de gebruiker een waarschuwing krijgt indien het veld leeg is of het nummer ongeldig is
- strFieldname : Naam van het veld voor verwerking in waarschuwingen
- blnBackToText: Bepaalt of de focus op het veld word gezet indien deze leeg is of het nummer ongeldig is
	
Geeft terug: - true : Nummer is geldig (en niet leeg)
- false: Nummer is ongeldig of het veld is leeg
================================================================================
	
	
ValidateEmail(strIDEmailAddress, blnMustEnter, blnUpdateText, blnMustBeFullyCompatible, blnShowAlerts, blnBackToText)
------------------------------------------------------------------------------------
Omschijving: Controleert of een opgegeven veld een geldig e-mail adres bevat en maakt deze op.
Opmerking  : Deze functie vereist de library: tlds.js (/refs/tlds.js)
	
Invoer     : - strIDEmailAddress       : De id van het veld
- blnMustEnter            : Bepaalt of het veld verplicht is
- blnUpdateText           : Bepaalt of het e-mail adres opgemaakt wordt
- blnMustBeFullyCompatible: Bepaalt hoe streng deze functie zich aan de RFC's moet houden wat betreft toegestane karakters
- blnShowAlerts           : Bepaalt of de gebruiker een waarschuwing krijgt indien het veld leeg is of het e-mail adres ongeldig is
- blnBackToText           : Bepaalt of de focus op het veld word gezet indien deze leeg is of het e-mail adres ongeldig is
	
Geeft terug: - true : E-mail is geldig (en niet leeg)
- false: E-mail is ongeldig of het veld is leeg
================================================================================
	
	
ValidateToevoeging(strIDToevoeging, blnStartWithDash)
------------------------------------------------------------------------------------
Opmerking  : Nog te documenteren
	
Geeft terug: n.v.t.
================================================================================
	
	
*/


//	================================================================================
//	= De functies                                                                  =
//	================================================================================

function ValidateVoorletters(strIDVoorletters, blnMustEnter, blnUpdateText, blnShowAlerts, blnBackToText) {
    var l_objVoorletters = document.getElementById(strIDVoorletters);
    var l_strVoorletters = new String();
    var l_strNewVoorletters = new String();
    var l_strAllowedInitials = "ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÌÍÎÏÝŸ";
    var l_strAllowedChars = l_strAllowedInitials + ". -"
    var l_strSpecialInitials = new Array("Chr", "Jac", "Th", "Ph", "IJ", "Ch");
    var l_lngPosition = new Number();
    var l_blnFoundSpecialInitial = false;

    l_strVoorletters = l_objVoorletters.value.toString().replace(/^\s+/g, "").replace(/\s+$/g, "");
    l_lngPosition = 0;

    // Controleren of de parameters verwijzen naar bestaande id's van objecten.
    if (eval(l_objVoorletters) == null) {
        alert("Bad Object Reference: " + strIDVoorletters + "\n\nFunction: ValidateVoorletters");
        return (false);
    }

    if (l_strVoorletters.length == 0) {
        if (blnMustEnter) {
            if (blnShowAlerts) {
                alert("Voorletters is verplicht.");
            }
            if (blnBackToText) {
                l_objVoorletters.focus();
            }
            return (false);
        } else {
            return (true);
        }
    }

    while (l_lngPosition < l_strVoorletters.length) {
        if (l_strAllowedInitials.indexOf(l_strVoorletters.substr(l_lngPosition, 1).toUpperCase()) != -1) {
            l_blnFoundSpecialInitial = false;
            for (var i = 0; i < l_strSpecialInitials.length; i++) {
                if (l_strVoorletters.substr(l_lngPosition, l_strSpecialInitials[i].length).toUpperCase() == l_strSpecialInitials[i].toString().toUpperCase()) {
                    if (confirm("De lettercombinatie " + l_strSpecialInitials[i].toString().toUpperCase() + " is gevonden in de voorletters.\nStaat dit voor de voorletter " + l_strSpecialInitials[i].toString() + "?")) {
                        l_blnFoundSpecialInitial = true;
                        l_strNewVoorletters = l_strNewVoorletters + l_strSpecialInitials[i].toString() + ".";
                        l_lngPosition = l_lngPosition + l_strSpecialInitials[i].length;
                    }
                    break;
                }
            }
            if (!l_blnFoundSpecialInitial) {
                l_strNewVoorletters = l_strNewVoorletters + l_strVoorletters.charAt(l_lngPosition).toUpperCase() + ".";
                l_lngPosition = l_lngPosition + 1;
            }
        } else {
            if (l_strAllowedChars.indexOf(l_strVoorletters.substr(l_lngPosition, 1).toUpperCase()) == -1) {
                if (blnShowAlerts) {
                    alert("Het karakter " + l_strVoorletters.substr(l_lngPosition, 1) + " op positie " + (l_lngPosition + 1) + " in de voorletters is niet toegestaan.");
                }
                if (blnBackToText) {
                    l_objVoorletters.focus();
                }
                return (false);
            } else {
                l_lngPosition = l_lngPosition + 1;
            }
        }
    }
    if (blnUpdateText) {
        l_objVoorletters.value = l_strNewVoorletters;
    }
    return (true);
}


function ValidateVoornaam(strIDVoornaam, blnMustEnter, blnUpdateText, blnShowAlerts, blnBackToText) {
    var l_objVoornaam = document.getElementById(strIDVoornaam);
    var l_strVoornaam = new String();
    var l_strNewVoornaam = new String();
    var l_strAllowedInitials = "ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÌÍÎÏÝŸ";
    var l_strAllowedCharacters = l_strAllowedInitials + " -'.";
    var l_lngPosition = new Number();
    var l_blnLastCharWasChar = false;

    // Controleren of de parameters verwijzen naar bestaande id's van objecten.
    if (eval(l_objVoornaam) == null) {
        alert("Bad Object Reference: " + strIDVoornaam + "\n\nFunction: ValidateVoornaam");
        return (false);
    }

    l_strVoornaam = l_objVoornaam.value.toString().replace(/^\s+/g, "").replace(/\s+$/g, "");

    if (l_strVoornaam.length == 0) {
        if (blnUpdateText) {
            l_objVoornaam.value = "";
        }
        if (blnMustEnter) {
            if (blnShowAlerts) {
                alert("Voornaam is verplicht.");
            }
            if (blnBackToText) {
                l_objVoornaam.focus();
            }
            return (false);
        } else {
            return (true);
        }
    }

    l_lngPosition = 0;

    while (l_lngPosition < l_strVoornaam.length) {
        if (l_strAllowedCharacters.indexOf(l_strVoornaam.substr(l_lngPosition, 1).toUpperCase()) == -1) {
            if (blnShowAlerts) {
                alert("Het karakter " + l_strVoornaam.substr(l_lngPosition, 1) + " op positie " + (l_lngPosition + 1) + " in de voornaam is niet toegestaan.");
            }
            if (blnBackToText) {
                l_objVoornaam.focus();
            }
            return (false);
        }

        if (l_strAllowedInitials.indexOf(l_strVoornaam.substr(l_lngPosition, 1).toUpperCase()) != -1) {
            if (!l_blnLastCharWasChar) {
                l_strNewVoornaam = l_strNewVoornaam + l_strVoornaam.charAt(l_lngPosition).toUpperCase();
            } else {
                l_strNewVoornaam = l_strNewVoornaam + l_strVoornaam.charAt(l_lngPosition).toLowerCase();
            }
            l_blnLastCharWasChar = true;
        } else {
            l_strNewVoornaam = l_strNewVoornaam + l_strVoornaam.charAt(l_lngPosition);
            l_blnLastCharWasChar = false;
        }
        l_lngPosition = l_lngPosition + 1;
    }
    if (blnUpdateText) {
        l_objVoornaam.value = l_strNewVoornaam;
    }
    return (true);
}


function ValidateTussenvoegsels(strIDTussenvoegsels, blnUpdateText, blnShowAlerts, blnBackToText) {
    var l_arrTussenvoegsels = new Array("de van der", "onder de", "uijt den", "voor den", "voor het", "aan den", "aan der", "aan het", "auf dem", "auf den", "auf der", "aus dem", "los van", "over de", "uit den", "uit het", "uit ten", "uyt den", "van den", "van der", "van het", "van ter", "van van", "von dem", "von den", "von der", "voor de", "voor 't", "aan de", "aan 't", "bij de", "bij 't", "da van", "de los", "in den", "in der", "in het", "op den", "op der", "op het", "op ten", "te van", "uit de", "van de", "van 't", "de de", "de l'", "de la", "de le", "in de", "in 't", "la de", "onder", "op de", "op 't", "te de", "over", "thoe", "v.d.", "v.h.", "voor", "aan", "auf", "ben", "dal", "del", "den", "der", "des", "dos", "het", "los", "ten", "ter", "toe", "uit", "van", "ver", "vom", "von", "zur", "a'", "af", "al", "d'", "da", "de", "di", "do", "du", "el", "in", "l'", "la", "le", "lo", "o'", "op", "'s", "'t", "t'", "te", "a");
    var l_objTussenvoegsels = document.getElementById(strIDTussenvoegsels);
    var l_strTussenvoegsels = new String();
    var l_lngTussenvoegselCounter = new Number();

    if (eval(l_objTussenvoegsels) == null) {
        alert("Bad Object Reference: " + strIDTussenvoegsels + "\n\nFunction: ValidateTussenvoegsels");
        return (false);
    }

    l_strTussenvoegsels = l_objTussenvoegsels.value.toString().replace(/^\s+/g, "").replace(/\s+$/g, "").toLowerCase();

    if (blnUpdateText) {
        l_objTussenvoegsels.value = l_strTussenvoegsels;
    }

    if (l_objTussenvoegsels.value.length == 0) {
        return (true);
    }

    for (l_lngTussenvoegselCounter = 0; l_lngTussenvoegselCounter < l_arrTussenvoegsels.length; l_lngTussenvoegselCounter++) {
        if (l_arrTussenvoegsels[l_lngTussenvoegselCounter].toString() == Trim(l_objTussenvoegsels.value.toString().toLowerCase())) {
            return (true);
        }
    }

    if (blnShowAlerts) {
        alert("Het ingevoerde tussenvoegsel is ongeldig.");
    }

    if (blnUpdateText) {
        l_objTussenvoegsels.value = "";
    }

    if (blnBackToText) {
        l_objTussenvoegsels.focus();
    }

    return (false);
}


function ValidateAchternaam(strIDAchternaam, blnMustEnter, blnUpdateText, blnShowAlerts, blnBackToText) {
    var l_objAchternaam = document.getElementById(strIDAchternaam);
    var l_strAchternaam = new String();
    var l_strNewAchternaam = new String();
    var l_strTussenvoegsels = new Array("de van der", "onder de", "uijt den", "voor den", "voor het", "aan den", "aan der", "aan het", "auf dem", "auf den", "auf der", "aus dem", "los van", "over de", "uit den", "uit het", "uit ten", "uyt den", "van den", "van der", "van het", "van ter", "van van", "von dem", "von den", "von der", "voor de", "voor 't", "aan de", "aan 't", "bij de", "bij 't", "da van", "de los", "in den", "in der", "in het", "op den", "op der", "op het", "op ten", "te van", "uit de", "van de", "van 't", "de de", "de l'", "de la", "de le", "in de", "in 't", "la de", "onder", "op de", "op 't", "te de", "over", "thoe", "v.d.", "v.h.", "voor", "aan", "auf", "ben", "dal", "del", "den", "der", "des", "dos", "het", "los", "ten", "ter", "toe", "uit", "van", "ver", "vom", "von", "zur", "a'", "af", "al", "d'", "da", "de", "di", "do", "du", "el", "in", "l'", "la", "le", "lo", "o'", "op", "'s", "'t", "t'", "te", "a");
    var l_strAllowedInitials = "ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÌÍÎÏÝŸ";
    var l_strAllowedCharacters = l_strAllowedInitials + " -'";
    var l_lngPosition = new Number();
    var l_blnLastCharWasChar = false;
    var l_blnFoundTussenvoegsel = false;

    // Controleren of de parameters verwijzen naar bestaande id's van objecten.
    if (eval(l_objAchternaam) == null) {
        alert("Bad Object Reference: " + strIDAchternaam + "\n\nFunction: ValidateAchternaam");
        return (false);
    }

    l_strAchternaam = l_objAchternaam.value.toString().replace(/^\s+/g, "").replace(/\s+$/g, "");

    if (l_strAchternaam.length == 0) {
        if (blnUpdateText) {
            l_objAchternaam.value = "";
        }

        if (blnMustEnter) {
            if (blnShowAlerts) {
                alert("Achternaam is verplicht.");
            }
            if (blnBackToText) {
                l_objAchternaam.focus();
            }
            return (false);
        } else {
            return (true);
        }
    }

    // Controleren of de achternaam begint met een tussenvoegsel.		
    for (var i = 0; i < l_strTussenvoegsels.length; i++) {
        if (l_strAchternaam.substr(0, l_strTussenvoegsels[i].length + 1).toLowerCase() == l_strTussenvoegsels[i].toString() + " ") {
            if (blnShowAlerts) {
                alert("Achternaam mag niet beginnen met een tussenvoegsel.");
            }

            if (blnBackToText) {
                l_objAchternaam.focus();
            }
            return (false);
        }
    }

    l_lngPosition = 0;

    while (l_lngPosition < l_strAchternaam.length) {
        if (l_strAllowedCharacters.indexOf(l_strAchternaam.substr(l_lngPosition, 1).toUpperCase()) == -1) {
            if (blnShowAlerts) {
                alert("Het karakter " + l_strAchternaam.substr(l_lngPosition, 1) + " op positie " + (l_lngPosition + 1) + " in de achternaam is niet toegestaan.");
            }
            if (blnBackToText) {
                l_objAchternaam.focus();
            }
            return (false);
        }

        l_blnFoundTussenvoegsel = false;
        for (var i = 0; i < l_strTussenvoegsels.length; i++) {
            if (l_strAchternaam.substr(l_lngPosition, l_strTussenvoegsels[i].length + 1).toLowerCase() == l_strTussenvoegsels[i].toString() + " ") {
                l_blnFoundTussenvoegsel = true;
                l_blnLastCharWasChar = false;
                l_strNewAchternaam = l_strNewAchternaam + l_strTussenvoegsels[i].toString() + " ";
                l_lngPosition = l_lngPosition + l_strTussenvoegsels[i].length + 1;
                break;
            }
        }

        if (!l_blnFoundTussenvoegsel) {
            if (l_strAllowedInitials.indexOf(l_strAchternaam.substr(l_lngPosition, 1).toUpperCase()) != -1) {
                if (!l_blnLastCharWasChar) {
                    l_strNewAchternaam = l_strNewAchternaam + l_strAchternaam.charAt(l_lngPosition).toUpperCase();
                } else {
                    l_strNewAchternaam = l_strNewAchternaam + l_strAchternaam.charAt(l_lngPosition).toLowerCase();
                }
                l_blnLastCharWasChar = true;
            } else {
                l_strNewAchternaam = l_strNewAchternaam + l_strAchternaam.charAt(l_lngPosition);
                l_blnLastCharWasChar = false;
            }
            l_lngPosition = l_lngPosition + 1;
        }
    }
    if (blnUpdateText) {
        l_objAchternaam.value = l_strNewAchternaam;
    }
    return (true);
}

function ValidateRekeningnummer(strIDRekeningnummer, blnMustEnter, blnUpdateText, blnShowAlerts, blnBackToText) {
    var l_objRekeningnummer = document.getElementById(strIDRekeningnummer);
    var l_strAllowedCharacters = new String(".,0123456789");
    var l_strRekeningnummer = new String("");
    var l_strNewRekeningnummer = new String("");
    var l_lngPosition = new Number(0);
    var l_lngResult = new Number(0);

    if (eval(l_objRekeningnummer) == null) {
        alert("Bad Object Reference: " + strIDRekeningnummer + "\n\nFunction: ValidateRekeningnummer");
        return (false);
    }

    l_strRekeningnummer = l_objRekeningnummer.value.toString().replace(/^\s+/g, "").replace(/\s+$/g, "");

    if (l_strRekeningnummer.length > 0) {
        for (l_lngPosition = 0; l_lngPosition < l_strRekeningnummer.length; l_lngPosition++) {
            if (l_strAllowedCharacters.indexOf(l_strRekeningnummer.substr(l_lngPosition, 1)) == -1) {
                if (blnShowAlerts) {
                    alert("Het karakter " + l_strRekeningnummer.charAt(l_lngPosition) + " op positie " + l_lngPosition.toString() + " is niet toegestaan in een rekeningnummer.");
                }
                if (blnBackToText) {
                    l_objRekeningnummer.focus();
                }
                return (false);
            }
        }
        for (l_lngPosition = 0; l_lngPosition < l_strRekeningnummer.length; l_lngPosition++) {
            if (l_strRekeningnummer.charAt(l_lngPosition) != "." && l_strRekeningnummer.charAt(l_lngPosition) != ",") {
                l_strNewRekeningnummer = l_strNewRekeningnummer + l_strRekeningnummer.charAt(l_lngPosition);
            }
        }
    } else {
        l_strRekeningnummer = "0";
        l_strNewRekeningnummer = "0";
    }

    if (parseInt(l_strNewRekeningnummer, 10) != 0) {
        l_strRekeningnummer = parseInt(l_strNewRekeningnummer, 10).toString();
    } else {
        l_strRekeningnummer = "";
    }

    if (blnUpdateText) {
        l_objRekeningnummer.value = l_strRekeningnummer;
    }

    if (l_strRekeningnummer.length == 0) {
        if (blnMustEnter) {
            if (blnShowAlerts) {
                alert("Rekeningnummer is verplicht.");
            }
            if (blnUpdateText) {
                l_objRekeningnummer.value = "";
            }
            if (blnBackToText) {
                l_objRekeningnummer.focus();
            }
            return (false);
        } else {
            return (true);
        }
    }

    if (l_strRekeningnummer.length < 1 || l_strRekeningnummer.length == 8 || l_strRekeningnummer.length > 9) {
        if (blnShowAlerts) {
            alert("Een rekeningnummer mag niet uit " + l_strRekeningnummer.length + " cijfers bestaan.");
        }
        if (blnBackToText) {
            l_objRekeningnummer.focus();
        }
        return (false);
    }

    if (l_strRekeningnummer.length != 9) {
        return (true);
    }

    for (var i = 1; i < 10; i++) {
        l_lngResult = l_lngResult + (i * parseInt(l_strRekeningnummer.charAt(9 - i), 10));
    }
    if (l_lngResult % 11 == 0) {
        return (true);
    } else {
        if (blnShowAlerts) {
            alert("Het ingevoerde rekeningnummer is ongeldig.");
        }
        if (blnBackToText) {
            l_objRekeningnummer.focus();
        }
        return (false);
    }
}


function ValidateTelefoonnummer(strIDTelefoonnummer, blnMustEnter, blnUpdateText, blnShowAlerts, blnBackToText) {
    var l_objTelefoonnummer = document.getElementById(strIDTelefoonnummer);
    var l_strTelefoonnummer = new String();
    var l_strNewTelefoonnummer = new String();

    // Controleren of de parameters verwijzen naar bestaande id's van objecten
    if (eval(l_objTelefoonnummer) == null) {
        alert("Bad Object Reference: " + strIDTelefoonnummer + "\n\nFunction: ValidateTelefoonnummer");
        return (false);
    }

    l_strTelefoonnummer = l_objTelefoonnummer.value.toString().replace(/^\s+/g, "").replace(/\s+$/g, "");

    if (l_strTelefoonnummer.length == 0) {
        if (blnMustEnter) {
            if (blnShowAlerts) {
                alert("Telefoonnummer is verplicht.");
            }
            if (blnBackToText) {
                l_objTelefoonnummer.focus();
            }
            return (false);
        } else {
            return (true);
        }
    }

    for (var i = 0; i < l_strTelefoonnummer.length; i++) {
        if (l_strTelefoonnummer.charCodeAt(i) > 47 && l_strTelefoonnummer.charCodeAt(i) < 58) {
            l_strNewTelefoonnummer = l_strNewTelefoonnummer + l_strTelefoonnummer.charAt(i);
        }
    }

    if ((l_strNewTelefoonnummer.substr(0, 2) == "00") || (l_strNewTelefoonnummer.substr(0, 1) != "0")) {
        if (blnShowAlerts) {
            alert("Het ingevoerde telefoonnummer is ongeldig.");
        }
        if (blnBackToText) {
            l_objTelefoonnummer.focus();
        }
        return (false);
    }

    if (parseInt(l_strNewTelefoonnummer.substr(0, 2), 10) > 0 && parseInt(l_strNewTelefoonnummer.substr(0, 2), 10) < 8) {
        if (l_strNewTelefoonnummer.length != 10) {
            if (blnShowAlerts) {
                alert("Het ingevoerde telefoonnummer is ongeldig.");
            }
            if (blnBackToText) {
                l_objTelefoonnummer.focus();
            }
            return (false);
        }

        for (var i = 0; i < l_strNetnummers2.length; i++) {
            if (l_strNewTelefoonnummer.substr(1, 2) == l_strNetnummers2[i]) {
                l_strNewTelefoonnummer = l_strNewTelefoonnummer.substr(0, 3) + "-" + l_strNewTelefoonnummer.substr(3, 7);
                if (blnUpdateText) {
                    l_objTelefoonnummer.value = l_strNewTelefoonnummer;
                }
                return (true);
            }
        }

        for (var i = 0; i < l_strNetnummers3.length; i++) {
            if (l_strNewTelefoonnummer.substr(1, 3) == l_strNetnummers3[i]) {
                l_strNewTelefoonnummer = l_strNewTelefoonnummer.substr(0, 4) + "-" + l_strNewTelefoonnummer.substr(4, 6);
                if (blnUpdateText) {
                    l_objTelefoonnummer.value = l_strNewTelefoonnummer;
                }
                return (true);
            }
        }

        if (l_strNewTelefoonnummer.substr(0, 2) == "06") {
            l_strNewTelefoonnummer = l_strNewTelefoonnummer.substr(0, 2) + "-" + l_strNewTelefoonnummer.substr(2, 8);
            if (blnUpdateText) l_objTelefoonnummer.value = l_strNewTelefoonnummer;
            return (true);
        }
    }

    if (parseInt(l_strNewTelefoonnummer.substr(0, 2), 10) == 8 && parseInt(l_strNewTelefoonnummer.substr(0, 2), 10) == 9) {
        if (l_strNewTelefoonnummer.length > 7 && l_strNewTelefoonnummer.length < 11) {
            l_strNewTelefoonnummer = l_strNewTelefoonnummer.substr(0, 4) + "-" + l_strNewTelefoonnummer.substr(4, 6);
            if (blnUpdateText) {
                l_objTelefoonnummer.value = l_strNewTelefoonnummer;
            }
            return (true);
        }
    }

    if (blnShowAlerts) {
        alert("Het ingevoerde telefoonnummer kon niet herkend worden als nederlands telefoonnummer.");
    }
    if (blnUpdateText) {
        l_objTelefoonnummer.value = l_strNewTelefoonnummer;
    }
    if (blnBackToField) {
        l_objTelefoonnummer.focus();
    }
    return (false);
}


function ValidateNumberAsInt(strIDNumber, blnMustEnter, blnUpdateText, blnShowAlerts, strFieldname, blnBackToText) {
    var l_objNumber = document.getElementById(strIDNumber);
    var l_strNumber = new String();
    var l_lngNumber = new Number();

    // Controleren of de parameters verwijzen naar bestaande id's van objecten.
    if (eval(l_objNumber) == null) {
        alert("Bad Object Reference: " + strIDNumber + "\n\nFunction: ValidateNumberAsInt");
        return (false);
    }

    l_strNumber = l_objNumber.value.toString().replace(/^\s+/g, "").replace(/\s+$/g, "");

    if (l_strNumber.length == 0) {
        if (blnMustEnter) {
            if (blnShowAlerts) {
                alert(strFieldname + " is verplicht.");
            }
            if (blnUpdateText) {
                l_objNumber.value = l_strNumber;
            }
            if (blnBackToText) {
                l_objNumber.focus();
            }
            return (false);
        } else {
            return (true);
        }
    }

    if (isNaN(parseInt(l_strNumber, 10))) {
        if (blnShowAlerts) {
            alert(strFieldname + " mag alleen maar uit cijfers bestaan.");
        }
        if (blnUpdateText) {
            l_objNumber.value = "";
        }
        if (blnBackToText) {
            l_objNumber.focus();
        }
        return (false);
    }
    if (blnUpdateText) {
        l_lngNumber = parseInt(l_strNumber, 10);
        l_objNumber.value = l_lngNumber;
    }
    return (true);
}

function ValidateEmail(strIDEmailAddress, blnMustEnter, blnUpdateText, blnMustBeFullyCompatible, blnShowAlerts, blnBackToText) {
    var l_objEmail = document.getElementById(strIDEmailAddress);
    var l_strEmail = new String();
    var l_strLocalPart = new String();
    var l_strLocalPartParts = new Array();
    var l_strLocalPartPart = new String();
    var l_lngPartCounter = new Number();
    var l_lngCharCounter = new Number();
    var l_strDomainPart = new String();
    var l_strDomainPartParts = new Array();
    var l_strDomainPartPart = new String();
    var l_lngAtPos = new Number();
    var l_blnDomainPartIsIP = new Boolean(false);
    var l_intNumberOfTLDsFound = new Number();
    var l_blnLocalPartDoubleQouted = new Boolean();
    var l_strIP = new String();
    var l_strIPParts = new Array();
    var l_strIPPart = new String();

    // Characters allowed in local part of e-mail address without qouting
    var l_strValidCharsLocalPartNonQouted = new String("+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWQXYZ_abcdefghijklmnopqrstuvwxyz");
    // Characters allowed in local part of e-mail address if preceded by a qoute (\)
    var l_strValidCharsLocalPartQouted = new String(" \",:;<>@[\\]");
    // Characters allowed in local part of e-mail address when the local part is double qouted
    var l_strValidCharsLocalPartDoubleQouted = new String(" (),");
    // Characters allowed in local part of e-mail address but are not compatible with all mailing systems
    var l_strValidCharsLocalPartButNotFullyCompatible = new String("!#$%`");
    // Characters allowed in domain part
    var l_strValidCharsDomainPart = new String("-_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
    // Characters allowed in domain part of e-mail address but are not compatible with all domain systems
    var l_strValidCharsDomainPartButNotFullyCompatible = new String("");
    // Characters allowed in IP
    var l_strValidCharsIP = new String("0123456789");

    if (!blnMustBeFullyCompatible) {
        l_strValidCharsLocalPartNonQouted = l_strValidCharsLocalPartNonQouted + l_strValidCharsLocalPartButNotFullyCompatible;
        l_strValidCharsDomainPart = l_strValidCharsDomainPart + l_strValidCharsDomainPartButNotFullyCompatible;
    }

    var l_strCharSetQouted = l_strValidCharsLocalPartNonQouted + l_strValidCharsLocalPartQouted;
    var l_strCharSetDoubleQouted = l_strValidCharsLocalPartNonQouted + l_strValidCharsLocalPartDoubleQouted;

    // Controleren of de parameters verwijzen naar bestaande id's van objecten.
    if (eval(l_objEmail) == null) {
        alert("Bad Object Reference: " + strIDEmailAddress + "\n\nFunction: ValidateEmail");
        return (false);
    }

    //  Convert to string and trim
    l_strEmail = l_objEmail.value.toString().replace(/^\s+/g, "").replace(/\s+$/g, "");

    // Check if e-mail is empty string
    if (l_strEmail.length == 0) {
        if (blnMustEnter) {
            if (blnShowAlerts) {
                alert("Het e-mail adres is verplicht.");
            }
            return (false);
        } else {
            return (true);
        }
    }

    // Check part 1: Search for an at sign (@) and split the address in localpart and domailpart
    l_lngAtPos = l_strEmail.indexOf("@");
    if (l_lngAtPos == -1) {
        // No at sign found so return the error
        if (blnShowAlerts) {
            alert("Het ingevoerde e-mail adres is ongeldig.");
        }
        return (false);
    }

    // Cut the e-mail address into two pieces :)
    if (l_lngAtPos > 0) {
        l_strLocalPart = l_strEmail.substr(0, l_lngAtPos);
    }
    if (l_lngAtPos < l_strEmail.length - 1) {
        l_strDomainPart = l_strEmail.substr(l_lngAtPos + 1, l_strEmail.length - l_lngAtPos).toLowerCase();
    }

    // Check if both parts are filled
    if (l_strLocalPart.length == 0 || l_strDomainPart.length == 0) {
        // The local or domain part of the e-mail address is missing so return the error
        if (blnShowAlerts) {
            alert("Het ingevoerde e-mail adres is ongeldig.");
        }
        return (false);
    }

    // Check part 2: Check the local part if the dot usage is correct and if it has invalid chars

    if (l_strLocalPart.charAt(0) == "." || l_strLocalPart.charAt(l_strLocalPart.length - 1) == ".") {
        // The local part starts or ends with a dot so return the error
        if (blnShowAlerts) {
            alert("Het ingevoerde e-mail adres is ongeldig.");
        }
        return (false);
    }

    // Check if the local part is double quoted ("localpart")
    l_blnLocalPartDoubleQouted = false;
    if (l_strLocalPart.charAt(0) == "\"" && l_strLocalPart.charAt(l_strLocalPart.length - 1) == "\"" && l_strLocalPart.length >= 3) {
        l_strLocalPart = l_strLocalPart.substring(1, l_strLocalPart.length - 1);
        l_blnLocalPartDoubleQouted = true;
    }
    if (!l_blnLocalPartDoubleQouted) {
        l_strLocalPart = l_strLocalPart.toLowerCase();
    }

    l_strLocalPartParts = l_strLocalPart.split(".");

    for (l_lngPartCounter = 0; l_lngPartCounter < l_strLocalPartParts.length; l_lngPartCounter++) {
        l_strLocalPartPart = l_strLocalPartParts[l_lngPartCounter].toString();
        if (l_strLocalPartPart.length == 0) {
            // There were two following dots found in the local part so return the error
            if (blnShowAlerts) {
                alert("Het ingevoerde e-mail adres is ongeldig.");
            }
            return (false);
        }

        for (l_lngCharCounter = 0; l_lngCharCounter < l_strLocalPartPart.length; l_lngCharCounter++) {
            if (l_strLocalPartPart.charAt(l_lngCharCounter) == "\\") {

                if (l_lngCharCounter == l_strLocalPartPart.length - 1) {
                    // A qoute was found but no following qouted char so return the error
                    if (blnShowAlerts) {
                        alert("Het ingevoerde e-mail adres is ongeldig.");
                    }
                    return (false);
                }
                if (l_strCharSetQouted.indexOf(l_strLocalPartPart.charAt(l_lngCharCounter + 1)) == -1) {
                    // An invalid qouted char was found in the local part so return the error
                    if (blnShowAlerts) {
                        alert("Het ingevoerde e-mail adres is ongeldig.");
                    }
                    return (false);
                }

                l_lngCharCounter = l_lngCharCounter + 1;

            } else if (l_strCharSetDoubleQouted.indexOf(l_strLocalPartPart.charAt(l_lngCharCounter)) == -1 && l_blnLocalPartDoubleQouted) {
                // An invalid qouted char was found in the local part so return the error
                if (blnShowAlerts) {
                    alert("Het ingevoerde e-mail adres is ongeldig.");
                }
                return (false);

            } else if (l_strValidCharsLocalPartNonQouted.indexOf(l_strLocalPartPart.charAt(l_lngCharCounter)) == -1 && !l_blnLocalPartDoubleQouted) {
                // An invalid char was found in the local part so return the error
                if (blnShowAlerts) {
                    alert("Het ingevoerde e-mail adres is ongeldig.");
                }
                return (false);
            }
        }
    }

    // Check part 3: Check the domain part

    if (l_strDomainPart.charAt(0) == "." || l_strDomainPart.charAt(l_strDomainPart.length - 1) == ".") {
        // The local part starts or ends with a dot so return the error
        if (blnShowAlerts) {
            alert("Het ingevoerde e-mail adres is ongeldig.");
        }
        return (false);
    }

    l_strDomainPartParts = l_strDomainPart.split(".");

    // Check if the domain part has at least 2 parts
    if (l_strDomainPartParts.length < 2) {
        // The domain part has less than 2 parts so return the error
        if (blnShowAlerts) {
            alert("Het ingevoerde e-mail adres is ongeldig.");
        }
        return (false);
    }

    l_blnDomainPartIsIP = false;
    if (l_strDomainPartParts.length == 4) {
        l_blnDomainPartIsIP = true;
        l_strIP = l_strDomainPart.replace("[", "").replace("]", "");
        l_strIPParts = l_strIP.split(".");
        for (l_lngPartCounter = 0; l_lngPartCounter < l_strIPParts.length && l_blnDomainPartIsIP; l_lngPartCounter++) {
            l_strIPPart = l_strIPParts[l_lngPartCounter];
            for (l_lngCharCounter = 0; l_lngCharCounter < l_strIPPart.length && l_blnDomainPartIsIP; l_lngCharCounter++) {
                if (l_strIPPart.charCodeAt(l_lngCharCounter) < 48 || l_strIPPart.charCodeAt(l_lngCharCounter) > 57) {
                    l_blnDomainPartIsIP = false;
                }
            }
            if (parseInt(l_strIPPart, 10) < 0 || parseInt(l_strIPPart, 10) > 255) {
                l_blnDomainPartIsIP = false;
            }
        }

        if (l_blnDomainPartIsIP) {
            if (l_strDomainPart != ("[" + l_strIPParts.join(".") + "]")) {
                // The domain part is an IP but is not formatted as "[xxx.xxx.xxx.xxx]" so return the error
                if (blnShowAlerts) {
                    alert("Het ingevoerde e-mail adres is ongeldig.");
                }
                return (false);
            }
        }
    }

    if (l_blnDomainPartIsIP) {
        if (blnUpdateText) {
            l_objEmail.value = l_strLocalPart + "@" + l_strDomainPart;
        }
        return (true);
    }

    // Check if there are the following dots in the domain part
    for (l_lngPartCounter = 0; l_lngPartCounter < l_strDomainPartParts.length; l_lngPartCounter++) {
        l_strDomainPartPart = l_strDomainPartParts[l_lngPartCounter];

        if (l_strDomainPartPart.length == 0) {
            // There were two following dots found in the domain part so return the error
            if (blnShowAlerts) {
                alert("Het ingevoerde e-mail adres is ongeldig.");
            }
            return (false);
        }

        for (l_lngCharCounter = 0; l_lngCharCounter < l_strDomainPartPart.length; l_lngCharCounter++) {
            // Check if there is an invalid char
            if (l_strValidCharsDomainPart.indexOf(l_strDomainPartPart.charAt(l_lngCharCounter)) == -1) {
                // An invalid char was found in the domain part so return the error
                if (blnShowAlerts) {
                    alert("Het ingevoerde e-mail adres is ongeldig.");
                }
                return (false);
            }
        }
    }

    // Check if the domain part ends with at least 1 TLD (Top Level Domain)
    l_strDomainPartPart = l_strDomainPartParts[l_strDomainPartParts.length - 1];
    for (l_lngPartCounter = 0; l_lngPartCounter < m_strTLDs.length; l_lngPartCounter++) {
        if (m_strTLDs[l_lngPartCounter] == l_strDomainPartPart) {
            if (blnUpdateText) {
                l_objEmail.value = l_strLocalPart + "@" + l_strDomainPart;
            }
            return (true);
        }
    }

    // The last part of the domain part is not a TLD so return the error.
    if (blnShowAlerts) {
        alert("Het ingevoerde e-mail adres is ongeldig.");
    }
    return (false);
}

function ValidateToevoeging(strIDToevoeging, blnStartWithDash) {
    var l_objToevoeging = document.getElementById(strIDToevoeging);
    var l_strToevoeging = new String();

    if (eval(l_objToevoeging) == null) { alert("Bad Object Reference: " + strIDToevoeging + "\n\nFunction: ValidateToevoeging"); return (false); }

    l_strToevoeging = l_objToevoeging.value.toString().replace(/^\s+/g, "").replace(/\s+$/g, "").toUpperCase();
    if (l_strToevoeging.length == 0) {
        return (true);
    }

    if (blnStartWithDash) {
        if (l_strToevoeging.charAt(0) != "-") {
            l_strToevoeging = "-" + l_strToevoeging;
        }
    } else if (l_strToevoeging.charAt(0) == "-") {
        l_strToevoeging = l_strToevoeging.substring(1, l_strToevoeging.length);
    }

    l_objToevoeging.value = l_strToevoeging;
    return (true);
}

