/******************************************************************************
  Función que determina si un año es o no bisiesto
  Nota: El año debe tener los 4 dígitos.
  Retorno: True o False
******************************************************************************/
function IsYearBisiesto(Year) {
    if (Year % 100 == 0) {
	if (Year % 400 == 0) { return true; }
    }
    else {
	if ((Year % 4) == 0) { return true; }
    }
    return false;
}

/******************************************************************************
  Autor: Sacada de la función IsValidDate de la página del TR de CSA
  
  isFechaValida(sFecha)

  Función que comprueba si una fecha es válida en el formato dia/mes/año.
  Tiene en cuenta los años bisiestos.
  
  Parámetros:
	-sFecha: Fecha que se quiere comprobar
  Retorno: True o False

  Ejemplo de llamada:
	if(isFechaValida(document.frmGeneral.CampoFecha.value) == false) {
	   	alert("Por favor teclee la fecha en formato 'dd/mm/aaaa'.\nO seleccione una fecha pulsando en el icono contiguo.");
	}
******************************************************************************/
function isFechaValida(sFecha) {
    var datePat = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
    var matchArray = sFecha.match(datePat);
    if (matchArray == null) {
        return false;
    }
    
    dia = matchArray[1];
    mes = matchArray[2];
    anyo = matchArray[3];

    if (mes < 0  || mes > 12) {
        return false;
    }

    if ((mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12) && (dia > 31 || dia < 1)) {
	return false;
    }
    if ((mes == 4 || mes == 6 || mes == 9 || mes == 11) && (dia > 30 || dia < 1)) {
        return false;
    }

    if (mes == 2) {
		if (dia < 1) {
            return false;
		}
		if (IsYearBisiesto(anyo) == true) {
			if (dia > 29) {
			return false;
			}
		}
		else {
			if (dia > 28) {
				return false;
			}
		}
    }
    return true
}

/******************************************************************************
  Autor: Sacada de la función IsValidTime de la página del TR de CSA
  
  isHoraValida(sHora)

  Función que comprueba si una hora es válida.
  
  Parámetros:
	-sHora: Cadena con la Hora que se quiere comprobar
  Retorno: True o False

******************************************************************************/
function isHoraValida(sHora) {

    var timePat = /^(\d{2}):(\d{2})$/;
    var matchArray = sHora.match(timePat);

    if (matchArray == null) {
	return false;
    }
    hour = matchArray[1];
    minute = matchArray[2];

    if (hour < 0  || hour > 23) {
	return false;
    }

    if (minute<0 || minute > 59) {
	return false;
    }
}

/*******************************************************************************
Función que devuelve la fecha Actual, en formato dd/mm/yyyy.
*******************************************************************************/
function sDate(){

	//Obtenemos la fecha del sistema
	fecha = new Date();
	
	
	//Obtenemos las distintas partes de la fecha.
	sDia = fecha.getDate().toString();
	sMes = (fecha.getMonth()+1).toString(); //Los meses empiezan por cero.
	sAnio = fecha.getFullYear().toString(); //
		
	if (sDia.length == 1)
		sDia = '0' + sDia;
	
	if (sMes.length == 1)
		sMes = '0' + sMes;	
		
	//Concatenamos las distintas partes
	sResultado = sDia + '/' + sMes + '/' + sAnio
	
	return sResultado			
}

/*******************************************************************************
Función que devuelve la fecha y hora Actual,en formato "dd/mm/yyyy hh:mm:ss".
*******************************************************************************/
function sNow(){

	//Obtenemos la fecha del sistema
	fecha = new Date();
	
	//Obtenemos las distintas partes de la fecha.
	sDia = fecha.getDate().toString();
	sMes = (fecha.getMonth()+1).toString(); //Los meses empiezan por cero.
	sAnio = fecha.getFullYear().toString(); //Devuelve el año con 4 dígitos.
	sHrs = fecha.getHours().toString();
	sMin = fecha.getMinutes().toString();
	sSeg = fecha.getSeconds().toString();
		
	if (sDia.length == 1)
		sDia = '0' + sDia;
	
	if (sMes.length == 1)
		sMes = '0' + sMes;
	
	if (sHrs.length == 1)
		sHrs = '0' + sHrs;
	
	if (sMin.length == 1)
		sMin = '0' + sMin;	
	
	if (sSeg.length == 1)
		sSeg = '0' + sSeg;	
		
	//Concatenamos las distintas partes
	sResultado = sDia + '/' + sMes + '/' + sAnio + ' ' + sHrs + ':' + sMin + ':' + sSeg;
	
	return sResultado
}


