//******************************************************
//Función que devuelve una cadena 
//sin espacios por la derecha y la izquierda.
//Elemento:Es el objecto a validar(la caja de texto).
//******************************************************
function Trim(str) {
	var resultStr = '';
	resultStr = TrimLeft(str);
	resultStr = TrimRight(resultStr);	
	return resultStr;
}
//***************************************************************
//Función que quita los espacios por la izquierda.
//str:la cadena a limpiar.
//***************************************************************
function TrimLeft(str) {
	var resultStr = '';
	var i =  0;
	var len = 0 ;
	if (str+'' == 'undefined' || str == null){return null;}
	str += '';
	if (str.length == 0){
		resultStr = '';
	}else{	
		len = str.length;					
  		while ((i <= len) && (str.charAt(i) == " ")){i++;}
  		resultStr = str.substring(i, len);
  	}		
  	return resultStr;
}
//**********************************************************
//Función que quita los espacios por la derecha.
//str:la cadena a limpiar.
//**********************************************************
function TrimRight(str) {
	var resultStr='';
	var i=0;
	if (str+'' == 'undefined' || str == null){return null;}
	str += '';
	if (str.length == 0){
		resultStr = '';
	}else{
  		i = str.length - 1;
  		while ((i >= 0) && (str.charAt(i) == ' ')){i--;}
	  	resultStr = str.substring(0, i + 1);
	}
	return resultStr;
}

//*****************************************************
// Función que valida que un CIF sea válido
//*****************************************************
function esCIF(CIF) 
{
  var v1 = new Array(0,2,4,6,8,1,3,5,7,9); 
  var temp = 0; 
  var temp1;
  
  //comprobar de los datos
  var temp2 = CIF.value.toUpperCase(); // pasar a mayúsculas

  if (!/^[A-Za-z0-9]{9}$/.test(temp2))  return false; // Son 9 dígitos? 
  else if (!/^[ABCDEFGHKLMNPQS]/.test(temp2)) return false;// Es una letra de las admitidas ?
  
  for( i = 2; i <= 6; i += 2 ){
     temp = temp + v1[ parseInt(CIF.value.substr(i-1,1)) ];
     temp = temp + parseInt(CIF.value.substr(i,1));
  };

  temp = temp + v1[ parseInt(CIF.value.substr(7,1)) ];
  temp = (10 - ( temp % 10));

  var ultima = CIF.value.substr(8,1);

  if( temp == 10 ){
    if((ultima == "J")||(ultima == "0"))return true;
    else return false;
  }
  else{
  	if(ultima == temp)return true;
    else return false;
  }
}


