//Clase encargada de formatear los campos fecha. Recibe como parametros todos los posibles sufijos de los 
// identificadores de cada uno de los campos que pueden formar una fecha
function ConversorFecha(deSufijoCampoAnio, deSufijoCampoMes, deSufijoCampoDia, deSufijoCampoHora, deSufijoCampoMinuto, deSufijoCampoSegundo, deSufijoCampoFraccionSegundo, nuAnioMaximo, nuAnioMinimo)
{
	this.deSufijoCampoAnio = deSufijoCampoAnio;
	this.deSufijoCampoMes = deSufijoCampoMes;
	this.deSufijoCampoDia = deSufijoCampoDia;
	this.deSufijoCampoHora = deSufijoCampoHora;
	this.deSufijoCampoMinuto = deSufijoCampoMinuto;
	this.deSufijoCampoSegundo = deSufijoCampoSegundo;
	this.deSufijoCampoFraccionSegundo = deSufijoCampoFraccionSegundo;
	this.nuAnioMaximo = nuAnioMaximo;
	this.nuAnioMinimo = nuAnioMinimo;
	
	//Funcion que formatea el campo dia de una fecha. Primero comprueba que el valor del campo sea numerico, válido
	//respecto a la obligatoriedad y en un rango entre 1 y 31 inclusive. En caso de detectar error en la validacion 
	//numérica, el error lo marca la propia funcion de valicion numerica ConversorNumero.formatearNumero y además
	//se marcan como erroneos los campos mes y año. En caso de que el formateo númerico devuelve valor true, se intenta 
	//validar la fecha completa con la funcion ConversorFecha.validarFecha
	this.formatearDia = function (idCampo, boRequerido)
	{
		var idEtiqueta = this.obtenerIdEtiquetaPrimerCampo(idCampo, this.deSufijoCampoDia);
		if (conversorNumero.formatearNumero (idCampo, idEtiqueta, 2, 0, false, true, 31, 1, boRequerido))
		{
			return this.validarFecha(idCampo, this.deSufijoCampoDia, boRequerido);
		}
		else
		{			
			gestorMensajesUsuario.ponerErrorCampo(this.obtenerId(idCampo, this.deSufijoCampoDia, this.deSufijoCampoMes));
			gestorMensajesUsuario.ponerErrorCampo(this.obtenerId(idCampo, this.deSufijoCampoDia, this.deSufijoCampoAnio));
			return false;
		}
	}
	
	// Formatea el dia sin validar
	this.formatearDiaSinValidar = function (idCampo, boRequerido)
	{
		var idEtiqueta = this.obtenerIdEtiquetaPrimerCampo(idCampo, this.deSufijoCampoDia);
		conversorNumero.formatearNumero (idCampo, idEtiqueta, 2, 0, false, true, 31, 1, boRequerido);
	}
	
	//Funcion que formatea el campo mes de una fecha. Primero comprueba que el valor del campo sea numerico, válido
	//respecto a la obligatoriedad y en un rango entre 1 y 12 inclusive. En caso de detectar error en la validacion 
	//numérica, el error lo marca la propia funcion de valicion numerica ConversorNumero.formatearNumero y además
	//se marcan como erroneos los campos dia y año. En caso de que el formateo númerico devuelve valor true, se intenta 
	//validar la fecha completa con la funcion ConversorFecha.validarFecha
	this.formatearMes = function (idCampo, boRequerido)
	{
		var idEtiqueta = this.obtenerIdEtiquetaPrimerCampo(idCampo, this.deSufijoCampoMes);
		if (conversorNumero.formatearNumero (idCampo, idEtiqueta, 2, 0, false, true, 12, 1, boRequerido))
		{
			return this.validarFecha (idCampo, this.deSufijoCampoMes, boRequerido);
		}
		else
		{			
			gestorMensajesUsuario.ponerErrorCampo(this.obtenerId(idCampo, this.deSufijoCampoMes, this.deSufijoCampoDia));
			gestorMensajesUsuario.ponerErrorCampo(this.obtenerId(idCampo, this.deSufijoCampoMes, this.deSufijoCampoAnio));
			return false;
		}
	}
	
	// Formatea el mes sin validar
	this.formatearMesSinValidar = function (idCampo, boRequerido)
	{
		var idEtiqueta = this.obtenerIdEtiquetaPrimerCampo(idCampo, this.deSufijoCampoMes);
		conversorNumero.formatearNumero (idCampo, idEtiqueta, 2, 0, false, true, 12, 1, boRequerido);
	}
	
	//Funcion que formatea el campo año de una fecha. Primero comprueba que el valor del campo sea numerico, válido
	//respecto a la obligatoriedad y en un rango entre -9999 y 9999 inclusive. En caso de detectar error en la validacion 
	//numérica, el error lo marca la propia funcion de valicion numerica ConversorNumero.formatearNumero y además
	//se marcan como erroneos los campos dia y año. En caso de que el formateo númerico devuelve valor true, se intenta 
	//validar la fecha completa con la funcion ConversorFecha.validarFecha
	this.formatearAnio = function (idCampo, boRequerido, boNoValidarRangoValores)
	{
		var idEtiqueta = this.obtenerIdEtiquetaPrimerCampo(idCampo, this.deSufijoCampoAnio);
        var formateoNumero = false;
        if (boNoValidarRangoValores)
        {
            formateoNumero = conversorNumero.formatearNumero (idCampo, idEtiqueta, 4, 0, false, false, 0, 0, boRequerido);
        } else {
            formateoNumero = conversorNumero.formatearNumero (idCampo, idEtiqueta, 4, 0, false, false, this.nuAnioMaximo, this.nuAnioMinimo, boRequerido); 
        }
		if (formateoNumero)
		{
			return this.validarFecha (idCampo, this.deSufijoCampoAnio, boRequerido);
		}
		else
		{			
			gestorMensajesUsuario.ponerErrorCampo(this.obtenerId(idCampo, this.deSufijoCampoAnio, this.deSufijoCampoDia));
			gestorMensajesUsuario.ponerErrorCampo(this.obtenerId(idCampo, this.deSufijoCampoAnio, this.deSufijoCampoMes));
			return false;
		}
	}
	
	// Formatea el año sin validar
	this.formatearAnioSinValidar = function (idCampo, boRequerido, boNoValidarRangoValores)
	{
		var idEtiqueta = this.obtenerIdEtiquetaPrimerCampo(idCampo, this.deSufijoCampoAnio);
        if (boNoValidarRangoValores)
        	conversorNumero.formatearNumero (idCampo, idEtiqueta, 4, 0, false, false, 0, 0, boRequerido);
        else
        	conversorNumero.formatearNumero (idCampo, idEtiqueta, 4, 0, false, false, this.nuAnioMaximo, this.nuAnioMinimo, boRequerido); 
	}
	
	//Funcion que formatea el campo hora de una fecha. Comprueba que el valor del campo sea numerico, válido
	//respecto a la obligatoriedad y en un rango entre 23 y 0 inclusive. En caso de detectar error en la validacion 
	//numérica, el error lo marca la propia funcion de valicion numerica ConversorNumero.formatearNumero y en caso contrario
	//se quita el posible mensaje de error
	this.formatearHora = function (idCampo, boRequerido)
	{
		var idEtiqueta = this.obtenerIdEtiquetaPrimerCampo(idCampo, this.deSufijoCampoHora);
		if (conversorNumero.formatearNumero (idCampo, idEtiqueta, 2, 0, false, true, 23, 0, boRequerido))
		{
			gestorMensajesUsuario.quitarError(idCampo, idEtiqueta);
			return true;
		}
		else
			return false;
	}
	
	// Formatea la hora sin validar
	this.formatearHoraSinValidar = function (idCampo, boRequerido)
	{
		var idEtiqueta = this.obtenerIdEtiquetaPrimerCampo(idCampo, this.deSufijoCampoHora);
		conversorNumero.formatearNumero (idCampo, idEtiqueta, 2, 0, false, true, 23, 0, boRequerido);
	}
	
	//Funcion que formatea el campo minuto de una fecha. Comprueba que el valor del campo sea numerico, válido
	//respecto a la obligatoriedad y en un rango entre 59 y 0 inclusive. En caso de detectar error en la validacion 
	//numérica, el error lo marca la propia funcion de valicion numerica ConversorNumero.formatearNumero y en caso contrario
	//se quita el posible mensaje de error
	this.formatearMinuto = function (idCampo, boRequerido)
	{
		var idEtiqueta = this.obtenerIdEtiquetaPrimerCampo(idCampo, this.deSufijoCampoMinuto);
		if (conversorNumero.formatearNumero (idCampo, idEtiqueta, 2, 0, false, true, 59, 0, boRequerido))
		{
			gestorMensajesUsuario.quitarError(idCampo, idEtiqueta);
			return true;
		}
		else
			return false;
	}
	
	// Formatea el minuto sin validar
	this.formatearMinutoSinValidar = function (idCampo, boRequerido)
	{
		var idEtiqueta = this.obtenerIdEtiquetaPrimerCampo(idCampo, this.deSufijoCampoMinuto);
		conversorNumero.formatearNumero (idCampo, idEtiqueta, 2, 0, false, true, 59, 0, boRequerido);
	}
	
	//Funcion que formatea el campo segundo de una fecha. Comprueba que el valor del campo sea numerico, válido
	//respecto a la obligatoriedad y en un rango entre 59 y 0 inclusive. En caso de detectar error en la validacion 
	//numérica, el error lo marca la propia funcion de valicion numerica ConversorNumero.formatearNumero y en caso contrario
	//se quita el posible mensaje de error
	this.formatearSegundo = function (idCampo, boRequerido)
	{
		var idEtiqueta = this.obtenerIdEtiquetaPrimerCampo(idCampo, this.deSufijoCampoSegundo);
		if (conversorNumero.formatearNumero (idCampo, idEtiqueta, 2, 0, false, true, 59, 0, boRequerido))
		{
			gestorMensajesUsuario.quitarError(idCampo, idEtiqueta);
			return true;
		}
		else
			return false;
	}
	
	// Formatea el segundo sin validar
	this.formatearSegundoSinValidar = function (idCampo, boRequerido)
	{
		var idEtiqueta = this.obtenerIdEtiquetaPrimerCampo(idCampo, this.deSufijoCampoSegundo);
		conversorNumero.formatearNumero (idCampo, idEtiqueta, 2, 0, false, true, 59, 0, boRequerido);
	}
	
	//Funcion que formatea el campo fraccion de segundo de una fecha. Comprueba que el valor del campo sea numerico, válido
	//respecto a la obligatoriedad y en un rango entre 99999 y 0 inclusive. En caso de detectar error en la validacion 
	//numérica, el error lo marca la propia funcion de valicion numerica ConversorNumero.formatearNumero y en caso contrario
	//se quita el posible mensaje de error
	this.formatearFraccionSegundo = function (idCampo, boRequerido)
	{
		var idEtiqueta = this.obtenerIdEtiquetaPrimerCampo(idCampo, this.deSufijoCampoFraccionSegundo);
		if (conversorNumero.formatearNumero (idCampo, idEtiqueta, 5, 0, false, false, 99999, 0, boRequerido))
		{
			gestorMensajesUsuario.quitarError(idCampo, idEtiqueta);
			return true;
		}
		else
			return false;
	}

	//Funcion que valida que el conjunto de los campos que forman una fecha sean correctos. Este conjunto puede ser 
	//formado solo por el año, que siempre es correcto, formado por el mes y el año, que son correctos si estan en sus rangos 
	//respectivos, formado por dia y mes que son correctos de igualo forma que lo son en un año no bisiesto y formados por
	//dia, mes y año que comprueba la validez de la fecha.
	//En el caso de detectar un error un alguno de los campos, se marcarán como erroneos todos los campos de la fecha. En 
	//caso de no estar todos los campos informados y no poder comprobar la validez de la fecha no se modifica es estado
	//erroneo o no erroneo de los campos, solo en el caso de no ser requeridos y estar todos vacios, en este caso
	//se quitan los posibles errores.
	this.validarFecha = function (idCampo, deSufijoCampo, boRequerido)
	{
		var nuDiaMes = null;
		var nuMesAnio = null;
		var nuAnio = null;
		var camposCorrectos = true;		
		
		var campo = null;		
		
		//dia
		idCampoDia = this.obtenerId(idCampo, deSufijoCampo, this.deSufijoCampoDia);
		campo = document.getElementById(idCampoDia);
		if (campo == null)
			nuDiaMes = '1';
		else
		{
			nuDiaMes = campo.value;
			if (!this.esCampoVacio(nuDiaMes))
				camposCorrectos = camposCorrectos && conversorNumero.formatearNumero (idCampoDia, this.obtenerIdEtiquetaPrimerCampo(idCampoDia, this.deSufijoCampoDia), 2, 0, false, true, 31, 1, boRequerido);
		}
		
		//Mes
		idCampoMes = this.obtenerId(idCampo, deSufijoCampo, this.deSufijoCampoMes);
		campo = document.getElementById(idCampoMes);
		if (campo == null)
			nuMesAnio = '1';
		else
		{
			nuMesAnio = campo.value;
			if (!this.esCampoVacio(nuMesAnio))
				camposCorrectos = camposCorrectos && conversorNumero.formatearNumero (idCampoMes, this.obtenerIdEtiquetaPrimerCampo(idCampoMes, this.deSufijoCampoMes), 2, 0, false, true, 12, 1, boRequerido);
		}

		//Año
		idCampoAnio = this.obtenerId(idCampo, deSufijoCampo, this.deSufijoCampoAnio);
		campo = document.getElementById(idCampoAnio);
		if (campo == null)
		{
			//Elegimos un año cualquiera no bisiesto, para eso buscamos el menor año permitido impar
			if ((this.nuAnioMinimo % 2) == 0)
				nuAnio = new String(this.nuAnioMinimo + 1);
			else
				nuAnio = new String(this.nuAnioMinimo);
		}
		else
		{
			nuAnio = campo.value;
			if (!this.esCampoVacio(nuAnio))
				camposCorrectos = camposCorrectos && conversorNumero.formatearNumero (idCampoAnio, this.obtenerIdEtiquetaPrimerCampo(idCampoAnio, this.deSufijoCampoAnio), 4, 0, false, false, 9999, -9999, boRequerido);
		}	
		if (!this.esCampoVacio(nuDiaMes) && !this.esCampoVacio(nuMesAnio) && !this.esCampoVacio(nuAnio))
		{	
			if (camposCorrectos)
			{
				// Año no bisiesto y es febrero y el dia es mayor a 28
				var esBisiesto = (nuAnio % 4 == 0 && nuAnio % 100 != 0) || nuAnio % 400 == 0;
				if(!esBisiesto && ((nuMesAnio == 2) && (nuDiaMes > 28)))
				{
					this.ponerErrorTodosCamposFecha(idCampo, deSufijoCampo);
					return false;
				}
				else if ((((nuMesAnio == 4) || (nuMesAnio == 6) || (nuMesAnio == 9) || (nuMesAnio == 11)) && (nuDiaMes > 30)) || 
					 ((nuMesAnio == 2) && (nuDiaMes > 29)))
				{
					this.ponerErrorTodosCamposFecha(idCampo, deSufijoCampo);
					return false;
				}
				else
				{
					this.quitarErrorTodosCamposFecha(idCampo, deSufijoCampo);
					return true;
				}
			}
			else
			{
				this.ponerErrorTodosCamposFechaSinEtiqueta(idCampo, deSufijoCampo);
			}
		}
		else
		{
			if (this.esCampoVacio(nuDiaMes) && this.esCampoVacio(nuMesAnio) && this.esCampoVacio(nuAnio) && !boRequerido)
				this.quitarErrorTodosCamposFecha(idCampo, deSufijoCampo);
			return true;
		}
	}
	
	//Pone erroneos los campos y etiquetas de una fecha: dia, mes y año
	this.ponerErrorTodosCamposFecha = function(idCampo, deSufijoCampo)
	{
		//dia
		idCampoDia = this.obtenerId(idCampo, deSufijoCampo, this.deSufijoCampoDia);
		if (document.getElementById(idCampoDia) != null)
			gestorMensajesUsuario.ponerError(idCampoDia, this.obtenerIdEtiquetaPrimerCampo(idCampoDia, this.deSufijoCampoDia), 10002);
	
		//mes
		idCampoMes = this.obtenerId(idCampo, deSufijoCampo, this.deSufijoCampoMes);
		if (document.getElementById(idCampoMes) != null)
			gestorMensajesUsuario.ponerError(idCampoMes, this.obtenerIdEtiquetaPrimerCampo(idCampoMes, this.deSufijoCampoMes), 10002);
			
		//año
		idCampoAnio = this.obtenerId(idCampo, deSufijoCampo, this.deSufijoCampoAnio);
		if (document.getElementById(idCampoAnio) != null)
			gestorMensajesUsuario.ponerError(idCampoAnio, this.obtenerIdEtiquetaPrimerCampo(idCampoAnio, this.deSufijoCampoAnio), 10002);
	}
	
	//Pone erroneos los solo campos y no las etiquetas de una fecha: dia, mes y año
	this.ponerErrorTodosCamposFechaSinEtiqueta = function (idCampo, deSufijoCampo)
	{
		//dia
		idCampoDia = this.obtenerId(idCampo, deSufijoCampo, this.deSufijoCampoDia);
		if (document.getElementById(idCampoDia) != null)
			gestorMensajesUsuario.ponerErrorCampo(idCampoDia);
	
		//mes
		idCampoMes = this.obtenerId(idCampo, deSufijoCampo, this.deSufijoCampoMes);
		if (document.getElementById(idCampoMes) != null)
			gestorMensajesUsuario.ponerErrorCampo(idCampoMes);
			
		//año
		idCampoAnio = this.obtenerId(idCampo, deSufijoCampo, this.deSufijoCampoAnio);
		if (document.getElementById(idCampoAnio) != null)
			gestorMensajesUsuario.ponerErrorCampo(idCampoAnio);
	}
	
	//Quita erroneos los campos y etiquetas de una fecha: dia, mes y año
	this.quitarErrorTodosCamposFecha = function (idCampo, deSufijoCampo)
	{
		//dia
		idCampoDia = this.obtenerId(idCampo, deSufijoCampo, this.deSufijoCampoDia);
		if (document.getElementById(idCampoDia) != null)
			gestorMensajesUsuario.quitarError(idCampoDia, this.obtenerIdEtiquetaPrimerCampo(idCampoDia, this.deSufijoCampoDia));
	
		//mes
		idCampoMes = this.obtenerId(idCampo, deSufijoCampo, this.deSufijoCampoMes);
		if (document.getElementById(idCampoMes) != null)
			gestorMensajesUsuario.quitarError(idCampoMes, this.obtenerIdEtiquetaPrimerCampo(idCampoMes, this.deSufijoCampoMes));
			
		//año
		idCampoAnio = this.obtenerId(idCampo, deSufijoCampo, this.deSufijoCampoAnio);
		if (document.getElementById(idCampoAnio) != null)
			gestorMensajesUsuario.quitarError(idCampoAnio, this.obtenerIdEtiquetaPrimerCampo(idCampoAnio, this.deSufijoCampoAnio));
	}
	
	//Obtiene el identificador de un campo, indicando un identificador de uno le los campos de la fecha como primer
	//parametro, el sufijo de fecha ese campo y el sufijo de fecha que se quiere obtener
	this.obtenerId = function (id, deSujifoCampoOrigen, deSujifoCampoDestino)
	{
		return id.replace(deSujifoCampoOrigen, deSujifoCampoDestino);
	}
	
	//Obtiene el identificador de etiqueta del primer campo. Actualmente siempre es el día, es necesario 
	//parametrizar esta circunstacio el primer campo puede ser otro (Ej: Mes, si se diese soporte a fechas de tipo
	// MM/AAAA o a fechas completas en idioma inglés
	this.obtenerIdEtiquetaPrimerCampo = function (idCampo, deSufijoCampo)
	{		
		//Se asume como primer campo el dia
		return this.obtenerIdEtiqueta(this.obtenerId(idCampo, deSufijoCampo, this.deSufijoCampoDia));
	}
	
	
	// Indica si un caracter es digito o no.
	this.esDigito = function (c)
	{
		if (	(c == '0') || (c == '1') || (c == '2') || (c == '3') || (c == '4') ||
				(c == '5') || (c == '6') || (c == '7') || (c == '8') || (c == '9') 	)
				return true;
		else
				return false;
	}
	
	
	//Funcion que formatea la fecha en un campo.
	this.formatearFechaUnCampo = function (idCampo, boRequerido)
	{
		var teDia = 0, teMes = 0, teAno = 0;
		
		var vaFecha = document.getElementById(idCampo);
		
		// Si no existe el campo, salimos sin hacer nada.
		if (vaFecha == null)
			return false;
		
		var teFecha = vaFecha.value;
				
		var nuCaracteres = teFecha.length;
		
		var anoActual = new Date().getFullYear();
		var sigloActual = ( parseInt((anoActual / 100), 10) + 1);
		
		// Quitamos error si lo hubiera por una validacion anterior
		gestorMensajesUsuario.quitarError(idCampo, this.obtenerIdEtiqueta(idCampo));
		
		if (nuCaracteres == 6) // Formato DDMMYY
		{
			// Validamos que todos los caracteres sean dígitos. Si alguno no lo es, ERROR.
			for (i=0;i<nuCaracteres;i++)
			{
				if (!this.esDigito(teFecha.charAt(i)))
				{
					gestorMensajesUsuario.ponerError(idCampo, this.obtenerIdEtiqueta(idCampo), 10002);
					return false;
				}
			}
	
			// Obtenemos dia y mes, y calculamos año en función del siglo actual.
			teDia = parseInt(teFecha.substring(0,2), 10);
			teMes = parseInt(teFecha.substring(2,4), 10);
			teAno = parseInt(teFecha.substring(4,6), 10);
			teAno = ( ((sigloActual -1) * 100) + teAno);
		}
		else if (nuCaracteres == 8)
		{
			if ( (teFecha.charAt(2) != '/') && (teFecha.charAt(2) != '-') ) // Formato DDMMYYYY
			{
				// Validamos que todos los caracteres sean dígitos. Si alguno no lo es, ERROR.
				for (i=0;i<nuCaracteres;i++)
				{
					if (!this.esDigito(teFecha.charAt(i)))
					{
						gestorMensajesUsuario.ponerError(idCampo, this.obtenerIdEtiqueta(idCampo), 10002);
						return false;
					}
				}
				
				// Obtenemos dia, mes y año.
				teDia = parseInt(teFecha.substring(0,2), 10);
				teMes = parseInt(teFecha.substring(2,4), 10);
				teAno = parseInt(teFecha.substring(4,8), 10);
			}
			else // Formato DD-MM-YY o DD/MM/YY
			{
				// Validamos que el valor recibido coincida con el esperado. Los caracteres
				// 0,1,3,4,6 y 7 deben ser digitos, y los caracteres 2 y 5 deben ser '-' o '/'.
				if ( 	(!this.esDigito(teFecha.charAt(0))) || (!this.esDigito(teFecha.charAt(1))) ||
						(!this.esDigito(teFecha.charAt(3))) || (!this.esDigito(teFecha.charAt(4))) ||
						(!this.esDigito(teFecha.charAt(6))) || (!this.esDigito(teFecha.charAt(7))) ||
						( (teFecha.charAt(2)!= '/') && (teFecha.charAt(2)!= '-') ) ||
						( (teFecha.charAt(5)!= '/') && (teFecha.charAt(5)!= '-') )	)
				{
					gestorMensajesUsuario.ponerError(idCampo, this.obtenerIdEtiqueta(idCampo), 10002);
					return false;
				}
				
				// Obtenemos dia y mes, y calculamos año en función del siglo actual.
				teDia = parseInt(teFecha.substring(0,2), 10);
				teMes = parseInt(teFecha.substring(3,5), 10);
				teAno = parseInt(teFecha.substring(6,8), 10);
				teAno = ( ((sigloActual -1) * 100) + teAno);
			}
		}
		else if (nuCaracteres == 10) // Formato DD-MM-YYYY o DD/MM/YYYY
		{
			// Validamos que el valor recibido coincida con el esperado. Los caracteres
			// 0,1,3,4,6,7,9 y deben ser digitos, y los caracteres 2 y 5 deben ser '-' o '/'.
			for (i=0;i<nuCaracteres;i++)
			{
				var coPosicionFecha = teFecha.charAt(i);		
				if ( (i==2) || (i==5) )
				{
					if ( (coPosicionFecha != '-') && (coPosicionFecha != '/') )
					{
						gestorMensajesUsuario.ponerError(idCampo, this.obtenerIdEtiqueta(idCampo), 10002);
						return false;
					}
				}
				else if (!this.esDigito(coPosicionFecha))
				{
					gestorMensajesUsuario.ponerError(idCampo, this.obtenerIdEtiqueta(idCampo), 10002);
					return false;
				}
			}
			
			// Obtenemos dia, mes y año.
			teDia = parseInt(teFecha.substring(0,2), 10);
			teMes = parseInt(teFecha.substring(3,5), 10);
			teAno = parseInt(teFecha.substring(6,10), 10);
		}
		else // En cualquier otro caso (longitud distinta de 6,8 y 10), ERROR. Salvo que campo No requerido y vacio.
		{
			
			if ( (this.esCampoVacio(teFecha)) && (!boRequerido) )
				return true;
			else
			{
				gestorMensajesUsuario.ponerError(idCampo, this.obtenerIdEtiqueta(idCampo), 10002);
				return false;
			}
		}
		
		// Formateamos dia en 2 caracteres (DD).
		if (teDia < 10)
			txDia = '0' + teDia;
		else
			txDia = teDia;
				
		// Formateamos mes en 2 caracteres (MM).
		if (teMes < 10)
			txMes = '0' + teMes;
		else
			txMes = teMes;
		
		// Formateamos año en 4 caracteres (YYYY).
		if (teAno < 10)
			txAno = '000' + teAno;
		else if (teAno < 100)
			txAno = '00' + teAno;
		else if (teAno < 1000)
			txAno = '0' + teAno;
		else
			txAno = teAno;
				
		vaFecha.value = txDia + '/' + txMes + '/' + txAno;
		
		// Validamos que la fecha introducida, además de estar bien formateada, sea correcta.
		return this.validarFechaUnCampo (idCampo, boRequerido);
	}
	
	//Funcion que valida la fecha en un campo.
	this.validarFechaUnCampo = function (idCampo, boRequerido)
	{
		// Obtenemos el campo cuyo valor hay que validar.
		var vaFecha = document.getElementById(idCampo);
		
		if (vaFecha != null)
		{
			// Obtenemos el valor del campo a validar.
			var teFecha = vaFecha.value;
			
			if (!this.esCampoVacio(teFecha))
			{
				// Obtenemos dia mes y año.
				teDia = parseInt(teFecha.substring(0,2), 10);
				teMes = parseInt(teFecha.substring(3,5), 10);
				teAno = parseInt(teFecha.substring(6,10), 10);
			
				// Calculamos si el año es bisiesto.
				var esBisiesto = (  (((teAno % 4) == 0) && ((teAno % 100) != 0)) || ((teAno % 400) == 0)  );
				
				// LOS MESES DEBEN ESTAR COMPRENDIDOS ENTRE 1 Y 12
			    // LOS DIAS DEBEN ESTAR COMPRENDIDOS ENTRE 1 Y 31
			    // LOS AQOS DEBEN ESTAR COMPRENDIDOS ENTRE 1 Y 9999
			    if ( ((teMes > 0) && (teMes <= 12)) &&
				 	 ((teDia > 0) && (teDia <= 31)) &&
					 ((teAno > 0) && (teDia <= 9999)) )
			    {
					// ABRIL, JUNIO, SEPTIEMBRE Y NOVIEMBRE TIENEN QUE TENER COMO MUCHO 30 DIAS
					if (( 	(teMes == 4) || (teMes == 6) ||
							(teMes == 9) || (teMes == 11) ) && (teDia > 30) )
					{
						gestorMensajesUsuario.ponerError(idCampo, this.obtenerIdEtiqueta(idCampo), 10002);
						return false;
					}

					// FEBRERO TIENE QUE TENER 28 DIAS SI NO ES BISIESTO Y 29 SI ES BISIESTO.
					if (esBisiesto)
					{
						if ( (teMes == 2) && (teDia > 29) )
						{
							gestorMensajesUsuario.ponerError(idCampo, this.obtenerIdEtiqueta(idCampo), 10002);
							return false;
						}
					}
					else
					{
						if ( (teMes == 2) && (teDia > 28) )
						{
							gestorMensajesUsuario.ponerError(idCampo, this.obtenerIdEtiqueta(idCampo), 10002);
							return false;
						}
					}
				}
				else
				{
					gestorMensajesUsuario.ponerError(idCampo, this.obtenerIdEtiqueta(idCampo), 10002);
					return false;
				}
			    
			    return true;
			}
				
			// Si campo es vacio y no requerido, quitamos marcas de error si las hubiera.
			if (this.esCampoVacio(teFecha) && !boRequerido)
			{
				if (document.getElementById(idCampo) != null)
					gestorMensajesUsuario.quitarError(idCampo, this.obtenerIdEtiqueta(idCampo));
				
				return true;
			}
		}
		
		return false;
	}
	
}
//Se declara la herencia
ConversorFecha.prototype = new ConversorElemento();

