/**
 * FormValidator.js - Javascript form validation library
 *
 * Created By Chris Navta
 * Version 1.5
 * October 12, 2007
**/

// FormValidator Object
function FormValidator() {
	this.fieldDefs = new Array();
	this.alertMessages = new Object();
	this.parsed = false;
}

FormValidator.TEXT				= "text";
FormValidator.NAME				= "name";
FormValidator.EMAIL				= "email";
FormValidator.PHONE_NUMBER		= "phone";
FormValidator.ZIP_CODE_5		= "zipCode5";
FormValidator.SELECT			= "select";
FormValidator.MULTIPLE_SELECT	= "multi";
FormValidator.MULTIPLE_CHECKBOX = "checks";

FormValidator.prototype.addFieldDef = function (fieldDef) {
	this.fieldDefs.push(fieldDef);
};

FormValidator.prototype.validate = function (form) {
	var hasErrors = false;
	var errorMsg = "";

	if (!this.parsed) { 
		this.parseDelarations(form);
	}

	var v = this;
	$A(this.fieldDefs).each(function(fieldDef) 
	{
		var field = form[fieldDef.getName()];

		if (field.type != 'select' && v.checkExists(field) == false)
		{
			hasErrors = true;
			errorMsg = "Please enter a " + fieldDef.getLabel();
			v.showError(fieldDef.getName(),errorMsg);
		} else 
		{
			var thisHasErrors = false;

			switch(fieldDef.getType())
			{
				case "zipCode5":
					if (v.checkZip(field) == false)
					{
						thisHasErrors = true;
						errorMsg = "Please enter a valid " + fieldDef.getLabel();
						v.showError(fieldDef.getName(),errorMsg);
					} else {
						v.removeError(fieldDef.getName());
					}
					break;	
				case "name":
					if (v.checkName(field) == false)
					{
						thisHasErrors = true;
						errorMsg = "Please enter your full " + fieldDef.getLabel();
						v.showError(fieldDef.getName(),errorMsg);
					} else {
						v.removeError(fieldDef.getName());
					}
					break;
				case "email":
					if (v.checkEmail(field) == false)
					{
						thisHasErrors = true;
						errorMsg = "Please enter a valid " + fieldDef.getLabel();
						v.showError(fieldDef.getName(),errorMsg);
					} else {
						v.removeError(fieldDef.getName());
					}
					break;
				case "phone":
					if (v.checkPhone(field) == false)
					{
						thisHasErrors = true;
						errorMsg = "Please enter a valid " + fieldDef.getLabel();
						v.showError(fieldDef.getName(),errorMsg);
					} else {
						v.removeError(fieldDef.getName());
					}
					break;
				case "select":
					if (v.checkSelect(field) == false)
					{
						thisHasErrors = true;
						errorMsg = "Please select a " + fieldDef.getLabel();
						v.showError(fieldDef.getName(),errorMsg);
					} else {
						v.removeError(fieldDef.getName());
					}
					break;
				case "checks":
					if (v.checkMultiCheck(field) == false)
					{
						thisHasErrors = true;
						errorMsg = "Please select a " + fieldDef.getLabel();
						v.showError(fieldDef.getName(),errorMsg);
					} else {
						v.removeError(fieldDef.getName());
					}
					break;
				case "multi":
					if (v.checkSelect(field) == false)
					{
						thisHasErrors = true;
						errorMsg = "Please select a " + fieldDef.getLabel();
						v.showError(fieldDef.getName(),errorMsg);
					} else {
						v.removeError(fieldDef.getName());
					}
					break;

			}

			if (thisHasErrors == true )
			{
				hasErrors = true;
			} else {
				v.removeError(fieldDef.getName());
			}
		}

	});

	if (hasErrors)
	{
		if (this.hasAlertMessages())
		{
			alert(this.getAlertMsgText());
		}
		return false;
	}

	return true;
};

FormValidator.prototype.findNameForControl = function(control) {
	var name
	$$('label').each(function(label) {
		if (label.htmlFor == control.name)
		{
			name = label.innerHTML.replace(':','');
		}
	});

	if (!name)
	{
		return control.name;
	}
		
	return name;
}

FormValidator.prototype.parseDelarations = function(form) {
	var v = this;
	$(form).getElements().each(function(element) {
		var validationType = element.getAttribute("validation");
		var name = v.findNameForControl(element);
		if (validationType)
		{
			v.addFieldDef(new FieldDef(element.name, validationType, name));
		}
	});
	this.parsed = true;
};


FormValidator.prototype.checkExists = function (field) {
	if (field.value == '')
		return false;
	
	return true;
};

FormValidator.prototype.checkName = function (field) {
	var filter = /^.*?\s.*?/;
	if (filter.test(field.value))
		return true;
	else
		return false;	
};

FormValidator.prototype.checkEmail = function (field) {
	var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	if (filter.test(field.value)) 
		return true;
	else 
		return false;
};


FormValidator.prototype.checkPhone = function (field) {
	var filter = /^\d\d\d-\d\d\d-\d\d\d\d$/;
	if (filter.test(field.value)) 
		return true;
	else 
		return false;
};

FormValidator.prototype.checkZip = function (field) {
	var filter = /^\d\d\d\d\d$/;
	if (filter.test(field.value)) 
		return true;
	else 
		return false;
};

FormValidator.prototype.checkMultiCheck = function (field) {
	var checked = false;

	for (var i=0;i<field.length;i++ )
	{
		if (field[i].checked == true)
		{
			checked = true;
		}
	}

	return checked;
};

FormValidator.prototype.checkSelect = function (field) {
	var selected = false;
	var ops = field.options;

	for (var i=0;i<ops.length;i++ )
	{
		if (ops[i].selected == true)
		{
			selected = true;
		}
	}

	return selected;
};

FormValidator.prototype.showError = function (id,errorMessage) {
	errorBox = $(id + "Error");

	if (errorBox != undefined)
	{
		errorBox.innerHTML = errorMessage;
	} else 
	{
		this.alertMessages[id] = errorMessage;
	}
	
};

FormValidator.prototype.removeError = function (id) {
	errorBox = $(id + "Error");
	if (errorBox != undefined)
	{
		errorBox.innerHTML = "";
	} else 
	{
		delete this.alertMessages[id];
	}
};

FormValidator.prototype.hasAlertMessages = function () {
	var hasMessages = false;
	for (var key in this.alertMessages)
	{
		hasMessages = true;
		break;
	}

	return hasMessages;
};

FormValidator.prototype.getAlertMsgText = function () {
	var alertText = "";
	for (var key in this.alertMessages)
	{
		alertText += this.alertMessages[key] + "\n";
	}

	return alertText;
};

FormValidator.prototype.submitForm = function (formId) {
	var form = $(formId);
	if (this.validate(form)) {
		form.submit();
	}
};


// FieldDef Object
function FieldDef(nameIn,typeIn,labelIn) {
	
	this.name = nameIn;
	this.type = typeIn;
	this.label = labelIn
}

FieldDef.prototype.setName = function (name) {
	this.name = name;
}

FieldDef.prototype.getName = function () {
	return this.name;
}

FieldDef.prototype.setType = function (type) {
	this.type = type;
}

FieldDef.prototype.getType = function () {
	return this.type;
}

FieldDef.prototype.setLabel= function (label) {
	this.label = label;
}

FieldDef.prototype.getLabel = function () {
	return this.label;
}