function form_validate(f) {

    var errores = '';
	var c, v; // referencia al campo del form y al valor (cuando proceda)
	var i, j, seleccionado, aux_split; // para trabajar con bucles en cada caso
	
    for (var ii=1;ii<arguments.length;ii++) {
		var g=new Array();
		var aux=arguments[ii].split('|');
		for (var jj=0;jj<aux.length;jj++) {
			g[aux[jj].split('=')[0]]=aux[jj].split('=')[1];
		}
		
		

        switch (g['tipo']) {  
		
		
		
		 case 'texto':  // texto
						c=eval('f.' + g['campo']);
						v=trim(c.value);
						errores+=control_rangos(v.length, g['min'], g['max'], g['obligatorio'], g['etiqueta'],'obligatorio','l_min','l_max','l_exacto','l_rango');
						errores+=control_campos_iguales(g['campo_igual'], v, f, g['etiqueta'], g['campo_igual']);
						break;



		 case 'fckeditor':  // fckeditor
		 				v=FCKeditorAPI.GetInstance(g['campo']).GetXHTML(true);
						errores+=control_rangos(v.length, g['min'], g['max'], g['obligatorio'], g['etiqueta'],'obligatorio','l_min','l_max','l_exacto','l_rango');
						errores+=control_campos_iguales(g['campo_igual'], v, f, g['etiqueta'], g['campo_igual']);
						break;
		
		 
		 case 'email':  // dirección email
						c=eval('f.' + g['campo']);
						v=trim(c.value);
						if (trim(v)!='' && !comprobarMail(v)) {
							errores += get_etiqueta('email', g['etiqueta']);
						}
						errores+=control_rangos(v.length, g['min'], g['max'], g['obligatorio'], g['etiqueta'],'obligatorio','l_min','l_max','l_exacto','l_rango');
						errores+=control_campos_iguales(g['campo_igual'], v, f, g['etiqueta'], g['campo_igual']);
						break;
	


		 case 'radio':  // radiobutton
						c=eval('f.' + g['campo']);
						var radios = format_to_array(c);
						seleccionado = false;
						for (i=0; i<radios.length && !seleccionado; i++) {
						   if (radios[i].checked) seleccionado=true;
						}
						if (!seleccionado) errores += get_etiqueta('obligatorio', g['etiqueta']);
						break;



		 case 'check':  // check (con el mismo nombre todas)
						c=eval('f.' + g['campo']);
						var checks = format_to_array(c);
						seleccionado = false;
						for (i=0; i<checks.length && !seleccionado; i++) {
						   if (checks[i].checked) seleccionado=true;			
						}
						errores+=control_rangos(seleccionado, g['min'], g['max'], g['obligatorio'], g['etiqueta'],'obligatorio','l_min','l_max','l_exacto','l_rango');
						break;
		
		
		
		 case 'custom_check':  // check secuencial (todas con un mismo prefijo y un indice secuencial. Ej. mycheck_0, mycheck_1,...)
						seleccionado = 0;
						var contador=(g['comiezo'])?parseInt(g['comiezo']):0;
						for (i=g['comienzo'];true;i++) {
							var obj=eval('f.'+g['custom_check']+i);
							if (typeof(obj)=='undefined') break;
							if (obj.checked) seleccionado++;
						}
						errores+=control_rangos(seleccionado, g['min'], g['max'], g['obligatorio'], g['etiqueta'],'obligatorio','e_min','e_max','e_exacto','e_rango');
						break;

				
		 case 'fecha':  // check secuencial (todas con un mismo prefijo y un indice secuencial. Ej. mycheck_0, mycheck_1,...)
						c=eval('f.' + g['campo']);
						if (trim(c.value)!='') {
							if (!validarFecha(c.value)) {
								errores += get_etiqueta('fecha', g['etiqueta']);
							} else if (g['fecha_mayor']) {
								aux_split=g['fecha_mayor'].split('~');
								var otra_fecha=eval('f.' + aux_split[0]);
								if (validarFecha(otra_fecha.value) && !es_fecha_mayor(c.value,otra_fecha.value))
								errores += get_etiqueta('fecha_mayor', g['etiqueta'], aux_split[1]);
							}
						}
						break;



		 case 'imagen': // imagen
						c=eval('f.' + g['campo']);
						var solo_archivo=c.value;
						solo_archivo=solo_archivo.substr(solo_archivo.lastIndexOf('\\')+1);
						solo_archivo=solo_archivo.substr(solo_archivo.lastIndexOf('/')+1);
						var extension=solo_archivo.substr(solo_archivo.lastIndexOf('.'));
						if (extension!='.gif' && extension!='.jpg' && extension!='.jpeg' && extension!='.png') {
							 errores += get_etiqueta('imagen', g['etiqueta']);
						}
						break;



		 case 'num_entero_positivo': // número entero positivo
						c=eval('f.' + g['campo']);
						if (!validar_numero_entero_positivo(c.value)) {
							 errores += get_etiqueta('num_entero_positivo', g['etiqueta']);
						}
						break;



		 case 'select': // select
						c=eval('f.' + g['campo']);
						v=c.options[c.selectedIndex].value ;
						aux_split=g['select'].split('~');
						for (i=0;i<aux_split.length;i++) {
							if (v==aux_split[i]) {
								errores += get_etiqueta('select', g['etiqueta']);
							}
						}
						break;

		} // fin de switch


	} // fin de for

	return errores;
}



