/**
@name LibValorTitulo.js
@description Implementa métodos para validação do valor de um título
@methods
@created 22/03/2004
@author Jorge Bittencourt
*/



//*************************************************************************************************************
/**
@name LibValorTitulo
@description Construtor dessa classe
@created 22/03/2004
@param inputVlTitulo: o input que contém o valor do título
@param inputAbat: o input que contém o valor do abatimento, se algum (se for null o abatimento é ignorado)
@param inputTpDes: o input que contém o tipo do valor do desconto (se for null o valor de desconto é ignorado)
@param inputVlDes: o input que contém o maior valor informado de desconto, se algum (se for null o valor de desconto
 é ignorado)
@param inputTpJuros: o nome do input que contém o tipo dos juros informado (se vier em branco o valor de juros é ignorado)
@param inputVlJuros: o input que contém o valor de juros, se algum (se vier em branco o valor de juros é ignorado)
@param inputVlIof: o input que contém o valor do iof, se algum (se vier em branco o valor de juros é ignorado)
@param inputTpMulta: o input que contém o tipo da multa, se algum (se vier em branco o valor da multa é ignorado)
@param inputVlMulta: o input que contém o valor da multa, se algum (se vier em branco o valor da multa é ignorado)
@param inputDiasMulta: o input que contém o dia da multa, se algum (se vier em branco o valor da multa é ignorado)
@param msgVlTituloInvalido: a mensagem a ser exibida se o valor do título for inválido (caracteres não-numéricos,
 valor não-positivo). Se vier em branco, nenhuma mensagem é exibida
@param msgVlTituloFaltando: a mensagem a ser exibida se o valor do título não for informado. Se vier em branco, 
 nenhuma mensagem é exibida
@param msgAbatInvalido: a mensagem a ser exibida se o valor do abatimento for inválido (caracteres não-numéricos,
 valor não-positivo, valor maior ou igual ao valor do título). Se vier em branco, nenhuma mensagem é exibida
@param msgDesMaior: a mensagem a ser exibida se o valor do desconto for maior ou igual ao valor do título (o valor
 do desconto deve ser um número positivo válido). Se vier em branco, nenhuma mensagem é exibida
@param msgDesAbatMaior: a mensagem a ser exibida se o valor do desconto for maior ou igual ao valor do título, deduzido
 o abatimento. Se vier em branco, nenhuma mensagem é exibida
@param msgVlJurosMaior: a mensagem a ser exibida se o valor dos juros for maior ou igual ao valor do título. Se vier 
 em branco, nenhuma mensagem é exibida
@param msgVlJurosInvalido: a mensagem a ser exibida se o valor dos juros for inválido (caracteres não-numéricos, 
 valor não-positivo). Se vier em branco, nenhuma mensagem é exibida
@param msgVlIofInvalido: a mensagem a ser exibida se o valor do IOF for inválido (caracteres não-numéricos, 
 valor não-positivo). Se vier em branco, nenhuma mensagem é exibida
@param msgVlIofMaior: a mensagem a ser exibida se o valor do IOF for maior ou igual ao valor do título
@param msgJurosFaltando: a mensagem a ser exibida se uma opção de juros for selecionada mas o valor dos juros não 
 for informado
@param msgVlMultaFaltando: a mensagem a ser exibida se um tipo de multa for selecionado e o valor da multa
 não for informado
@param msgDiasMultaFaltando: a mensagem a ser exibida se um tipo de multa que exige um dia for selecionado e o dia
 não for informado
@return Não retorna nada
@author Jorge Bittencourt
*/
function LibValorTitulo(inputVlTitulo, inputAbat, inputTpDes, inputVlDes, inputTpJuros, inputVlJuros, inputVlIof, 
	inputTpMulta, inputVlMulta, inputDiasMulta, msgVlTituloInvalido, msgVlTituloFaltando, msgAbatInvalido, 
	msgDesMaior, msgDesAbatMaior, msgVlJurosMaior, msgVlJurosInvalido, msgVlIofInvalido, msgVlIofMaior, jurosHidden, 
	iofHidden, msgJurosFaltando, msgVlMultaFaltando, msgDiasMultaFaltando)

