/* Dan DeValve 5/17/11 -- Form validation module  */

// keep it clean...
var FormValidator = new Object();

// returns true if the form with ID is valid, false otherwise
FormValidator.ValidateForm = function (formId, validClass, invalidClass)
{
	// walk the form, and validate non hidden fields...
	var form = document.getElementById(formId);
	var isValid = true;
	
	// set the valid/invalid class names on all elements as we walk...
	for(var element = 0; element < form.elements.length; element++)
	{
		
		var elementId = form.elements[element].id;
		
		if(!elementId.match(/^ignore/))
		{
			if(!FormValidator.ValidateField(elementId))
			{
				form.elements[element].className = invalidClass;
				isValid = false;
			}
			else
			{
				form.elements[element].className = validClass;
			}
		}
			
	}

	return isValid;
	
};

// returns true if the field is valid, false otherwise
FormValidator.ValidateField = function (fieldId)
{
	// figure out what the validator is
	// if the field isn't specified, don't bother...
	var validator_postfix = "_validate";
	
	
	var validator = document.getElementById(fieldId + validator_postfix);
	var element = document.getElementById(fieldId);
	
	// hidden elements are always valid.
	if(element.type == "hidden" || element.type == "Hidden")
		return true;
	
	if(validator)
	{
		// validate
		var elementValue = "";
		
		// if we're a textbox, take out value as the value...
		if(element.type == "text" || element.type == "Text" || element.type == "password" || element.type == "Password")
			elementValue = element.value;
		
		if(element.type == "select" || element.type == "Select")
			elementValue = element.options[element.selectedIndex].value;
		
		if(element.type == "checkbox" || element.type == "Checkbox")
			elementValue = element.checked;
		
		if(element.type == "checkbox" || element.type == "Checkbox")
			elementValue = element.checked;
		
		
		return FormValidator.GetValidator(validator.value)(elementValid);
	}
	else
	{
		// no validator, so it must be!
		return true;
	}
	
	
};

FormValidator.GetValidator = function (validator_type)
{
	
	// returns a list of validators based on the type...
	var validator_name = validator_type.split(":")[0];
	var validator_param = "";
	if(validator_type.split(":").length > 1)
	{
		validator_param = validator_type.split(":")[1];
	}
	
	// find the function, then return it...
	var validator_function = function (data) {return true;};
	
	if(validator_name == "none")
	{
		validator_function = function (data) { return FormValidator.Validator_None(validator_param, data); };
	}
	
	if(validator_name == "name")
	{
		validator_function = function (data) { return FormValidator.Validate_Name(validator_param, data); };
	}
	
	if(validator_name == "int")
	{
		validator_function = function (data) { return FormValidator.Validate_Integer(validator_param, data); };
	}
	
	if(validator_name == "nonempty")
	{
		validator_function = function (data) { return FormValidator.Validate_NonEmpty(validator_param, data); };
	}
	
	if(validator_name == "date")
	{
		validator_function = function (data) { return FormValidator.Validate_Date(validator_param, data); };
	}
	return validator_function;
};

FormValidator.Validator_None = function (param, data) {return true; };
FormValidator.Validate_Integer = function (param, data) {return data.match(/^\d+$/); };
FormValidator.Validate_NonEmpty = function (param, data) {return data.match(/^.+$/); };
FormValidator.Validate_Name = function (param, data) {return data.match(/^[\w '&]+$/); };
FormValidator.Validate_Date = function (param, data) 
{
	// validate a date...
	// validate mm/dd/yy or mm/dd/yyyy with or without leading zeroes...
	return data.match(/^d{1,2}\/d{1,2}\/d{2}|d{4}$/)
};


