/* 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_email array
                        if (required_domainname[ec] == existing_required_field.name)
                        {
                            // if it is present, check if it is a valid e-mail address
                            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)
{
var arr = new Array(
'.com','.net','.org','.biz','.coop','.info','.museum','.name',
'.pro','.edu','.gov','.int','.mil','.ac','.ad','.ae','.af','.ag',
'.ai','.al','.am','.an','.ao','.aq','.ar','.as','.at','.au','.aw',
'.az','.ba','.bb','.bd','.be','.bf','.bg','.bh','.bi','.bj','.bm',
'.bn','.bo','.br','.bs','.bt','.bv','.bw','.by','.bz','.ca','.cc',
'.cd','.cf','.cg','.ch','.ci','.ck','.cl','.cm','.cn','.co','.cr',
'.cu','.cv','.cx','.cy','.cz','.de','.dj','.dk','.dm','.do','.dz',
'.ec','.ee','.eg','.eh','.er','.es','.et','.fi','.fj','.fk','.fm',
'.fo','.fr','.ga','.gd','.ge','.gf','.gg','.gh','.gi','.gl','.gm',
'.gn','.gp','.gq','.gr','.gs','.gt','.gu','.gv','.gy','.hk','.hm',
'.hn','.hr','.ht','.hu','.id','.ie','.il','.im','.in','.io','.iq',
'.ir','.is','.it','.je','.jm','.jo','.jp','.ke','.kg','.kh','.ki',
'.km','.kn','.kp','.kr','.kw','.ky','.kz','.la','.lb','.lc','.li',
'.lk','.lr','.ls','.lt','.lu','.lv','.ly','.ma','.mc','.md','.mg',
'.mh','.mk','.ml','.mm','.mn','.mo','.mp','.mq','.mr','.ms','.mt',
'.mu','.mv','.mw','.mx','.my','.mz','.na','.nc','.ne','.nf','.ng',
'.ni','.nl','.no','.np','.nr','.nu','.nz','.om','.pa','.pe','.pf',
'.pg','.ph','.pk','.pl','.pm','.pn','.pr','.ps','.pt','.pw','.py',
'.qa','.re','.ro','.rw','.ru','.sa','.sb','.sc','.sd','.se','.sg',
'.sh','.si','.sj','.sk','.sl','.sm','.sn','.so','.sr','.st','.sv',
'.sy','.sz','.tc','.td','.tf','.tg','.th','.tj','.tk','.tm','.tn',
'.to','.tp','.tr','.tt','.tv','.tw','.tz','.ua','.ug','.uk','.um',
'.us','.uy','.uz','.va','.vc','.ve','.vg','.vi','.vn','.vu','.ws',
'.wf','.ye','.yt','.yu','.za','.zm','.zw');

var mai = nname;
var val = true;

var dot = mai.lastIndexOf(".");
var dname = mai.substring(0,dot);
var ext = mai.substring(dot,mai.length);
//alert(ext);

if(dot>2 && dot<57)
{
	for(var i=0; i<arr.length; i++)
	{
	  if(ext == arr[i])
	  {
	 	val = true;
		break;
	  }
	  else
	  {
	 	val = false;
	  }
	}
	if(val == false)
	{
//	  	 alert("Your domain extension "+ext+" is not correct");
		 return false;
	}
	else
	{
		for(var j=0; j<dname.length; j++)
		{
		  var dh = dname.charAt(j);
		  var hh = dh.charCodeAt(0);
		  if((hh > 47 && hh<59) || (hh > 64 && hh<91) || (hh > 96 && hh<123) || hh==45 || hh==46)
		  {
			 if((j==0 || j==dname.length-1) && hh == 45)
		  	 {
//		 	  	 alert("Domain name should not begin are end with '-'");
			      return false;
		 	 }
		  }
		else	{
//		  	 alert("Your domain name should not have special characters");
			 return false;
		  }
		}
	}
}
else
{
 //alert("Your Domain name is too short/long");
 return false;
}

return true;
}
