function DateValidation( dateSrc)
{
	this.dtSrc= dateSrc;
	this.dtValue= "";
	this.isDate= _isDate;
	this.getDateValue= _getDateValue;
	this.getMonthDateValue= _getMonthDateValue;
}

function _getDateValue(){ return(this.dtValue); }
function _getMonthDateValue(){ return(String(this.dtValue).substring(3)); }

function _isDate()
{
	 var vr = trim(this.dtSrc);
	 if (vr.length >= 6 && vr.length <= 10)
	 {
		 token = new Array();
		 i = 0;
		 j = 0;
		 nBar = 0;
		 nDig = 0;
		 while (i < vr.length)
		 {
			 if (vr.substring(i, i+1) >= '0' && vr.substring(i, i+1) <= '9'){
				 str = "" + vr.substring(i, i+1);
				 i++;
				 while (vr.substring(i, i+1) >= '0' && vr.substring(i, i+1) <= '9' && i < vr.length)
				 {
					 str = str + vr.substring(i, i+1);
					 i++;
				 }
				 token[j] = str;
				 j++;
				 nDig++;
			 }else if (vr.substring(i, i+1) == "/"){
				 str = "" + vr.substring(i, i+1);
				 token[j] = str;
				 j++;
				 i++;
				 nBar++;
			 }else{
				 i++;
			 }
		 }
		 //verifica quantas barras e digitos foram reconhecidos
		 //nBar == 0 e nDig == 1  - formato 01012000
		 //nBar == 2 e nDig == 3  - formato 01/10/2000
		 //para quaisquer outros formatos não faz formatação, ocasionando em erro
		 if ((nBar == 0 && nDig == 1) || (nBar == 2 && nDig == 3))
		 {
			 if (token.length == 1){ //um token de tamanho minimo 6, maximo 8
				 dia = token[0].substring(0, 2);
				 mes = token[0].substring(2, 4);

				 if (token[0].length == 6){
					 if (eval(token[0].substring(4, 6)) < 30)
						 ano = "20" + token[0].substring(4, 6);
					 else
						 ano = "19" + token[0].substring(4, 6);
				 }
				 else
				 if (token[0].length == 8)
					 ano = token[0].substring(4, 8);
				 else
					 ano = token[0].substring(4, token[0].length);

				 //alert(dia + "/" + mes + "/" + ano);
				 this.dtValue= dia + "/" + mes + "/" + ano;
			 }else
			 if (token.length == 5){ //5 tokens indicam data no formato dd/mm/aa
				 if (token[0].length == 1 && eval(token[0]) < 10)
					 dia = "0" + token[0];
				 else
					 //pega os dois primeiros digitos e ignora o restante se houver
					 dia = token[0].substring(0, 2);
				 barra1 = token[1]; //pega barra
				 if (token[2].length == 1 && eval(token[2]) < 10)
					 mes = "0" + token[2];
				 else
					 //pega os dois primeiros digitos e ignora o restante se houver
					 mes = token[2].substring(0, 2);

				 barra2 = token[3]; //pega barra

				 if (token[4].length == 2){
					 if (eval(token[4]) < 30)
						 ano = "20" + token[4];
					 else
						 ano = "19" + token[4];
				 }
				 else
					 ano = token[4];
				 //alert(dia + barra1 + mes + barra2 + ano);
				 this.dtValue= dia + barra1 + mes + barra2 + ano;
			 }
		 }
	 }
	 var err=0;
	 var psj=0; 

	 if( this.dtValue.length != 10)
		 err=4;
	 else
	 {
		 dia = this.dtValue.substring(0, 2); // day 
		 barra1 = this.dtValue.substring(2, 3); // '/' 
		 mes = this.dtValue.substring(3, 5); // month 
		 barra2 = this.dtValue.substring(5, 6); // '/' 
		 ano = this.dtValue.substring(6, 10); // year 
		 //basic error checking 
		 if (mes < 1 || mes >12) err = 1;
		 if (barra1 != '/') err = 4;
		 if (dia < 1 || dia > 31) err = 2;
		 if (barra2 != '/') err = 4 
		 if (ano < 1900 || ano > 2100) err = 3 
		 if (mes == 4 || mes == 6 || mes == 9 || mes == 11){ 
			 //advanced error checking 
			 // months with 30 days 
			 if (dia == 31) err=4 
		 } 
		 if (mes == 2){ 
			 // february, leap year 
			 var g = parseInt(ano/4) 
			 if (isNaN(g)) { 
				 err=4 
			 } 
			 if (dia > 29) err=4 
			 if (dia == 29 && ((ano/4)!=parseInt(ano/4))) err=4 
		 } 
	 }
	if( err > 0)
		 return false;
	else
		return true;
}

/*Objeto que contém métodos úteis para validação de datas*/ 
function DateObj(dt)
{
	if(typeof(dt)=='string' && dt.length==10)
	{
		this.isValid=true;
		this.day=dt.substring(0,2);
		this.month=dt.substring(3,5);
		this.year=dt.substring(6,10);
		this.daysTo=_DaysTo;
		this.lesserThan=_LesserThan;
	}
	else
	{
		this.isValid=false;
	}	
}
function _LesserThan(dt)
{
	var start=Number(this.year+this.month+this.day);
	var finish=Number(dt.year+dt.month+dt.day);
	if(start<finish) return true;
	else return false;
}
function _DaysTo(dt)
{
	var msDay=24*60*60*1000; //Milisegundo existentes em um dia
	var start=new Date(this.month+"/"+this.day+"/"+this.year);
	var finish=new Date(dt.month+"/"+dt.day+"/"+dt.year);
	var time=(finish.getTime()-start.getTime());
	return(Math.floor(time/msDay));
}
//Essa função verifica se duas datas são válidas, verificando se a primeira é  //
//maior que a segunda e se as duas estão dentro de um período pré determinado  //
function isInInterval(dtInicial,dtFinal,pInicial,pFinal)
{
		var sDate=new DateObj(dtInicial);
		var fDate=new DateObj(dtFinal);
		var sPer=new DateObj(pInicial);
		var fPer=new DateObj(pFinal);
		if(sDate.isValid && fDate.isValid && sPer.isValid && fPer.isValid)
		{
			if(fDate.lesserThan(sDate))
			{
				alert('Data inicial maior que a data final. Verifique!');
				return false;
			}
			else if(sDate.lesserThan(sPer)||fPer.lesserThan(fDate))
			{
				alert('Data está fora do período disponível');
				return false;
			}
			return true;
		}
}
//Essa função verifica se o intervalo entre duas datas é igual ou inferior ao  //
//limite pré-determinado:                                                      //
function isInDaysLimit(dtInicial,dtFinal,dias)
{
	var sDate=new DateObj(dtInicial);
 var fDate=new DateObj(dtFinal);
	if(sDate.isValid && fDate.isValid)
	{
		if((sDate.daysTo(fDate)+1)>dias)
		{
			alert('O intervalo é maior que o número de dias permitido para este relatório('+ dias+' dias).');
			return false;
		}
		return true;
	}
}
