/**
@name LibDataTitulo.js
@description Implementa métodos para validação das datas de vencimento de um título
@methods
@created 08/06/2004
@author Jorge Bittencourt
*/



//*************************************************************************************************************
/**
@name LibDataTitulo
@description Construtor dessa classe
@created 08/06/2004
@param inputTipoVencimento: o nome do input que contém a lista do tipo de vencimento
@param inputDtVencimento: o nome do input que contém a data de vencimento do título
@param inputDtDocumento: o nome do input que contém a data do documento
@param inputCategoria: o nome do input que contém a categoria do título
@param inputConfirmacaoDtVencimento: o nome do nome do input que guarda a confirmação do usuário de que aceita a data 
 de vencimento mesmo que esta seja anterior à data do documento ou mais de 1 ano posterior. A 
 razão desse campo existir é para o usuário não ser chateado por várias mensagens de confirmação
 mesmo ele já tendo confirmado
@param inputConfirmacaoDtVencimento: o nome do mesmo do último parâmetro, só que guarda a confirmação
 da data do documento
@param inputDtHoje: o nome do input que contém a data de hoje do servidor
@param inputDtDesconto1: o nome do input que contém a primeira data de desconto
@param inputDtDesconto2: o nome do input que contém a segunda data de desconto
@param inputDtDesconto3: o nome do input que contém a terceira data de desconto
@param msgDataVenctoInvalida: a mensagem a ser exibida quando o usuário preenche uma data de
 vencimento inválida
@param msgDataDocumentoInvalida: a mensagem a ser exibida quando o usuário preenche uma data de
 documento inválida 
@param msgDtVencimentoAusente: a mensagem a ser exibida quando o usuário clica no botão Enviar quando o
 tipo de vencimento é No Vencimento e a data de vencimento está ausente. Note que, se a data
 estiver presente, ela já terá sido validada
@param msgDtDocumentoAusente: a mensagem a ser exibida quando a data do documento está ausente. 
 Note que, se a data estiver presente, ela já terá sido validada
@param msgDtVctoCategoria3: a mensagem a ser exibida quando a data de vencimento é igual à data atual e 
 a categoria de cobrança é 3
@param msgDtDescontoMaiorDtVcto: a mensagem a ser exibida quando alguma data de desconto é superior à data
 de vencimento
@param msgDtDescontoMenorDtDocumento: a mensagem a ser exibida quando alguma data de desconto é menor que a
 data do atual
@param inclusao: determina se o título está sendo incluso ou alterado
@return Não retorna nada
@author Jorge Bittencourt
*/
function LibDataTitulo(inputTipoVencimento, inputDtVencimento, inputDtDocumento, inputCategoria, 
	inputConfirmacaoDtVencimento, inputConfirmacaoDtDocumento, inputDtHoje, inputDtDesconto1, inputDtDesconto2,
	inputDtDesconto3, msgDataVenctoInvalida, msgDataDocumentoInvalida, msgDtVencimentoAusente, msgDtDocumentoAusente, 
	msgDtVctoCategoria3, msgDtDescontoMaiorDtVcto, msgDtDescontoMenorDtDocumento, inclusao)
{
	// recupere os inputs e armazene referências a eles
	eval("this.inputTipoVencimento = document.getElementById('" + inputTipoVencimento + "')");
	eval("this.inputDtVencimento = document.getElementById('" + inputDtVencimento + "')");
	eval("this.inputDtDocumento = document.getElementById('" + inputDtDocumento + "')");
	eval("this.inputCategoria = document.getElementById('" + inputCategoria + "')");
	eval("this.inputConfirmacaoDtVencimento = document.getElementById('" + inputConfirmacaoDtVencimento + "')");
	eval("this.inputConfirmacaoDtDocumento = document.getElementById('" + inputConfirmacaoDtDocumento + "')");
	eval("this.inputDtHoje = document.getElementById('" + inputDtHoje + "')");
	eval("this.inputDtDesconto1 = document.getElementById('" + inputDtDesconto1 + "')");
	eval("this.inputDtDesconto2 = document.getElementById('" + inputDtDesconto2 + "')");
	eval("this.inputDtDesconto3 = document.getElementById('" + inputDtDesconto3 + "')");	
		
	// armazene as mensagens
	this.msgDataVenctoInvalida = msgDataVenctoInvalida;
	this.msgDataDocumentoInvalida = msgDataDocumentoInvalida;
	this.msgDtVencimentoAusente = msgDtVencimentoAusente;
	this.msgDtDocumentoAusente = msgDtDocumentoAusente;
	this.msgDtVctoCategoria3 = msgDtVctoCategoria3;
	this.msgDtDescontoMaiorDtVcto = msgDtDescontoMaiorDtVcto;
	this.msgDtDescontoMenorDtDocumento = msgDtDescontoMenorDtDocumento;
  this.inclusao = inclusao;
  	
	// crie as funções private dessa classe - não devem ser usadas fora dessa classe
	this.ValideDtVcto = ValideDtVcto;
	this.ValideDtDocumento = ValideDtDocumento;
	this.LimpeConfirmacaoDtDocumento = LimpeConfirmacaoDtDocumento;
	this.LimpeConfirmacaoDtVencimento = LimpeConfirmacaoDtVencimento;
	this.CompareDatasUmAno = CompareDatasUmAno;
	this.ValideDtDesconto = ValideDtDesconto;
	this.Valide = ValideNoEnviar;
	this.ConfirmeProtesto = ConfirmeProtesto;
	
	// determine a função que valida todas as datas de título na hora do usuário clicar no botão
	// enviar
	this.isValid = pfnValideValorTitulo;
}


