function CF_checkForm(f){
	eval("var fo=document." +f);
	for (i=0;i<fo.length;i++){
	ele=fo.elements[i];
	valor=CF_valor(ele);
	if ((CF_esObligatorio(ele.name,f)) && (valor=="")){
		alert(eval("CF_"+f+"_trdErrorFalta_"+ele.name));
		try{
			ele.focus();
		}
		catch(e){
		}

		return false;
	}else{
	}
	if ((CF_tieneTipo(ele.name,f)) && (valor!="")){
		if (!(eval("_es" + CF_tipo(ele.name,f) + "('" + valor + "')"))){
				alert(eval("CF_"+f+"_trdErrorFormato_"+ele.name));
				try{
					ele.focus();
				}
				catch(e){
				}
				return false;
		}else{
		}
	}
   }
   return true;
}

function CF_esObligatorio(s,f){
   re = new RegExp ("," + s + "," ,"i");
   return (re.test(',' + eval("CF_"+ f + "_lstObligatorios") + ','));
}

function CF_tieneTipo(s,f){
   re = new RegExp ("," + s + "::" ,"i");
   return (re.test(',' + eval("CF_"+ f + "_lstTipos")));
}

function CF_tipo (s,f){
   re = new RegExp ("," + s + "::([A-Z]*)," ,"i");
   re.exec(',' + eval("CF_"+ f + "_lstTipos") + ',');
   return (RegExp.$1);
}

function CF_valor(o){
	if ((o.type == "select") || (o.type == "select-one")){
		//kkkk modificado para que no pete cuando un select no tiene valor en el indice seleccionado
		if (o.length == 0){
			return 0;
		}else{
			return o.options[o.selectedIndex].value;
		}
	}else{
		return o.value;
	}
	
}

function _esENTERO(s){ 
   var re	
   re = /^\d+$/;
   return re.test(s);			
}

function _esENTEROPOSITIVO(s){ 
   var bRdo = _esENTERO(s);
   if (bRdo)
		bRdo = (s>0); 
   
   return bRdo;
}

function _esNUMERICO(s){ 
   var re	
//   re = /^[+|-]{0,1}\d+[[\.]{0,1}\d{NUMERO DE DECIMALES}]{0,1}$/;
//   re = /^[+|-]{0,1}\d+[[\.]{0,1}\d+]*$/;
   re = /^\d+[,]*[\d]*$/;
   return re.test(s);			
}


function _esFECHA(s){ 
   var re	
   re = /^\d{1,2}\/\d{1,2}\/\d{2,4}$/;
   return re.test(s);			
}

function _esNIFCIF(s){ 
   return ((_esNIFESPANIOL(s)) || (_esCIF(s)))
}

function _esNIFESPANIOL(s){ 
   var re	
   re = /^\d{8}[a-zA-Z]$/;
   return re.test(s);			
}

//versión que permite CIF de la forma Q12345678J
function _esCIF(s){ 
   var re	
   re = /^[a-zA-Z]\d{8}[a-zA-Z]*$/;
   return re.test(s);			
}

function _esNIFESPANIOL_LETRA(s){ 
   var re	
   re = /^(\d{8})([a-zA-Z])$/;
   if (re.test(s)){
	   var dni = RegExp.$1;
	   var letra = RegExp.$2;
	   var cadena="TRWAGMYFPDXBNJZSQVHLCKE"
	   return ((letra.toUpperCase())==cadena.substring(dni%23,dni%23+1));	
   }else{
   	return false;
   }
}

function _esMAIL(s){
   reMail = /^[a-zA-Z0-9]+[\.a-zA-Z0-9_-]*@[a-zA-Z0-9_-]+[\.a-zA-Z0-9_-]*\.[a-zA-Z0-9_-]{2,}$/;

   return reMail.test(s);
}


function _esHORA(s){
   var re	
   re = /^\d{1,2}:\d{1,2}$/;
   return re.test(s);			
}

function _letraNIF(dni){
	var cadena="TRWAGMYFPDXBNJZSQVHLCKE"
	return letra=cadena.substring(dni%23,dni%23+1);	
		
}

//Controla el número máximo de caracteres de un textarea. Aconsejable utilizar con evento "onKeyUp"
//	o	: elemento. Ej:textarea
//	max	: número máximo de caracteres
//	trdMax	: texto de error (Opcional)
function CF_controlaTA(o, max, trdMax){
	if (o.value.length>max){
		o.value = o.value.substr(0,max-1);
		if (trdMax)
			alert(trdMax)
		else
			alert("Se ha excedido la longitud m" + String.fromCharCode(225) + "xima del campo");
	}
}
