/**
@name DescontoLib.js
@description Implementa métodos para validação de descontos de título em geral, seja a data informada como data
 completa, em dia, ou em data com mês e ano.
@methods 
@created 17/02/2004
@author Jorge Bittencourt
*/



//*************************************************************************************************************
/**
@name DescontoLib
@description Construtor dessa classe.
@created 17/02/2004
@param nomeVlDes1: o nome do input onde o primeiro valor de desconto é digitado
@param nomeVlDes2: o nome do input onde o segundo valor de desconto é digitado
@param nomeVlDes3: o nome do input onde o terceiro valor de desconto é digitado
@param nomeDtDes1: o nome do input onde a primeira data de desconto é digitada
@param nomeDtDes2: o nome do input onde a segunda data de desconto é digitada
@param nomeDtDes3: o nome do input onde a terceira data de desconto é digitada
@param nomeSlTipoDesconto: o nome do select que contém os tipos de desconto.
@param tipoData: o tipo da data em questão: pode ser datas no formato dd/mm/aaaa (0), mm/aaaa (1) e dias (2).
 A função pode ser extendida para acomodar outros tipos de data.
@param ordemValorDecrescente: se true, os valores devem estar em ordem decrescente para serem válidos, caso
 contrário devem estar em ordem crescente.
@param ordemDataDecrescente: se true, as datas devem estar em ordem decrescente para serem válidas, caso
 contrário devem estar em ordem crescente.
@param msgVlPrimeiroDesFaltando: a mensagem a ser exibida se o primeiro valor de desconto estiver ausente
@param msgDtPrimeiroDesFaltando: a mensagem a ser exibida se a primeiro data de desconto estiver ausente
@param msgVlDesOrdemErrada: a mensagem a ser exibida se os valores de desconto estiverem informados na ordem
 errada, segundo o parâmetro ordemDecrescente (se um valor nulo for inserido no meio dos descontos, é essa
 mensagem que será exibida).
@param msgDtDesOrdemErrada: a mensagem a ser exibida se as datas de desconto estiverem informadas na ordem
 errada, segundo o parâmetro ordemDecrescente.
@param msgVlDesFaltando: a mensagem a ser exibida se uma data de desconto for informada mas o seu valor 
 correspondente não for.
@param msgDtDesFaltando: a mensagem a ser exibida se um valor de desconto for informado mas a sua data
 correspondente não for.
@param msgValorInvalido: a mensagem a ser exibida se um valor de desconto inválido é informado (caracteres não-
 numéricos ou valor menor do que zero). A razão de uma mensagem similar não estar presente para a data é por causa
 da variedade de datas que essa lib suporta. Por isso, a validação das datas deve ser feita por outra função.
@param tipoNenhum: o index do select acima que representa o desconto nulo (Nenhum).
@param tipoReal: o index do select acima que representa o desconto em real.
@param tipoPercentual: o index do select acima que representa o desconto em porcentagem.
@param linhaDesconto1: o elemento html da linha de desconto 1
@param linhaDesconto2: o elemento html da linha de desconto 2
@param linhaDesconto3: o elemento html da linha de desconto 3
@param nomeSinalReal1: o nome do elemento html onde o sinal de real do valor de desconto 1 é exibido
@param nomeSinalReal2: o nome do elemento html onde o sinal de real do valor de desconto 2 é exibido
@param nomeSinalReal3: o nome do elemento html onde o sinal de real do valor de desconto 3 é exibido
@param nomeSinalPer1: o nome do elemento html onde o sinal de percentual do valor de desconto 1 é exibido
@param nomeSinalPer2: o nome do elemento html onde o sinal de percentual do valor de desconto 2 é exibido
@param nomeSinalPer3: o nome do elemento html onde o sinal de percentual do valor de desconto 3 é exibido
@param complementoDtDesc1: o nome do elemento html onde o complemento da data de desconto 1 é exibido
@param complementoDtDesc1: o nome do elemento html onde o complemento da data de desconto 2 é exibido
@param complementoDtDesc1: o nome do elemento html onde o complemento da data de desconto 3 é exibido
@return Não retorna nada
@author Jorge Bittencourt
*/
function DescontoLib(nomeVlDes1, nomeVlDes2, nomeVlDes3, nomeDtDes1, nomeDtDes2, nomeDtDes3, nomeSlTipoDesconto, 
	tipoData, ordemValorDecrescente, ordemDataDecrescente, msgVlPrimeiroDesFaltando, msgDtPrimeiroDesFaltando, 
	msgVlDesOrdemErrada, msgDtDesOrdemErrada, msgVlDesFaltando, msgDtDesFaltando, msgValorInvalido, 
	tipoNenhum, tipoReal, tipoPercentual, linhaDesconto1, linhaDesconto2, linhaDesconto3,
	nomeSinalReal1, nomeSinalReal2, nomeSinalReal3, nomeSinalPer1, nomeSinalPer2, nomeSinalPer3,
	complementoDtDesc1, complementoDtDesc2, complementoDtDesc3)
{
	// recupere os inputs e armazene referências a eles
	this.nomeVlDes1 = document.getElementById(nomeVlDes1);
	this.nomeVlDes2 = document.getElementById(nomeVlDes2);
	this.nomeVlDes3 = document.getElementById(nomeVlDes3);
	this.nomeDtDes1 = document.getElementById(nomeDtDes1);
	this.nomeDtDes2 = document.getElementById(nomeDtDes2);
	this.nomeDtDes3 = document.getElementById(nomeDtDes3);
	this.nomeSlTipoDesconto = document.getElementById(nomeSlTipoDesconto);
	this.linhaDesconto1 = document.getElementById(linhaDesconto1);
	this.linhaDesconto2 = document.getElementById(linhaDesconto2);
	this.linhaDesconto3 = document.getElementById(linhaDesconto3);
	this.nomeSinalReal1 = document.getElementById(nomeSinalReal1);
	this.nomeSinalReal2 = document.getElementById(nomeSinalReal2);
	this.nomeSinalReal3 = document.getElementById(nomeSinalReal3);
	this.nomeSinalPer1 = document.getElementById(nomeSinalPer1);
	this.nomeSinalPer2 = document.getElementById(nomeSinalPer2);
	this.nomeSinalPer3 = document.getElementById(nomeSinalPer3);
	this.complementoDtDesc1 = document.getElementById(complementoDtDesc1);
	this.complementoDtDesc2 = document.getElementById(complementoDtDesc2);
	this.complementoDtDesc3 = document.getElementById(complementoDtDesc3);

	this.tipoData = new Number(tipoData).valueOf();
	this.ordemValorDecrescente = ordemValorDecrescente;
	this.ordemDataDecrescente = ordemDataDecrescente;
	this.msgVlPrimeiroDesFaltando = msgVlPrimeiroDesFaltando;
	this.msgDtPrimeiroDesFaltando = msgDtPrimeiroDesFaltando;
	this.msgVlDesOrdemErrada = msgVlDesOrdemErrada;
	this.msgDtDesOrdemErrada = msgDtDesOrdemErrada;
	this.msgVlDesFaltando = msgVlDesFaltando;
	this.msgDtDesFaltando = msgDtDesFaltando;
	this.tipoNenhum = new Number(tipoNenhum).valueOf();
	this.tipoReal = new Number(tipoReal).valueOf();
	this.tipoPercentual = new Number(tipoPercentual).valueOf();
	this.msgValorInvalido = msgValorInvalido;
	
	// se qualquer um dos parâmetros que deveria ter sido passado como número não foi passado, jogue a próxima exceção,
	// o que causará um erro e permitirá que qualquer erro seja resolvido mais rapidamente
	if (isNaN(this.tipoData) || isNaN(this.tipoNenhum) || isNaN(this.tipoReal) || isNaN(this.tipoPercentual))
		throw "Argumento inválido";
	
	// as próximas variáveis determinam quais valores foram digitados pelo usuário na hora de validar os descontos
	this.temValor1 = false;
	this.temValor2 = false;
	this.temValor3 = false;
	this.temData1 = false;
	this.temData2 = false;
	this.temData3 = false;

	// determine a função que valida os descontos
	this.isValid = pfnValideDesconto;
	
	// determine as outras funções private dessa biblioteca - se elas forem chamadas avulsamente, causarão erro
	this.VerifiqueTipoDesconto = VerifiqueTipoDesconto;
	this.VerifiqueValoresDigitados = VerifiqueValoresDigitados;
	this.ValideAusenciaValores = ValideAusenciaValores;
	this.ValideOrdem = ValideOrdem;
	this.InicializeCampos = InicializeCampos;
	this.ValideValorDesconto = ValideValorDesconto;
	// essa é a função básica disponível para o evento onchange do select que contém os tipos de desconto
	// se funcionalidade extra for necessário, é preciso implementar outra função para realizar essa funcionalidade 
	this.pfnDescontoOnChange = pfnDescontoOnChange;

	// inicialize os campos
	this.InicializeCampos();
}


