//*******************************************************
//ficheiro: date.js
//CORRIGIDO EM 02/2004
//*******************************************************
//JavaScript: versão 1.2
//*********************************************************************************************************
//Esta biblioteca usa:
//                                        number.js
//*********************************************************************************************************


//***************************************************
//Relação das funções nesta bibioteca
//***************************************************
//daysInMonth(month)-->int
//daysInFebruary(year)-->int
//isLeap(year)-->boolean
//isMonth(s)-->boolean
//isDay(s)-->boolean
//isYear(s)-->boolean
//isDate(year, month, day)-->boolean
//***************************************************


//*****************************************************
//daysInMonth:Array
//*****************************************************
//Array contendo o numero de dias de cada mes.
//Atenção que Fevereiro é um mês especial, o
//valor aqui atribuido é uma mera indicação
//carece de validação pela funcao daysInFebruary(ano)
//*****************************************************
var daysInMonthValues = new Array();
daysInMonthValues[1] = 31;
daysInMonthValues[2] = 29;
daysInMonthValues[3] = 31;
daysInMonthValues[4] = 30;
daysInMonthValues[5] = 31;
daysInMonthValues[6] = 30;
daysInMonthValues[7] = 31;
daysInMonthValues[8] = 31;
daysInMonthValues[9] = 30;
daysInMonthValues[10] = 31;
daysInMonthValues[11] = 30;
daysInMonthValues[12] = 31;

//*****************************************************
//daysInMonth:int-->int
//*****************************************************
//Esta função recebe um inteiro que simboliza um mes,
//exemplo 1 é janeiro, e retorna o número de dias deste.
//Notar o caso excepcional do mes de Fevereiro onde esta
//informação requer um calculo, usando a função
//daysInFebruary.
//nota:utiliza o array daysInMonth(month,year)
//*****************************************************
function daysInMonth(month,year)
{
        if(!isMonth(month)){ return -1}
        
		if(month=='2')
        {
		  return daysInFebruary(year)
		}
        else
        {
		   return daysInMonthValues[month]
		};
}

//************************************************
//dayInFebruary:int-->boolean
//************************************************
//Com a informação do ano verifica se o mes de
//janeiro tem 28 ou 29 dias, ou seja se é ou não
//bissexto.
//notas:
//.função espera receber um inteiro.
//.função auxiliar de isDate(year,month.day)
//************************************************
function daysInFebruary (year)
{
        if(!isPositiveInteger(year)){
                return -1;
        }
                else{
                    return ( isPositiveInteger(year) && isLeap(year) ? 29 : 28 );
            }
}

//************************************************
//isLeap:int-->boolean
//************************************************
//Verifica se um determinado ano é ou não bissexto
//************************************************
function isLeap(year)
{
	
   if ( (year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0)) )
   {
	 return true; 
   }
   else
   {
     return false;
   }
}

//************************************************
//isMonth:int-->boolean
//************************************************
//Verifica se o inteiro representa ou não um mês
//exemplo: o numero 1 representa janeiro enquanto
//enquanto que o numero 12 representa Dezembro.
//notas:
//.função espera receber um inteiro.
//.função auxiliar de isDate(year,month.day)
//************************************************
function isMonth (s)
{
    return (isPositiveInteger(s) && s>=1 && s<=12);
}


//************************************************
//isDay:int-->boolean
//************************************************
//Verifica se o inteiro pode ou nao ser um dia dum
//qualquer mês. É uma verificação genérica que não
//tem em conta a que mês refere o dia. É uma regra
//geral que diz que um dia só pode pertencer a
//um mês se for maior ou igual a 1 e menor ou
//igual a 31.
//notas:
//.função espera receber um inteiro.
//.função auxiliar de isDate(year,month.day)
//************************************************
function isDay (s)
{
    return (isPositiveInteger(s) && s>=1 && s<=31);
}

//************************************************
//isYear:int-->boolean
//************************************************
//Verifica um inteiro pode ou nao ser um ano
//Atenção que são apenas considerados anos, os
//inteiros que tenham 4 digitos e cujo valor seja
//inferior a 9999.
//notas:
//.função espera receber um inteiro.
//.função auxiliar de isDate(year,month.day)
//************************************************
function isYear (s)
{

         return (isPositiveInteger(s) && s.length==4 && s<=9999);
}

//************************************************
//isYear:int,int,int-->boolean
//************************************************
//Recebendo em separado os valores do ano,mes,dia
//em inteiros, verifica se se trata de uma data
//valida ou não
//exemplo de utilização : isYear(1999,2,1), diz
//respeito ao dia 1 de Fevereiro de 1999, e sendo
//uma data correcta, a função responde com true.
//notas:
//.função espera receber 3 inteiros e nao faz
// nenhum tipo de verificacao do tipo de input.
//************************************************
function isDate (year, month, day)
{
    if (! ( isYear(year) && isMonth(month) && isDay(day) )  ) return false;

    if (day > daysInMonth(month,year)) return false;

    return true;
}
