var strMelding = "";
var strWaarschuwing = "";
var blnInvoerOk = true;
var DEBUG = false;
var blnFirst = true;
var strFocusControl;

function valideerDirect(name, description) {

    clearValidatie();
    valideerDatum(name, description);
    if (getValidatieStatus()==false)
    {  getValidatieMeldingen();
       return false;
     }
     return true;
}

function sizeAllTextareas() {
    var elem = window.document.getElementsByTagName('textarea');
    for (var i = 0; i < elem.length; i++) {
        sizeTextarea(elem[i]);
    }
};

function sizeTextarea(t) {
    t.rows = 5;
    a = t.value.split('\n');
    b = 1;
    for (x = 0; x < a.length; x++) {
        if (a[x].length >= t.cols) b += Math.floor(a[x].length / t.cols);
    }
    b += a.length;
    if (b > t.rows) t.rows = b;
};

function toggleVisibleAndSize(szDivID, iState) // 1 visible, 0 hidden
{
    if (document.getElementById) 
    {
        var obj = document.getElementById(szDivID);

        obj.style.visibility = iState ? "visible" : "hidden";
        obj.style.display = iState ? "inline" : "none";
    }
};

function relocate(waarde) { location = waarde; }
function relocateparent(waarde) { location = waarde; }
function switchImage(imgName, imgSrc) { if (document.images) { if (imgSrc != "none") { document.images[imgName].src = imgSrc; } } }
function openWindow(waarde) {
    var sName = 'print';
    var urlWindow = waarde;
    var sFeatures = 'height=600, width=650, toolbar=0 left=0 top=0 scrollbars=yes resizable=yes status=yes';
    var wizWin = window.open(urlWindow, sName, sFeatures);
};
function displayFormHelp(helpTitle, helpText) {
    var objWnd = window.open("about:blank", "newwindow", "height=150, width=250, top=150, left=200, resizable=yes, toolbar=no, statusbar=no");

    objWnd.document.open();
    objWnd.document.write("<html><head><title>Help</title></head>");
    objWnd.document.write("<body>");
    objWnd.document.write("<H1>" + helpTitle + "</H1><BR>");
    objWnd.document.write(helpText);
    objWnd.document.write("</body></html>");

};

function enableAllControls() {
    var count = document.entryform.elements.length;
    for (i = 0; i < count; i++) {
        var element = document.entryform.elements[i];
        element.disabled = false;
    }
}
function controlsEnabled() {
    if (document.forms.length > 0) {
        for (var i = 0; i < document.forms[0].elements.length; i++) {
            var oField = document.forms[0].elements[i];
            if (oField.type != "hidden") {
                oField.disabled = false;
            };
        };
    };
}

function focusonFirst() {
    if (document.forms.length > 0) {
        for (var i = 0; i < document.forms[0].elements.length; i++) {
            var oField = document.forms[0].elements[i];
            if (oField.type != "hidden") {
                oField.focus();
                return;
            };
        };
    };
}
function getControlValue(objControl) {

    var strVal;
    var blnArray;

    strVal = "";

    strVal = objControl.value;
    {
        for (i = 0; i < objControl.length; i++) {
            if (objControl[i].checked == true) {
                strVal = objControl[i].value;
            };
        };
    };
    return strVal;
}

function vulDatumVandaag(strControl) {

    // vul een control met de datum van vandaag
    // als deze leeg is

    vandaag = new Date();
    objControl = eval("document.entryform." + strControl);
    intDag = vandaag.getDate();
    intMaand = (vandaag.getMonth() + 1)
    if (intDag < 10)
    { intDag = "0" + intDag };
    if (intMaand < 10)
    { intMaand = "0" + intMaand };


    strWaarde = intDag + "-" + intMaand + "-" + vandaag.getYear();
    if (objControl.value == 0) {
        objControl.value = strWaarde;
    };
}

