//======================================
//Nome: GenJsValidateDate
//Linguagem: JavaScript
//Descrição: Essa função recebe uma data e a valida respeitando os parâmetros passados
//
//Autor: Equipe Biblioteca Marlin
//
//Data: 12/06/2002
//
//Parâmetros de entrada:
//	- pStrFormattedR	=> Data de retorno no formato YYYYMMDD
//	- pStrToValidate	=> Data a ser validada
//	- pIntDateFormat	=> Formato de estruturação da data
//								1 - dd/mm/aaaa
//								2 - mm/dd/aaaa
//	- pStrDelimiter		=> Separador de dia, mês e ano
//	- pStrMinDate		=> A data não pode ser mais antiga que esse parâmetro
//	- pStrMaxDate		=> A data não pode ser mais recente que esse parâmetro
//	- pIntOptional		=> Se a data é opcional ou obrigatória
//								0 - obrigatória
//								1 - opcional
//	- 
//Retorno: Código de erro
//
//Informações adicionais:
//	+ Funções:
//		- GenJsStrPadding(pStrFormattedR, pStrToPad, pStrPad, pIntTam, pIntSideToPad)
//		- FncJsVerifyIntParameter(pParam, pIntDefValue)
//		-
//	+ Includes:
//		-
//	+ Objetos:
//		-
//	+ Stored Procedures:
//		-
//Historico Alteracao:
//	- 12/06/2002 Thyago Consort
//	-
//======================================
function GenJsValidateDate(pStrFormattedR, pStrToValidate, pIntDateFormat, pStrDelimiter, pStrMinDate, pStrMaxDate, pIntOptional) {
	var lStrFormatted = '';
	var lLngDay = 0;
	var lLngMonth = 0;
	var lLngYear = 0;
	var lIntIndDay;
	var lIntIndMonth;
	var lIntIndYear;
	var lIntMaxDay = 0;
	var lReDtPattern;
	var lStrAux = new Array;
	var lArrDate = new Array;
	var p = new Array;
	
	lStrFormatted = pStrToValidate;
	pStrFormattedR[0] = '';
	
	//Verificando parâmetros de entrada e valores default
	p[0] = pIntDateFormat;
	if (!FncJsVerifyIntParameter(p,1)) {
 		return -11;
        }   
	pIntDateFormat = p[0];
	
	p[0] = pIntOptional;
	if (!FncJsVerifyIntParameter(p,1))
 		return -11;
	pIntOptional = p[0];
	
	if ( (pStrDelimiter == null) || (pStrDelimiter == '') )
		pStrDelimiter = '/';
	if (pStrMinDate == null)
		pStrMinDate = '';
	if (pStrMaxDate == null)
		pStrMaxDate = '';
	
	//Se vazio e obrigatório, ERRO, senão não há o que validar
	if (lStrFormatted.length == 0) {
		if (pIntOptional == 0)
			return -220;
		return 0;
	}
	
	//Testa o formato da string	
	lReDtPattern = new RegExp("^\\d{1,2}" + pStrDelimiter + "\\d{1,2}" + pStrDelimiter  + "\\d{4}" + "$");						
	if (!lReDtPattern.test(lStrFormatted)) {
		return -221;
        }
	
	//Verifica dia, mes, ano de acordo com o formato	
	lArrDate = lStrFormatted.split(pStrDelimiter);
	switch(pIntDateFormat){
	case 1: //dd/mm/yyyy
		lIntIndDay = 0;
		lIntIndMonth = 1;
		lIntIndYear = 2;
		break;
		
	case 2: //mm/dd/yyyy
		lIntIndDay = 1;
		lIntIndMonth = 0;
		lIntIndYear = 2;
		break;
		
	default:
		return -11;
	}
	
	//Converte dia, mês, ano de acordo com formato
	lLngDay = parseInt(lArrDate[lIntIndDay],10);
	lLngMonth = parseInt(lArrDate[lIntIndMonth],10);
	lLngYear = parseInt(lArrDate[lIntIndYear],10);
	
	//Calcula limite do dia
	lIntMaxDay = 31;
	switch(lLngMonth){
	case 2:
		lIntMaxDay = 28;
		if (lLngYear/4 == Math.round(lLngYear/4))
			lIntMaxDay = 29;
		break;
	
	case 4:
	case 6:
	case 9:
	case 11:
		lIntMaxDay = 30;
		break;
	}
	
	//Verificando validade do conteudo da data
	if (lLngYear < 1)
		return -221;
	if ((lLngMonth < 1) || (lLngMonth > 12))
		return -221;
	if ((lLngDay < 1) || (lLngDay > lIntMaxDay))
		return -221;
	
	//Montando data de retorno no formato YYYYMMDD
	GenJsStrPadding(lStrAux,lArrDate[lIntIndYear],'0',4,0);
	lStrFormatted = lStrAux[0];
	GenJsStrPadding(lStrAux,lArrDate[lIntIndMonth],'0',2,0);
	lStrFormatted = lStrFormatted + lStrAux[0];
	GenJsStrPadding(lStrAux,lArrDate[lIntIndDay],'0',2,0);
	lStrFormatted = lStrFormatted + lStrAux[0];
	
	//Formato OK => atualizar o valor do retorno 
	pStrFormattedR[0] = lStrFormatted;
	
	//Verificando se a data é maior que a data mínima e menor que a máxima
	if (pStrMinDate != '')
		if (pStrFormattedR < pStrMinDate)
			return -222;
	if (pStrMaxDate != '')
		if (pStrFormattedR > pStrMaxDate)
			return -223;
	
	return 0;
			
}