//*************************************************************************************************************
/**
@name CompareDataMMAAAAReverso
@description Faz a comparação de duas datas no formato mm/aaaa no sentido inverso de pfnCompareDatasMesAno. 
 Ver documentação de ValidaçãoData.js para detalhes.
@created 18/02/2004
@return 1 se inicio ou fim não forem válidas válidas no formato mm/aaaa ou a diferença, em meses, entre inicio e
 fim (inicio - fim)
@author Jorge Bittencourt
*/
function CompareDataMMAAAAReverso(inicio, fim)
{
	var compareData = pfnCompareDatasMesAno(inicio, fim);
	if (isNaN(compareData))
		return 1;
	else
		return -1 * compareData;
}


//*************************************************************************************************************
/**
@name CompareDataReverso
@description Faz a comparação de duas datas no formato dd/mm/aaaa no sentido inverso de pfnCompareDatas. 
 Ver documentação de ValidaçãoData.js para detalhes.
@created 18/02/2004
@return 1 se inicio ou fim não forem válidas válidas no formato dd/mm/aaaa ou a diferença, em dias, entre inicio e
 fim (inicio - fim)
@author Jorge Bittencourt
*/
function CompareDataReverso(inicio, fim)
{
	var compareData = pfnCompareDatas(inicio, fim);
	if (isNaN(compareData))
		return 1;
	else
		return -1 * compareData;
}


