
function validate( form )
{
	if(!validateFields(	
			form, ar_required, ar_required_values, ar_required_messages, "required"))
		return false;
		
	if(!validateFields(	form, ar_date, ar_date_values, ar_date_messages, "date"))
		return false;
	
	if(!validateFields(	
			form, ar_number, ar_number_values, ar_number_messages, "number"))
		return false;
		
	if(!validateFields(	form, ar_maxlength, ar_maxlength_values,
			ar_maxlength_messages, "maxlength"))
		return false; 
		
	if(!validateFields(	form, ar_minlength, ar_minlength_values,
			ar_minlength_messages, "minlength"))
		return false;
	
	if(!validateFields(	
		form, ar_email, ar_email_values, ar_email_messages, "email"))
		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 = document.getElementById(fields[i]);
				
		if(object == undefined) 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 "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();			
			return false;
		}
	}
	return true;
}

function requiredField( object ) 
{	
	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":
			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);
	}
}

function emailField( object )
{
	value = object.value;	
	b = (empty(value) || (value.indexOf("@") != -1));	
	return b;	
}

function numberField( object )
{
	value = object.value;
	return (empty(value) || !isNaN(parseInt(value)));
}

function dateField( object )
{
	value = object.value;	
	return (empty(value) || validDate(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 ;
	}
}


