function validate( form )
{
	prefix = "ar_" + form.id + "_";
	rules = ["required", "date", "number","maxlength", "minlength", "email", "confirm"];
	
	for(r = 0; r <rules.length; r++)
	{
		var rprefix = prefix + rules[r];
		if(!validateFields(
			form, 
			eval(rprefix), 
			eval(rprefix + "_values"), 
			eval(rprefix + "_messages"), 
			rules[r])) {
			return false;
		}
	}
	
	if(!validExtraRules(form))
		return false;
	
	return true;
}

/* re-write function if necessary */
function validExtraRules(form)
{
	return true;
}


function validateFields ( form, fields, values, messages, rule)
{
	valid = true;
	for (i = 0; i < fields.length; i++)
	{		
		object = form[fields[i]];
		if(object == undefined){
			alert("Object undefined: " + "form." + fields[i]);
			valid = false;
		}
			
		else
		{	
			switch(rule)
			{
				case "required":
					valid = requiredField(object);
					break;
					
				case "maxlength":
				case "minlength": 
					limit = parseInt(values[i]);
					valid = lengthField(object, limit, rule);
					break;
					
				case "confirm":
					valid = confirmField(object, values[i]);
					break;
					
				case "number":
					valid = numberField(object);
					break;
					
				case "email":
					valid = emailField(object);
					break;
			
				case "date":
					valid = dateField(object);
					break;
			}
		}
		
		if(!valid)
		{
			alert(messages[i]);		
			if(!valid && object != undefined && object.focus) object.focus();			
			return false;
		}
	}
	
	return true;	
}

function requiredField( object ) 
{
	if(object.length != undefined)
	{
		for(k = 0; k < object.length; k++)
		{
			if(object[k].checked) return true;
		}
		return false;
	}
	
	switch(object.type)
	{
		case "checkbox":
			return object.checked;
		
		case "select-one":
		case "select-multiple":
			return !empty(object[object.selectedIndex].value);

		case "text":
		case "file":
		case "textarea":
		case "password":
			return !empty(object.value);
			
		
	}
}

function lengthField( object, limit, rule) 
{
	ek = object.value;
	size = ek.length;
	switch(rule)
	{
		case "minlength":
			return size >= parseInt(limit);
	
		case "maxlength":
			return size <=  parseInt(limit);
	}
}

var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z]+$/; 
function emailField( object )
{
	value = object.value;	
	if(empty(value)) return true;
	
	return emailPattern.test(value);	
}

function numberField( object )
{
	value = object.value;
	return (empty(value) || !isNaN(parseInt(value)));
}

function dateField( object )
{
	value = object.value;	
	return (empty(value) || validDate(value));	
}

function confirmField(object, confirm_field)
{
	oconfirm = document.getElementById(confirm_field);
	if(!oconfirm) return false;
	
	return (object.value == oconfirm.value);
}

/* utils functions */
function empty(value)
{
	if(value == null || value == "") return true;
	return false;
}

function validDate(psDate){
	reDate=/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/
	var bRes = reDate.test(psDate);
	if (bRes)
	{
		nDia = RegExp.$1;
		nMes = RegExp.$2;
		nAnyo = RegExp.$3;
		if((nMes<1)||(nMes>12)) bRes = false;
		else if ((nDia<1)||(nDia>LastOfMonth(nMes,nAnyo))) bRes = false;
	}
	return bRes;
}

function LastOfMonth (
		pnMonth, //Mes (de 1..12)
		pnYear   //Aņo (en cuatro cifras)
	) {
	anMonths = new Array (31,28,31,30,31,30,31,31,30,31,30,31) ;
	var nRes = 0 ;
	
	if ((pnMonth<1)||(pnMonth>12)) {
		return 0 ;
	} else {
		nRes = anMonths[pnMonth-1] ;
		if ((pnMonth==2)&&( ((pnYear%400)==0)||(((pnYear%4)==0)&&((pnYear%100)!=0)))) { //Febrero bisiesto
			nRes++ ;
		}
		return nRes ;
	}
}


function validateLogin( form )
{
	if(!validateFields(	
			form, ar_required_login, ar_required_values_login, 
			ar_required_messages_login, "required"))
		return false;
		
	if(!validateFields(	form, ar_maxlength_login, ar_maxlength_values_login,
			ar_maxlength_messages_login, "maxlength"))
		return false; 
		
	return true;	
}


