
// Proyecto        : SIPLEX
// Programa        : xGestForm.js
// Version         : 1.0 11-06-2002
// Autor           : BCS
// Descripcion     : Facilita la gestión de formularios
//               
// Historia                :
//        0.01 BCS 11-06-2002 Versíon inicial

//	
// GESTIÓN DE CAMPOS OBLIGATORIOS
//
	var xgfColorObligatorioVacio 		= "#FFFFCC";	// Amarillo
	var xgfColorObligatorioLleno 		= "#FFFFFF";	// Blanco
	var xgfColorCampoDeshabilitado 		= "#CCCCCC";	// Gris	
	var xgfColorCampoHabilitado 		= "#FFFFFF";	
	var xgfColorBotonDeshabilitado 		= "#CCCCCC";	
	var xgfColorBotonHabilitado 		= "#9999CC";	// Violeta
	
	/** 
		Desahabilita el elemento y le cambia el color de fondo.
	
		@param elemento	elemento a deshabilitar.
		@param color color de fondo en formato #AABBCC.
	*/
	function xgfDesabilita(elemento,color)
	{
		elemento.disabled = true;
		elemento.style.backgroundColor = color;
	}
	
	/** 
		Desahabilita el elemento y le cambia el estilo.
			
		@param elemento	elemento a deshabilitar.
		@param clase	nombre de la clase de la hoja de estilos a usar.
	*/
	
	function xgfDesabilitaEstilo(elemento,clase)
	{
		elemento.disabled = true;
		elemento.className = clase;
	}
	
	/** 
		Habilita el elemento y le cambia el color de fondo.
	
		@param elemento	elemento a habilitar.
		@param color color de fondo en formato #AABBCC.
	*/
	function xgfHabilita(elemento,color)
	{
		elemento.disabled = false;
		elemento.style.backgroundColor= color;
	} 
	
	/** 
		Habilita el elemento y le cambia el estilo.
			
		@param elemento	elemento a deshabilitar.
		@param clase	nombre de la clase de la hoja de estilos a usar.
	*/
	function xgfHabilitaEstilo(elemento,clase)
	{
		elemento.disabled = false;
		elemento.className= clase;
	}
	
	/**
		Cambia el color de fondo en función de si el campo está relleno o no.
		
		@param elmento	campo a gestionar.
	*/
	function xgfFondoColor(elemento)
	{
		var longitud = (elemento.value).length;
		
		if (longitud == 0) 
			elemento.style.backgroundColor = xgfColorObligatorioVacio;
		else 
			elemento.style.backgroundColor = xgfColorObligatorioLleno;
		
		return true;
	}	

	/**
		Cambia el color de fondo en función de si el campo está relleno o no.
		
		@param elemento		Campo a gestionar.
		@param claseDatos 	Clase para cuando el campo tiene datos.
		@param claseVacio 	Clase para cuando el campo testa vacío.
	*/
	function xgfFondoColorEstilo(elemento, claseDatos, claseVacio)
	{
		var longitud = (elemento.value).length;
		
		if (longitud == 0) 
			elemento.className = claseVacio;
		else 
			elemento.className = claseDatos;
		
		return true;
	}

