//class validator
function Validator ()
{

	this.isNumber = function (obj)
	{
		if (isNaN(obj.value))
			return false;
		return true;
	}
	this.isPositiveNumber = function (obj)
	{
		if (isNaN(obj.value) || obj.value==0)
			return false;
		return true;
	}	
	this.isEmpty = function (obj)
	{
		if (obj.value == "")
			return true;
		return false;
	}
	
	this.isString = function (obj)
	{
		if (obj.value == "" || obj.value.length>40)
			return true;
		return false;
	}

	this.isEmptyAndNumber = function (obj)
	{
		if ( this.isEmpty(obj) == true )
			return true;
		else if ( !this.isNumber(obj) )
			return true;
			else
				return false; 
	}	

	this.isNumberDate = function (str)
	{
		if(str.length==0)
			return false;
		numdecs = 0;
		for (i = 0; i < str.length; i++){
			mychar = str.charAt(i);
			if ((mychar >= "0" && mychar <= "9") || mychar == "." ){
				if (mychar == ".")
				numdecs++;
			}else 
				return false;
		}
		return true;
	} 
	
	this.isMoney = function (str)
	{
		/^\d+\.\d\d$/
		if (str.value=="") 
		{
			return true;
		}
		//Expresión regular para validar sólo dígitos
		JSRegExp0 =/^\d+$/;		
		JSRegExp1 =/^\d+\.\d\d$/;
		JSRegExp2 =/^\d+\,\d\d$/;
		if(JSRegExp0.test(str.value) || JSRegExp1.test(str.value) || JSRegExp2.test(str.value))
		{
			return true;
		}
		else
		{
			return false;
		} 
	}	

	this.isDate = function (obj)
	{
		if (obj.value != "") {
			var ar = obj.value.split("-");
			if (!this.isNumberDate(ar[0])) {
				return false;
			}
			if (!this.isNumberDate(ar[1])) {
				return false;
			}
			if (!this.isNumberDate(ar[2])) {
				return false;
			}
			if ( ar[0] > 31 ) {
				return false;
			}
			if ( ar[1] > 12) {
				return false;
			}
			if ( ar[2] > 2050) {
				return false;
			}
			return true;
		}
		else
			return true;
		///TODO///
		//return true;
	}

	this.checkEmail = function (obj)
	{
		string = obj.value;
		
		if (string.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) == -1 || string.length>40)
			return true;
		return false;
	}

	this.checkEmailOrBlank = function (obj)
	{
		string = obj.value;
		
		if(string.length==0)
			return false;
		if (string.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) == -1 || string.length>40)
			return true;
		return false;
	}

	this.isEqual = function(obj1, obj2)
	{
		if (obj1.value == obj2.value)
			return true;
		return false;
	}
	
	this.isTimes = function (obj)
	{
		var arg = obj.value.split(":");
		var ok = 0;
		if (obj.value.length != '5')
			return false;
		
		
		if (!isNaN(arg[0]))
			if (arg[0] <= "0")
				return false;
			else if (arg[0] >="23")
				return false;		
				else 
					ok = 1;
		else
			return false;	
		
		if (!isNaN(arg[1]))
			if (arg[1] <= "0")
				return false;
			else if (arg[1] >="60")
				return false;		
				else 
					ok = 1;
		else
			return false;
			
		if (ok == 1)
			return true;
				
	}

	this.validate = function (nameForm)
	{
		formObj = new Object();
		formObj = document.getElementById(nameForm);
		errors = "";
		inputs = formObj.getElementsByTagName("input");
		passwordObj = new Object();
		atLeast = true;
		atLeastMsg = "";
		showAtLeast = false;
		groups = new Array();
		for (var i = 0; i < inputs.length; i++)
		{
			flag		= false;
			dataType	= inputs[i].getAttribute("dataType");
			group		= inputs[i].getAttribute("group");
			msg		= inputs[i].getAttribute("msg");

			if (inputs[i].name == "password")
				passwordObj = inputs[i];

			if (inputs[i].style.display != "none")
			{
				if ((group))
				{
					if (!groups[group])
					{
						groups[group] = new Array();
					}
					groups[group].push(inputs[i]);
				}
				else
				{
					switch (dataType)
					{
						case "string":		{flag = this.isString(inputs[i]);}			break;
						case "messagge":	{flag = this.isEmpty(inputs[i]);}			break;
						case "email":		{flag = this.checkEmail(inputs[i]);}			break;
						case "emailOrBlank":	{flag = this.checkEmailOrBlank(inputs[i]);}		break;
						case "retryPassword":	{flag = !this.isEqual(inputs[i], passwordObj);}	break;
						case "date":		{flag = !this.isDate(inputs[i]);}			break;
						case "positiveNumber":	{flag = !this.isPositiveNumber(inputs[i]);}		break;
						case "number":		{flag = !this.isNumber(inputs[i]);}			break;
						case "emptyNumber":	{flag = this.isEmptyAndNumber(inputs[i]);}		break;
						case "money":		{flag = !this.isMoney(inputs[i]);}			break;

						
						case "times":		{flag = !this.isTimes(inputs[i]);}			break;
						case "atleast":
						{
							showAtLeast = true;
							atLeast = ( atLeast && this.isEmpty(inputs[i]) );
							atLeastMsg = msg;
						}
						break;
						default:
						case "":
						{
							flag = false;
						}
						break;
					}
					if(flag)
						errors	+= msg +" \n";

					if (showAtLeast && atLeast)
						errors	+= atLeastMsg + ".\n";
				}
			}
		}

		for (key in groups)
		{
			flag	= false;
			msg	= "";
			if (typeof(groups[key]) == "object")
			{
				for (var k in groups[key])
				{
					element = groups[key][k];
					if (typeof(element) == "object")
					{
						dataType	= element.getAttribute("dataType");
						msg		= element.getAttribute("msg");
						opr		= element.getAttribute("condition");
						switch (dataType)
						{
							case "string":		{flag = (opr == "OR")?(flag || this.isString(element)):(flag && this.isString(element));}			break;
							case "messagge":	{flag = (opr == "OR")?(flag || this.isEmpty(element)):(flag && this.isEmpty(element));}			break;
							case "email":		{flag = (opr == "OR")?(flag || this.checkEmail(element)):(flag && this.checkEmail(element));}		break;
							case "emailOrBlank":	{flag = (opr == "OR")?(flag || this.checkEmailOrBlank(element)):(flag && this.checkEmailOrBlank(element));}	break;
							case "date":		{flag = (opr == "OR")?(flag || !this.isDate(element)):(flag && !this.isDate(element));}			break;
							case "positiveNumber":	{flag = (opr == "OR")?(flag || !this.isPositiveNumber(element)):(flag && !this.isPositiveNumber(element));}	break;
							case "number":		{flag = (opr == "OR")?(flag || !this.isNumber(element)):(flag && !this.isNumber(element));}			break;
							case "money":		{flag = (opr == "OR")?(flag || !this.isMoney(element)):(flag && !this.isMoney(element));}			break;

							case "emptyNumber":	{flag = (opr == "OR")?(flag || this.isEmptyAndNumber(element)):(flag && this.isEmptyAndNumber(element));}	break;
							case "times":		{flag = (opr == "OR")?(flag || !this.isTimes(element)):(flag && !this.isTimes(element));}			break;
							default:
							case "":		{flag = (opr == "OR")?(flag || false):(flag && false);}							break;
						}
					}
				}
				if(flag)
					errors	+= msg + " \n";
			}
		}

		if (errors == "")
			return true;

		alert(errors);
		return false;
	}

}