function mostrar_errores(errores) {
    alert('Se han producido los siguientes errores:\n\n' + errores + '\n');
}

function get_etiqueta(index, campo) {
	var et=new Array();
	et['obligatorio']			='   - El campo ' + campo + ' es obligatorio.\n';
	et['l_min']					='   - El campo ' + campo + ' debe tener una longitud mínima de ' + get_etiqueta.arguments[2] + ' caracteres.\n';
	et['l_max']					='   - El campo ' + campo + ' debe tener una longitud máxima de ' + get_etiqueta.arguments[2] + ' caracteres.\n';
	et['l_exacto']				='   - El campo ' + campo + ' debe tener una longitud de ' + get_etiqueta.arguments[2] + ' caracteres.\n';
	et['l_rango']				='   - El campo ' + campo + ' debe tener una longitud entre ' + get_etiqueta.arguments[2] + ' y ' + get_etiqueta.arguments[3] +' caracteres.\n';
    et['email'] 				='   - El campo ' + campo + ' debe ser una dirección válida de e-mail.\n';
	et['fecha'] 				='   - El campo ' + campo + ' debe ser una fecha válida en formato dd/mm/aaaa.\n';
	et['fecha_mayor'] 			='   - El campo ' + campo + ' debe ser mayor que el campo ' +  get_etiqueta.arguments[2] + '\n';
	et['campo_igual'] 			='   - El campo ' + campo + ' debe ser igual que el campo ' +  get_etiqueta.arguments[2] + '\n';
	et['imagen'] 				='   - El campo ' + campo + ' solo puede ser de los siguienes tipos: .jpg, .jpeg, .gif o .png\n';
	et['num_entero_positivo']	='   - El campo ' + campo + ' debe contener sólo números.\n';
	et['select'] 				='   - El campo ' + campo + ' no marca una selección válida.\n';
	et['e_min']					='   - El campo ' + campo + ' debe tener seleccionados un mínimo de ' + get_etiqueta.arguments[2] + ' elementos.\n';
	et['e_max']					='   - El campo ' + campo + ' debe tener seleccionados un máximo de ' + get_etiqueta.arguments[2] + ' elementos.\n';
	et['e_exacto']				='   - El campo ' + campo + ' debe tener seleccionados ' + get_etiqueta.arguments[2] + ' elementos.\n';
	et['e_rango']				='   - El campo ' + campo + ' debe tener seleccionados entre ' + get_etiqueta.arguments[2] + ' y ' + get_etiqueta.arguments[3] +' elementos.\n';
	return et[index];
	
}