{

	// recupere os inputs e armazene referências a eles
	this.inputVlTitulo = document.getElementById(inputVlTitulo);
	this.inputAbat = document.getElementById(inputAbat);
	this.inputTpDes = document.getElementById(inputTpDes);
	this.inputVlDes = document.getElementById(inputVlDes);
	this.inputTpJuros = document.getElementById(inputTpJuros);
	this.inputVlJuros = document.getElementById(inputVlJuros);
	this.inputVlIof = document.getElementById(inputVlIof);
	this.inputTpMulta = document.getElementById(inputTpMulta);
	this.inputVlMulta = document.getElementById(inputVlMulta);
	this.inputDiasMulta = document.getElementById(inputDiasMulta);
	
	// armazene se os inputs iof e juros são hidden pois, nesse caso, não é possível dar foco neles
	this.iofHidden = iofHidden;
	this.jurosHidden = jurosHidden;
	
	// armazene as mensagens
	this.msgVlTituloInvalido = msgVlTituloInvalido;
	this.msgVlTituloFaltando = msgVlTituloFaltando;	
	this.msgAbatInvalido = msgAbatInvalido;
	this.msgDesMaior = msgDesMaior;
	this.msgDesAbatMaior = msgDesAbatMaior;
	this.msgVlJurosMaior = msgVlJurosMaior;
	this.msgVlJurosInvalido = msgVlJurosInvalido;
	this.msgVlIofInvalido = msgVlIofInvalido;
	this.msgVlIofMaior = msgVlIofMaior;
	this.msgJurosFaltando = msgJurosFaltando;
	this.msgVlMultaFaltando = msgVlMultaFaltando;
	this.msgDiasMultaFaltando = msgDiasMultaFaltando;
	
	// crie as funções private dessa classe - não devem ser usadas fora dessa classe
	this.ValideValorTitulo = ValideValorTitulo;
	this.ValideAbatimento = ValideAbatimento;
	this.ValideJuros = ValideJuros;
	this.ValideJurosExistente = ValideJurosExistente;
	this.ValideIof = ValideIof;
	this.ValideDesconto = ValideDesconto;
	this.RecupereValores = RecupereValores;
	this.ValideMulta = ValideMulta;
	
	// determine a função que valida todos os valores do título
	this.isValid = pfnValideValorTitulo;
	this.pfnValideValorTituloRecebimento = pfnValideValorTituloRecebimento;	

}
//*************************************************************************************************************
/**
@name pfnValideValorTituloRecebimento
@description Valida os valores de juros, de desconto e de multa
@created 23/03/2004
@return Não retorna nada
*/
function pfnValideValorTituloRecebimento()
{
	try
	{
		// recupere os valores digitados
		this.RecupereValores();

		// valide os juros
		if (this.inputVlJuros != null)
			this.ValideJuros();
	
		// valide o desconto
		if (this.inputVlDes != null)
			this.ValideDesconto();
	
		// valide a multa 
		if (this.inputTpMulta != null)
			this.ValideMulta();
		
		return true;
	}
	
	// houve algum problema na validação
	catch(e)
	{
		// verifique se o problema foi de fato na validação, em cujo caso essa exceção deveria ter uma asterico no
		// meio dela
		if (typeof(e) == "string")
		{
			var partes = e.split("*");
			if (partes.length == 2)
			{
				// a primeira parte é a mensagem a ser mostrada e a segunda o nome do campo a ser focalizado
				alert(partes[0]);
				eval("document.all('" + partes[1] + "').select();");
				eval("document.all('" + partes[1] + "').focus();");
			}
		}
		return false;
	}
}

//*************************************************************************************************************
/**
@name pfnValideValorTitulo
@description Valida os valores de juros, de iof, de desconto, de abatimento e do próprio valor de um título
@created 23/03/2004
@return Não retorna nada
@author Jorge Bittencourt
*/
function pfnValideValorTitulo()
{
	try
	{
		//alert("validação valorTitulo1");
		// recupere os valores digitados
		this.RecupereValores();

		// valide o valor do título
		this.ValideValorTitulo();
		
		// valide o abatimento
		if (this.inputAbat != null)
			this.ValideAbatimento();
		
		// valide os juros
		if (this.inputVlJuros != null)
			this.ValideJuros();
		
		// valide o iof
		if (this.inputVlIof != null)
			this.ValideIof();
		
		// valide o desconto
		if (this.inputVlDes != null)
			this.ValideDesconto();
		
		// valide a multa 
		if (this.inputTpMulta != null)
			this.ValideMulta();
			
		return true;
	}
	
	// houve algum problema na validação
	catch(e)
	{
		// verifique se o problema foi de fato na validação, em cujo caso essa exceção deveria ter uma asterico no
		// meio dela
		if (typeof(e) == "string")
		{
			var partes = e.split("*");
			if (partes.length == 2)
			{
				// a primeira parte é a mensagem a ser mostrada e a segunda o nome do campo a ser focalizado
				alert(partes[0]);
				eval("document.all('" + partes[1] + "').select();");
				eval("document.all('" + partes[1] + "').focus();");
			}
		}
		return false;
	}
}

