// validate.js
//
// Validates the form on the client side.

function LTrim ( s ){
	return s.replace( /^\s*/, "" )
}
function RTrim ( s ){
	return s.replace( /\s*$/, "" );
}
function Trim ( s ){
	return RTrim(LTrim(s));
}

function IsTrue( b )
{
	b = b.toLowerCase();
	
	if (b == "true") return true;
	if (b == "yes") return true;
	
	return false;
}

function FV_Validate(formID)
{
	var formData = eval(formID);
	var fieldLabel = "";
	var fieldData = "";
	var fieldValue = "";
	var errors = new Array();
	
	// Get the form object
	var formObj = document.getElementById(formID);
	// var fields = formObj.getElementsByTagName("input");
	var fields = formObj.elements;
	
	for (var fieldName in formData.fields)
	{
		fieldData = formData.fields[fieldName];
		var check = true;
		var field = null;
		
		fieldData = formData.fields[fieldName];

		// Get the value... 
		switch (fieldData.type)
		{
			case "radio":
			case "checkbox":
				var chkCollection = formObj.elements(fieldData.id);
				fieldValue = "";
				if (chkCollection)
				{
					for (var i = 0; i < chkCollection.length; i++)
					{
						if (chkCollection[i].checked)
						{
							if (fieldValue != "") fieldValue += ",";
							fieldValue += chkCollection[i].value;
						}
					}
				}
				break;
			case "select":
				field = document.getElementById(fieldData.id);
				var options = field.options;
				fieldValue = "";
				for (var i = 0; i < options.length; i++)
				{
					if (options[i].selected)
					{
						if (fieldValue != "") fieldValue += ",";
						fieldValue += options[i].value;
					}					
				}
				break;
			default:
				field = document.getElementById(fieldData.id);
				fieldValue = Trim(field.value);
				break;
		}

		var fieldId = fieldData.id.toLowerCase();
		if (formData.labels[fieldId] != null){
			fieldLabel = formData.labels[fieldId];
		}else{
		//alert(field.name);
			if(field!=null){
				if(formData['fields'][field.name.toLowerCase()]['label']!=null){
					fieldLabel = formData['fields'][field.name.toLowerCase()]['label'];
				}else{
					fieldLabel = field.name;
				}
				//alert(field.name + " " + field.value);
				//fieldLabel = field.name;
			}
		}
		
		// Check for required values.
		if (fieldValue == "")
		{
			if (IsTrue(fieldData.required))
			{
				errors[errors.length] = fieldLabel + " is required.";
			}

			// Even if it is not required, we don't want to do any further checking.
			check = false;
		}

		// Check maxlen
		if (check && fieldData.maxlength != null)
		{
			if (fieldValue.length > fieldData.maxlength)
			{
				errors[errors.length] = fieldLabel + " cannot be more than " + fieldData.maxlength + " characters long.";
				check = false;
			}
		}
		
		// Check minlen
		if (check && fieldData.minlength != null)
		{
			if (fieldValue.length < fieldData.minlength)
			{
				errors[errors.length] = fieldLabel + " must be at least " + fieldData.minlength + " characters long.";
				check = false;
			}
		}

		// Check validation type
		var result = "";
		if (check)
		{
			switch(fieldData.type.toLowerCase())
			{
				case "text":
					// None... for now.
					break;
				case "integer":
					result = FV_ValidateInteger(fieldValue);
					break;
				case "numeric":
					result = FV_ValidateNumeric(fieldValue);
					break;
				case "date":
					result = FV_ValidateDate(fieldValue);
					break;
				case "time":
					result = FV_ValidateTime(fieldValue);
					break;
				case "email":
					result = FV_ValidateEmail(fieldValue);
					break;
				case "regex":
					result = FV_ValidateRegEx(fieldValue, fieldData.regex, fieldData.errormessage);
					break;
				case "password":
					result = FV_ValidatePassword(fieldValue, fieldData);
					break;
			}
			
			if (result != "")
			{
				errors[errors.length] = fieldLabel + " " + result;
				check = false;
			}
		}
		
		// Custom validator
		if (check && fieldData.jsvalidator != null)
		{
			var vFunction = "";
			
			try
			{
				vFunction = eval(fieldData.jsvalidator);
			}
			catch (e)
			{
				alert("Error:  " + fieldData.jsvalidator + " is not defined.");
				return false;
			}
			
			if (!(vFunction instanceof Function))
			{
				alert("Error:  " + fieldData.jsvalidator + " is not a function.");
				return false;
			}
			
			result = vFunction(fieldValue, fieldData, formData);
			
			if (result != "")
			{
				errors[errors.length] = fieldLabel + " " + result;
				check = false;
			}
		}
	}

	if (errors.length != 0)
	{
		if (formData.errordisplay == "alert")
		{
			alert (errors.join("\n"));
		}
		else
		{
			var errorElement = document.getElementById(formData.errordisplay);
			errorElement.style.display = "";
//			alert(document.frmSingleJobSearch.messageintro);
			if(formObj.messageintro != null){
				errorElement.innerHTML = formObj.messageintro + "<ul class='ul'><li>" + errors.join("</li><li>") + "</li></ul>";
			}else{
				errorElement.innerHTML = "<ul><li>" + errors.join("</li><li>") + "</li></ul>";
			}
			if(formObj.errordisplay!=null)
				document.getElementById(formObj.errordisplay).scrollIntoView();
		}
	}
	
	return (errors.length == 0);
}