//*************************************************************************************************************
/**
@name InicializeCampos
@description Inicializa os campos e as funções de comparação de valores e datas, dependendo das opções
 passadas pelo usuário
@created 18/02/2004
@return Não retorna nada
@author Jorge Bittencourt
*/
function InicializeCampos()
{
	// determine a função de comparação da ordem das datas e dos valorese o comprimento máximo de cada campo,
	// dependendo do tipo de data e da ordem
		switch(this.tipoData)
		{
			// data do tipo dd/mm/aaaa
			case 0:
				// determine a função de comparação das datas
				if (this.ordemDataDecrescente)
					this.CompareData = pfnCompareDatas;
				else
					this.CompareData = CompareDataReverso;
				
				// determine o comprimento máximo dos campos
				this.nomeDtDes1.maxLength = 10;
				this.nomeDtDes2.maxLength = 10;
				this.nomeDtDes3.maxLength = 10;
				
				break;
			// data do tipo mm/aaaa
			case 1:
				// determine a função de comparação das datas
				if (this.ordemDataDecrescente)
					this.CompareData = pfnCompareDatasMesAno;
				else
					this.CompareData = CompareDataMMAAAAReverso;				
			
				// determine o comprimento máximo dos campos
				this.nomeDtDes1.maxLength = 7;
				this.nomeDtDes2.maxLength = 7;
				this.nomeDtDes3.maxLength = 7;
				break;
			case 2:
				// determine a função de comparação das datas
				if (this.ordemDataDecrescente)
					this.CompareData = UltMenosPriNum;
				else
					this.CompareData = PriMenosUltNum;					

				// determine o comprimento máximo dos campos
				this.nomeDtDes1.maxLength = 3;
				this.nomeDtDes2.maxLength = 3;
				this.nomeDtDes3.maxLength = 3;
				break;
		}

		if (this.ordemValorDecrescente)
			this.CompareValor = UltMenosPriNum;
		else
			this.CompareValor = PriMenosUltNum;	
		
		// inicialize os campos de valores também
		this.pfnDescontoOnChange(false);
}


