/*
Created By:     Ramen Das on 24-Aug-09

Modified By:    Ramen Das on 05-Mar-10
                Improved the script for radio groups and checkboxes
*/

/* Enums */
var validationTypeEnums = {'Required':0, 'Email':1, 'PhoneNumber':2};

/* Regular expressions */
var REGEX_EMAIL = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
var REGEX_PHONE = /^(\+[0-9]{1,4})?[ \-\.]?(\(?[0-9]{1,4}\)?)?[ \-\.]?[0-9]{6,11}$/;

/* String constants */
var LEADING_TEXT_FOR_MESSAGE = 'Please complete the following fields:';
var LEADING_TEXT_FOR_ITEMS = '\t* ';


/* Form validation routine */
function ValidateForm(formValidationParams)
{
	if (formValidationParams.length != 3)
	{
	   alert('Parameter array does not have all 3 necessary containing arrays!');
	   return false;
	}
	if (formValidationParams[0].length != formValidationParams[1].length || formValidationParams[1].length != formValidationParams[2].length)
	{
	   alert('Parameter arrays are not of same dimension!');
	   return false;
	}

/*	array#1 holds element IDs (or Name if it's a radio group) */
	var elementIDsToValidate = formValidationParams[0];
/*	array#2 holds validation type from the enum validationTypeEnums. */
	var validationTypes = formValidationParams[1];
/*	array#3 holds message text for alert function to show */
	var validationMessages = formValidationParams[2];

	var message;
	message = '';
	
	for (i=0; i<elementIDsToValidate.length; i++)
	{
		var elementToValidate, regEx, isValid;

		elementToValidate = document.getElementById(elementIDsToValidate[i]);

		if (elementToValidate == null)
		{
		    var groupToValidate = document.getElementsByName(elementIDsToValidate[i]);
    		if (groupToValidate == null) continue;
    		
		    isValid = false;
		    for (j=0; j<groupToValidate.length; j++)
		    {
		        var elementInGroup = groupToValidate.item(j);
		        if (elementInGroup.type == "radio" || elementInGroup.type == "checkbox")
		            if (elementInGroup.checked)
		            {
		                isValid = true;
		                break;
		            }
		    }
        }
        else
        {
		    isValid = true;
		    switch (validationTypes[i])
		    {
		       case validationTypeEnums.Required:
		       default:
		            switch (elementToValidate.type)
		            {
		                case "textbox": default: if (elementToValidate.value == '') isValid = false; break;
		                case "checkbox": if (!elementToValidate.checked) isValid = false; break;
		            }
                    break;

		       case validationTypeEnums.Email:
                    if (elementToValidate.value == '') continue;
                    regEx = REGEX_EMAIL;
                    if (!regEx.test(elementToValidate.value)) isValid = false;
                    break;

		       case validationTypeEnums.PhoneNumber:
                    if (elementToValidate.value == '') continue;
                    regEx = REGEX_PHONE;
                    if (!regEx.test(elementToValidate.value)) isValid = false;
                    break;
		    }
		}
		
	    if (!isValid)
	       message += LEADING_TEXT_FOR_ITEMS + validationMessages[i] + '\n';
	}

	if (message != '')
	{
	   alert(LEADING_TEXT_FOR_MESSAGE + '\n\n' + message);
	   return false;
	}

	/* these are to be commented out after finishing testing */
	/*alert('Successfully sent the form!');
	return false;*/
	/* these are to be commented in after finishing testing */
	return true;
}

/*
An example formValidationParams:

var formParams =
[
// array#1 holds element IDs (or Name if it's a radio group)
   [
        'lead_personfirstname','lead_personlastname','lead_companyname',
	    'lead_persontitle','lead_personemail','lead_personemail',
	    'lead_personphonenumber','lead_personphonenumber'
   ],
// array#2 holds validation type from the enum validationTypeEnums
   [
        validationTypeEnums.Required,validationTypeEnums.Required,
        validationTypeEnums.Required,validationTypeEnums.Required,
        validationTypeEnums.Required,validationTypeEnums.Email,
	    validationTypeEnums.Required,validationTypeEnums.PhoneNumber
   ],
// array#3 holds message text for alert function to show
   [
        'First Name','Last Name','Company','Job Title',
    	'Email','Email, e.g. first.last@ipd.com',
	    'Phone Number','Phone Number, e.g. +44 (02) 123456'
   ]
];
*/



/* Form clearing routine */
function ClearForm(elementIDsToClear)
{
/*	elementIDsToClear holds element IDs (or Name if it's a radio group) */

	for (i=0; i<elementIDsToClear.length; i++)
	{
		var elementToValidate;

		elementToValidate = document.getElementById(elementIDsToClear[i]);

		if (elementToValidate == null)
		{
		    var groupToValidate = document.getElementsByName(elementIDsToClear[i]);
    		if (groupToValidate == null) continue;
    		
		    for (j=0; j<groupToValidate.length; j++)
		    {
		        var elementInGroup = groupToValidate.item(j);
		        if (elementInGroup.type == "radio" || elementInGroup.type == "checkbox")
		            elementInGroup.checked = false;
		    }
        }
        else
        {
            switch (elementToValidate.type)
            {
                case "textbox": default: elementToValidate.value = ''; break;
                case "checkbox": elementToValidate.checked = false; break;
            }
		}
	}
	return false;
}