//*************************************************************************************************************
/**
@name LimpeConfirmacaoDtDocumento
@description Limpe a confirmação do usuário da data do documento quando o usuário mudar o 
 valor da data de documento
@created 08/06/2004
@return Não retorna nada
@author Jorge Bittencourt
*/
function LimpeConfirmacaoDtDocumento()
{
	this.inputConfirmacaoDtDocumento.value = "";
}


//*************************************************************************************************************
/**
@name LimpeConfirmacaoDtVencimento
@description Limpe a confirmação do usuário da data de vencimento quando o usuário mudar o 
 valor da data de vencimento
@created 08/06/2004
@return Não retorna nada
@author Jorge Bittencourt
*/
function LimpeConfirmacaoDtVencimento()
{
	this.inputConfirmacaoDtVencimento.value = "";
}


//*************************************************************************************************************
/**
@name ValideDtDesconto
@description Valida se alguma data de desconto é superior à data de vencimento e se a data de desconto é menor
 que a data do documento
@created 27/06/2004
@return Não retorna nada
@author Jorge Bittencourt
*/
function ValideDtDesconto()
{
	var input = null;
	try
	{  
  	// verifique se algum desconto foi informado na primeira data
		if (pfnTrim(this.inputDtDesconto1.value).length > 0)
		{
			// verifique se alguma data de desconto é menor que a data do documento
			// como as datas de desconto são crescentes, só é necessário verificar a primeira data
			if (pfnCompareDatas(this.inputDtDesconto1.value,  this.inputDtHoje.value) > 0)
			{
				input = this.inputDtDesconto1;
				throw this.msgDtDescontoMenorDtDocumento;
			}
			
			// as próximas verificações só devem ser feitas se o tipo de vencimento for
			// no vencimento
			if (this.inputTipoVencimento.selectedIndex == 0 &&  this.inputDtVencimento.value !=0)
			{
  				// verifique se a data de desconto é maior que a data de vencimento
  				if (pfnCompareDatas(this.inputDtDesconto1.value, this.inputDtVencimento.value) < 0)
  				{
  					input = this.inputDtDesconto1;
  					throw this.msgDtDescontoMaiorDtVcto;
  				}
    			// verifique se a segunda data foi informada e se a data de desconto é maior que a data de vencimento
    			else if (pfnTrim(this.inputDtDesconto2.value).length > 0 && pfnCompareDatas(this.inputDtDesconto2.value, this.inputDtVencimento.value) < 0)
    			{
    				input = this.inputDtDesconto2;
    				throw this.msgDtDescontoMaiorDtVcto;
    			}
    			// verifique se a segunda data foi informada e se a data de desconto é maior que a data de vencimento
    			else if (pfnTrim(this.inputDtDesconto3.value).length > 0 && pfnCompareDatas(this.inputDtDesconto3.value, this.inputDtVencimento.value) < 0)
    			{
    				input = this.inputDtDesconto3;
    				throw this.msgDtDescontoMaiorDtVcto;
    			}
    		}
    }
    return true;
	}
	catch (e)
	{
		alert(e);
		input.select();
		input.focus();
		return false;
	}
}

//*************************************************************************************************************
/**
@name ValideDtDocumento
@description Valida a data de documento, verificando se esta é posterior à data atual
 ou anterior a 1 ano da data atual
@created 08/06/2004
@return Não retorna nada
@author Jorge Bittencourt
*/
function ValideDtDocumento()
{
	// obtenha as datas atual e a do documento
	var dataDocumento = this.inputDtDocumento.value;
	var dataAtual = this.inputDtHoje.value;

	// se a data de documento não for válida, saia, sem validar mais nada
	if (!pfnValideFormateData(this.inputDtDocumento, this.msgDataDocumentoInvalida))
		return true;

	// primeiro verifique se a data é posterior à data atual
	if (pfnCompareDatas(dataAtual, dataDocumento) > 0)
	{
		alert("Data do documento (" + dataDocumento + ") posterior à data atual");
		this.inputDtDocumento.select();
		this.inputDtDocumento.focus();
	}
	else
		this.CompareDatasUmAno(dataDocumento, dataAtual, 
		"Data do documento (" + dataDocumento + ") anterior a um ano da data atual.\nConfirma?", 
		this.inputDtDocumento, this.inputConfirmacaoDtDocumento);
}