//
// GESTIÓN DE EVENTOS COMUNES
//

	function xgfCIF_onKeyPress(evento)
	{
		evento = (evento) ? evento : ((window.event) ? window.event : "");
		if (evento) 
		{
			var tecla = xnTeclaPulsada(evento);
			var esDigitoCIF = xgfDigitoCIF(tecla);
			
			if (esDigitoCIF)	return true;
			if (evento.which) evento.preventDefault();
		}
		
		return false;
	}
	
	function xgfNumero_onKeyPress(evento)
	{
		evento = (evento) ? evento : ((window.event) ? window.event : "");
		if (evento) 
		{
			var tecla = xnTeclaPulsada(evento);
			var esDigitoNumero = xgfDigitoNumero(tecla);
			
			if (esDigitoNumero)	return true;
			if (evento.which) evento.preventDefault();
		}
		
		return false;
	}
	
	
	function xgfImporte_onKeyPress(evento)
	{
		evento = (evento) ? evento : ((window.event) ? window.event : "");
		if (evento) 
		{
			var tecla = xnTeclaPulsada(evento);
			var esDigitoImporte = xgfDigitoImporte(tecla);

			if (esDigitoImporte)
			{
				var caracter = String.fromCharCode(tecla);
				if (caracter == ",")
				{
					var elemento = xnPropietarioEvento(evento);
					var cadena = elemento.value
				
					if (cadena.indexOf(",") == -1) return true;
				}
				else
				{
					return true;
				}
			}
			if (evento.which) evento.preventDefault(); // multinavegador
		}
		
		return false;
	}
	
	function xgfIAE_onKeyPress(evento)
	{
		evento = (evento) ? evento : ((window.event) ? window.event : "");
		if (evento) 
		{
			var tecla = xnTeclaPulsada(evento);
			var esDigitoImporte = xgfDigitoIAE(tecla);

			if (esDigitoImporte)
			{
				var caracter = String.fromCharCode(tecla);
				if (caracter == ".")
				{
					var elemento = xnPropietarioEvento(evento);
					var cadena = elemento.value
				
					if (cadena.indexOf(".") == -1) return true;
				}
				else
				{
					return true;
				}
			}
			if (evento.which) evento.preventDefault(); // multinavegador
		}
		
		return false;
	}
	
	function xgfImporte_onFocus(evento)
	{
		evento = (evento) ? evento : ((window.event) ? window.event : "");
		if (evento) 
		{
			var elemento = xnPropietarioEvento(evento);
			var cadena = elemento.value;
			elemento.value = xgfQuitaPuntosMillar(cadena);
		}
	}

	function xgfImporte_onBlur(evento)
	{
		evento = (evento) ? evento : ((window.event) ? window.event : "");
		if (evento) 
		{
			var elemento = xnPropietarioEvento(evento);
			var cadena = elemento.value;
			if (!xgfEsImporteMoneda(cadena)) 
			{	
				xnOnBlurFocus(elemento);
				return false;
			}
			elemento.value = xgfPonPuntosMillar(cadena);
		}
		return true;	
	}



	function xgfDias_onKeyPress(evento)
	{
		evento = (evento) ? evento : ((window.event) ? window.event : "");
		if (evento) 
		{
			var tecla = xnTeclaPulsada(evento);
			if (xgfDigitoNumero(tecla)) return true;
			if (evento.which) evento.preventDefault();
		}
		
		return false
	}
	
	function xgfFecha_onKeyPress(evento)
	{
		
		evento = (evento) ? evento : ((window.event) ? window.event : "");
		if (evento) 
		{
			var tecla = xnTeclaPulsada(evento);
			var esDigitoFecha = xgfDigitoFecha(tecla,"-");
			if (esDigitoFecha)
			{
				
				var caracter = String.fromCharCode(tecla);
				
				if (caracter == "-")
				{
					var cadena = xnValorCampo(evento);
					var cuentaSeparadores=0;
					for (var i=0; i<cadena.length;i++)
					{
						if (cadena.substring(i,i+1)=="-")
							cuentaSeparadores += 1;
					}
		
					if ((cuentaSeparadores < 2))  return true;
					
				}
				else
				{
					return true;
				}
			}
			if (evento.which) evento.preventDefault();
		}
		return false;
	}
	
	function xgfHora_onKeyPress(evento)
	{
		evento = (evento) ? evento : ((window.event) ? window.event : "");
		if (evento) 
		{
			var tecla = xnTeclaPulsada(evento);
			var esDigitoHora = xgfDigitoHora(tecla);
			if (esDigitoHora)
			{
				var caracter = String.fromCharCode(tecla);
				if (caracter == ":")
				{
					var elemento = xnPropietarioEvento(evento);
					var cadena = elemento.value;
					if (cadena.indexOf(":") == -1)	return true;
				}
				else
				{
					return true;
				}
			}
			if (evento.which) evento.preventDefault();				
		}
		return false;
	}
	