//****************************************************************************************/
//Función que valida que una cadena no contenga caracteres extraños.
//añadir al patrón los caracteres permitidos.
//Elemento : Es el objeto a validar(la caja de texto).
//*****************************************************************************************/
function EsCadena(Elemento){
	//var patron=/^[^|\'\&\"\Ñ\ñ]+$/;
	var patron=/^[^|\&\"]+$/;
	var cadena = Trim(Elemento.value);
	//var patron = /^[a-zA-Z0-9\.\:\=\á\é\í\ó\ú\Á\É\Í\Ó\Ú\Ü\ü\s-\Ñ\ñ]+$/;
	var cadenaEncontrada = cadena.match(patron);
	
	if (cadenaEncontrada==null){return false;}
	return true;
}

//*****************************************************************************************/
//Esta función valida un importe:
//El separador decimal es tanto una coma como un punto.
//	Elemento : Es el objeto a validar(la caja de texto).
//	Enteros : La longitud máxima de la parte entera.
//  Decimales : La longitud máxima de la parte decimal.
//  NOTA:Si a la función se le especifican un 0 en el parámetro de decimales, 
//  solo validaria números enteros sin decimales.
//******************************************************************************************/
function EsImporte(elemento,enteros,decimales){
	if (decimales>0){
		var cadena='^\\d{1,' + enteros + '}(([\\,|\\.])\\d{1,' + decimales + '})?$';
	}else{
		var cadena='^\\d{1,' + enteros + '}$';
	}
	var patron = new RegExp(cadena);
	var cadena = elemento.value;
	var cadenaEncontrada=cadena.match(patron);
	if (cadenaEncontrada==null){
		return false;
	}
	return true;
}


/***************************************************************************************
 VALIDA SI UNA CADENA DE CARACTERES ESTA FORMADA UNICAMENTE POR DIGITOS NUMERICOS
        - Entrada:  cadena de caracteres
	- Devuelve: true/false
***************************************************************************************/
function esNumeros(variable) {
	var patron = /^\d+$/;
	return patron.test(variable);
}


//*****************************************************************************************/
//Esta función valida una direccion IP:
//Formato: <codigo>.<codigo>.<codigo>.<codigo>
//         con codigo entre 0 y 256
//******************************************************************************************/
function EsDirIP(elemento) {
	var codigos = elemento.value.split(".");
	if (codigos.length != 4) {
		return false;
	}
	for (var i=0;i<4;i++) {
		if (!esNumeros(codigos[i]) || (codigos[i] < 0) || (codigos[i] > 255)) {
			return false;
		}
	}
	return true;
}


/***************************************************************************************
 VALIDAR NUMERO DE TELEFONO (OMS)
 Segun los siguientes criterios:
	- con prefijo del país: un signo y 11 dígitos numéricos (+XXXXXXXXXXX).
	- sin prefijo del país: 9 dígitos numéricos (XXXXXXXXX).
***************************************************************************************/
function esTelefono(elemento) {
	var strAux = Trim(elemento.value);
	var tam = strAux.length;
	if ((tam != 9) && (tam != 12)) {
		return false;
	} 
	if ((tam == 9) && (!esNumeros(strAux))) {
		return false;
	}
	if (tam == 12) {
		var strAux2 = strAux.substring(1,tam);
		if ((strAux.substr(0,1) != "+") || (!esNumeros(strAux2))) {
			return false;
		}
	}
	return true;
}

/***************************************************************************************
 VALIDAR DIRECCION DE CORREO ELECTRONICO (OMS)
 Segun los siguientes criterios:
	- la cadena contiene una @.
	- la cadena contiene algo antes de la @.
	- la cadena contiene algo después de la @.
***************************************************************************************/
function esEmail(variable) {
	var strAux = Trim(variable);
	var posArr = strAux.indexOf("@");
	if ((posArr == -1) || (posArr == 0) || (posArr == (strAux.length-1))) {		
		return false;
	}
	else {
		return true;
	}
}
/***************************************************************************************
 VALIDAR NIF
***************************************************************************************/
function esDNI(pCif){
	var cif, cif2, A, B,B1,B11,B111,B2,B22,B222,B3,B33,B333,B4,B44,B444,C, D
	var letraInicial, letrasOK, posLetra, strSQL
	var aLetras, strLetraNIF, nDNI
	var salida=true;
	cif=pCif.toUpperCase();

	//si tiene menos de 9 caracteres, chungo
	if (cif.length != 9) {		
		return false;
	}

	// busco si la letra inicial es de un tipo válido
	letraInicial = cif.substr(0,1);
	letrasOk ="ABCDEFGHKLMQS";
	posLetra = letrasOk.indexOf(letraInicial);

	//si el primer caracter no es letra válida, pruebo a ver si es un NIF
	if (posLetra < 0){
		nDNI = cif.substr(0,8);
		aLetras = new Array("T","R","W","A","G","M","Y","F","P","D","X","B","N","J","Z","S","Q","V","H","L","C","K","E");
		
		strLetraNIF = aLetras[nDNI-(Math.floor(nDNI/23) *23)];
		if (strLetraNIF != cif.substr(8,1)) {
			alert(pCif+' no es un NIF válido.\n');
			salida = false;
		}
	}
	else {		
		salida = false;
	}
	return salida;
}	
function esFecha(fecha) {
	var tamano=fecha.length;
	var error="false";
	var separador=0;
	separador=fecha.indexOf("/");
	if (separador>0) {
		var aux=fecha.split("/");
		var dia=trim(aux[0]);
		var mes=trim(aux[1]);
		var anno=trim(aux[2]);
	}
	else {
		error="true";	
	}
	if (error=="false") {   // si tamaño correcto
		// Comprobramos si son numéricos el día, mes y año, y año de 4 dígitos.				
		if (esNumeros(dia) || esNumeros(mes) || esNumeros(anno) || (anno.length<4))	{
			error="true";
		}
		if ( error=="false") {  // todos los campos son numericos
			if( dia.length==1 ) { // formato 1/1/2001 por ejemplo
				dia="0"+dia;
			//	error="true";
			}
			if( mes.length==1 ) {
				mes="0"+mes;
			//	error="true";
			}
			// Comprobamos que el día y el mes estén dentro de rango.
			if ((mes<1) || (mes>12) || (dia<1) || (dia>31) || (anno>9999)) {
				error="true";
			}
			// Comprobamos el último día dependiendo del mes.
			// Meses con 30 días.
			if ((mes=="04") || (mes=="06") || (mes=="09") || (mes=="11")) {
				if (dia>30) {
					error="true";
				}
			}
			// Comprobación de Febrero (año bisiesto).
			if (mes=="02") {
				if ((anno % 400)=="0") {
					if (dia>29) {
						error="true";
					}					
				}
				else {
					if ((anno % 100)=="0") {
						if (dia>28) {
							error="true";
						}
					}
					else {
						if ((anno % 4)=="0") {
							if (dia>29) {
								error="true";
							}
						}
						else {
							if (dia>28) {						
								error="true";
							}
						}
					}
				}	
			}
		} // fin todos los campos son numericos
	} // fin tamaño correcto 
	
	
	return error;
}
function esPath(campo) {
	var vartexto = "";
	eval('vartexto = document.all.' + campo + '.value');
	// VALUE = "" da en la función un resultado erróneo, por lo que sólo se validará cuando haya texto.	 
	if(vartexto.length > 0){		 
		//comprobamos que el campo no tenga valores " ó '		
		var reglaCodigo =/^[^"'\*:?<>|]+$/; 
		var resulCodigo = reglaCodigo.exec(vartexto);
		
		if (resulCodigo!=null){						
			return false;						
		}else{				
			return true;
		}
	}else{ 
		return false;						
	}// fin if 
}// fin de función.


//********************************************************************************
//Función que recorre todos los elementos del formulario, si son de tipo TEXT,...
//validamos según los valores que nos venga en el atributo FORMATO
//que va a tener 3 valores, si el campo es obligatorio u opcional,
//el tipo de campo que es, y su identificador.
//*********************************************************************************
function esValido()
{
	var tipo;

	for(i=0;i<document.forms[0].elements.length;i++)
	{
		if(document.forms[0].elements[i].type == 'text' ||
		   document.forms[0].elements[i].type == 'file' ||
		   document.forms[0].elements[i].type == 'password' ||
		   document.forms[0].elements[i].type == 'textarea') 
		{
			if(document.forms[0].elements[i].formato != null)
			{
				tipo = document.forms[0].elements[i].formato.split("|");
				if (tipo.length == 3)
				{
					if (tipo[0] == "ob")
					{
						if (Trim(document.forms[0].elements[i].value) == "")
						{
							alert("Es obligatorio rellenar el campo \"" + tipo[2] + "\".");
							window.document.forms[0].elements[i].select();
							return false;
						}
					}	
					if (tipo[1] == "txt")
					{
						if(document.forms[0].elements[i].value != "" && !EsCadena(document.forms[0].elements[i]))
						{
							alert("El campo \"" + tipo[2] + "\" contiene caracteres extraños.");
							window.document.forms[0].elements[i].select();
							return false;
						}
					}	
					if (tipo[1].substr(0,3) == "num")
					{
						var param = tipo[1].split(":");
						var intNumEnteros = 100;
						var intNumDecimal = 0;
						//numero de cifras enteras
						if ((param.length > 1) && (Trim(param[1])!="")) {
							var intNumEnteros = Math.abs(param[1]);
						}
						//numero de cifras decimales
						if ((param.length > 2) && (Trim(param[2])!="")) {
							var intNumDecimal = Math.abs(param[2]);
						}
						if(document.forms[0].elements[i].value != "" && !EsImporte(document.forms[0].elements[i],intNumEnteros,intNumDecimal))
						{
							alert("El campo \"" + tipo[2] + "\" no tiene un formato adecuado.");
							window.document.forms[0].elements[i].select();
							return false;
						}
						if(document.forms[0].elements[i].value == "")
						{
							window.document.forms[0].elements[i].value = 0;
						}
						//numero mayor que
						if ((param.length > 3) && (Trim(param[3])!="")) {
							var strNum1 = document.forms[0].elements[i].value;
							var strNum2 = strNum1.replace(/,/,".");
							var intNum = Math.abs(strNum2);
							var intMin = Math.abs(param[3]);
							if (intNum < intMin) {
								alert("El campo \"" + tipo[2] + "\" debe contener un valor mayor que "+intMin+".");
								window.document.forms[0].elements[i].select();
								return false;
							}
						}
						//numero menor que
						if ((param.length > 4) && (Trim(param[4])!="")) {
							var strNum1 = document.forms[0].elements[i].value;
							var strNum2 = strNum1.replace(/,/,".");
							var intNum = Math.abs(strNum2);
							var intMax = Math.abs(param[4]);
							if (intNum > intMax) {
								alert("El campo \"" + tipo[2] + "\" debe contener un valor menor que "+intMax+".");
								window.document.forms[0].elements[i].select();
								return false;
							}
						}
							
							
					}	
					if (tipo[1] == "dip")
					{
						if(document.forms[0].elements[i].value != "" && !EsDirIP(document.forms[0].elements[i]))
						{
							alert("El campo \"" + tipo[2] + "\" no tiene un formato adecuado.");
							window.document.forms[0].elements[i].select();
							return false;
						}
					}
					if (tipo[1] == "tfn")
					{
						if(document.forms[0].elements[i].value != "" && !esTelefono(document.forms[0].elements[i]))
						{
							alert("El campo \"" + tipo[2] + "\" no tiene un formato adecuado.");
							window.document.forms[0].elements[i].select();
							return false;
						}
					}
					if (tipo[1] == "fec")
					{
						if(document.forms[0].elements[i].value != "" && !esFecha(document.forms[0].elements[i]))
						{
							alert("El campo \"" + tipo[2] + "\" no tiene un formato adecuado.");
							window.document.forms[0].elements[i].select();
							return false;
						}
					}
					if (tipo[1] == "dni")
					{
						if(document.forms[0].elements[i].value != "" && !esDNI(document.forms[0].elements[i]))
						{
							alert("El campo \"" + tipo[2] + "\" no tiene un formato adecuado.");
							window.document.forms[0].elements[i].select();
							return false;
						}
					}
					if (tipo[1] == "cif")
					{
						if(document.forms[0].elements[i].value != "" && !esCIF(document.forms[0].elements[i]))
						{
							alert("El campo \"" + tipo[2] + "\" no tiene un formato adecuado.");
							window.document.forms[0].elements[i].select();
							return false;
						}
					}
					if (tipo[1] == "mail")
					{
						if(document.forms[0].elements[i].value != "" && !esEmail(document.forms[0].elements[i]))
						{
							alert("El campo \"" + tipo[2] + "\" no tiene un formato adecuado.");
							window.document.forms[0].elements[i].select();
							return false;
						}
					}
          if (tipo[1] == "hor")
					{
             if(document.forms[0].elements[i].value != ""){
 
                var horaValida = validaHora(document.forms[0].elements[i].value);                         
                
                if (horaValida == ""){     
							      alert("El campo " + tipo[2] + " no tiene un formato adecuado.");
							      window.document.forms[0].elements[i].select();
                    return false;  
                 }else{
                    window.document.forms[0].elements[i].value = horaValida;      
                 }
              } 
					}
          
				}
			}
		}	
	}
	return true;	
}	