//*************************************************************************************************************
/**
@name RecupereValores
@description Recupere os valores digitados pelo usuário antes de validar o formulário
@created 22/03/2004
@return Não retorna nada
@author Jorge Bittencourt
*/
function RecupereValores()
{
	// recupere os valores do formulário e converta-os para números
	// primeiro verifique quais validações serão feitas - somente aquelas cujo input o usuário passou
	if (this.inputVlTitulo != null)	
		this.vlTitulo = new Number(pfnToNumeroAmericano(this.inputVlTitulo.value)).valueOf();

	// se o abatimento não precisar ser validado, armazene 0 para que, na possível validação do desconto,
	// eu não tenha que testar novamente o valor do abatimento
	if (this.inputAbat != null)
		this.vlAbat = new Number(pfnToNumeroAmericano(this.inputAbat.value)).valueOf();
	else
		this.vlAbat = 0;

	if (this.inputTpDes != null)
	{
		this.tpDes = new Number(this.inputTpDes.value).valueOf();
		this.vlDes = new Number(pfnToNumeroAmericano(this.inputVlDes.value)).valueOf();
	}
	if (this.inputTpJuros != null)
	{
		this.tpJuros = new Number(this.inputTpJuros.value).valueOf();
		this.vlJuros = new Number(pfnToNumeroAmericano(this.inputVlJuros.value)).valueOf();
	}
	if (this.inputVlIof != null)
		this.vlIof = new Number(pfnToNumeroAmericano(this.inputVlIof.value)).valueOf();
}


//*************************************************************************************************************
/**
@name ValideAbatimento
@description Valida o abatimento de um título (opcional)
@created 22/03/2004
@return Não retorna nada
@author Jorge Bittencourt
*/
function ValideAbatimento()
{
	// só valide o abatimento se este foi informado
	if (this.inputAbat.value != "")
	{
		if (isNaN(this.vlAbat) || this.vlAbat < 0 || this.vlAbat >= this.vlTitulo)
			throw this.msgAbatInvalido + "*" + this.inputAbat.name;
	}
}


//*************************************************************************************************************
/**
@name ValideDesconto
@description Verifica se o valor de desconto é menor do que a soma do valor do título e do abatimento. Assume
 que o valor do desconto já foi previamente validado
@created 22/03/2004
@return Não retorna nada
@author Jorge Bittencourt
*/
function ValideDesconto()
{
	if (this.tpDes == 3)
	{
		// verifique se o valor de juros é menor do que o valor do título
		if (this.vlTitulo <= this.vlDes + this.vlAbat)
		{
			if (this.vlAbat == 0)
				throw this.msgDesMaior + "*" + this.inputVlDes.name;
			else
				throw this.msgDesAbatMaior + "*" + this.inputVlDes.name;
		}
	}
}


//*************************************************************************************************************
/**
@name ValideIof
@description Valida o iof de um título (opcional)
@created 22/03/2004
@return Não retorna nada
@author Jorge Bittencourt
*/
function ValideIof()
{
	// determine o campo que será localizado no caso de erro, já que o campo do iof
	// pode ser hidden
	var campoToFocus;
	if (this.jurosHidden)
		campoToFocus = this.inputVlTitulo.name;
	else
		campoToFocus = this.inputVlIof.name;
		
	// só valide o valor do iof se este foi informado
	if (this.inputVlIof.value != "")
	{
		// verifique se o valor do iof é válido
		if (isNaN(this.vlIof) || this.vlIof < 0)
		{
			throw this.msgVlIofInvalido + "*" + campoToFocus;
		}
		
		// verifique se o valor do iof é maior do que o valor do título
		if (this.vlIof >= this.vlTitulo)
		{
			throw this.msgVlIofMaior + "*" + campoToFocus;
		}
	}		
}