//	
// GESTIÓN DE TECLAS PULSADAS
//
	var xgfTeclasEspeciales = /[\x00\x08\x09\x0D\x25\x27]/; // Inicio,Fin,Supr,Flechas/retroceso/tab/intro/<--/-->
	
	function xgfDigitoCIF(codigoTecla)
	{                        
		var caracter;
		var digitos = /[\d,A-Z]/;
					
		if (codigoTecla == null) return true;
		
		caracter = String.fromCharCode(codigoTecla);
		caracter = caracter.toUpperCase();
		if (digitos.test(caracter)||xgfTeclasEspeciales.test(caracter)) return true;
		
		return false;      
	}
	
	function xgfDigitoNumero(codigoTecla)
	{                        
		var caracter;
		var digitos = /\d/;
					
		if (codigoTecla == null) return true;
		
		caracter = String.fromCharCode(codigoTecla);
		
		if (digitos.test(caracter)||xgfTeclasEspeciales.test(caracter)) return true;
		
		return false;      
	}
	
	function xgfPonEnMayuscula(codigoTecla)
	{
		var caracter;
		if(codigoTecla == null) return true;
		caracter = String.fromCharCode(codigoTecla).toUpperCase();
		return true;
	}
	
	function xgfDigitoImporte(codigoTecla)
	{                        
		var caracter;
		var digitos = /[\,\d]/;
					
		if (codigoTecla == null) return true;
		
		caracter = String.fromCharCode(codigoTecla);
		
		if (digitos.test(caracter)||xgfTeclasEspeciales.test(caracter)) return true;
		
		return false;      
	}
		
	function xgfDigitoIAE(codigoTecla)
	{                        
		var caracter;
		var digitos = /[\.\d]/;
					
		if (codigoTecla == null) return true;
		
		caracter = String.fromCharCode(codigoTecla);
		
		if (digitos.test(caracter)||xgfTeclasEspeciales.test(caracter)) return true;
		
		return false;      
	}
	
	function xgfDigitoFecha(codigoTecla,separador)
	{
		var tecla, caracter;
		var digitos = '0123456789';
							
		if (codigoTecla == null) return true;

		digitos += separador;
		caracter = String.fromCharCode(codigoTecla);

		if (digitos.indexOf(caracter) != -1) return true; 

		if ( codigoTecla==null || codigoTecla==0 || codigoTecla==8 || codigoTecla==9 || codigoTecla==13 || codigoTecla==27 )
			return true;
		
		return false;   
	}
	
	function xgfDigitoHora(codigoTecla)
	{                        
		var tecla, caracter;
		var digitos = '0123456789:';
					
		if (codigoTecla == null) return true;
		
		caracter = String.fromCharCode(codigoTecla);
		
		if (digitos.indexOf(caracter) != -1) return true; 

		if ( codigoTecla==null || codigoTecla==0 || codigoTecla==8 || codigoTecla==9 || codigoTecla==13 || codigoTecla==27 )
			return true;
		
		return false;   
	}
	
	
