// Objetivo				: Funções de validação de data
// Autor				: Mauricio Bumba
// Data					: 01/06/2006
// Comentários			: Feitas melhorias diversas na antiga FuncaoData.js
// Alterado por			:
// Data					:
// Motivo da alteração	:
// Componentes usados	:
// Premissas			: 
// Entradas				: 
// Retorno				:

// Objetivo : Adiciona unidades de data conforme parametros passados
// Premissas : ValidaData, ConverteData, DateToStr
// Entradas : strType ("d"-dia ; "m"-mês ; "y"-ano)
//			  intQuant - valor a ser somado
//			  strDate - data a ter o valor somado	
// Saídas : data somada
function SomaData (strType, intQuant, strDate) 
{
	var strOut;			//Varíavel de retorno da função
	var dtmIn;			//Variável que armazenará a data com o incremento
	var intDia;			//Armazena o dia
	var intMes;			//Armazena o mês
	var intAno;			//Armazena o ano
	
	strOut = '';
	
	if (ValidaData (strDate)) 
	{
		dtmIn = ConverteData (strDate);
		
		switch (strType) 
		{
			case 'd':
				intDia = dtmIn.getDate();
				intDia += Number(intQuant);
				dtmIn.setDate (intDia);
				break;
				
			case 'm':
				intMes = dtmIn.getMonth();
				intMes += Number(intQuant);
				dtmIn.setMonth (intMes);
				break;
			
			case 'y':
				intAno = dtmIn.getFullYear();
				intAno += Number(intQuant);
				dtmIn.setFullYear (intAno);
				break;
				
		}
		
		strOut = DateToStr(dtmIn);
	}
	else 
	{
		strOut = 'Data inválida';
	}
		
	return (strOut);
}



// Objetivo : Função usada pelo DateAdd
// Premissas : 
// Entradas : Data como string
// Saídas : data convertida
function ConverteData (strDate) 
{
	var strDia;		//Armazena o dia
	var strMes;		//Armazena o mês
	var strAno;		//Armazena o ano
	var dtmValor;	//Variável de retorno da data convertida

	strDia = strDate.substr (0, 2);
	strMes = strDate.substr (3, 2);
	strAno = strDate.substr (6, 4);
	
	dtmValor = new Date (strAno, Number(strMes) - 1, strDia);

	return (dtmValor);
}


// Objetivo : Converter data em string
// Premissas : 
// Entradas : Data a ser convertida
// Saídas : Data convertida em string
function DateToStr (dtmIn) 
{
	var strDia; //Armazena o dia
	var strMonth; //Armazena o mês
	var strYear; //Armazena o ano

	strDia = dtmIn.getDate().toString();
	strMonth = (dtmIn.getMonth() + 1).toString();
	strYear = dtmIn.getFullYear().toString();

	if (strDia.length < 2) 
	{ 
		strDia = '0' + strDia; 
	}
	if (strMonth.length < 2) 
	{ 
		strMonth = '0' + strMonth; 
	}

	return (strDia + "/" + strMonth + "/" + strYear);
}




// Objetivo : Formata a hora na ocorrencia do evento on blur
// Premissas : 
// Entradas : valor do text e nome do text
// Saídas : hora formatada
//function FormataHora (objText, strValor) 
//{
//	if (strValor.length == 4) 
//	{
//		if (strValor.indexOf (":") == -1) 
//		{
//			var strHora = strValor.substr (0, 2);
//			var strMinuto = strValor.substr (2, 2);
//			
//			strValor = strHora + ":" + strMinuto;
//		}
//	}
//	objText.value = strValor;
//	return;
//}