function clearValidatie() 
{
    // we resetten de gegevens van de validatieprocedure
    // let op dit zijn package variabelen

    controlsEnabled();
    strMelding = "";
    strWaarschuwing = "";
    blnInvoerOk = true;
    blnFirst = true;
    return true;
}
function getValidatieStatus() {

    // opvragen van de validatiestatus 
    // true is validatie is geslaagd
    if (blnInvoerOk == true) {
        if (strWaarschuwing.length > 0) {
            strWaarschuwing = strWaarschuwing + "\r\nOpslaan zonder aanpassing?";
            blnInvoerOk = confirm(strWaarschuwing);
            strWaarschuwing = "";
        };
        return blnInvoerOk;
    }
    else
        return blnInvoerOk;

}
function getValidatieMeldingen() {
    if (strWaarschuwing.length > 0) {
        strMelding = strMelding + "\r\n" + strWaarschuwing;
    };
    if (strMelding.length > 0) {
        alert(strMelding);
    };
}
function valideerVerplicht(strControl, strLabel) {

    // kijk of er iets is ingevuld
    // zo niet dan gaat de validatie naar false
    var bDisabled;

    bDisabled = eval("document.entryform." + strControl + ".disabled");
    if (bDisabled == false) {
        strValue = eval("document.entryform." + strControl + ".value");
        debugMessage("valideerVerplicht " + strValue + strLabel);

        // aanroepen van een helperfunctie
        if (!isNietLeeg(strValue)) {
            strMelding = strMelding + strLabel + " is verplicht \r\n";
            blnInvoerOk = false;
            setFocusControl(strControl);
            return false;
        }
        else
            return true;
    }
    else
        return true;

}
function waarschuwingVerplicht(strControl, strLabel) {

    // kijk of er iets is ingevuld
    // zo niet dan krijg je een waarschuwing
    var bDisabled;

    bDisabled = eval("document.entryform." + strControl + ".disabled");
    if (bDisabled == false) {
        strValue = eval("document.entryform." + strControl + ".value");
        debugMessage("valideerVerplicht " + strValue + strLabel);

        // aanroepen van een helperfunctie
        if (!isNietLeeg(strValue)) {
            strWaarschuwing = strWaarschuwing + strLabel + " is niet ingevuld \r\n";
            setFocusControl(strControl);
            return true;
        }
        else
            return true;
    }
    else
        return true;
}

function valideerGetal(strControl, strLabel) {

    // controleer of er een cijfer, "," of "." is ingevuld

    strValue = eval("document.entryform." + strControl + ".value");
    strValue = strValue.replace(",", ".")
    eval("document.entryform." + strControl + ".value = '" + strValue + "';");    
    debugMessage("valideerGetal " + strValue + strLabel);
    if (isNietLeeg(strValue)) {
        if (!isGetal(strValue)) {
            strMelding = strMelding + strLabel + " is geen getal \r\n";
            blnInvoerOk = false;
            setFocusControl(strControl);
            return false;
        }
        else
            return true;
    }
}

function valideerPostcode(strControl, strLabel) {

    // controleer of het een nederlandse postcode is

    var strPostcode = /[1-9][0-9][0-9][0-9]\s[A-Za-z][A-Za-z]/;
    var strLand;
    var strTemp;

    strLand = eval("document.entryform.land.value");
    if (strLand == "NL") {
        strValue = eval("document.entryform." + strControl + ".value");
        strValue = strValue.toUpperCase();
        if (strValue.length == 6) {
            strTemp = strValue
            strValue = strTemp.substr(0, 4) + " " + strTemp.substr(4, 2);
        };
        eval("document.entryform." + strControl + ".value = '" + strValue + "';");
        debugMessage("valideerPostcode " + strValue + strLabel);
        if (isNietLeeg(strValue)) {
            if (!strPostcode.test(strValue)) {
                strMelding = strMelding + strLabel + " is geen postcode\r\n";
                blnInvoerOk = false;
                setFocusControl(strControl);
                return false;
            }
            else
                return true;
        }
    }
    else {
        return true;
    }

}
function valideerEmail(strControl, strLabel) {

    // controleer of het een nederlandse postcode is
    strValue = eval("document.entryform." + strControl + ".value");
    debugMessage("valideerEmail " + strValue + strLabel);
    if (isNietLeeg(strValue)) {
        if ((strValue.indexOf(".") > 0) && (strValue.indexOf("@") > 0))
            return true;
        else {
            strMelding = strMelding + strLabel + " is geen geldig emailadres\r\n";
            blnInvoerOk = false;
            setFocusControl(strControl);
            return false;
        }
    }
}