// GESTIÓN DE TIPOS DE DATOS 
	// Valida el formato de una dirección de correo electrónico
	function xgfEsEMail(direccion) 
	{
	    var cadena = direccion.value;
	    var patron = /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/;
	    
	    if (!cadena.match(patron))  return false;
	    
	    return true;
	}
	
	
	//Comprueba si la cadena es un CIF
	function xgfEsCIF(cif)
	{
		var patron = /^[A-Z]{0,1}\d*[A-Z]{0,1}$/;
		if (patron.test(cif)) return true;
		
		return false;
	}
	
	//Comprueba si la cadena representa un número
	function xgfEsNumeroEntero(numero)
	{
		var patron = /^\d*$/;
		if (patron.test(numero)) return true;
		/*
		for (var i=0; i<numero.length;i++)
		{
			temp=""+numero.substring(i,i+1);
			if (!xgfEsDigitoNumeroEntero(temp)) return false;
		}
		*/	
		return false;
	}
	
	// Comprueba si la cadena representa un formato de un importe.
	// El importe se especifica con coma decimal y como mucho dos dígitos decimales.
	
	function xgfEsImporteMoneda(cadena)
	{   
		var patron = /^\d*\,?\d{0,2}$/;
		
		if (patron.test(cadena)) 
			return true
		else
			return false;		
	}
	
	
	// Comprueba si es un IAE
	
	function xgfEsIAE(cadena)
	{   
		var patron = /^\d{1,3}.?\d{0,1}$/;
		
		if (patron.test(cadena)) 
			return true
		else
			return false;		
	}
	
	// Comprueba si una fecha tiene un formato válido
	function xgfEsFechaValida(cadena, separador)
	{
		// Comprobaciones iniciales
		if ((cadena == "")||(cadena==null)) return false;
		if (!xgfSonDigitosFecha(cadena,separador)) return false;

		var patron = "^[0-3]?[0-9]\\" + separador+"[0-1]?[0-9]\\"+separador+"[0-9][0-9][0-9][0-9]$";
		//if (cadena.search(patron)== -1) alert(patron);
		if (cadena.search(patron)== -1) return false;

		// Obtenemos partes
		var partes = cadena.split(separador);
		var dia = parseInt(partes[0],10);
		var mes = parseInt(partes[1],10);
		var ano = parseInt(partes[2],10);

		// Comprobamos
		if ((dia < 1) || (dia > 31)) return false;
		if ((mes < 1) || (mes > 12)) return false
		if (mes == 2)
		{
			if (xgfEsBisiesto(ano))
			{
				if (dia > 29) return false;
			}
			else
			{
				if (dia > 28) return false;
			}
		}

		if (xgfEsMes30Dias(mes))
		{
			if (dia > 30 ) return false;
		}
		else
		{
			if (dia > 31 ) return false;
		}					
		return true;
	}
	
	
	// Comprueba si una fecha es mayor a otra
	function xgfEsFechaMayor(FechaA,FechaB,separador)
	{
		if (parseInt(xgfFechaANumero(FechaA,separador)) > parseInt(xgfFechaANumero(FechaB,separador)))
		     return true;
		else
		     return false;
	}
	
	
	// Comprueba si una hora tiene un formato válido
	var xgfHora12 = 0;
	var xgfHora24 = 1;
	function xgfEsHoraValida(cadena, modo)
	{
		// Comprobaciones iniciales
		if ((cadena == "")||(cadena==null)) return false;
		if (!xgfSonDigitosHora(cadena)) return false;
		
		var patron = null;
		if (modo == xgfHora12)
			patron = "^[0-1][0-2]:[0-5][0-9]$";
		else
			patron = "(^(2[0-3]))|(^([0-1][0-9])):[0-5][0-9]$";
			
		//if (cadena.search(patron)== -1) alert(patron);
		if (cadena.search(patron)== -1) return false;
			
		return true;
	}	
	
	
	// Convierte un importe en formato de coma decimal a punto decimal
	function xgfNormalizaImporte(Cadena)
	{   
		var CadenaX = Cadena +"";
		var CadenaNormalizada = CadenaX.split(",").join(".");
		if (CadenaNormalizada.indexOf(".") == CadenaNormalizada.length)
			return CadenaNormalizada + "0";
		else
			return CadenaNormalizada;
	}
	// Convierte un porcentaje en formato de coma decimal a punto decimal
	function xgfNormalizaPorcentaje(Cadena)
	{   
		var CadenaX = Cadena +"";
		var CadenaNormalizada = CadenaX.split(",").join(".");
		if (CadenaNormalizada.indexOf(".") == CadenaNormalizada.length)
			return CadenaNormalizada + "0";
		else
			return CadenaNormalizada;
	}
	
	// Convierte un importe en formato de punto decimal a coma decimal
	function xgfLatinizaImporte(Cadena)
	{   
		var CadenaX = Cadena +"";
		var CadenaNormalizada = CadenaX.split(".").join(",");
		if (CadenaNormalizada.indexOf(",") == CadenaNormalizada.length)
			return CadenaNormalizada + "0";
		else
			return CadenaNormalizada;
	}
	// Convierte un porcentaje en formato de punto decimal a coma decimal
	function xgfLatinizaPorcentaje(Cadena)
	{   
		var CadenaX = Cadena +"";
		var CadenaNormalizada = CadenaX.split(".").join(",");
		if (CadenaNormalizada.indexOf(",") == CadenaNormalizada.length)
			return CadenaNormalizada + "0";
		else
			return CadenaNormalizada;
	}

	// Redondea un importe a dos decimales
	function xgfRedondeaImporte2D(importe)
	{
		if (importe==null) return 0;
		return Math.round(importe*100)/100;
	}
	
	// Redondea un importe a 3 decimales
	function xgfRedondeaImporte3D(importe)
	{
		if (importe==null) return 0;
		return Math.round(importe*1000)/1000;
	}
	
	// Quita los separadores de millar a una cadena 
   	function xgfQuitaPuntosMillar(cadena)
   	{
   		if (cadena == null) return null;
   		var cadenaFormateada = cadena.split(".").join("");
   		return cadenaFormateada;
   	}
   
   	// Pone los separadores de millar a una cadena 
   	function xgfPonPuntosMillar(cadena)
   	{
   		if (cadena == null) return null;
   		
   		var posComa = cadena.indexOf(",");
		var parteEntera = ""
		var parteDecimal = "";
		if (posComa == -1)
		{
			parteEntera = cadena;
			parteDecimal = "";
		}
		else
		{
			parteEntera = cadena.substring(0,posComa);
			if (parteEntera == "") parteEntera = "0";
			parteDecimal = "," + cadena.substring(posComa+1);
		}
						
		
        var miles = Math.floor(parteEntera.length/3);
        var resto = parteEntera.length%3;
        var cadenaFormateada="";
        var posBase = parteEntera.length;
    	if (miles > 0)
    	{
    		if (resto > 0) cadenaFormateada = parteEntera.substring(0,resto) + "." 
    		posBase = resto;
    		cadenaFormateada = cadenaFormateada + parteEntera.substring(posBase,posBase+3) 
    		posBase+=3;
    		for (i = 1; i < miles; i++)
    		{
    			cadenaFormateada = cadenaFormateada + "." + parteEntera.substring(posBase,posBase+3);
    			posBase += 3;
    		}
    			
    		cadenaFormateada = cadenaFormateada + parteDecimal;
    	}
    	else
    	{
    		cadenaFormateada = cadena;
    	}
    	
		return cadenaFormateada;
   	}
	
	
	// FUNCIONES AUXILIARES 
	
	// Elimina los blancos al principio de una cadena
	function xgfTrimInicio(campo)
	{
		var i=0;
		while(''+campo.value.charAt(i)==' ') i++;
	
		if (i > 0) campo.value=campo.value.substring(i,campo.value.length);
	};
	
	// Comprueba si el caracter es un número
	function xgfEsDigitoNumeroEntero(caracter)
	{                        
		var digitos = /\d/;			
					
		if (digitos.test(caracter)) return true; 
		
		return false;     
	}
	
	// Comprueba si una cadena tiene digitos válidos para indicar un importe
	function xgfEsDigitoImporte(caracter)
	{   
		var digitos = /[\,\d]/;			
					
		if (digitos.test(caracter)) return true; 
		
		return false;   
	}
	
	// Comprueba si una cadena contiene digitos válidos para indicar una fecha
	function xgfSonDigitosFecha(cadena,separador)
	{
		var digitosValidos="0123456789"+separador;
		var temp;
	
		for (var i=0; i < cadena.length; i++)
		{
			temp = "" + cadena.substring(i, i+1);
			if (digitosValidos.indexOf(temp) == -1) return false;
		}
		return true;
	}
	
	// Comprueba si una cadena contiene digitos válidos para indicar una hora
	function xgfSonDigitosHora(cadena)
	{
		var digitosValidos="0123456789:";
		var temp;
	
		for (var i=0; i < cadena.length; i++)
		{
			temp = "" + cadena.substring(i, i+1);
			if (digitosValidos.indexOf(temp) == -1) return false;
		}
		return true;
	}
	// Comprueba si una ño es bisiesto
	function xgfEsBisiesto(ano)
	{
		if ((ano % 4) == 0)
			if ((ano % 100) == 0)
				if (( ano % 400) == 0)
					return true;
				else
					return false;
			else
				return true;
		else
			return false;
	}
	
	// Comprueba si el mes indicado tiene 30 días
	function xgfEsMes30Dias(mes)
	{
		if (mes < 7)
		{
			if (mes % 2 == 0)
				return true;
			else
				return false;
		}
		else
		{
			if (mes % 2 != 0)
				return true;
			else
				return false;
		}
	}
	
	// Convierte una fecha DD/MM/AAAA a AAAAMMDD
	// Se presupone una fecha valida
	function xgfFechaANumero(fecha, separador)
	{ 	
		var partes = fecha.split(separador);
		var dia = parseInt(partes[0],10);
		var mes = parseInt(partes[1],10);
		var ano = parseInt(partes[2],10);
		
		return ano*10000+mes*100+dia;
	}
	
	// Cuenta el número de decimales de un número
 	function xgfCuentaDecimales(numero, separador)
	{
		posComa = numero.indexOf(separador);
		if (posComa == -1) return 0;
		
		posComa++;
		return numero.length - posComa;
	}