// Objetivo : Formata a data conforme o usuário digita os valores no text
// Premissas : 
// Entradas : valor do text (this)
// Saídas : alert indicando o erro da data
function ValidaData() 
{
	var strData;	//Valor do campo data
	var dtmPat;		//Expressão regular de validação de data
	var arrMatch;	//Array com a data quebrada em dia, mês e ano
	var blnIsLean;	//Indica se o ano é bisexto

	strData = event.srcElement.value;	
	if (strData.length>0)
	{
		dtmPat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/;
		arrMatch = strData.match(dtmPat);

		if (arrMatch == null) 
		{
			alert("Formato de data invalido.")
			event.srcElement.focus();
			event.srcElement.select();
			return;
		}
		else	
		{
			intDia = arrMatch[1]; 
			if (intDia.length==1)
				intDia = '0' + intDia;						
			intMes = arrMatch[3];
			if (intMes.length==1)
				intMes = '0' + intMes;
			intAno = arrMatch[4];
			if (intDia < 1 || intDia > 31) 
			{
				alert("Dia incorreto.");
				event.srcElement.focus();
				event.srcElement.select();
				return;
			}
			if (intMes < 1 || intMes > 12) 
			{ 
				alert("Mês incorreto.");
				event.srcElement.focus();
				event.srcElement.select();
				return;
			}
			if ((intMes==4 || intMes==6 || intMes==9 || intMes==11) && intDia==31) 
			{
				alert("Mês "+intMes+" não tem 31 dias!")
				event.srcElement.focus();
				event.srcElement.select();
				return;
			}
			if (intMes == 2) 
			{ 
				blnIsLean = (intAno % 4 == 0 && (intAno % 100 != 0 || intAno % 400 == 0));
				if (intDia>29 || (intDia==29 && !blnIsLean)) 
				{
					alert("Fevereiro " + intAno + " não tem " + intDia + " dias!");
					event.srcElement.focus();
					event.srcElement.select();
					return;
				}
			}

			if (intAno <= 0 )
			{
				alert("Ano incorreto.");
				event.srcElement.focus();
				event.srcElement.select();
				return;
			}


		}		
		event.srcElement.value = intDia + '/' + intMes + '/' + intAno; 	
		return true;
	}	
}

// Objetivo : Inicializa flag de controle
// Premissas :
// Entradas : valor do text em questao (this)
// Saídas : nenhuma
function SetarEvento(objCtrl)
{
	if (objCtrl.value.length == 0)
	{
		objCtrl.EditaCampo=true;
	}
	else
	{
		objCtrl.EditaCampo=false;
	}
}

// Objetivo : Verifica se a hora é válida
// Premissas :
// Entradas : valor do campo com uma string de hora
// Saídas : alert indicando o erro, caso ocorra
function VerificaHora (strTime) 
{
	var blnIsOk;	//Indica se a hora foi enviada com o formato correto
	var strHora;	//Armazena a hora
	var strMinuto;	//Armazena o minuto
	var strSep;		//Armazena o separador (:)

	blnIsOk = true;

	if (strTime.length != 0)
	{

		if (strTime.length != 5) 
		{
			alert ("Hora inválida, formato deve ser 'HH:MM'.");
			blnIsOk = false;
		}

		if (blnIsOk) 
		{
			strHora = strTime.substr (0, 2);
			strSep =  strTime.substr (2, 1);
			strMinuto = strTime.substr (3, 2);

			if (IsNaN (strHora)) 
			{
				alert ("Hora inválida.");
				blnIsOk = false;
			}

			if (strSep != ":") 
			{
				alert ("Hora inválida, formato deve ser 'HH:MM'.");
				blnIsOk = false;
			}

			if (blnIsOk && IsNaN (strMinuto)) 
			{
				alert ("Minuto inválido.");
				blnIsOk = false;
			}

			if (blnIsOk && Number (strHora) < 0) 
			{
				alert ("Hora deve ser maior ou igual a zero.");
				blnIsOk = false;
			}

			if (blnIsOk && Number (strHora) > 23) 
			{
				alert ("Hora deve ser menor ou igual a 23.");
				blnIsOk = false;
			}

			if (blnIsOk && Number (strMinuto) < 0) 
			{
				alert ("Minutos devem ser maiores ou iguais a zero.");
				blnIsOk = false;
			}

			if (blnIsOk && Number (strMinuto) > 59) 
			{
				alert ("Minutos não podem ser maiores que 59.");
				blnIsOk = false;
			}
		}
	}
	return blnIsOk;
}

