﻿/* For form validation

    CVS
    $Revision: 1.1.1.1 $
    $Id: form_validation.js,v 1.1.1.1 2007/06/15 16:38:47 philip Exp $

    CHANGELOG
    16-12-2005: changed validation by adding select option fields, which colors their background red on missing
    22-08-200": changed e-mail regex to include 4 characters as tld (like .info)
*/


function pw_validate_form(form_naam)
{
    var form_is_ok = true;
    var required_counter = 0;
    var error_message = "";
    var error_in_current_field = false;
    var error_in_checkboxes = false;

    var valid_required_string = document.forms[form_naam].elements['valid_required'].value;
    var valid_required_array = valid_required_string.split(",");
    var required_fields = new Array();

    // MAP: map array keys to a form reference
    for (rc = 0; rc < valid_required_array.length; rc++)
    {
        var formfield_to_map = form_naam + "[" + valid_required_array[rc] + "]";
        required_fields.push(formfield_to_map);
    }

    // MAP: map valid_email hidden field to a reference variable so that this script can use it for checking
    if (document.forms[form_naam].elements['valid_email'])
    {
        // the idea is that each form field mentioned in the valid_email hidden field is added to a required_email array, which is checked later
        var valid_email_string = document.forms[form_naam].elements['valid_email'].value;
        var valid_email_array = valid_email_string.split(",");
        var required_email = new Array();

        for (ec = 0; ec < valid_email_array.length; ec++)
        {
            var emailfield_to_map = form_naam + "[" + valid_email_array[ec] + "]";
            required_email.push(emailfield_to_map);
            //alert(emailfield_to_map);
        }
    }

    // MAP: map valid_domainname hidden field to a reference variable so that this script can use it for checking
    if (document.forms[form_naam].elements['valid_domainname'])
    {
        // the idea is that each form field mentioned in the valid_email hidden field is added to a required_email array, which is checked later
        var valid_domainname_string = document.forms[form_naam].elements['valid_domainname'].value;
        var valid_domainname_array = valid_domainname_string.split(",");
        var required_domainname = new Array();

        for (ec = 0; ec < valid_domainname_array.length; ec++)
        {
            var domainname_to_map = form_naam + "[" + valid_domainname_array[ec] + "]";
            required_domainname.push(domainname_to_map);
        }
    }

    // MAP: map valid_one_or_more hidden field to a reference variable so that this script can use it for checking
    if (document.forms[form_naam].elements['valid_one_or_more'])
    {
        // the idea is that each form field mentioned in the valid_one_or_more hidden field is added to a required_one_or_more array, which is checked later
        var valid_one_or_more_string = document.forms[form_naam].elements['valid_one_or_more'].value;
        var valid_one_or_more_array = valid_one_or_more_string.split(",");
        var required_one_or_more = new Array();

        for (oc = 0; oc < (valid_one_or_more_array.length - 1); oc++)
        {
            var one_or_more_field_to_map = form_naam + valid_one_or_more_array[oc];
            required_one_or_more.push(one_or_more_field_to_map);
            //alert(one_or_more_field_to_map);
        }

        // assume an error, and remove error if a checked radio button is found
        error_in_checkboxes = true;

        // check if one or more required checkboxes are present
        for (oc = 0; oc < required_one_or_more.length; oc++)
        {
            if (document.forms[form_naam].elements[required_one_or_more[oc]])
            {
                if (document.forms[form_naam].elements[required_one_or_more[oc]].type == 'checkbox')
                {
                    //alert(document.forms[form_naam].elements[required_one_or_more[oc]].checked);
                    if (document.forms[form_naam].elements[required_one_or_more[oc]].checked == true)
                    {
                        error_in_checkboxes = false;
                    }
                }
            }
        }
        if (error_in_checkboxes == true)
        {
            error_message = error_message + "U heeft een verplicht aankruisveld niet aangevinkt\r\n";
            form_is_ok = false;

            for (oc = 0; oc < required_one_or_more.length; oc++)
            {
                if (document.forms[form_naam].elements[required_one_or_more[oc]])
                {
                    document.forms[form_naam].elements[required_one_or_more[oc]].style.border = "solid 2px red";
                }
            }
        } else {
            for (oc = 0; oc < required_one_or_more.length; oc++)
            {
                if (document.forms[form_naam].elements[required_one_or_more[oc]])
                {
                    document.forms[form_naam].elements[required_one_or_more[oc]].style.border = "none";
                }
            }
        }
    }




    // MAIN LOOP: loop through all required fields
    for (key_checktextfield=0; key_checktextfield < required_fields.length; key_checktextfield++)
    {
        //alert(required_fields[key_checktextfield] + " " + required_fields[key_checktextfield].length); // for debug

        // check if required radio button is present
        if (document.forms[form_naam].elements[required_fields[key_checktextfield]])
        {
            if (document.forms[form_naam].elements[required_fields[key_checktextfield]][0] && document.forms[form_naam].elements[required_fields[key_checktextfield]][0].type == 'radio')
            {
                // assume an error, and remove error if a checked radio button is found
                error_in_current_field = true;

                // loop through radio button options
                existing_radio_button = document.forms[form_naam].elements[required_fields[key_checktextfield]];
                for (radio_options_counter = 0; radio_options_counter < existing_radio_button.length; radio_options_counter++)
                {
                    if (existing_radio_button[radio_options_counter].checked == true)
                    {
                        // a checked button has been found, remove assumed error
                        error_in_current_field = false;

                        //alert(existing_radio_button[radio_options_counter].name + ' = ' + existing_radio_button[radio_options_counter].value)
                    }
                }


                // show error fields graphically in form by changing border color
                if (error_in_current_field == true)
                {
                    for (radio_options_counter = 0; radio_options_counter < existing_radio_button.length; radio_options_counter++)
                    {
                        existing_radio_button[radio_options_counter].style.border = '1px solid red';
                    }
                    form_is_ok = false;
                } else {
                    for (radio_options_counter = 0; radio_options_counter < existing_radio_button.length; radio_options_counter++)
                    {
                        existing_radio_button[radio_options_counter].style.border = 'none';
                    }
                }
            } else {
                if (document.forms[form_naam].elements[required_fields[key_checktextfield]].type == 'checkbox')
                {
                    existing_checkbox = document.forms[form_naam].elements[required_fields[key_checktextfield]];

                    // if the mandatory checkbox is not checked, then its an error
                    if (existing_checkbox.checked == false)
                    {
                        existing_checkbox.style.border = '1px solid red';
                        form_is_ok = false;
                    } else {
                        existing_checkbox.style.border = 'none';
                    }
                }
            }
        } else {
            alert(required_fields[key_checktextfield] + ' : dit veld is aangegeven als verplicht in het formulier onder required_fields, maar het is niet aanwezig in het formulier');
            return false;
        }

        // check if required field is present
        if (document.forms[form_naam].elements[required_fields[key_checktextfield]].type)
        {
            // the required field exists!
            var existing_required_field = document.forms[form_naam].elements[required_fields[key_checktextfield]];

            // before checking set current field to no error found
            error_in_current_field = false;

            // check if the required field contains data
            if (existing_required_field.value == "")
            {
                error_in_current_field = true;
                //alert("missing field " + existing_required_field.name);
            }

            // should the required field validate as an e-mail?
            if (document.forms[form_naam].elements['valid_email'])
            {
                // check if a required_email array exists
                if (required_email)
                {
                    // loop through the required_email array
                    for (ec = 0; ec < required_email.length; ec++)
                    {
                        //alert(required_email[ec]);
                        // check if the currently checked required field is present in the required_email array
                        if (required_email[ec] == existing_required_field.name)
                        {
                            // if it is present, check if it is a valid e-mail address
                            if (pw_is_valid_email(existing_required_field.value) == false)
                            {
                                error_in_current_field = true;
                                error_message = error_message + "Er is een ongeldig e-mail adres ingevuld!\r\n";
                            }
                        }
                    }
                }
            }

            // should the required field validate as an e-mail?
            if (document.forms[form_naam].elements['valid_domainname'])
            {
                // check if a required_email array exists
                if (required_domainname)
                {
                    // loop through the required_email array
                    for (ec = 0; ec <= required_domainname.length; ec++)
                    {
                        //alert(required_email[ec];
                        // check if the currently checked required field is present in the required_domainname array
                        if (required_domainname[ec] == existing_required_field.name)
                        {
                            // if it is present, check if it is a valid domain
                            if (pw_is_valid_domain(existing_required_field.value) == false)
                            {
                                error_in_current_field = true;
                                error_message = error_message + "Er is een ongeldige domeinnaam ingevuld!\r\n";
                            }
                        }
                    }
                }
            }


            // show error fields graphically in form by changing border color
            if (error_in_current_field == true)
            {
                if (existing_required_field.type == "select-one")
                {
                    existing_required_field.style.backgroundColor = 'red';
                } else {
                    existing_required_field.style.border = "solid 2px red";
                }
                form_is_ok = false;
            } else {
                if (existing_required_field.type == "select-one")
                {
                    existing_required_field.style.backgroundColor = 'white';
                } else {
                    if (existing_required_field.style)
                    {
                        existing_required_field.style.border = "solid 1px black";
                    }
                }
            }

        } else {
            // array's are not detected properly
            //alert("For admin: required field " + required_fields[key_checktextfield] + " not found in form.");  // for debug
        }
    }

    if(form_is_ok == false)
    {
        show_error_message(error_message);
    } else {
        document.forms[form_naam].submit.value = 'Bezig....';
        document.forms[form_naam].submit.disabled = true;
    }
    return form_is_ok;
}

function show_error_message(error_message)
{
    error_message = "Niet alle verplichte velden zijn goed ingevuld!\r\n" + error_message;
    error_message = error_message +  "De niet goed ingevulde velden zijn met rood gemarkeerd.";
    alert (error_message);
}


function pw_is_valid_email(str)
{
   // are regular expressions supported?
   var supported = 0;
   if (window.RegExp)
   {
     var tempStr = "a";
     var tempReg = new RegExp(tempStr);
     if (tempReg.test(tempStr)) supported = 1;
   }
   if (!supported)
   {
     return (str.indexOf(".") > 2) && (str.indexOf("@") > 0);
   } else {
       var r1 = new RegExp("(@.*@)|(\\.\\.)|(@\\.)|(^\\.)");
       var r2 = new RegExp("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$");
       return (!r1.test(str) && r2.test(str));
   }
}


function pw_is_valid_domain(nname)
{
    return true;
}