var ElementToValidate = new Array();
var ElementType = new Array();
var ElementName = new Array();
var ElementRequired = new Array();
var ElementDataType = new Array();
var ajaxErrorDivElement = null;
	
function Validator()
{
	ElementToValidate = new Array();
	ElementType = new Array();
	ElementName = new Array();
	ElementRequired = new Array();
	ElementDataType = new Array();
	ajaxErrorDivElement = document.getElementById('divWarning');
	
	this.ValidateValues = ValidateValues;
	this.AddElement = AddElement;
	this.setErrorDiv = setErrorDiv;
}

function ValidateValues()
{
	var AllOk = true;
	var Message = "";
	
	clearValidationErrors();
	
	for(var i = 0; i < ElementName.length; i++)
	{
		var firstTime = true;
		var reg;
		switch (ElementDataType[i])
		{
			case "Integer":
				reg = new RegExp(/^([-]?[1-9]([0-9]{1,8})?)$/);
				break;
			case "PositiveInteger":
				reg = new RegExp(/^([1-9]([0-9]{1,8})?)$/);
				break;
			case "Decimal":
				reg = new RegExp(/^[-+]?[0-9]*\.?[0-9]+$/);
				break;
			case "Date":
				reg = new RegExp(/^(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?\d\d$/);
				break;
			case "Year":
				reg = new RegExp(/^(19|20)?\d\d$/);
				break;
			case "Email":
				reg = new RegExp(/^[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.(?:[A-Za-z]{2}|com|org|net|biz|info|name|aero|info|jobs|museum|name|mil|edu|gov|coop|cat|int|mobi|pro|travel)$/i);
				break;
			case "Zip":
				reg = new RegExp(/(^\d{5}-\d{4}$)|(^\d{5}$)|(^[a-zA-Z]\d[a-zA-Z]\s?\d[a-zA-Z]\d$)/);
				break;
			case "Phone":
				reg = new RegExp(/^[(]?\d{3}[)\s-]{0,2}\d{3}[-\s]?\d{4}$/);
				break;
			case "Existence":
				reg = new RegExp(".*");
				break;
			case "Byte":
				reg = new RegExp(/^(100)|(\d?\d)$/);
				break;
			default:
				AddErrorAjax("You didn't add a type to validate.", ajaxErrorDivElement);
				return false;
				break;
		} // switch
		
		var hit = false;
		if(ElementRequired[i] == true && ElementType[i] != "radio" && ElementType[i] != "checkbox")
		{
			// element to validate could be an array of multiple elements
			var elements = ElementToValidate[i];
			if(elements.length == undefined) // it isn't an array, just one element
			{
				if(elements.value == null || elements.value == "")
				{
					AllOk = false;
					elements.parentNode.style.backgroundColor = '#ef9999';
					elements.style.backgroundColor = '#efdddd';
					Message += ElementName[i] + " must have a value.<br />";
					hit = true;
				}
				else
				{
					elements.parentNode.style.backgroundColor = '';
					elements.style.backgroundColor = '';
				}
			}
			else // it is an array
			{
				for(var j=0; j < elements.length; j++)
			    {
					if (elements[j].type.indexOf("select") != -1)
					{
						if (elements[j].value == "")
						{
							AllOk = false;
							elements[j].parentNode.style.backgroundColor = '#ef9999';
							elements[j].style.backgroundColor = '#efdddd';
							Message += ElementName[i] + " must have a value.<br />";
							hit = true;
						}
						else
						{
							elements[j].parentNode.style.backgroundColor = '';
							elements[j].style.backgroundColor = '';
						}
					}
					else
					{
					    if(elements[j].value == null || elements[j].value == "")
						{
							AllOk = false;
							elements[j].parentNode.style.backgroundColor = '#ef9999';
							elements[j].style.backgroundColor = '#efdddd';
							if(firstTime)
							{
								Message += ElementName[i] + " must have a value.<br />";
								firstTime = false;
								hit = true;
							}
						}
						else
						{
							elements[j].parentNode.style.backgroundColor = '';
							elements[j].style.backgroundColor = '';
						}
					}   
			    }
			}
		}
		else if(ElementRequired[i] == true) // has to be a radio or checkbox
		{
			// element to validate could be an array of multiple elements
			var elements = ElementToValidate[i];
			var oneChecked = false;
			for(var j=0; j < elements.length; j++)
			{
				if(elements[j].checked != false)
				{
					oneChecked = true;
				}
			}
			
			if(!oneChecked)
			{
				AllOk = false;
				Message += ElementName[i] + " must have a value selected.<br />";
				for(var j=0; j < elements.length; j++)
				{
					elements[j].parentNode.style.backgroundColor = '#ef9999';
					elements[j].style.backgroundColor = '#efdddd';
				}
			}
			else
			{
				for(var j=0; j < elements.length; j++)
				{
					elements[j].parentNode.style.backgroundColor = '';
					elements[j].style.backgroundColor = '';
				}
			}
		}
		
		if(!hit)
		{
			// element to validate could be an array of multiple elements
			var elements = ElementToValidate[i];
			if(elements.length == undefined)
			{
				if(elements.value != '')
				{
					if(!elements.value.match(reg))
					{
						AllOk = false;
						elements.parentNode.style.backgroundColor = '#ef9999';
						elements.style.backgroundColor = '#efdddd';
						Message += ElementName[i] + " is not a valid " + ElementDataType[i] + ".<br />";
					}
					else
					{
						elements.parentNode.style.backgroundColor = '';
						elements.style.backgroundColor = '';
					}
				}
			}
			else
			{
				for(var j=0; j < elements.length; j++)
				{
					if(elements[j].value != '')
					{
						if(!elements[j].value.match(reg))
						{
							AllOk = false;
							elements[j].parentNode.style.backgroundColor = '#ef9999';
							elements[j].style.backgroundColor = '#efdddd';
							if(firstTime)
							{
								Message += ElementName[i] + " is not a valid " + ElementDataType[i] + ".<br />";
								firstTime = false;
							}
						}
						else
						{
							elements[j].parentNode.style.backgroundColor = '';
							elements[j].style.backgroundColor = '';
						}
					}
				} // for
			}
		}// if hit
	} // for
	
	if(!AllOk)
	{
		$('divWarning').innerHTML = '';
		AddErrorAjax(Message, ajaxErrorDivElement);
	}
	return AllOk;
}

function AddElement(Name, Type, Element, Required, DataType)
{
	ElementToValidate.push(Element);
	ElementType.push(Type);
	ElementName.push(Name);
	ElementRequired.push(Required);
	ElementDataType.push(DataType);
}

function setErrorDiv(element)
{
	ajaxErrorDivElement = element;
}

function clearValidationErrors()
{
    for(var i = 0; i < ElementToValidate.length; i++)
    {
        var element = ElementToValidate[i];
        
        // element could be array of elements
        if (element.length == undefined)
        {
            element.parentNode.style.backgroundColor = '';
			element.style.backgroundColor = '';
        }
        else //element is an array of elements
        {
            for (ii = 0; i < element.length; i++)
            {
                element[ii].parentNode.style.backgroundColor = '';
			    element[ii].style.backgroundColor = '';
            }
        }
    }
    
    // clear error div
    ajaxErrorDivElement.style.display = 'none';
	ajaxErrorDivElement.innerHTML = '';
}