//*************************************************************************************************************
/**
@name pfnDescontoOnChange
@description Essa função deve ser usada no evento onchange do select que contém o tipo dos descontos.
 Ela determina o comprimento máximo do campo da data, dependendo do tipo escolhido, e habilita ou desabilita os
 campos e modifica a classe dos mesmos, dependendo do tipo de desconto selecionado.
 Caso seja necessário realizar outras operações no evento onblur do campo select, é recomendável passar outra
 função a esse evento, onde esta função é chamada e as outras operações necessárias são chamadas.
@param zereValores Se true, zera os valores de desconto
@created 17/02/2004
@return Não retorna nada.
@author Jorge Bittencourt
*/
function pfnDescontoOnChange(zereValores)
{
	// esconda os inputs de desconto se o usuário selecionar opção "Nenhum"
	switch (this.VerifiqueTipoDesconto())
	{
		case this.tipoNenhum:
			this.linhaDesconto1.style.display = "none";
			this.linhaDesconto2.style.display = "none";
			this.linhaDesconto3.style.display = "none";
			break;
		case this.tipoReal:
			this.nomeSinalReal1.style.display = "inline";
			this.nomeSinalReal2.style.display = "inline";
			this.nomeSinalReal3.style.display = "inline";
			this.nomeSinalPer1.innerText = "até";
			this.nomeSinalPer2.innerText = "até";
			this.nomeSinalPer3.innerText = "até";
			this.linhaDesconto1.style.display = "inline";
			this.linhaDesconto2.style.display = "inline";
			this.linhaDesconto3.style.display = "inline";
			// determine o comprimento máximo dos campos de valores - 13 é o valor máximo para campos numéricos
			this.nomeVlDes1.maxLength = 13;
			this.nomeVlDes2.maxLength = 13;
			this.nomeVlDes3.maxLength = 13;
			break;
		default:
			this.nomeSinalReal1.style.display = "none";
			this.nomeSinalReal2.style.display = "none";
			this.nomeSinalReal3.style.display = "none";
			this.nomeSinalPer1.innerText = "% até";
			this.nomeSinalPer2.innerText = "% até";
			this.nomeSinalPer3.innerText = "% até";
			this.linhaDesconto1.style.display = "inline";
			this.linhaDesconto2.style.display = "inline";
			this.linhaDesconto3.style.display = "inline";
			// determine o comprimento máximo dos campos - 5 dígitos equivale ao valor percentual máximo "99,99"
			this.nomeVlDes1.maxLength = 5;
			this.nomeVlDes2.maxLength = 5;
			this.nomeVlDes3.maxLength = 5;
			break;
	}
	// apague os valores
	if (zereValores)
	{
		this.nomeVlDes1.value = "";
		this.nomeVlDes2.value = "";
		this.nomeVlDes3.value = "";
		this.nomeDtDes1.value = "";
		this.nomeDtDes2.value = "";
		this.nomeDtDes3.value = "";
	}
	
	// faça com que o menu continue no topo
	pfnNoScrolling();
}

//*************************************************************************************************************
/**
@name pfnValide
@description Valida as datas e os valores de desconto. Essa validação só será feita se o usuário informar algum 
 tipo de desconto.
@created 17/02/2004
@return true, se a validação tiver sucesso; false, caso contrário
@author Jorge Bittencourt
*/
function pfnValideDesconto()
{
	try
	{
		// verifique se algum tipo de desconto foi informado e, caso positivo, que tipo de Desconto
		var tipo = this.VerifiqueTipoDesconto();
		
		if (tipo != this.tipoNenhum)
		{
			// verifique qusis valores foram digitados pelo usuário, para tornar mais fácil a validação das funções
			// a seguir - verifique se há algum valor inválido ou negativo
			this.VerifiqueValoresDigitados();
			
			// verifique se os primeiros valor e data de desconto foram preenchidos e se, para cada outro valor ou
			// data preenchidos, o seu correspondente está preenchido
			this.ValideAusenciaValores();
		
			// verifique se os valores e datas de desconto estão todos na ordem correta
			this.ValideOrdem();
		}
		// se a excecução chegou aqui, nenhuma exceção foi lançada, portanto a validação teve sucesso
		return true;
	}
	catch (e)
	{
		// se alguma exceção foi lançada, ocorreu algum problema com a validação
		return false;
	}
}