/******************************************************************************
  Autor: STG  
  
  nComparaFechas(sFecha1,sFecha2)  
  Función que calcula la diferencia en días, haciendo la resta de Fecha2 - Fecha1.
  - Si el resultado es un numero positivo, será que Fecha2 > Fecha1.
  - Si el resultado es un numero positivo, será que Fecha1 > Fecha.
  - Si el resultado es 0, será que Fecha1 = Fecha2
  
  NOTA: Esta función presupone que las fechas están en Formato "dd/mm/yyyy"
****************************************************************************/
function nComparaFechas(sFecha1,sFecha2){
	
	splitstring = sFecha1.split("/");
	dia=splitstring[0];
	mes=splitstring[1];
	anyo=splitstring[2];
	var dFecha1=new Date(anyo,mes-1,dia);  //OJO!,restamos 1 porque los meses empiezan en 0 para JavaScript,es decir,Enero es el mes 0.
	
	splitstring = sFecha2.split("/");
	dia=splitstring[0];
	mes=splitstring[1];
	anyo=splitstring[2];
	var dFecha2=new Date(anyo,mes-1,dia);
	
	//Usamos getTime para calcular la diferencia entre las fechas,pero
	//el resultado lo devuelve en milisegundos
	var nDiferencia = dFecha2.getTime() - dFecha1.getTime();
	//Pasamos de milisegundos a días
	var nDias = Math.floor(nDiferencia / (1000 * 60 * 60 * 24));
	
	return nDias;
}


/******************************************************************************
  Autor: STG  
  
  GetHoraActual(control)  
  Función que devuelve la hora actual del sistema en formato hh:mm,
  y la escribe en el campo pasado en la variable control.
****************************************************************************/
function GetHoraActual(control) {
	time = new Date();
	
	hr = time.getHours();
	mins = time.getMinutes();
	//secs = time.getSeconds();
	
	if (hr.toString().length < 2)
	    hr = '0' + hr;
	
	if (mins.toString().length < 2) 
	    mins = '0' + mins;
	
	eval('document.' + control + '.value="' + hr + ':' + mins + '"');
  
}
//******************************************************************************************************
//Día de la semana
//Función que devuelve el día de la semana de la fecha recibida (1=lunes, 2=martes... 7=domingo)
//*****************************************************************************************************
function DiaDeLaSemana(day,month,year) {
	var a = Math.floor((14 - month)/12);
	var y = year - a;
	var m = month + 12*a - 2;
	var d = (day + y + Math.floor(y/4) - Math.floor(y/100) + Math.floor(y/400) + Math.floor((31*m)/12)) % 7;
	if (d==0) {d=7;}
	return d;		
}
		
//******************************************************************************************************
//Último día del mes
//Función que devuelve el número de días del mes recibido según el año
//*****************************************************************************************************
function UltimoDiaMes(mes, ano){
	if ((mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12)) 
			Ultimodia = 31

	if ((mes == 4 || mes == 6 || mes == 9 || mes == 11))
			Ultimodia = 30
	if (mes == 2){
		if (IsYearBisiesto(ano) == true) 
			Ultimodia = 29
		else
			Ultimodia = 28
		
	}
	return (Ultimodia)
}

//calcular la edad de una persona 
//recibe la fecha como un string en formato español 
//devuelve un entero con la edad. Devuelve false en caso de que la fecha sea incorrecta o mayor que el dia actual 
function calcular_edad(fecha){ 

    //calculo la fecha de hoy 
    hoy=new Date() 
    //alert(hoy) 

    //calculo la fecha que recibo 
    //La descompongo en un array 
    var array_fecha = fecha.split("/") 
    //si el array no tiene tres partes, la fecha es incorrecta 
    if (array_fecha.length!=3) 
       return false 

    //compruebo que los ano, mes, dia son correctos 
    var ano 
    ano = parseInt(array_fecha[2]); 
    if (isNaN(ano)) 
       return false 

    var mes 
    mes = parseInt(array_fecha[1]); 
    if (isNaN(mes)) 
       return false 

    var dia 
    dia = parseInt(array_fecha[0]); 
    if (isNaN(dia)) 
       return false 


    //si el año de la fecha que recibo solo tiene 2 cifras hay que cambiarlo a 4 
    if (ano<=99) 
       ano +=1900 

    //resto los años de las dos fechas 
    edad=hoy.getFullYear()- ano - 1; //-1 porque no se si ha cumplido años ya este año 
    
    //si resto los meses y me da menor que 0 entonces no ha cumplido años. Si da mayor si ha cumplido 
    if (hoy.getMonth() + 1 - mes < 0) //+ 1 porque los meses empiezan en 0 
       return edad 
    if (hoy.getMonth() + 1 - mes > 0) 
       return edad+1 

    //entonces es que eran iguales. miro los dias 
    //si resto los dias y me da menor que 0 entonces no ha cumplido años. Si da mayor o igual si ha cumplido 
    if (hoy.getDate() - dia >= 0) 
       return edad + 1 

    return edad 
} 