//*************************************************************************************************************
/**
@name ValideJuros
@description Valida os juros de um título (opcional)
@created 22/03/2004
@return Não retorna nada
@author Jorge Bittencourt
*/
function ValideJuros()
{
	// determine o campo que será localizado no caso de erro, já que o campo dos juros
	// pode ser hidden
	var campoToFocus;
	if (this.jurosHidden)
		campoToFocus = this.inputVlTitulo.name;
	else
		campoToFocus = this.inputVlJuros.name;
	// só valide o valor de juros se algum tipo de juros foi selecionado
	if (this.tpJuros != 0 && this.tpJuros != 5)
	{
		// verifique se algum valor de juros foi informado
		if (pfnTrim(this.inputVlJuros.value) == "")
			throw this.msgJurosFaltando + "*" + campoToFocus;
				
		// verifique se o valor de juros é válido
		if (isNaN(this.vlJuros) || this.vlJuros < 0)
			throw this.msgVlJurosInvalido + "*" + campoToFocus;
			
		// verifique se algum valor de juros foi informado igual a zero.
		if (pfnToNumeroAmericano(this.inputVlJuros.value) == 0)
			throw this.msgJurosFaltando + "*" + campoToFocus;

			// verifique se o valor de juros é menor do que o valor do título
			// se o valor dos juros estiver em real, a comparação é com o valor do título
			// se o valor estiver em percentual, não pode ser maior que 99.99
			if (((this.tpJuros == 1 || this.tpJuros == 2) && this.vlJuros >= this.vlTitulo) ||
				((this.tpJuros == 3 || this.tpJuros == 4) && this.vlJuros > 99.99))
			{
				throw this.msgVlJurosMaior + "*" + campoToFocus;
			}
	}
}

//*************************************************************************************************************
/**
@name ValideJurosExistente
@description Valida os juros de um título (opcional), aqui não valida a regra de negocio, valida somente obrigatóriedade.
@created 22/05/2005
@return Não retorna nada
@author Marcos Lopes Conde
*/
function ValideJurosExistente()
{

	// determine o campo que será localizado no caso de erro, já que o campo dos juros
	// pode ser hidden
	var campoToFocus;
	if (this.jurosHidden)
		campoToFocus = this.inputVlTitulo.name;
	else
		campoToFocus = this.inputVlJuros.name;
	// só valide o valor de juros se algum tipo de juros foi selecionado
	if (this.inputTpJuros.value != 0 && this.inputTpJuros.value != 5)
	{
		// verifique se algum valor de juros foi informado
		if (pfnTrim(this.inputVlJuros.value) == "")
			throw this.msgJurosFaltando + "*" + campoToFocus;		
		// verifique se o valor de juros é válido
		if (this.inputVlJuros.value < 0)
			throw this.msgVlJurosInvalido + "*" + campoToFocus;	
		// verifique se algum valor de juros foi informado igual a zero.
		if (pfnToNumeroAmericano(this.inputVlJuros.value) == 0)
			throw this.msgJurosFaltando + "*" + campoToFocus;	
	}
}


//*************************************************************************************************************
/**
@name ValideMulta
@description Valida o valor da multa
@created 28/07/2004
@return Não retorna nada
@author Jorge Bittencourt
*/
function ValideMulta()
{
	// determine se o usuário selecionou um tipo de multa
	if (this.inputTpMulta.selectedIndex > 0 && this.inputTpMulta.selectedIndex < 5)
	{
		// verifique se o usuário informou um valor de multa
		if (pfnToNumeroAmericano(this.inputVlMulta.value) <= 0)
			throw this.msgVlMultaFaltando + "*" + this.inputVlMulta.name;

		// agora verifique se o usuário selecionou um tipo de multa que exige um dia
		if (this.inputTpMulta.selectedIndex == 2 || this.inputTpMulta.selectedIndex == 4)
		{
			if (pfnToNumeroAmericano(this.inputDiasMulta.value) <= 0)
				throw this.msgDiasMultaFaltando + "*" + this.inputDiasMulta.name;
		}
	}
}

//*************************************************************************************************************
/**
@name ValideValorTitulo
@description Valida o valor do título (obrigatório)
@created 22/03/2004
@return Não retorna nada
@author Jorge Bittencourt
*/
function ValideValorTitulo()
{
	// verifique se o valor do título foi informado
	//alert("valor com trim = " + pfnTrim(this.inputVlTitulo.value));
	//alert("length = " + pfnTrim(this.inputVlTitulo.value).length);
	if (pfnTrim(this.inputVlTitulo.value) == "")
		throw this.msgVlTituloFaltando + "*" + this.inputVlTitulo.name;
	
	// verifique se o valor do título é um número válido e positivo
	if (isNaN(this.vlTitulo) || this.vlTitulo <= 0)
		throw this.msgVlTituloInvalido + "*" + this.inputVlTitulo.name;
	
}