function valideerTelefoon(strControl, strLabel) {

    // controleer of het een nederlandse postcode is

    var strTelefoon = /[0][1-9][0-9 ][0-9 ][0-9 ][0-9][0-9][0-9][0-9][0-9][0-9]/;

    strValue = eval("document.entryform." + strControl + ".value");
    debugMessage("valideerGetal " + strValue + strLabel);
    if (isNietLeeg(strValue)) {
        if (!strTelefoon.test(strValue)) {
            strMelding = strMelding + strLabel + " is geen telefoonnummer met cijfers en een spatie";
            blnInvoerOk = false;
            setFocusControl(strControl);
            return false;
        }
        else
            return true;
    }
}

function valideerTijd(strControl, strLabel) {

    // controleer of het een nederlandse postcode is

    var strTijd = /[0-2 ][0-9][.][0-6][0-9]/;

    strValue = eval("document.entryform." + strControl + ".value");
    debugMessage("valideerTijd " + strValue + strLabel);
    if (isNietLeeg(strValue)) {
        if (!strTijd.test(strValue)) {
            strMelding = strMelding + strLabel + " is geen correcte tijd in het formaat 99.99\r\n";
            blnInvoerOk = false;
            setFocusControl(strControl);
            return false;
        }
        else
            return true;
    }
}

function valideerDatum(strControl, strLabel) {
    // controleer of er een datum is ingevuld
    // let op de helper functies

    var strControle;

    strValue = eval("document.entryform." + strControl + ".value");
    debugMessage("valideerDatum " + strValue + strLabel);
    if (isNietLeeg(strValue)) {
        strControle = date2String(strValue, "ymd");

        if (!isDatum(strValue) || strControle < date2String("01-01-1800", "ymd") || strControle > date2String("01-01-2050", "ymd")) {
            strMelding = strMelding + strLabel + " is geen datum in dd-mm-yyyy formaat of ligt buiten de registratieperiode\r\n";
            blnInvoerOk = false;
            setFocusControl(strControl);
            return false;
        }
    }
}
function valideerGetalMinMax(strControl, strLabel, strMin, strMax) {
    // controleer of een getal tussen twee waarden in ligt

    strValue = eval("document.entryform." + strControl + ".value");
    debugMessage("valideerGetalMinMax " + strValue + strLabel + strMin + strMax);

    // als er de andere voorwaarden (verplicht en getal voldoen gaan we verder
    if (valideerVerplicht(strControl, strLabel) && valideerGetal(strControl, strLabel)) {
        if (parseInt(strValue, 10) <= parseInt(strMin, 10) || parseInt(strValue, 10) >= parseInt(strMax, 10)) {
            strMelding = strMelding + strLabel + " ligt niet tussen " + strMin + " en " + strMax + "\r\n";
            blnInvoerOk = false;
            setFocusControl(strControl);
            return false;
        }
        else
            return true;
    }
    else
        return false;
}

function valideerGetalMin(strControl, strLabel, strMin) {
    // controleer of een getal tussen twee waarden in ligt

    strValue = eval("document.entryform." + strControl + ".value");
    debugMessage("valideerGetalMin " + strValue + strLabel + strMin);

    // als er de andere voorwaarden (verplicht en getal voldoen gaan we verder
    if (valideerVerplicht(strControl, strLabel) && valideerGetal(strControl, strLabel)) {
        if (parseInt(strValue, 10) <= parseInt(strMin, 10)) {
            strMelding = strMelding + strLabel + " is niet groter dan " + strMin + "\r\n";
            blnInvoerOk = false;
            setFocusControl(strControl);
            return false;
        }
        else
            return true;
    }
    else
        return false;
}