//*************************************************************************************************************
/**
@name PriMenosUltNum
@description Subtrai o argumento ultimo de primeiro (primeiro - ultimo).
 Ver documentação de ValidaçãoData.js para detalhes.
@created 18/02/2004
@return 1, se ultimo ou primeiro não forem números válidos, caso contrário, primeiro - ultimo
@author Jorge Bittencourt
*/
function PriMenosUltNum(primeiro, ultimo)
{
	var primeiro_, ultimo_;
	primeiro_ = new Number(pfnToNumeroAmericano(primeiro)).valueOf();
	ultimo_ = new Number(pfnToNumeroAmericano(ultimo)).valueOf();
	if (isNaN(primeiro_) || isNaN(ultimo_))
		return 1;
	else
		return  primeiro_ - ultimo_;
}


//*************************************************************************************************************
/**
@name UltMenosPriNum
@description Subtrai o argumento primeiro de ultimo (ultimo - primeiro).
 Ver documentação de ValidaçãoData.js para detalhes.
@created 18/02/2004
@return 1, se ultimo ou primeiro não forem números válidos, caso contrário, ultimo - primeiro.
@author Jorge Bittencourt
*/
function UltMenosPriNum(primeiro, ultimo)
{
	var primeiro_, ultimo_;
	primeiro_ = new Number(pfnToNumeroAmericano(primeiro)).valueOf();
	ultimo_ = new Number(pfnToNumeroAmericano(ultimo)).valueOf();
	if (isNaN(primeiro_) || isNaN(ultimo_))
		return 1;
	else
		return  ultimo_ - primeiro_;
}


//*************************************************************************************************************
/**
@name ValideAusenciaValores
@description Valida se os primeiros valor e data de desconto foram preenchidos e se, para cada outro valor ou data 
 preenchidos, o seu correspondente também está preenchido - a mensagem da exceção lançada não importa, a exceção 
 serve somente para a função acima dessa ser sinalizada de que a validação falhou
@created 17/02/2004
@return Não retorna nada
@author Jorge Bittencourt
*/
function ValideAusenciaValores()
{
	// verifique o primeiro valor
	if (!this.temValor1)
	{
		alert(this.msgVlPrimeiroDesFaltando);
		this.nomeVlDes1.focus();
		throw "exception";
	}
	
	// verifique a primeira data
	if (!this.temData1)
	{
		alert(this.msgDtPrimeiroDesFaltando);
		this.nomeDtDes1.focus();
		throw "exception";
	}
	
	// verifique se o segundo valor de desconto não teve a data preenchida
	if (this.temValor2 && !this.temData2)
	{
		alert(this.msgDtDesFaltando);
		this.nomeDtDes2.focus();
		throw "exception";
	}
		
	// verifique se a segunda data de desconto não teve o valor preenchido
	if (this.temData2 && !this.temValor2)
	{
		alert(this.msgVlDesFaltando);
		this.nomeVlDes2.focus();
		throw "exception";
	}

	// verifique se o terceiro valor de desconto não teve a data preenchida
	if (this.temValor3 && !this.temData3)
	{
		alert(this.msgDtDesFaltando);
		this.nomeDtDes3.focus();
		throw "exception";
	}
		
	// verifique se a terceira data de desconto não teve o valor preenchido
	if (this.temData3 && !this.temValor3)
	{
		alert(this.msgVlDesFaltando);
		this.nomeVlDes3.focus();
		throw "exception";
	}
}


//*************************************************************************************************************
/**
@name ValideOrdem
@description Valide a ordem dos valores e das datas de desconto
@created 17/02/2004
@return Não retorna nada se a validação tiver sucesso; caso contrário, lança uma exceção
@author Jorge Bittencourt
*/
function ValideOrdem()
{
	// se o segundo desconto tiver sido informado, valide a ordem das datas e dos valores do primeiro se segundo
	// desconto
	if (this.temData2)
	{
		//alert("Compare Data: " + this.CompareData);
		//alert("compare data: " + this.CompareData(this.nomeDtDes1.value, this.nomeDtDes2.value));
		//alert("data 1: " + this.nomeDtDes1.value + " data2 = " + this.nomeDtDes2.value);
		// compare as datas
		if (this.CompareData(this.nomeDtDes1.value, this.nomeDtDes2.value) >= 0)
		{
			alert(this.msgDtDesOrdemErrada);
			this.nomeDtDes2.focus();
			throw "exception";
		}
		
		// compare os valores
		else if (this.CompareValor(this.nomeVlDes1.value, this.nomeVlDes2.value) >= 0)
		{
			alert(this.msgVlDesOrdemErrada);
			this.nomeVlDes2.focus();
			throw "exception";		
		}
	}
	
	// verifique se a terceira data de desconto está preenchida e a segunda, não
	if (!this.temData2 && this.temData3)
	{
		alert(this.msgVlDesOrdemErrada);
		this.nomeVlDes2.focus();
		throw "exception";		
	}
	
	// verifique se as duas últimas datas e valores de desconto estão em ordem decrescente
	if (this.temData3)
	{
		// compare as datas
		if (this.CompareData(this.nomeDtDes2.value, this.nomeDtDes3.value) >= 0)
		{
			alert(this.msgDtDesOrdemErrada);
			this.nomeDtDes3.focus();
			throw "exception";
		}
		// compare os valores
		else if (this.CompareValor(this.nomeVlDes2.value, this.nomeVlDes3.value) >= 0)
		{
			alert(this.msgVlDesOrdemErrada);
			this.nomeVlDes3.focus();
			throw "exception";		
		}
	}	
}