// Objetivo     : Valida se o caracter digitado é um número ou barra de divisão
// Premissas    : 
// Entradas     : valor do caracter
// Saídas       : true ou false indicando se o caracter é válido
function isValidDataDigit(strChar) {
    return ("/0123456789".indexOf(strChar)>=0);
}

// Objetivo     : Valida a digitação apenas de números inteiros
// Premissas    : 
// Entradas     : 
// Saídas       : true ou false indicando se o caracter é válido
function EventValidaKeyData() {
	var strKey; //Valor do evento do teclado
	var blnRet; //Variável de retorno

	strKey = String.fromCharCode(event.keyCode);
	blnRet = ValidaDigitoInteiro(strKey);

	event.returnValue = blnRet;
}

// Objetivo : Formata a data conforme o usuário digita os valores no text
// Premissas : 
// Entradas : valor do text (this)
// Saídas : alert indicando o erro da data
function ValidaDataReduzida() 
{
	var strData;	//Valor do campo data
	var dtmPat;		//Expressão regular de validação de data
	var arrMatch;	//Array que armazena mês e ano

	strData = event.srcElement.value;	
	if (strData.length>0)
	{		
		dtmPat = /^(\d{1,2})(\/|-)(\d{4})$/;
		arrMatch = strData.match(dtmPat);

		if (arrMatch == null) 
		{
			alert("Formato de data invalido.")
			event.srcElement.focus();
			event.srcElement.select();
			return;
		}
		else	
		{
			intMes = arrMatch[1]; 
			if (intMes.length==1)
				intMes = '0' + intMes;									
			intAno = arrMatch[3];
			if (intMes < 1 || intMes > 12) 
			{ 
				alert("Mês incorreto.");
				event.srcElement.focus();
				event.srcElement.select();
				return;
			}
			if (intAno <= 0 )
			{
				alert("Ano incorreto.");
				event.srcElement.focus();
				event.srcElement.select();
				return;
			}


		}		
		event.srcElement.value = intMes + '/' + intAno; 	
		return true;
	}	
}

// Objetivo : Formata a data conforme o usuário digita os valores no text
// Premissas : 
// Entradas : valor do text em questao (this)
// Saídas : nenhuma
function FormataDataReduzida(objCampo) {
	var strValor;			//Valor do campo
	var strValorFormatado;	//Valor formatado do campo
	var strTecla;			//Valor da tecla pressionada
	var blnRetorno;			//Variável de retorno da função
	var intTamanho;         //Tamanho da string

	strValor = objCampo.value;
	strTecla = String.fromCharCode(event.keyCode);
	blnRetorno = (ValidaDigitoInteiro(strTecla));

	event.returnValue = blnRetorno;

	strValorFormatado = new String(objCampo.value);
   	strValorFormatado = SoNumero(strValorFormatado);
   	intTamanho = strValorFormatado.length + 1;

	if (intTamanho > 2){
		objCampo.value = strValorFormatado.substr(0, 2) + '/' + strValorFormatado.substr(2, intTamanho);
	}
}

// Objetivo : Formata a data conforme o usuário digita os valores no text
// Premissas : 
// Entradas : valor do text em questao (this)
// Saídas : nenhuma
function FormataData(objCampo) {
	var strValor;			//Valor do campo
	var strTecla;			//Valor da tecla pressionada
	var strValorFormatado;	//Valor do campo após formatação
	var blnRetorno;			//Retorno para o evento do teclado
	var intTamanho;         //Tamanho da string

	strValor = objCampo.value;
	strTecla = String.fromCharCode(event.keyCode);
	blnRetorno = (ValidaDigitoInteiro(strTecla));

	event.returnValue = blnRetorno;
	
	strValorFormatado = new String(objCampo.value);
   	//strValorFormatado = strValorFormatado.replace("/", "");
   	strValorFormatado = SoNumero(strValorFormatado);
   	intTamanho = strValorFormatado.length + 1;

	if (intTamanho > 2 && intTamanho < 5){
		objCampo.value = strValorFormatado.substr(0, 2) + '/' + strValorFormatado.substr(2, intTamanho);
	}
	if (intTamanho >= 5 && intTamanho < 9){
		objCampo.value = strValorFormatado.substr(0, 2) + '/' + strValorFormatado.substr(2, 2) + '/' + strValorFormatado.substr(4, intTamanho - 4);
	}
}