function valideerGetalMax(strControl, strLabel, strMax) {
    // controleer of een getal tussen twee waarden in ligt

    strValue = eval("document.entryform." + strControl + ".value");
    debugMessage("valideerGetalMinMax " + strValue + strLabel + strMax);

    // als er de andere voorwaarden (verplicht en getal voldoen gaan we verder
    if (valideerVerplicht(strControl, strLabel) && valideerGetal(strControl, strLabel)) {
        if (parseInt(strValue, 10) >= parseInt(strMax, 10)) {
            strMelding = strMelding + strLabel + " is niet groter dan " + strMax + "\r\n";
            blnInvoerOk = false;
            setFocusControl(strControl);
            return false;
        }
        else
            return true;
    }
    else
        return false;
}


function valideerDatumMinMax(strControl, strLabel, strMin, strMax) {
    // controleer of de datum tussen twee waarden ligt
    // denk erom dat de datum wel goed ingevoerd is van min en max

    var strValue;
    var strMaxValue;
    var strMinValue;
    var strControle;
    var blnOk = true;

    strValue = eval("document.entryform." + strControl + ".value");
    debugMessage("valideerDatumMinMax " + strValue + strLabel + strMin + strMax);

    // als verplicht en datum validatie ok dan gaan we verder
    if (valideerVerplicht(strControl, strLabel) && valideerDatum(strControl, strLabel)) {
        // converteren naar een formaat waarmee we kunnen vergelijken
        strMaxValue = date2String(strMax, "ymd");
        strMinValue = date2String(strMin, "ymd");
        strControle = date2String(strValue, "ymd");
        debugMessage("valideerDatumMinMaxExtra " + strControle + strLabel + strMinValue + strMaxValue);

        if (strControle <= strMinValue || strControle >= strMaxValue) {
            strMelding = strMelding + strLabel + " ligt niet tussen " + strMin + " en " + strMax + "\r\n";
            blnInvoerOk = false;
            setFocusControl(strControl);
            blnOk = false;
        }
    }
    else
        blnOk = false;
    return blnOk;
}

function valideerDatumMin(strControl, strLabel, strMin) {
    // controleer of de datum tussen twee waarden ligt
    // denk erom dat de datum wel goed ingevoerd is van min en max

    var strValue;
    var strMaxValue;
    var strMinValue;
    var strControle;
    var blnOk = true;

    strValue = eval("document.entryform." + strControl + ".value");
    debugMessage("valideerDatumMin " + strValue + strLabel + strMin);

    // als verplicht en datum validatie ok dan gaan we verder
    if (valideerVerplicht(strControl, strLabel) && valideerDatum(strControl, strLabel)) {
        // converteren naar een formaat waarmee we kunnen vergelijken
        strMinValue = date2String(strMin, "ymd");
        strControle = date2String(strValue, "ymd");
        debugMessage("valideerDatumMinExtra " + strControle + strLabel + strMinValue);

        if (strControle <= strMinValue) {
            strMelding = strMelding + strLabel + " ligt niet na " + strMin + "\r\n";
            blnInvoerOk = false;
            setFocusControl(strControl);
            blnOk = false;
        }
    }
    else
        blnOk = false;
    return blnOk;
}

function valideerDatumMax(strControl, strLabel, strMin) {
    // controleer of de datum tussen twee waarden ligt
    // denk erom dat de datum wel goed ingevoerd is van min en max

    var strValue;
    var strMaxValue;
    var strControle;
    var blnOk = true;

    strValue = eval("document.entryform." + strControl + ".value");
    debugMessage("valideerDatumMax " + strValue + strLabel + strMax);

    // als verplicht en datum validatie ok dan gaan we verder
    if (valideerVerplicht(strControl, strLabel) && valideerDatum(strControl, strLabel)) {
        // converteren naar een formaat waarmee we kunnen vergelijken
        strMaxValue = date2String(strMax, "ymd");
        strControle = date2String(strValue, "ymd");
        debugMessage("valideerDatumMaxExtra " + strControle + strLabel + strMaxValue);

        if (strControle >= strMaxValue) {
            strMelding = strMelding + strLabel + " ligt niet voor " + strMax + "\r\n";
            blnInvoerOk = false;
            setFocusControl(strControl);
            blnOk = false;
        }
    }
    else
        blnOk = false;
    return blnOk;
}

