function ValidatableForm(theForm)
{
	ValidatableForm.WHITE_SPACE = new Array("\t", "\n", " ", "\r");
	ValidatableForm.EMAIL = "EMAIL";
	ValidatableForm.EMPTY = "EMPTY";
	ValidatableForm.NOT_DEFAULT = "NOT_DEFAULT";
	ValidatableForm.CHECKBOX = "CHECKBOX";
	ValidatableForm.FILE = "FILE";
	
	var fields;
	var form;
	var messageStart;
	
	this.init = init;
	this.validate = validate;
	this.addField = addField;
	this.removeField = removeField;
	this.isValidEmail = isValidEmail;
	this.isEmpty = isEmpty;
	this.setMessageStart = setMessageStart;
	
	this.init(theForm);
	
	function init(theForm)
	{
		this.form = theForm;
		this.fields = new Array();
		this.messageStart = "";
	}
	
	function setMessageStart(messageStart)
	{
		this.messageStart = messageStart;
	}
	
	function validate()
	{
		var errorField = null;
		var errors = new Array();
		
		for (var i = this.fields.length - 1; i >= 0; i--)
		{
			var fieldInfo = this.fields[i];
			
			switch (fieldInfo.type)
			{
				case	ValidatableForm.EMPTY:
					var field = this.form[fieldInfo.name];
					if (this.isEmpty(field.value))
					{
						errorField = field;
						errors.push("Enter your " + fieldInfo.label);
					}
					break;
				case	ValidatableForm.NOT_DEFAULT:
					var field = this.form[fieldInfo.name];
					if (field.value == field.defaultValue || this.isEmpty(field.value))
					{
						errorField = field;
						errors.push("Enter your " + fieldInfo.label);
					}
					break;
				case	ValidatableForm.EMAIL:
					var field = this.form[fieldInfo.name];
					if (this.isEmpty(field.value))
					{
						errorField = field;
						errors.push("Enter your " + fieldInfo.label);
					}
					else if (!this.isValidEmail(field.value))
					{
						errorField = field;
						errors.push("Enter a valid " + fieldInfo.label);
					}
					break;
				case	ValidatableForm.CHECKBOX:
					var field = this.form[fieldInfo.name];
					if (!field.checked)
					{
						errorField = field;
						errors.push("Agree to our " + fieldInfo.label);
					}
					break;
				case	ValidatableForm.FILE:
					var field = this.form[fieldInfo.name];
					var filepath = field.value;
					if (filepath != "")
					{
						var dotIndex = filepath.lastIndexOf(".");
						var extension = "";
						if (dotIndex != -1) {
							extension = filepath.substring(dotIndex + 1, filepath.length);
						}
						
						var validExtensions = fieldInfo['validateData'];
						var isValidExtension = false;
						for (var j = 0; j < validExtensions.length && !isValidExtension; j++)
						{
							var testExtension = validExtensions[j];
							if (extension.toLowerCase() == testExtension.toLowerCase())
							{
								isValidExtension = true;
							}
						}
						if (!isValidExtension)
						{
							errorField = field;
							errors.push("Upload a valid filetype for " + fieldInfo.label + " (" + validExtensions.join(", ") + ")");
						}
					}
					break;
			}
		}
		
		if (errors.length == 0)
		{
			return true;
		}
		else
		{
			errors.reverse();		
			errorField.focus();
			
			var msg = this.messageStart + "\n\n";
			for (var j = 0; j < errors.length; j++)
			{
				var errMsg = errors[j];
				msg += "\t- " + errMsg + "\n";
			}
			
			alert(msg);
			
			return false;
		}
	}
	
	function addField(name, label, type, validateData, targetIndex)
	{
		var field = new Array();
		field['name'] = name;
		field['label'] = label;
		field['type'] = type;
		field['validateData'] = validateData;
		if (targetIndex == null)
		{
			this.fields.push(field);
		}
		else
		{
			this.fields.splice(targetIndex, 0, field);
		}
	}
	
	function removeField(name)
	{
		var found = false;
		
		for (var i = 0; i < this.fields.length && !found; i++)
		{			 
			var field = this.fields[i];
			if (field['name'] == name)
			{
				found = true;
				this.fields.splice(i, 1);
			}
		}
		
		return found;
	}
	
	function isValidEmail(email)
	{
		var apos = email.indexOf("@")
		var dotpos = email.lastIndexOf(".")
		if (apos < 1 || dotpos-apos < 2) 
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	
	function isEmpty(value)
	{
		for (var i = 0; i < ValidatableForm.WHITE_SPACE.length; i++)
		{
			var illegalChar = ValidatableForm.WHITE_SPACE[i];
			value = value.split(illegalChar).join("");
		}
		
		return (value == "");
	}
}