//***********************************************************************
//Objetivos	: Valida a digitação apenas de números ou hífen
//Premissas	: 
//Entradas	: Captura de evento do teclado
//Saída		: True ou false, indicando se o caractere é valido.
//***********************************************************************
function MascaraData(objCampo) {
	var strValor = objCampo.value; //Conteúdo do campo
	var strTecla = String.fromCharCode(event.keyCode); //Valor da tecla pressionada
	var intPosPrimeiraBarra;
	var intPosSegundaBarra;
	
	var intTamanho; //Tamanho da string

	var blnRetorno = ValidaKeyUpNumero(event.keyCode);
	
	if (!blnRetorno){
		event.returnValue = blnRetorno;
		return;
	}
	
	intTamanho = strValor.length;
	
	intPosPrimeiraBarra = strValor.indexOf("/")
	intPosSegundaBarra = strValor.indexOf("/", intPosPrimeiraBarra + 1)
    
	if ((intTamanho == 2)&&(intPosPrimeiraBarra == -1)){
	    strValor = strValor + "/"
	    objCampo.value = strValor;
	    return;
	}
	
	if ((intTamanho == 3)&&(intPosPrimeiraBarra == -1)){
	    strValor = strValor.substr(0,2) + "/" + strValor.substr(2,1)
	    objCampo.value = strValor;
	    return;
	}
	
	if ((intTamanho == 4)&&(intPosPrimeiraBarra == -1)){
	    strValor = strValor.substr(0,2) + "/" + strValor.substr(2,2)
	    objCampo.value = strValor;
	    return;
	}
	
	if ((intTamanho == 5)&&(intPosSegundaBarra == -1)){
	    strValor = strValor + "/"
	    objCampo.value = strValor;
	    return;
	}
	
	if ((intTamanho >= 6)&&(intPosSegundaBarra == -1)){
	    strValor = SoNumero(strValor);
	    strValor = strValor.substr(0,2) + '/' + strValor.substr(2,2) + '/' + strValor.substr(4, intTamanho);
	    if (strValor.length > 10){
	        strValor = strValor.substr(0,10)
	    }
	    objCampo.value = strValor;
	    return;
	}
	return;	
}

//***********************************************************************
//Objetivos	: Valida a digitação apenas de números ou hífen
//Premissas	: 
//Entradas	: Captura de evento do teclado
//Saída		: True ou false, indicando se o caractere é valido.
//***********************************************************************
function MascaraDataReduzida(objCampo) {
	var strValor = objCampo.value; //Conteúdo do campo
	var strTecla = String.fromCharCode(event.keyCode); //Valor da tecla pressionada
	var intPosPrimeiraBarra;
	
	var intTamanho; //Tamanho da string

	var blnRetorno = ValidaKeyUpNumero(event.keyCode);
	
	if (!blnRetorno){
		event.returnValue = blnRetorno;
		return;
	}
	
	intTamanho = strValor.length;
	
	intPosPrimeiraBarra = strValor.indexOf("/")
    
	if ((intTamanho == 2)&&(intPosPrimeiraBarra == -1)){
	    strValor = strValor + "/"
	    objCampo.value = strValor;
	    return;
	}
	
	if ((intTamanho == 3)&&(intPosPrimeiraBarra == -1)){
	    strValor = strValor.substr(0,2) + "/" + strValor.substr(2,1)
	    objCampo.value = strValor;
	    return;
	}
	
	if ((intTamanho == 4)&&(intPosPrimeiraBarra == -1)){
	    strValor = strValor.substr(0,2) + "/" + strValor.substr(2,2)
	    objCampo.value = strValor;
	    return;
	}
	
	if ((intTamanho >= 4)&&(intPosSegundaBarra == -1)){
	    strValor = SoNumero(strValor);
	    strValor = strValor.substr(0,2) + '/' + strValor.substr(4, intTamanho);
	    if (strValor.length > 7){
	        strValor = strValor.substr(0,7)
	    }
	    objCampo.value = strValor;
	    return;
	}
	return;	
}