//*************************************************************************************************************
/**
@name VerifiqueTipoDesconto
@description Verifica o tipo de desconto atualmente selecionado pelo usuário
@created 17/02/2004
@return O index selecionado pelo usuário no campo select que determina os tipos de desconto
@author Jorge Bittencourt
*/
function VerifiqueTipoDesconto()
{
	if (this.nomeSlTipoDesconto.selectedIndex == 0)
	{
		return this.nomeSlTipoDesconto.selectedIndex;
	}
	else
	{
		return this.nomeSlTipoDesconto.options[this.nomeSlTipoDesconto.selectedIndex].value-2;
	}	
}
	

//*************************************************************************************************************
/**
@name ValideValorDesconto
@description Verifica se o valor de desconto digitado é válido
@created 29/10/2004
@return Não retorna nada
@author Jorge Bittencourt
*/
function ValideValorDesconto(input)
{
	switch (this.VerifiqueTipoDesconto())
	{
		case this.tipoReal:
      pfnValideFormateMoedaOnBlur(input, this.msgValorInvalido)
      break;
    case this.tipoPercentual:
      pfnValideFormateMoedaOnBlur(input, this.msgValorInvalido)
      // verifique se o valor é menor que 100%
      if (new Number(pfnToNumeroAmericano(input.value)).valueOf() >= 100)
      {
        alert(this.msgValorInvalido);
        input.select();
        input.focus();
      }
      break;
  }
}

//*************************************************************************************************************
/**
@name VerifiqueValoresDigitados
@description Recupera os valores digitados pelo usuário e valida os valores
@created 17/02/2004
@return Não retorna nada
@author Jorge Bittencourt
*/
function VerifiqueValoresDigitados()
{
	// determine quais valores foram digitados pelo usuário	
	this.temValor1 = (this.nomeVlDes1.value != "") && (pfnToNumeroAmericano(this.nomeVlDes1.value) >0);
	this.temValor2 = (this.nomeVlDes2.value != "") && (pfnToNumeroAmericano(this.nomeVlDes2.value) >0);
	this.temValor3 = (this.nomeVlDes3.value != "") && (pfnToNumeroAmericano(this.nomeVlDes3.value) >0);
	this.temData1 = this.nomeDtDes1.value != "";
	this.temData2 = this.nomeDtDes2.value != "";
	this.temData3 = this.nomeDtDes3.value != "";
	
	// valide os valores - os valores precisam ser numéricos e maiores ou iguais a zero
	if (this.temValor1)
	{
		var vl1 = new Number(pfnToNumeroAmericano(this.nomeVlDes1.value).valueOf());
		if (isNaN(vl1) || vl1 < 0)
		{
			alert("Valor inválido");
			this.nomeVlDes1.focus();
			throw "exception";
		}
	}
	if (this.temValor2)
	{	
		var vl2 = new Number(pfnToNumeroAmericano(this.nomeVlDes2.value).valueOf());
		if (isNaN(vl2) || vl2 < 0)
		{
			alert("Valor inválido");
			this.nomeVlDes2.focus();
			throw "exception";
		}
	}
	if (this.temValor3)
	{
		var vl3 = new Number(pfnToNumeroAmericano(this.nomeVlDes3.value).valueOf());
		if (isNaN(vl3) || vl3 < 0)
		{
			alert("Valor inválido");
			this.nomeVlDes3.focus();
			throw "exception";
		}
	}
}