function control_rangos (actuales, minimo, maximo, obligatorio, et_campo, et_obligatorio, et_min, et_max, et_exacto, et_rango) {
	//alert("Actuales: " + actuales+"\nMinimo: " + minimo+"\nMaximo: " + maximo+"\nObligatorio: " + obligatorio+"\nEt. campo: " + et_campo+"\nEt. obligatorio: " + et_obligatorio+"\nEt. campo: " + et_campo+"\nEt. obligatorio: " + et_obligatorio+"\nEt. mínimo: " + et_min+"\nEt. máximo: " + et_max+"\nEt. exacto: " + et_exacto+"\nEt. rango: " + et_rango);

	if (!obligatorio && actuales==0) { // si el campo no es obligatorio y esta vacio no devolvemos error
		return ''
	}

	if (obligatorio=='true' && actuales==0 && !minimo && !maximo)  { // si el campo es obligatorio Y esta vacio Y no hay limites de minimoi y máximo devolvemos el error de "campo obligatorio"
		return get_etiqueta (et_obligatorio, et_campo);
	}
	
	
	if (minimo>0 && maximo) {
		if (minimo==maximo) { // cantidad exacta
			if (actuales!=minimo) {
				return get_etiqueta (et_exacto, et_campo, minimo);
			}
		} else { // rango
			if (actuales<minimo || actuales>maximo) {
				return get_etiqueta (et_rango, et_campo, minimo, maximo);
			}
		}
	}
	if (minimo>0 && !maximo && actuales<minimo) { // minimo
		return get_etiqueta (et_min, et_campo, minimo);
	}
	if (!minimo && maximo && actuales>maximo) { // maximo
		return get_etiqueta (et_max, et_campo, maximo);
	}
	return '';
}

function control_campos_iguales(igualar_campo, v, f, et_campo1, patron) {
	if (!igualar_campo) return '';
	var aux_split=patron.split('~');
	var patron_name=aux_split[0];
	var patron_etiqueta=aux_split[1];
	var patron_campo=eval('f.' + patron_name);
	
	if (trim(v)!='' && v!=patron_campo.value)
	return get_etiqueta('campo_igual', et_campo1, patron_etiqueta);	
	return '';
}


function trim(cadena) {
	while(cadena.charAt(0)==" " && cadena!="") cadena=cadena.substr(1);
	while(cadena.charAt(cadena.length-1)==" " && cadena!="") cadena=cadena.substr(0,cadena.length-1);
	return cadena;
}


function comprobarMail(s) {
    var expresion = new RegExp('^[0-9a-zA-Z_]+(([\\.-]?[0-9a-zA-Z_]+)+)?@[0-9a-zA-Z_-]+(\\.([0-9a-zA-Z_-])+)+$');
    if (expresion.test(s)) return true;
    else return false;
}

function validar_numero_entero_positivo(s) {
    var expresion = new RegExp('^[0-9]+$');
    if (expresion.test(s)) return true;
    else return false;
}

function format_to_array(obj) {
    var array = new Array();
    if (obj.length) for (var z = 0; z < obj.length; z++) array[z] = obj[z];
    else array[0] = obj;
    return array;
}

function validarFecha(strFecha) { // formato dd/mm/aaaa
    if (strFecha.length != 10) return false;
    arr = strFecha.split("/");
    str2 = arr[1] + "/" + arr[0] + "/" + arr[2];
    fecha = new Date(str2);
    if ((fecha.getDate() == arr[0]) && ((fecha.getMonth() + 1) == arr[1]) && (fecha.getFullYear() == arr[2])) {
        return true;
    }
    else {
        return false;
    }
}

function es_fecha_mayor(fecha, fecha_referencia) {
    fecha = parseInt('' + fecha.split('/')[2] + '' + fecha.split('/')[1] + '' + fecha.split('/')[0]);
    fecha_referencia = parseInt('' + fecha_referencia.split('/')[2] + '' + fecha_referencia.split('/')[1] + '' + fecha_referencia.split('/')[0]);
    if (fecha > fecha_referencia) return true;
    return false;
}
