//validator class
function Validation(id, type, req, name)
{
	this.id = id;
	this.type = type;
	this.req = req;
	this.name = name;
}
function Validator()
{
	this.validations = new Array();
	this.Validate = Validate;
	this.ValidateSilent = ValidateSilent;
	this.AddValidation = AddValidation;
	this.silent = false;

}
function ValidateSilent()
{
	this.silent = true;
	return this.Validate();
}
function Validate()
{
	errortext = "";
	passedvalidation = true;
	passedrequired = true;
	requiredmissing = new Array();
	for(var f=0; f<this.validations.length; f++)
	{
		var thiselem = GetElem(this.validations[f].id);
		switch(this.validations[f].type.toUpperCase())
		{
			case "NUMBER":
				if(IsNumber(thiselem.value))
					thiselem.value = IsNumber(thiselem.value);
				else
				{
					if(IsEmpty(thiselem.value))
					{
						passedvalidation = false;
						errortext += this.validations[f].name + " should be a number.\n";
					}
					else
					{
						if(this.validations[f].req) passedvalidation = false;
					}
				}
			break;
			case "TELEPHONE":
				if(IsNumber(thiselem.value))
					thiselem.value = IsNumber(thiselem.value);
				else
				{
					
					if(IsEmpty(thiselem.value))
					{
						passedvalidation = false;
						errortext += this.validations[f].name + " should be a valid telephone number.\n";
					}
					else
						if(this.validations[f].req) passedvalidation = false;
				}
			break;
			case "EMAIL":
				if(!IsEmail(thiselem.value))
				{
					if(IsEmpty(thiselem.value))
					{
						passedvalidation = false;
						errortext += this.validations[f].name + " should be a valid email address.\n";
					}
					else
						if(this.validations[f].req) passedvalidation = false;
				}
			break;
			case "TEXT":
				if(IsEmpty(thiselem.value))
					thiselem.value = IsEmpty(thiselem.value);
				else
				{
					if(IsEmpty(thiselem.value))
					{
						passedvalidation = false;
						errortext += this.validations[f].name + " should not be a zero length string.\n";
					}
					else
						if(this.validations[f].req) passedvalidation = false;
				}
			break;
			case "DROPDOWN":
				if(thiselem.value=="")
				{
					if(IsEmpty(thiselem.value))
					{
						passedvalidation = false;
						errortext += "Please select your " + this.validations[f].name + " from the dropdown menu.\n";
					}
					else
						if(this.validations[f].req) passedvalidation = false;
				}
			break;
			default:
				typesplit = this.validations[f].type.split(":");
				if(typesplit[0].toUpperCase()=="RANGE")
				{
					if(IsNumber(thiselem.value))
					{
						if((parseInt(typesplit[1])<=parseInt(IsNumber(thiselem.value)))&&(parseInt(IsNumber(thiselem.value))<=parseInt(typesplit[2])))
						{
							thiselem.value = IsNumber(thiselem.value);
						}
						else
						{
							if(IsEmpty(thiselem.value))
							{
								passedvalidation = false;
								errortext += this.validations[f].name + " should be a number between " + typesplit[1] + " and " + typesplit[2] + ".\n";
							}
							else
								if(this.validations[f].req) passedvalidation = false;
						}
					}
					else
					{
						if(IsEmpty(thiselem.value))
						{
							passedvalidation = false;
							errortext += this.validations[f].name + " should be a valid number.\n";
						}
						else
							if(this.validations[f].req) passedvalidation = false;
					}
				}
			break;
		}
		if(!passedvalidation)
		{
			if(this.validations[f].req)
			{
				if(!IsEmpty(thiselem.value))
				{
					passedrequired = false;
					requiredmissing[requiredmissing.length] = this.validations[f].name;
				}
			}
		}
	}
	if(!passedvalidation)
	{
		if(!passedrequired)
		{
			errortext += "The Following required fields are required: ";
			for(var i = 0; i<requiredmissing.length; i++)
			{
				if(i>0) errortext += ", ";
				errortext += requiredmissing[i];
			}
			errortext += ".\n";
		}
		if(!this.silent)
		{
			alert(errortext);
		}
		return false;
	}
	else
		return true;
}
function AddValidation(id, type, req, name)
{
	this.validations[this.validations.length] = new Validation(id, type, req, name);
}
function CleanupNumber(str)
{
	return str.replace(/[\(\)\+\ \£\$\,\%]/g, '');
}
function CleanupText(str)
{
	str = Trim(str);
	return str;
}
function IsEmpty(str)
{
	str = CleanupText(str);
	return ((str.length>0)?str:false);
}
function IsNumber(str)
{
	str = CleanupNumber(str);
	return (isNaN(str)?false:str);
}
function IsEmail(str)
{
	str = Trim(str);
	var regex = /^[a-zA-Z0-9._-]+@([a-zA-Z0-9.-]+\.)+[a-zA-Z0-9.-]{2,4}$/;
	return (regex.test(str)?str:false);
}
function Trim(str)
{
	return str.replace(/^\s+|\s+$/g, '');
}
function GetElem(sId)
{
	if(!sId) return null;
	var returnObj = document.getElementById(sId);
	if(!returnObj && document.all) returnObj = document.all[sId];
	return returnObj;
}