//*************************************************************************************************************
/**
@name ValideDtVcto
@description Valida a data de vencimento, verificando se esta é anterior ou posterior a 1 ano
 da data atual e, opcionalmente, se é anterior à data atual
@created 22/03/2004
@return Não retorna nada
@author Jorge Bittencourt
*/
function ValideDtVcto()
{
	// primeiro verifique se o tipo de vencimento é no vencimento, caso contrário nem existe data
	// a ser validada
	if (this.inputTipoVencimento.selectedIndex != 0)
		return true;

	//alert("data válida = " + pfnValideFormateData(this.inputDtVencimento, this.msgDataInvalida));
	// se a data de vencimento não for válida, saia, sem validar mais nada
	if (!pfnValideFormateData(this.inputDtVencimento, this.msgDataVenctoInvalida))
		return false;
	
	// recupere a data de vencimento e a data de hoje
	var dataVencimento = this.inputDtVencimento.value;
	var dataHoje = this.inputDtHoje.value;
	
	// se o título está sendo alterado, a data de vencimento deve ser maior que a data atual
	if (!this.inclusao)
	{  
  	if (pfnCompareDatas(dataVencimento, dataHoje) > 0)
  	{
      alert("A data de vencimento deve ser maior que a data atual");
			this.inputDtVencimento.select();
			this.inputDtVencimento.focus();      
    }
  }
  else
  {
  	// verifique se a data é um ano posterior da atual
  	if (this.CompareDatasUmAno(dataHoje, dataVencimento, 
  		"Data de vencimento (" + dataVencimento + ") posterior a um ano da data atual.\nConfirma?", 
  		this.inputDtVencimento, this.inputConfirmacaoDtVencimento))
  	{
  		// armazene o fato de que o usuário já confirmou essa data
  		this.inputConfirmacaoDtVencimento.value = "y";
  	}
  	
  	// verifique se a data é anterior à atual
  	else if (pfnCompareDatas(dataVencimento, dataHoje) > 0)
  	{
  		// só confirme com o usuário se este já não confirmou para a data de vencimento que está
  		// no formulário
  		if (this.inputConfirmacaoDtVencimento.value == "")
  		{
  			var yesNo = confirm("Data de vencimento (" + dataVencimento + ") menor que a data atual. " +
  			" O título será cadastrado como 'Em carteira, vencido'.\nConfirma?");

  			if (!yesNo)
  			{
  				this.inputDtVencimento.select();
  				this.inputDtVencimento.focus();
  			}
  			else
  				// armazene o fato de que o usuário já confirmou essa data
  				this.inputConfirmacaoDtVencimento.value = "y";
  		}
    }
	}
}


//*************************************************************************************************************
/**
@name ValideNoEnviar
@description Verifica se o tipo de vencimento informado é No Vencimento e se a data de vencimento
 está presente. Se as duas condições forem verdadeiras, exibe mensagem de erro e focaliza o campo.
@created 09/06/2004
@return true, se a validação tiver sucesso e false caso contrário
@author Jorge Bittencourt
*/
function ValideNoEnviar()
{
	// a data de vencimento
	var dataVencimento = this.inputDtVencimento.value;
	// a data atual
	var dataAtual = this.inputDtHoje.value;
	// a data do documento
	var dataDocumento = this.inputDtDocumento.value;
	
	// a mensagem de erro e o input que será focalizado
	var mensagem, inputToFocus;
	try
	{
		// verifique se a data do documento foi informada
		if (dataDocumento == "")
		{
			inputToFocus = this.inputDtDocumento;
			throw this.msgDtDocumentoAusente;
		}
    // verifique o desconto
    if (!this.ValideDtDesconto())
		{
			return false;
		}
		
		// faça as outras verificações se o tipo de vencimento informado foi "No Vencimento"
		if (this.inputTipoVencimento.selectedIndex == 0)
		{
			// verifique se a data de vencimento foi informada
			if (dataVencimento == "")
			{
				inputToFocus = this.inputDtVencimento;
				throw this.msgDtVencimentoAusente;
			}
			// se for alteração e a data de vencimento for menor que a data atual.
			else	if (!this.inclusao && pfnCompareDatas(dataVencimento, dataAtual) > 0)
			{  
				inputToFocus = this.inputDtVencimento;
				throw "A data de vencimento deve ser maior que a data atual";					   
			}
			// agora verifique se a data de vencimento é menor que a data do documento
			else if (pfnCompareDatas(dataVencimento, dataDocumento) > 0)
			{
				inputToFocus = this.inputDtVencimento;
				throw "Data de vencimento (" + dataVencimento + ") menor que a data do documento (" + dataDocumento + ")";
			}
			// por fim, se a data de vencimento é igual à data atual e a categoria do título for 3, reclame
			else if (this.inputCategoria.selectedIndex == 3 && pfnCompareDatas(dataAtual, dataVencimento) == 0)
			{
				inputToFocus = this.inputDtVencimento;
				throw this.msgDtVctoCategoria3;
			}
		}
		return true;
	}
	catch (e)
	{
		alert(e);
		inputToFocus.select();
		inputToFocus.focus();
		window.scrollTo(0,0);
		return false;
	}
}