/*
* Performs field validation for Integer field types.
*/
function FV_ValidateInteger(fieldValue)
{
	if (fieldValue.match(/^[0-9]+$/) == null)
		return "must be an integer.";

	return "";
}

/*
* Performs field validation for Numeric field types.
*/
function FV_ValidateNumeric(fieldValue)
{
	if (fieldValue.match(/^([0-9]*[\\.]?)?[0-9]+$/) == null)
		return "must be an number.";

	return "";
}

/*
* Performs field validation for Date field types.
*/
function FV_ValidateDate(fieldValue)
{
	// Must match MM/DD/YYYY
	if (fieldValue.match(/^[0-9]{1,2}[\/][0-9]{1,2}[\/][0-9]{4}$/) == null)
	{
		return "must be a date (MM/DD/YYYY).";
	}

	var dateArray = fieldValue.split("/");
	var year = parseInt(dateArray[2]);
	var month = parseInt(dateArray[0]) - 1;
	var day = parseInt(dateArray[1]);
	var dateObj = new Date (fieldValue);

	// Determine if the month and day values are valid.
	// If the components of the date object do not
	// match the month, day, or year values, the date
	// must be invalid.  This is the case because
	// the new Date() constructor will change 
	// 03/32/2003 to 4/1/2003.
	if (dateObj == null
		|| year != dateObj.getFullYear()
		|| month != dateObj.getMonth()
		|| day != dateObj.getDate()
	)
	{
		return "is an invalid date.";
	}

	return "";
}

/*
* Peforms field validation for Time field types.
*/
function FV_ValidateTime(fieldValue)
{
	// Must match HH:MM TT
	if (fieldValue.match(/^[0-9]{1,2}[:][0-9]{2}[ ]?[aApP][mM]$/) == null)
	{
		return "must be a time (HH:MM AM|PM).";
	}
	
	return "";
}

/*
* Peforms field validation for Email field types.
*/
function FV_ValidateEmail(fieldValue)
{
	if (fieldValue.match(/^[a-zA-Z][a-zA-Z0-9\._\-]*[@][a-zA-Z][a-zA-Z0-9\-]*([\.][a-zA-Z][a-zA-Z0-9\-]*)+$/) == null)
	{
		return "is not a valid email address.";
	}
	
	return "";
}

/*
* Performs field validation for a RegEx field type.
*/
function FV_ValidateRegEx(fieldValue, regEx, errorMessage)
{
	if (regEx.charAt(0) != "^")
		regEx = "^" + regEx;
	
	if (regEx.charAt(regEx.length - 1) != "$")
		regEx = regEx + "$";

	if (fieldValue.match( new RegExp(regEx) ) == null)
	{
		return errorMessage;
	}
	
	return "";
}

/*
* Performs field validation for a Password field type.
*/
function FV_ValidatePassword(fieldValue, fieldData)
{
	var confirmValue = "";
	var confirmField = "";

	if (IsTrue(fieldData.confirm))
	{
		// Need to change this... i think... could have name collisions if more than
		// one form is present.
		confirmField = document.getElementById(fieldData.name + "_ConfirmPassword");

		if (confirmField == null)
		{
			return "confirmation field not found.";
		}
		
		confirmValue = Trim(confirmField.value);
		
		if (fieldValue != confirmValue)
		{
			return "and confirmation do not match.";
		}
	}
	
	return "";
}

function FV_errorMessage(fieldValue, fieldData)
{
	var confirmValue = "";
	var confirmField = "";

	if (IsTrue(fieldData.confirm))
	{
		// Need to change this... i think... could have name collisions if more than
		// one form is present.
		confirmField = document.getElementById(fieldData.name + "_ConfirmPassword");

		if (confirmField == null)
		{
			return "confirmation field not found.";
		}
		
		confirmValue = Trim(confirmField.value);
		
		if (fieldValue != confirmValue)
		{
			return "and confirmation do not match.";
		}
	}
	
	return "";
}