//
// Begin helperfuncties
// deze functies zouden in echte Java private of protected zijn, maar dat kan hier niet
// 
function isNietLeeg(strValue) {
    // controleer of strValue iets ingevuld heeft en dat er niet in voorkomt maak uw keuze 
    // dit is voor een keuzelijst ook een lege waarde
    var returnValue = true;

    if ((strValue.length == 0) || (strValue.indexOf("Maak uw keuze") > -1)) {
        returnValue = false;
    }
    return returnValue;
}

function isGetal(strValue) {
    // controleer of strValue een getal is

    var returnValue = true;
    var cnt44 = 0;
    var cnt46 = 0;

    // voldoet elk element aan de juiste voorwaarden een getal, punt of comma
    for (var i = 0; (i < strValue.length && returnValue == true); i++) {
        if (!((strValue.charCodeAt(i) >= 48 && strValue.charCodeAt(i) <= 57) || strValue.charCodeAt(i) == 44 || strValue.charCodeAt(i) == 46)) {
            returnValue = false;
        } else if (strValue.charCodeAt(i) == 44) {
            cnt44++;
        } else if (strValue.charCodeAt(i) == 46) {
            cnt46++;
        }
    }

    // als er meer dan 1 comma of punt voorkomt gaat het ook fout
    if ((cnt44 + cnt46) > 1) {
        returnValue = false;
    }
    return returnValue;
}

function isDatum(strValue) {
    // controleer of strValue een datum in dd-mm-yyyy formaat is
    // deze functie zou nog iets meer kunnen door de value van\ de control te standaardiseren
    // is dit wenselijk?

    if (date2String(strValue, "dmy") == "nodate") {
        return false;
    }
    else {
        return true;
    }
}

function date2String(strValue, strFormat) {
    // zet een string om naar de dag, maand en het jaar 
    // en plakt ze op een correcte manier weer aan elkaar
    // we kunnen hier nog verder gaan door extra validaties in te bouwen
    var dateValue = "";
    var dd;
    var mm;
    var yyyy;

    if (strValue.indexOf("-") > 0) {
        var dateParts = strValue.split("-");
    }
    else {
        dateValue = "nodate";
    };

    if (dateValue != "nodate") {
        // 2nd argument means that the string contains a number in a base 10 format
        // Must be specified here because 08 and 09 would otherwise be considered octal numbers.

        if (dateParts[0].length < 2) {
            dateValue = "nodate";
        };
        if (dateParts[1].length < 2) {
            dateValue = "nodate";
        };

        dd = parseInt(dateParts[0], 10);
        mm = parseInt(dateParts[1], 10);
        yyyy = parseInt(dateParts[2], 10);

        // Controleer maand
        if (mm >= 1 && mm <= 12) {
            if (mm < 10) {
                mm = "0" + mm;
            }
            else {
                mm = "" + mm;
            }

        }
        else {
            dateValue = "nodate";
        }

        // Controleer dag
        if (dd >= 1 && dd <= 31) {
            if (dd < 10) dd = "0" + dd;
            if (dd == 31 && (mm == "04" || mm == "06" || mm == "09" || mm == "11")) {
                dateValue = "nodate"
            }
            if (dd > 29 && mm == "02") {
                dateValue = "nodate"
            }

        }
        else {
            dateValue = "nodate";
        }

        // controleer jaartal
        if (dateValue != "nodate" && yyyy.toString().length != 2 && yyyy.toString().length != 4) {
            dateValue = "nodate";
        }

        if (dateValue != "nodate") {
            if (strFormat == "dmy")
                dateValue = dd + "-" + mm + "-" + yyyy;
            if (strFormat == "ymd")
                dateValue = yyyy + "-" + mm + "-" + dd;

        }
    }
    return dateValue;
}

function isTijd(strValue) {
    var timeValue;

    if (strValue.indexOf(":") < 0)
        return false;

    timeValue = strValue.split(":");

    if (timeValue[0] < 0 || timeValue[0] >= 24)
        return false;

    if (timeValue[1] < 0 || timeValue[1] >= 60)
        return false;

    return true;
}

function setFocusControl(strControl) {

    if (blnFirst == true) {
        strFocusControl = strControl;
        blnFirst = false;
    }
}

function debugMessage(strMessage) {
    if (DEBUG) {
        alert(strMessage)
    }
}
