/********************************************/
/*                                          */
/*  Fichero de validaciones de Javascript   */
/*                                          */
/********************************************/
// Funcion que valida los elementos de un
// formulario
// Recibe el objeto formulario a validar
function validar(objform) {	
	var result = true;
	for (var i = 0; i < objform.elements.length; i++) {
		var elemento = objform.elements[i];
		if (elemento.type == "text" || elemento.type == "select-one" || elemento.type == "textarea") {
			result = validarcampo(elemento); 
			if (!result) {
				return result;
			}
		}
	}	
	return result;
}
// Función que valida un elemento de un formulario
// Recibe el objeto input a validar
function validarcampo(objinput) {
	if (objinput.getAttribute("tipoVal") !=null && objinput.getAttribute("tipoVal") != "") {
		var inp_alt = objinput.getAttribute("tipoval").toUpperCase();
		var inp_type = objinput.getAttribute("tipoval").toUpperCase();
		var result = false;
		//Validación de obligatorio	
		var pos_inp_obl = inp_alt.indexOf("_OBL");
		var dec_numero = inp_alt.indexOf("DEC_");
		var dec_num;
		
		//alert("dec_numero: "+dec_numero);

		
		
		
		
		if (dec_numero != -1) {
			
			//alert("**INP_ALT: "+inp_alt);
			var detecta_obligatorio;
			detecta_obligatorio = inp_alt.indexOf("_OBL");
			if(detecta_obligatorio == -1){
				//alert("no tiene_obl");
				dec_num= inp_alt.slice(-1);
				}
			else{
				var dameNumero = inp_alt.substring((detecta_obligatorio-1),detecta_obligatorio);
				//alert("+++tiene_obl++++: "+dameNumero);
				dec_num= dameNumero;
				}	
			//alert("detecta_obligatorio: "+detecta_obligatorio);
			
			
			
			//alert("**DEC_NUM: "+dec_num);
		}
		if (pos_inp_obl != -1) {
			if (!validate_blank(objinput.value)) {
				return controlError(objinput,"El campo no puede estar vacio.");
			}
			inp_type = inp_alt.substr(0, pos_inp_obl);
		} else {
			if (objinput.value == "") {
				return true;
			}
		}
		
		
		
		
		if (inp_type.indexOf("DEC_")> -1) {
				var pos_num = inp_type.lastIndexOf("DC");
				var num_decimal = inp_type.substr(pos_num + 2);
				inp_type = inp_type.substr(0,pos_num + 2);
				
				inp_type = inp_type + dec_num;
				//alert("tipo: "+inp_type);
				
			}
		
		
//		alert("dec_num: "+dec_num);
		
		
		
		
		if (validarcaracteres(objinput)) {
			var inp_value=trim(objinput.value);
			result = true;
			//alert("DENTRO DE SWITCH: "+inp_type);
			switch (inp_type) {
				case "TXT_NAT":
					if (!textoAlfanumerico(inp_value)) {
						return controlError(objinput,"El campo no es alfanumerico.");
					}
					break;
				case "TXT_NONUM":
					if (!textoAlfabetico(inp_value)) {
						return controlError(objinput,"El campo no es alfabetico.");
					}
					break;
				case "IMP_NAT":
					if (!importeNatural(inp_value)) {
						return controlError(objinput,"El campo no es un importe.");
					}
					break;
				case "IMP_NAT_NC":
					if (!importeNaturalSinCero(inp_value)) {
						return controlError(objinput,"El campo no es un importe sin cero.");
					}
					break;
				case "IMP_POS":
					if (!importePositivo(inp_value)) {
						return controlError(objinput,"El campo no es un importe positivo.");
					}
					break;
				case "IMP_POS_NC":
					if (!importePositivoSinCero(inp_value)) {
						return controlError(objinput,"El campo no es un importe positivo sin cero.");
					}
					break;
				case "IMP_NEG":
					if (!importeNegativo(inp_value)) {
						return controlError(objinput,"El campo no es un importe negativo.");
					}
					break;
				case "IMP_NEG_NC":
					if (!importeNegativoSinCero(inp_value)) {
						return controlError(objinput,"El campo no es un importe negativo sin cero.");
					}
					break;
				case "ENT_NAT":
					if (!enteroNatural(inp_value)) {
						return controlError(objinput,"El campo no es entero.");
					}
					break;
				case "ENT_NAT_NC":
					if (!enteroNaturalSinCero(inp_value)) {
						return controlError(objinput,"El campo no es entero sin cero.");
					}
					break;
					case "ENT_POS":
					if (!enteroPositivo(inp_value)) {
						return controlError(objinput,"El campo no es entero positivo.");
					}
					break;
				case "ENT_POS_NC":
					if (!enteroPositivoSinCero(inp_value)) {
						return controlError(objinput,"El campo no es entero positivo sin cero.");
					}
					break;
					case "ENT_NEG":
					if (!enteroNegativo(inp_value)) {
						return controlError(objinput,"El campo no es entero negativo.");
					}
					break;
				case "ENT_NEG_NC":
					if (!enteroNegativoSinCero(inp_value)) {
						return controlError(objinput,"El campo no es entero negativo sin cero.");
					}
					break;
				case "DEC_NAT_DC"+dec_num:
					if (!numeroNatural(inp_value,dec_num)) {
						return controlError(objinput,"El campo no es numero y solo acepta "+dec_num+" decimales.");
					}
					break;
				case "DEC_NAT_NC_DC"+dec_num:
					if (!numeroNaturalSinCero(inp_value,dec_num)) {
						return controlError(objinput,"El campo no es numero sin cero y solo acepta "+dec_num+" decimales.");
					}
					break;
				case "DEC_POS_DC"+dec_num:			
					if (!numeroNaturalPositivo(inp_value,dec_num)) {
						return controlError(objinput,"El campo no es numero positivo y solo acepta "+dec_num+" decimales.");
					}
					break;
				case "DEC_POS_NC_DC"+dec_num:
					if (!numeroNaturalPositivoSinCero(inp_value,dec_num)) {
						return controlError(objinput,"El campo no es numero positivo sin cero y solo acepta "+dec_num+" decimales.");
					}
					break;
				case "DEC_NEG_DC"+dec_num:
					if (!numeroNaturalNegativo(inp_value,dec_num)) {
						return controlError(objinput,"El campo no es numero negativo y solo acepta "+dec_num+" decimales.");
					}
					break;
				case "DEC_NEG_NC_DC"+dec_num:
					if (!numeroNaturalNegativoSinCero(inp_value,dec_num)) {
						return controlError(objinput,"El campo no es numero negativo sin cero y solo acepta "+dec_num+" decimales.");
					}
					break;
				case "COMBO":
					if (!tipoCombo(inp_value)) {
						return controlError(objinput,"Debe seleccionar el campo.");
					}
				break;
				case "FEC_DIA":
					nameinput = objinput.id;
					namesimple = nameinput.substr(0, (nameinput.indexOf("_DIA")));
					sdia = document.getElementById(namesimple + "_DIA").value;
					smes = document.getElementById(namesimple + "_MES").value;
					sanno = document.getElementById(namesimple + "_ANO").value;
					if (!comprobarFecha(sdia,smes,sanno)) {
						return controlError(objinput,"No es una fecha correcta.");
					}
				break;
					
				case "TXT_CORREO":
					if (!IsMail(inp_value)) {
						return controlError(objinput,"El campo no es una direccion de correo valida.");
					}
				break;
					
				
				default:
				//alert("pos no entra");
					break;
			}
		}
		return result;
	}
	return true;
}
// funcion que valida si el string recibido esta compuesto
// por algún caracter distinto de espacios en blanco
function validate_blank(valor) {
	var result = false;
	var valortmp = valor;
	if (valortmp != "") {
		while (valortmp.indexOf(" ") != -1) {
			valortmp = valortmp.replace(" ", "");
		}
		if (valortmp != "") {
			result = true;
		}
	}
	return result;
}
// funcion que valida los caracteres permitidos
function validarcaracteres(objinput) {
	var result = true;
   	var buscaCaracterUno = objinput.value.indexOf("?");
   	var buscaCaracterDos = objinput.value.indexOf("*");   
   	var buscaCaracterTres = objinput.value.indexOf("\"");   

   	if(buscaCaracterUno > -1 || buscaCaracterDos > -1 || buscaCaracterTres > -1){
		return controlError(objinput,"No se permiten caracteres del tipo: *, ? o \".");
    }

	return result;
}
// Quita los espacios al inicio y al final de una cadena
function trim(Cadena){
	var varI;
	var varRetorno;
	varRetorno = Cadena;
	while (varRetorno.charAt(0) == " ") {
		varRetorno = varRetorno.substr(1, varRetorno.length -1);
	}
	while (varRetorno.charAt(varRetorno.length -1) == " ") {
		varRetorno = varRetorno.substr(0, varRetorno.length -1);
	}
	return(varRetorno);
}
//valida textos alfanumericos
function textoAlfanumerico(valor){
    var patTexto = /^(|.|)+$/i;
    return (patTexto.test(valor));
}
//valida que un texto no existan numeros
function textoAlfabetico(valor){
    var patTexto = /^[A-Z]\D+$/i;
    return (patTexto.test(valor));
}
//valida importe (negativos, positivos y decimales). Formato: digitos enteros. una coma decimal y dos decimales
function importeNatural(numReal) {
	var patNumReal =  /^([0-9.-]{0,15})([\,]{0,1})([0-9]{0,2})$/;
    return (patNumReal.test(numReal));
}
//valida importe (negativos, positivos y decimales). Formato: digitos enteros. una coma decimal y dos decimales
function importeNaturalSinCero(numReal) {
	var patNumReal =  /^([0-9.-]{0,15})([\,]{0,1})([0-9]{0,2})$/;
	if ((numReal*1)=="0" | (numReal*1)=="-0") return false;	
    return (patNumReal.test(numReal));
}
//valida importe (positivos y decimales). Formato: digitos enteros. una coma decimal y dos decimales
function importePositivo(numReal) {
	var patNumReal =  /^([0-9.]{0,15})([\,]{0,1})([0-9]{0,2})$/;
    return (patNumReal.test(numReal));
}
//valida importe (positivos y decimales). Formato: digitos enteros. una coma decimal y dos decimales
function importePositivoSinCero(numReal) {
	var patNumReal =  /^([0-9.]{0,15})([\,]{0,1})([0-9]{0,2})$/;
	if ((numReal*1)=="0") return false;
    return (patNumReal.test(numReal));
}
//valida importe (negativos y decimales). Formato: digitos enteros. una coma decimal y dos decimales
function importeNegativo(numReal) {
	var patNumReal =  /^([0-9.-]{0,15})([\,]{0,1})([0-9]{0,2})$/;
	if (numReal.slice(0,1)!="-") return false;
    return (patNumReal.test(numReal));
}
//valida importe (negativos y decimales). Formato: digitos enteros. una coma decimal y dos decimales
function importeNegativoSinCero(numReal) {
	var patNumReal =  /^([0-9.-]{0,15})([\,]{0,1})([0-9]{0,2})$/;
	if (numReal.slice(0,1)!="-") return false;
	if ((numReal*1)=="-0") return false;
    return (patNumReal.test(numReal));
}
//valida que solamente contengan números
function soloNumeros(numEntero){
	var patNumEntero =/^([0-9])+$/;
    return (patNumEntero.test(numEntero));
}
//valida numeros enteros (solo positivos y negativos enteros)
function enteroNatural(numEntero){
	var patNumEntero =/^([0-9.-]{0,15})$/;
    return (patNumEntero.test(numEntero));
}
//valida numeros enteros (solo positivos y negativos enteros sin cero)
function enteroNaturalSinCero(numEntero){
	var patNumEntero =/^([0-9.-]{0,15})$/;
	if ((numEntero*1)=="0") return false;
    return (patNumEntero.test(numEntero));
}
//valida numeros enteros (solo positivos enteros)
function enteroPositivo(numEntero){
	var patNumEntero =/^([0-9.]{0,15})$/;
    return (patNumEntero.test(numEntero));
}
//valida numeros enteros (solo positivos enteros sin cero)
function enteroPositivoSinCero(numEntero){
	var patNumEntero =/^([0-9.]{0,15})$/;
	if ((numEntero*1)=="0") return false;
    return (patNumEntero.test(numEntero));
}
//valida numeros enteros (solo negativos enteros)
function enteroNegativo(numEntero){
	var patNumEntero =/^([0-9.-]{0,15})$/;
	if (numEntero.slice(0,1)!="-") return false;
    return (patNumEntero.test(numEntero));
}
//valida numeros enteros (solo negativos enteros sin cero)
function enteroNegativoSinCero(numEntero){
	var patNumEntero =/^([0-9.-]{0,15})$/;
	if (numEntero.slice(0,1)!="-") return false;
	if ((numEntero*1)=="-0") return false;
    return (patNumEntero.test(numEntero));
}
//valida numero (negativos, positivos y decimales).numNat es el value y dec decimales permitidos
function numeroNatural(numNat,dec) {
	
	//alert(" function numeroNatural // numNat: "+numNat+" dec: "+dec);
	var dec_coma = numNat.indexOf(",");
	var dec_com;
	var dec_co;
		if (dec_coma != -1) {
			dec_com = numNat.split(",");
			dec_co = dec_com[dec_com.length-1];
			if(dec_co.length>dec){return false;}
		}
	var patnumNat =  /^([0-9.-]{0,15})([\,]{0,1})([0-9]{0,9})$/;
    return (patnumNat.test(numNat));
}
//valida numero (negativos, positivos y decimales).numNat es el value y dec decimales permitidos
function numeroNaturalSinCero(numNat,dec) {
	
	var todoNumeros = numNat.split(",");
	var flag = true;
	for(i=0; i<todoNumeros.length;i++){
		if(todoNumeros[i] == 0){
			flag = false;
			}
		else{
			flag = true;
			return true;
			}	
			
		}
	if(!flag){
		return false;
		}
	var dec_coma = numNat.indexOf(",");
	var dec_com;
	var dec_co;
		if (dec_coma != -1) {
			dec_com = numNat.split(",");
			dec_co = dec_com[dec_com.length-1];
			if(dec_co.length>dec){return false;}
		}
		
	var patnumNat =  /^([0-9.-]{0,15})([\,]{0,1})([0-9]{0,9})$/;
	if ((numNat*1)=="0" || (numNat*1)=="-0") return false;
    return (patnumNat.test(numNat));
}
//valida numero (positivos y decimales).numNat es el value y dec decimales permitidos
function numeroNaturalPositivo(numNat,dec) {
	var dec_coma = numNat.indexOf(",");
	var dec_com;
	var dec_co;
		if (dec_coma != -1) {
			dec_com = numNat.split(",");
			dec_co = dec_com[dec_com.length-1];
			if(dec_co.length>dec){return false;}
		}
	var patnumNat =  /^([0-9.]{0,15})([\,]{0,1})([0-9]{0,9})$/;
    return (patnumNat.test(numNat));
}
//valida numero (positivos y decimales).numNat es el value y dec decimales permitidos
function numeroNaturalPositivoSinCero(numNat,dec) {
	var dec_coma = numNat.indexOf(",");
	var dec_com;
	var dec_co;
		if (dec_coma != -1) {
			dec_com = numNat.split(",");
			dec_co = dec_com[dec_com.length-1];
			if(dec_co.length>dec){return false;}
		}
	var patnumNat =  /^([0-9.]{0,15})([\,]{0,1})([0-9]{0,9})$/;
	if ((numNat*1)=="0") return false;
    return (patnumNat.test(numNat));
}
//valida numero (negativos y decimales).numNat es el value y dec decimales permitidos
function numeroNaturalNegativo(numNat,dec) {
	var dec_coma = numNat.indexOf(",");
	var dec_com;
	var dec_co;
		if (dec_coma != -1) {
			dec_com = numNat.split(",");
			dec_co = dec_com[dec_com.length-1];
			if(dec_co.length>dec){return false;}
		}
	var patnumNat =  /^([0-9.-]{0,15})([\,]{0,1})([0-9]{0,9})$/;
	if (numNat.slice(0,1)!="-") return false;
    return (patnumNat.test(numNat));
}
//valida numero (negativos y decimales).numNat es el value y dec decimales permitidos
function numeroNaturalNegativoSinCero(numNat,dec) {
	var dec_coma = numNat.indexOf(",");
	var dec_com;
	var dec_co;
		if (dec_coma != -1) {
			dec_com = numNat.split(",");
			dec_co = dec_com[dec_com.length-1];
			if(dec_co.length>dec){return false;}
		}
	var patnumNat =  /^([0-9.-]{0,15})([\,]{0,1})([0-9]{0,9})$/;
	if (numNat.slice(0,1)!="-") return false;
	if ((numNat*1)=="-0") return false;
    return (patnumNat.test(numNat));
}
//valida que este seleccionada alguna opcion del combo.
function tipoCombo(numEntero){
    if (numEntero == "-1"){
		return false;
    }
		return true;
}
var a, mes, dia, anyo, febrero;
//funcion para comprobar si una año es bisiesto argumento anyo > año extraido de la fecha introducida por el usuario
function anyoBisiesto(anyo){
	//si el año introducido es de dos cifras lo pasamos al periodo de 1900. Ejemplo: 25 > 1925
	if (anyo < 100)
		var fin = anyo + 1900;
	else
		var fin = anyo ;
	//primera condicion: si el resto de dividir el año entre 4 no es cero > el año no es bisiesto
	//es decir, obtenemos año modulo 4, teniendo que cumplirse anyo mod(4)=0 para bisiesto
	if (fin % 4 != 0)
		return false;
	else
	{
		if (fin % 100 == 0)
		{//si el año es divisible por 4 y por 100 y divisible por 400 > es bisiesto
			if (fin % 400 == 0)
			{
				return true;
			}
			else//si es divisible por 4 y por 100 pero no lo es por 400 > no es bisiesto
			{
				return false;
			}
		}
		else//si es divisible por 4 y no es divisible por 100 > el año es bisiesto
		{
			return true;
		}
	}
} 
//funcion principal de validacion de la fechaargumento fecha > cadena de texto de la fecha introducida por el usuario
function comprobarFecha( dia,mes,anyo){
if( (isNaN(dia)==true) || (isNaN(mes)==true) || (isNaN(anyo)==true) )
{
	alert("LA fecha introducida debe estar formada sólo por números");
 return;
   }
   if(anyoBisiesto(anyo))
	   febrero=29;
   else
	   febrero=28;
   //si el mes introducido es negativo, 0 o mayor que 12 > alertamos y detenemos ejecucion
   if ((mes<1) || (mes>12))
   {
	   return;
   }
   //si el mes introducido es febrero y el dia es mayor que el correspondiente al año introducido > alertamos y detenemos ejecucion
   if ((mes==2) && ((dia<1) || (dia>febrero)))
   {
	   return;
   }
   //si el mes introducido es de 31 dias y el dia introducido es mayor de 31 > alertamos y detenemos ejecucion
   if (((mes==1) || (mes==3) || (mes==5) || (mes==7) || (mes==8) || (mes==10) || (mes==12)) && ((dia<1) || (dia>31)))
   {
	   return;
   }
   //si el mes introducido es de 30 dias y el dia introducido es mayor de 301 > alertamos y detenemos ejecucion
   if (((mes==4) || (mes==6) || (mes==9) || (mes==11)) && ((dia<1) || (dia>30)))
   {
	   //alert("El dia introducido no es valido. Por favor, introduzca un dia correcto");
	   return;
   }
   patAno = /[0-9]{4}$/
   if(!patAno.test(anyo)){
   		return;
   }
   else
	  return true; 
}  

function IsMail(valor)
{
	var patTexto = /^[a-z][a-z-_0-9.]+@[a-z-_=>0-9.]+.[a-z]{2,3}$/i //Formato de direccion de correo electronico
	return (patTexto.test(valor)) ? 1 : 0 //Compara \"YourMail\" con el formato \"Template\" y si coincidevuelve verdadero si no devuelve falso
}



//funcion encargada de realizar la operativa en caso de error
function controlError(objinput, menerror) {
	alert(menerror);
	objinput.focus();
	return false;
}
