function Validator(){}

Validator.form_onsubmit = function(event)
{
	var form = Commands.getForm(event);
	if(!Validator.validate(form)) Util.cancelEvent(event);
}

Validator.validate = function(form)
{
	if(form._isInvalid) return false;
	if(form.vSkipValidation) return true;
	
	var isValid = true;
	for(var i = 0; i < form.elements.length; i++)
	{
		var lastIsValid = true;
		var l = form.elements[i];
		if(l.offsetHeight == 0) continue;
		var isEmpty = Util.trim(String(l.value)) == "";

		var vRequired = l.getAttribute("vRequired");
		vRequired = vRequired == "1" || vRequired == "true";
		if(vRequired  && !l.disabled
		&& (l.tagName == "TEXTAREA" || l.type == "text" || l.type == 'password' || l.type == 'file'
		|| l.tagName == "SELECT" || l.type == "radio")
		&& isEmpty)
		{
			lastIsValid = false;
		}

		if(!isEmpty)
		{
			var vEmailRequired = l.getAttribute("vEmailRequired");
			if(vEmailRequired)
			{
				if(!l.value.match(/^.+@.+\.\w{2,}$/)) lastIsValid = false;
			}
			var vDateRequired = l.getAttribute("vDateRequired");
			if(vDateRequired)
			{
				if(!l.value.match(/^\d{1,2}[\/.]\d{1,2}[\/.]\d{2,4}(\s+\d{1,2}:{1,2}(\s*(AM|PM)))?$/)) 
				{
					lastIsValid = false;
				}
			}
			var vNumberRequired = l.getAttribute("vNumberRequired");
			if(vNumberRequired)
			{
				if(!l.value.match(/^-?[\d]*\.?[\d]+$/)) lastIsValid = false;
			}
			//\+?\d?\s*\(\d{3}\)\s*
			if(l.getAttribute("vPhoneRequired")
			&& !l.value.match(/^((\+?\d+\s*)?\(\d{3}\)\s*)?\d{3}(\-|\s)?\d{4}$/)) lastIsValid = false;
		}

		if(l.type == "password" && l.value.length > 0)
		{
			var vCheckPassword = l.getAttribute("vCheckPassword");
			if(vCheckPassword)
			{
				var pass2 = form.elements[vCheckPassword];
				var minLength = l.getAttribute("vMinLength");
				
				if(pass2 && l.value != pass2.value
				|| minLength && l.value.strlen < parseInt(minLength, 10))
				{
					lastIsValid = false;
				}
			}
		}

		if(!lastIsValid)
		{
			isValid = false;
			if(l.currentStyle)
				l._border = l.currentStyle.borderColor;
			else
				l._border = document.defaultView.getComputedStyle(l, null).getPropertyValue("borderColor");

			//l.style.border = "1px solid red";
		}
		else
		{
			//if(l._border !== undefined) l.style.borderColor = l._border;
		}
		var vMessageID = l.getAttribute("vMessageID");
		if(vMessageID)
		{
			var messageEl = document.getElementById(vMessageID);
			messageEl.style.display = lastIsValid ? 'none' : 'inline';
		}
	}

	if(!isValid && form.getAttribute("vShowMessage") == "true")
	{
		alert("The form contains data errors.");
	}

	return isValid;
}


function Commands(){}

Commands.getForm = function(event)
{
	var form = event.srcElement ? event.srcElement : event.target;
	while(form && form.tagName != "FORM") form = form.parentNode;
	return form
}


function Util(){}
Util.cancelEvent = function(event)
{
	if(event.stopPropagation)
	{
		event.stopPropagation();
		event.preventDefault();
	}
	else
	{
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	}
}

Util.trim = function(str)
{
	return str.replace(/^\s+/, '').replace(/\s+$/, '');
}



