/*

Este arquivo contem funcoes de uso geral

Pre-requisito: nao possui

*/

function geral() {

	/*

	Descricao: Retorna um objeto a partir do seu identificador
	Retorno:
		- objeto = objeto retornado pela funcao "document.getElementById"
	Parametros:
		- idObjeto = identificador do objeto ou o proprio objeto

	*/

	this.pegarObj = function (idObjeto) {

		if (!idObjeto.tagName) {

			return document.getElementById(idObjeto);

		}
		else {

			return idObjeto;

		}

	}

	/*

	Descricao: Modifica um campo e da o foco a este campo para alertar sobre um erro
	Retorno: nao possui retorno
	Parametros:
		- obj = objeto ou id do objeto que sera focado

	*/

	this.focoErro = function (obj) {

		var obj = this.pegarObj(obj);

		if (obj) {

			obj.fundoAntigo = obj.style.backgroundColor;
			obj.style.backgroundColor = "#FFEEEE";
			obj.focus();

			obj.onblurErro = (obj.onblur) ? obj.onblur : function (e) { return false; };

			obj.onblur = function (e) {

				this.onblurErro(e);

				this.style.backgroundColor = this.fundoAntigo;

				this.onblur = this.onblurErro;

			}

		}

	}

	/*

	Descricao: Tira os espacos sobressalentes na lateral esquerda de uma string
	Retorno:
		- texto = texto sem espacos na lateral esquerda
	Parametros:
		- textoInicial = texto que podera conter espacos no comeco e no final da string

	*/

	this.ltrim = function (textoInicial) {

		if (!textoInicial) {

			return "";

		}
		else {

			while ((textoInicial.length > 0)&&(textoInicial.charAt(0) == " ")) {

				textoInicial = textoInicial.substr(1);

			}

			return textoInicial;

		}

	}

	/*

	Descricao: Tira os espacos sobressalentes na lateral direita de uma string
	Retorno:
		- texto = texto sem espacos na lateral direita
	Parametros:
		- textoInicial = texto que podera conter espacos no comeco e no final da string

	*/

	this.rtrim = function (textoInicial) {

		if (!textoInicial) {

			return "";

		}
		else {

			while ((textoInicial.length > 0)&&(textoInicial.charAt(textoInicial.length - 1) == " ")) {

				textoInicial = textoInicial.substr(0,textoInicial.length - 1);

			}

			return textoInicial;

		}

	}

	/*

	Descricao: Tira os espacos sobressalentes nas laterais direita e esquerda de uma string
	Retorno:
		- texto = texto sem espacos nas duas laterais
	Parametros:
		- textoInicial = texto que podera conter espacos no comeco e no final da string

	*/

	this.trim = function (textoInicial) {

		if (!textoInicial) {

			return "";

		}
		else {

			return this.rtrim(this.ltrim(textoInicial));

		}

	}

	/*

	Descricao: Verifica se um e-mail e valido
	Retorno:
		- boolean = verdadeiro caso seja valido e falso caso seja invalido
	Parametros:
		- email = email que sera verificado

	*/

	this.verificarEmail = function (email) {

		if (this.trim(email) != "") {

			var expressaoEmail = new RegExp("^[a-zA-Z0-9]+[_a-zA-Z0-9-]*(\.[_a-z0-9-]+)*@[a-z0-9]+(-[a-z0-9]+)*(\.[a-z0-9-])+\\.([a-z]{2,4})$");

			return expressaoEmail.test(email);

		}
		else {

			return false;

		}

	}

	/*

	Descricao: Tenta detectar a versao do browser utilizado pelo usuario
	Retorno:
		- navegador = nome do navegador (ex.: Firefox, Internet Explorer, Safari, etc.)
		- versao = versao do navegador (ex.: 3, 7, etc.)
		- sistema operacional = nome do sistema operacional utilizado (ex.: Windows, Linux, Mac OS, etc.)
	Parametros: nao admite parametros

	*/

	this.versaoBrowser = function () {

		var parametrosDeteccaoBrowser = new Array();

		parametrosDeteccaoBrowser[parametrosDeteccaoBrowser.length] = {

			stringIdentificacao: navigator.userAgent,
			stringReferencia: "OmniWeb",
			stringReferenciaVersao: "OmniWeb/",
			identificacao: "OmniWeb"

		};

		parametrosDeteccaoBrowser[parametrosDeteccaoBrowser.length] = {

			stringIdentificacao: navigator.vendor,
			stringReferencia: "Apple",
			identificacao: "Safari"

		};

		parametrosDeteccaoBrowser[parametrosDeteccaoBrowser.length] = {

			propriedadeUnica: window.opera,
			identificacao: "Opera"

		};

		parametrosDeteccaoBrowser[parametrosDeteccaoBrowser.length] = {

			stringIdentificacao: navigator.vendor,
			stringReferencia: "iCab",
			identificacao: "iCab"

		};

		parametrosDeteccaoBrowser[parametrosDeteccaoBrowser.length] = {

			stringIdentificacao: navigator.vendor,
			stringReferencia: "KDE",
			identificacao: "Konqueror"

		};

		parametrosDeteccaoBrowser[parametrosDeteccaoBrowser.length] = {

			stringIdentificacao: navigator.userAgent,
			stringReferencia: "Firefox",
			identificacao: "Firefox"

		};

		parametrosDeteccaoBrowser[parametrosDeteccaoBrowser.length] = {

			stringIdentificacao: navigator.vendor,
			stringReferencia: "Camino",
			identificacao: "Camino"

		};

		parametrosDeteccaoBrowser[parametrosDeteccaoBrowser.length] = {

			stringIdentificacao: navigator.userAgent,
			stringReferencia: "Netscape",
			identificacao: "Netscape"

		};

		parametrosDeteccaoBrowser[parametrosDeteccaoBrowser.length] = {

			stringIdentificacao: navigator.userAgent,
			stringReferencia: "MSIE",
			stringReferenciaVersao: "MSIE",
			identificacao: "Internet Explorer"

		};


		parametrosDeteccaoBrowser[parametrosDeteccaoBrowser.length] = {

			stringIdentificacao: navigator.userAgent,
			stringReferencia: "Gecko",
			stringReferenciaVersao: "rv",
			identificacao: "Mozilla"

		};


		parametrosDeteccaoBrowser[parametrosDeteccaoBrowser.length] = {

			stringIdentificacao: navigator.userAgent,
			stringReferencia: "Mozilla",
			stringReferenciaVersao: "Mozilla",
			identificacao: "Netscape"

		};

		var parametrosDeteccaoSistemaOperacional = new Array();

		parametrosDeteccaoSistemaOperacional[parametrosDeteccaoSistemaOperacional.length] = {

			stringIdentificacao: navigator.platform,
			stringReferencia: "Win",
			identificacao: "Windows"

		};

		parametrosDeteccaoSistemaOperacional[parametrosDeteccaoSistemaOperacional.length] = {

			stringIdentificacao: navigator.platform,
			stringReferencia: "Mac",
			identificacao: "Mac OS"

		};

		parametrosDeteccaoSistemaOperacional[parametrosDeteccaoSistemaOperacional.length] = {

			stringIdentificacao: navigator.platform,
			stringReferencia: "Linux",
			identificacao: "GNU/Linux"

		};

		var procuraString = function (dados) {

			for (var i = 0; i < dados.length; i++) {

				dados[i].stringReferenciaVersao = dados[i].stringReferenciaVersao || dados[i].identificacao;

				if (dados[i].propriedadeUnica) {

					return dados[i];

				}
				else {

					if ((dados[i].stringIdentificacao)&&(dados[i].stringIdentificacao.indexOf(dados[i].stringReferencia) != -1)) {

						return dados[i];

					}

				}

			}

		}

		var procuraVersao = function (stringReferenciaVersao, stringIdentificacao) {

			var indice = stringIdentificacao.indexOf(stringReferenciaVersao);

			if (indice != -1) {

				return parseFloat(stringIdentificacao.substring(indice + stringReferenciaVersao.length + 1));

			}

		}

		var navegador = procuraString(parametrosDeteccaoBrowser) || "";
		var versaoNavegador = procuraVersao(navegador.stringReferenciaVersao,navigator.userAgent) || procuraVersao(navegador.stringReferenciaVersao,navigator.appVersion) || 0;
		var sistemaOperacional = procuraString(parametrosDeteccaoSistemaOperacional) || "";

		return [navegador.identificacao, versaoNavegador, sistemaOperacional.identificacao];

	}

	/*

	Descricao: Formata um valor (anteriormente formatado com a funcao "inteiro"), retornando no formato 999.999.999,99
	Retorno:
		- texto = valor formatado (com separadores decimais e inteiros)
	Parametros:
		- valor = valor inteiro (sem separadores decimais)
		- [variacaoDecimal] = quantidade de casas decimais contidas no numero fornecido

	*/

	this.formatarValor = function (valor) {

		if (arguments.length > 1) {

				var variacaoDecimal = arguments[1];

		}
		else {

				var variacaoDecimal = 2;

		}

		var valorString = valor.toString();

		var complemento = "";


		for (var i = 0; i < variacaoDecimal + 1; i++) {

			complemento += "0";

		}

		if (valorString.length < variacaoDecimal + 1) {

			valorString = complemento + valorString;
			valorString = valorString.substr(valorString.length - (variacaoDecimal + 1),variacaoDecimal + 1);

		}

		var parteInteira = valorString.substr(0,valorString.length - variacaoDecimal);
		var parteInteiraFormatada = "";
		var qtdeSeparadores = 0;

		for (var i = parteInteira.length - 1; i >= 0; i--) {

			if ((parteInteiraFormatada.length > 0)&&(((parteInteiraFormatada.length - qtdeSeparadores) % 3 == 0))) {

				parteInteiraFormatada = "." + parteInteiraFormatada;
				qtdeSeparadores++;

			}

			parteInteiraFormatada = parteInteira.charAt(i) + parteInteiraFormatada;

		}

		valorString = parteInteiraFormatada + "," + valorString.substr(valorString.length - variacaoDecimal,variacaoDecimal);

		return valorString;

	}

	/*

	Descricao: Remove a formatacao de um valor (para ser formatado posteriormente com a funcao "formatarValor")
	Retorno:
		- texto = valor formatado (com separadores decimais e inteiros)
	Parametros:
		- valor = valor sem formatacao
		- [casasDecimais] = quantidade de casas decimais contidas no numero fornecido
		- [inverterSeparador] = caso verdadeiro, utiliza virgula como separador inteiro e o ponto como separador decimal, caso falso, utiliza a virgula como separador decimal e o ponto como separador inteiro

	*/

	this.inteiro = function (valor) {

		if (valor == "") {

			return "0";
	
		}

		if (!valor.length) {

			var valor = valor.toString();

		}

		var inverterSeparador = false;

		if (arguments.length > 1) {

			var casasDecimais = arguments[1];

		  if (arguments.length > 2) {

		    var inverterSeparador = arguments[2];

		  }

		}
		else {

			var casasDecimais = 0;

		}

		var caracteresDecimais = "";

		for (var i = 0; i < casasDecimais; i++) {

			caracteresDecimais += "0";

		}

		valor = this.trim(valor);

		if (inverterSeparador) {

		  var separador1 = ",";
		  var separador2 = ".";

		}
		else {

		  var separador1 = ".";
		  var separador2 = ",";

		}

		var partes = new Array();
		partes = valor.split(separador1);
		valor = partes.join("");

		var partes = new Array();
		partes = valor.split(separador2);

		partes[1] = (partes[1]) ? partes[1].concat(caracteresDecimais).substr(0,casasDecimais) : caracteresDecimais;

		var valorStr = partes.join("");

		var i = 0;

		while ((valorStr.length > 1)&&(valorStr.charAt(i) == "0")) {

			valorStr = valorStr.substr(1);

		}

		return parseInt(valorStr);

	}

	/*

	Descricao: verifica se um determinado valor esta dentro de uma array
	Retorno:
		- boolean ou inteiro = retorna falso caso nao seja encontrado ou retorna a posicao da primeira ocorrencia caso seja encontrado
	Parametros:
		- textoProcura = elemento que sera procurado (needle)
		- arrayElementos = array contendo os elementos (haystack)

	*/

	this.inArray = function (textoProcura, arrayElementos) {

		var retorno = false;

		if (arrayElementos.length) {

			for (var i = 0; i < arrayElementos.length; i++) {

				if (arrayElementos[i] == textoProcura) {

					var retorno = i;
					break;

				}

			}

		}

		return retorno;

	}

	/*

	Descricao: verifica se um CPF e valido
	Retorno:
		- boolean = retorna falso se for invalido ou verdadeiro caso seja valido
	Parametros:
		- cpf = CPF que devera ser verificado

	*/

	this.verificarCPF = function (cpf) {

		var digitoVerificador = new Array();

		var cpfInvalido = new Array("00000000000","11111111111","22222222222","33333333333","44444444444","55555555555","66666666666","77777777777","88888888888","99999999999");

		if (!cpf.length) {

			return false;

		}

		var numerosCPF = cpf.match(/\d/g);

		if (numerosCPF.length) {

			var cpf = numerosCPF.join("");

		}
		else {

			return false;

		}

		if ((cpf.length != 11)||(this.inArray(cpf,cpfInvalido) !== false)) {

			return false;

		}

		var soma = 0;

		for (var i = 0; i < cpf.length - 2; i++) {

			soma += cpf.charAt(i) * (10 - i);

		}

		digitoVerificador[0] = 11 - (soma % 11);

		if ((digitoVerificador[0] == 10)||(digitoVerificador[0] == 11)) {

			digitoVerificador[0] = 0;

		}

		var soma = 0;

		for (var i = 0; i < cpf.length - 1; i++) {

			soma += cpf.charAt(i) * (11 - i);

		}

		digitoVerificador[1] = 11 - (soma % 11);

		if ((digitoVerificador[1] == 10)||(digitoVerificador[1] == 11)) {

			digitoVerificador[1] = 0;

		}

		if ((digitoVerificador[0] == cpf.charAt(cpf.length - 2))&&(digitoVerificador[1] == cpf.charAt(cpf.length - 1))) {

			return true;

		}
		else {

			return false;

		}

	}

	/*

	Descricao: verifica se um CNPJ e valido
	Retorno:
		- boolean = retorna falso se for invalido ou verdadeiro caso seja valido
	Parametros:
		- cnpj = CNPJ que devera ser verificado

	*/

	this.verificarCNPJ = function (cnpj) {

		var digitoVerificador = new Array();

		var digitosReferencia = new Array();

		digitosReferencia[0] = new Array(6,5,4,3,2,9,8,7,6,5,4,3,2);
		digitosReferencia[1] = new Array(7,6,5,4,3,2,9,8,7,6,5,4,3,2);

		var cnpjInvalido = new Array("000000000000000","111111111111111","222222222222222","333333333333333","444444444444444","555555555555555","666666666666666","777777777777777","888888888888888","999999999999999");

		if (!cnpj.length) {

			return false;

		}

		var numerosCNPJ = cnpj.match(/\d/g);

		if (numerosCNPJ.length) {

			var cnpj = numerosCNPJ.join("");

		}
		else {

			return false;

		}

		if ((cnpj.length != 15)||(this.inArray(cnpj,cnpjInvalido) !== false)) {

			return false;

		}

		var soma = 0;

		for (var i = 0; i < cnpj.length - 2; i++) {

			soma += cnpj.charAt(i) * digitosReferencia[0][i];

		}

		digitoVerificador[0] = 11 - (soma % 11);

		if ((digitoVerificador[0] == 10)||(digitoVerificador[0] == 11)) {

			digitoVerificador[0] = 0;

		}

		var soma = 0;

		for (var i = 0; i < cnpj.length - 1; i++) {

			soma += cnpj.charAt(i) * digitosReferencia[1][i];

		}

		digitoVerificador[1] = 11 - (soma % 11);

		if ((digitoVerificador[1] == 10)||(digitoVerificador[1] == 11)) {

			digitoVerificador[1] = 0;

		}

		if ((digitoVerificador[0] == cnpj.charAt(cnpj.length - 2))&&(digitoVerificador[1] == cnpj.charAt(cnpj.length - 1))) {

			return true;

		}
		else {

			return false;

		}

	}

	/*

	Descricao: retorna o fatorial de um numero (funcao recursiva)
	Retorno:
		- numero = retorna o fatorial do numero escolhido
	Parametros:
		- numero = numero inteiro cujo fatorial sera calculado

	*/

	this.fatorial = function (numero) {

		if (numero < 2) {

			return 1;

		}

		return numero * this.fatorial(numero - 1);

	}

	/*

	Descricao: verifica se uma data e valida ou nao
	Retorno:
		- boolean = retorna verdadeiro caso a data seja valida ou falso caso seja invalida
	Parametros:
		- dataReferencia = data que sera verificada

	*/

	this.verificarData = function (dataReferencia) {

		if (!dataReferencia) {

			var dataReferencia = "00/00/0000";

		}

		if (arguments.length > 2) {

			var diaReferencia = this.inteiro(arguments[0]);
			var mesReferencia = this.inteiro(arguments[1]);
			var anoReferencia = this.inteiro(arguments[2]);

		}
		else {

			var partes = dataReferencia.split("/");
			var diaReferencia = this.inteiro(partes[0]);
			var mesReferencia = this.inteiro(partes[1]);
			var anoReferencia = this.inteiro(partes[2]);

		}

		var novaData = new Date();

		novaData.setYear(anoReferencia);
		novaData.setMonth(mesReferencia - 1);
		novaData.setDate(diaReferencia);

		if ((novaData.getDate() != diaReferencia)||(novaData.getMonth() != mesReferencia - 1)||(novaData.getFullYear() != anoReferencia)) {

			return false;

		}
		else {

			return true;

		}

	}

	/*

	Descricao: formata o campo para aceitar apenas digitos que compoe um cpf
	Retorno: nao retorna nenhuma informacao
	Parametros:
		- obj = objeto que recebera a formatacao

	*/

	this.campoCPF = function (obj) {

		var obj = this.pegarObj(obj);

		if (!obj) {

			return false;

		}

		obj.maxLength = 14;

		obj.onkeydownCampoCPF = (obj.onkeydown) ? obj.onkeydown : function (e) { return false; };

		obj.onkeydown = function (e) {

			this.onkeydownCampoCPF(e);

			if (!e) {

				e = window.event;
				var tecla = e.keyCode;

			}
			else {

				var tecla = e.which;

			}

			var teclaCtrl = e.ctrlKey;
			var teclaShift = e.shiftKey;

			var partes1 = this.value.split(".");
			var partes2 = this.value.split("-");

			if ((teclaShift == false)&&(tecla > 47)&&(tecla < 58)) {

				if (((this.value.length == 3)||(this.value.length == 7))&&(partes1.length < 3)&&(this.value.charAt(0) != ".")&&(this.value.charAt(this.value.length - 1) != ".")) {

					this.value += ".";

				}
				else {

					if ((this.value.length == 11)&&(partes2.length == 1)&&(this.value.charAt(0) != "-")&&(this.value.charAt(this.value.length - 1) != "-")) {

						this.value += "-";

					}

				}

				return true;

			}
			else {

				if ((tecla == 8)||								// backspace
					(tecla == 9)||								// tab
					(tecla == 46)||								// delete
					(tecla == 35)||								// end
					(tecla == 36)||								// home
					(tecla == 37)||								// seta para a esquerda
					(tecla == 39)||								// seta para a direita
					((teclaCtrl == true)&&(tecla == 67))||		// ctrl + c
					((teclaCtrl == true)&&(tecla == 86))) {		// ctrl + v

					return true;

				}
				else {

					return false;

				}

			}

		}

	}


	/*

	Descricao: formata o campo para aceitar apenas digitos que compoe um cnpj
	Retorno: nao retorna nenhuma informacao
	Parametros:
		- obj = objeto que recebera a formatacao

	*/

	this.campoCNPJ = function (obj) {

		var obj = this.pegarObj(obj);

		if (!obj) {

			return false;

		}

		obj.maxLength = 19;

		obj.onkeydownCampoCNPJ = (obj.onkeydown) ? obj.onkeydown : function (e) { return false; };

		obj.onkeydown = function (e) {

			this.onkeydownCampoCNPJ(e);

			if (!e) {

				e = window.event;
				var tecla = e.keyCode;

			}
			else {

				var tecla = e.which;

			}

			var teclaCtrl = e.ctrlKey;
			var teclaShift = e.shiftKey;

			var partes1 = this.value.split(".");
			var partes2 = this.value.split("/");
			var partes3 = this.value.split("-");

			if ((teclaShift == false)&&(tecla > 47)&&(tecla < 58)) {

				if (((this.value.length == 3)||(this.value.length == 7))&&(partes1.length < 3)&&(this.value.charAt(0) != ".")&&(this.value.charAt(this.value.length - 1) != ".")) {

					this.value += ".";

				}
				else {

					if ((this.value.length == 11)&&(partes2.length == 1)&&(this.value.charAt(0) != "/")&&(this.value.charAt(this.value.length - 1) != "/")) {

						this.value += "/";

					}
					else {

						if ((this.value.length == 16)&&(partes3.length == 1)&&(this.value.charAt(0) != "-")&&(this.value.charAt(this.value.length - 1) != "-")) {

							this.value += "-";
						}

					}

				}

				return true;

			}
			else {

				if ((tecla == 8)||								// backspace
					(tecla == 9)||								// tab
					(tecla == 46)||								// delete
					(tecla == 35)||								// end
					(tecla == 36)||								// home
					(tecla == 37)||								// seta para a esquerda
					(tecla == 39)||								// seta para a direita
					((teclaCtrl == true)&&(tecla == 67))||		// ctrl + c
					((teclaCtrl == true)&&(tecla == 86))) {		// ctrl + v

					return true;

				}
				else {

					return false;

				}

			}

		}

	}

	/*

	Descricao: formata o campo para aceitar apenas digitos que compoe uma data
	Retorno: nao retorna nenhuma informacao
	Parametros:
		- obj = objeto que recebera a formatacao

	*/

	this.campoData = function (obj) {

		var obj = this.pegarObj(obj);

		if (!obj) {

			return false;

		}

		obj.maxLength = 10;

		obj.onblurCampoData = (obj.onblur) ? obj.onblur : function (e) { return false; };

		obj.onblur = function (e) {

			this.onblurCampoData(e);

			if (this.value != "") {

				var novaData = new Date();

				var diaAtual = novaData.getDate();
				var mesAtual = novaData.getMonth() + 1;
				var anoAtual = novaData.getFullYear();

				var partes = this.value.split("/");

				partes[0] = (partes[0]) ? partes[0] : diaAtual;
				partes[1] = (partes[1]) ? partes[1] : mesAtual;
				partes[2] = (partes[2]) ? partes[2] : anoAtual;

				partes[0] = "0".concat(partes[0]);
				partes[1] = "0".concat(partes[1]);

				partes[0] = partes[0].charAt(partes[0].length - 2).concat(partes[0].charAt(partes[0].length - 1));
				partes[1] = partes[1].charAt(partes[1].length - 2).concat(partes[1].charAt(partes[1].length - 1));

				if (partes[2].length == 2) {

					if ((inteiro(partes[2]) >= 90)&&(inteiro(partes[2]) <= 99)) {

						partes[2] = (inteiro(anoAtual.toString().substr(0,2)) - 1) + "" + partes[2];

					}
					else {

						partes[2] = inteiro(anoAtual.toString().substr(0,2)) + "" + partes[2];

					}

				}

				this.value = partes[0] + "/" + partes[1] + "/" + partes[2];

			}

		}

		obj.onchangeCampoData = (obj.onchange) ? obj.onchange : function (e) { return false; };

		obj.onchange = function (e) {

			this.onchangeCampoData(e);

			var novoValor = "";

			for (var i = 0; i < this.value.length; i++) {

				if ((this.value.charCodeAt(i) > 46)&&(this.value.charCodeAt(i) < 58)) {

					novoValor += this.value.charAt(i);

				}

			}

			if (this.value != novoValor) {

				this.value = novoValor;

			}

		}

		obj.onkeydownCampoData = (obj.onkeydown) ? obj.onkeydown : function (e) { return false; };

		obj.onkeydown = function (e) {

			this.onkeydownCampoData(e);

			if (!e) {

				e = window.event;
				var tecla = e.keyCode;

			}
			else {

				if (e.srcElement) {

					var tecla = e.keyCode;

				}
				else {

					var tecla = e.which;

				}

			}

			var teclaCtrl = e.ctrlKey;
			var teclaShift = e.shiftKey;

			var partes = this.value.split("/");

			if ((teclaShift == false)&&(tecla > 47)&&(tecla < 58)) {

				if (((this.value.length == 2)||(this.value.length == 5))&&(partes.length < 3)&&(this.value.charAt(0) != "/")&&(this.value.charAt(this.value.length - 1) != "/")) {

					this.value += "/";

				}

				return true;

			}
			else {

				if ((tecla == 8)||								// backspace
					(tecla == 9)||								// tab
					(tecla == 46)||								// delete
					(tecla == 35)||								// end
					(tecla == 36)||								// home
					(tecla == 37)||								// seta para a esquerda
					(tecla == 39)||								// seta para a direita
					((teclaCtrl == true)&&(tecla == 67))||		// ctrl + c
					((teclaCtrl == true)&&(tecla == 86))) {		// ctrl + v

					return true;

				}
				else {

					return false;

				}

			}

		}

	}

	/*

	Descricao: formata o campo para aceitar apenas digitos que compoe uma hora
	Retorno: nao retorna nenhuma informacao
	Parametros:
		- obj = objeto que recebera a formatacao

	*/

	this.campoHora = function (obj) {

		if (!obj.tagName) {

			obj = this.pegarObj(obj);

		}

		if (!obj) {

			return false;

		}

		obj.onkeydownCampoHora = (obj.onkeydown) ? obj.onkeydown : function (e) { return false; };

		obj.onkeydown = function (e) {

			this.onkeydownCampoHora(e);

			if (!e) {

				e = window.event;
				var tecla = e.keyCode;

			}
			else {

				if (e.srcElement) {

					var tecla = e.keyCode;

				}
				else {

					var tecla = e.which;

				}

			}

			var teclaCtrl = e.ctrlKey;
			var teclaShift = e.shiftKey;

			var partes = this.value.split("/");

			if ((teclaShift == false)&&((tecla > 47)&&(tecla < 58)||(tecla > 95)&&(tecla < 106))) {

				return true;

			}
			else {

				if ((tecla == 8)||												// backspace
					(tecla == 9)||												// tab
					(tecla == 46)||												// delete
					(tecla == 35)||												// end
					(tecla == 36)||												// home
					(tecla == 37)||												// seta para a esquerda
					(tecla == 39)||												// seta para a direita
					((teclaCtrl == true)&&(tecla == 67))||						// ctrl + c
					((teclaCtrl == true)&&(tecla == 86))||						// ctrl + v
					((teclaShift == true)&&((tecla == 59)||(tecla == 186)))) {	// dois pontos ":"

					return true;

				}
				else {

					return false;

				}

			}

		}

	}

	/*

	Descricao: formata o campo para aceitar apenas digitos que compoe um numero (inclusive com campo decimal)
	Retorno: nao retorna nenhuma informacao
	Parametros:
		- obj = objeto que recebera a formatacao

	*/

	this.campoNumero = function (obj) {

		var obj = this.pegarObj(obj);

		if (!obj) {

			return false;

		}

		obj.onkeydownCampoNumero = (obj.onkeydown) ? obj.onkeydown : function (e) { return false; };

		obj.onkeydown = function (e) {

			this.onkeydownCampoNumero(e);

			if (!e) {

				e = window.event;
				var tecla = e.keyCode;

			}
			else {

				if (e.srcElement) {

					var tecla = e.keyCode;

				}
				else {

					var tecla = e.which;

				}

			}

			var teclaCtrl = e.ctrlKey;
			var teclaShift = e.shiftKey;

			var partes = this.value.split("/");

			if ((teclaShift == false)&&((tecla > 47)&&(tecla < 58)||(tecla > 95)&&(tecla < 106))) {

				return true;

			}
			else {

				if ((tecla == 8)||								// backspace
					(tecla == 9)||								// tab
					(tecla == 46)||								// delete
					(tecla == 35)||								// end
					(tecla == 36)||								// home
					(tecla == 37)||								// seta para a esquerda
					(tecla == 39)||								// seta para a direita
					(tecla == 188)||							// virgula
					(tecla == 110)||							// virgula (teclado numerico)
					((teclaCtrl == true)&&(tecla == 67))||		// ctrl + c
					((teclaCtrl == true)&&(tecla == 86))) {		// ctrl + v

					return true;

				}
				else {

					return false;

				}

			}

		}

	}

	/*

	Descricao: formata o campo para aceitar apenas digitos que compoe um numero inteiro
	Retorno: nao retorna nenhuma informacao
	Parametros:
		- obj = objeto que recebera a formatacao

	*/

	this.campoNumeroInteiro = function (obj) {

		if (!obj.tagName) {

			obj = this.pegarObj(obj);

		}

		if (!obj) {

			return false;

		}

		obj.onkeydownCampoNumeroInteiro = (obj.onkeydown) ? obj.onkeydown : function (e) { return true; };

		obj.onkeydown = function (e) {

			this.onkeydownCampoNumeroInteiro(e);

			if (!e) {

				e = window.event;
				var tecla = e.keyCode;

			}
			else {

				if (e.srcElement) {

					var tecla = e.keyCode;

				}
				else {

					var tecla = e.which;

				}

			}

			var teclaCtrl = e.ctrlKey;
			var teclaShift = e.shiftKey;

			var partes = this.value.split("/");

			if ((teclaShift == false)&&((tecla > 47)&&(tecla < 58)||(tecla > 95)&&(tecla < 106))) {

				return true;

			}
			else {

				if ((tecla == 8)||								// backspace
					(tecla == 9)||								// tab
					(tecla == 46)||								// delete
					(tecla == 35)||								// end
					(tecla == 36)||								// home
					(tecla == 37)||								// seta para a esquerda
					(tecla == 39)||								// seta para a direita
					((teclaCtrl == true)&&(tecla == 67))||		// ctrl + c
					((teclaCtrl == true)&&(tecla == 86))) {		// ctrl + v

					return true;

				}
				else {

					return false;

				}

			}

		}

	}

	/*

	Descricao: processa o evento gerado ao pressionar a tecla Enter em um objeto
	Retorno:
		- boolean = retorna falso ao executar uma operacao ou verdadeiro quando nao executa nenhuma operacao (isso garante que o processamento continuara)
	Parametros:
		- e = evento gerado ao pressionar uma tecla

	*/

	this.processaAtalhoEnter = function (e) {

		if (!e) {

			e = window.event;
			var obj = e.srcElement;
			var tecla = e.keyCode;

		}
		else {

			if (e.srcElement) {

				var obj = e.srcElement;
				var tecla = e.keyCode;

			}
			else {

				var obj = e.target;
				var tecla = e.which;

			}


		}

		var teclaShift = e.shiftKey;

		if ((tecla == 13)&&(teclaShift != true)) {

			eval("obj.objDestino." + obj.operacao);

			return true;

		}

		return obj.onkeydownAtalhoEnter(e);

	}

	/*

	Descricao: atribui uma funcao quando a tecla Enter for pressionada em um campo
	Retorno: nao retorna nenhuma informacao
	Parametros:
		- objOrigem = objeto ao qual sera atribuida a funcao
		- objDestino = objeto que contera a operacao a ser executada
		- operacao = funcao que sera executada dentro do objeto "objDestino"

	*/

	this.atalhoEnter = function (objOrigem, objDestino, operacao) {

		objOrigem.objDestino = new Object();
		objOrigem.objDestino = objDestino;
		objOrigem.operacao = operacao;

		objOrigem.onkeydownAtalhoEnter = (objOrigem.onkeydown) ? objOrigem.onkeydown : function (e) { return true; };
		objOrigem.onkeydown = this.processaAtalhoEnter;

	}

	/*

	Descricao: trata um campo que contem dados no formato (linha1_col1#linha1_col2#linha1_col3|linha2_col1#linha2_col2#linha2_col3...)
	Retorno:
		- array = array bi-dimensional contendo os dados
	Parametros:
		- [idRecipiente] = id ou objeto que contem as informacoes que serao tratadas

	*/

	this.tratarRecipienteDados = function () {

		if (arguments.length > 0) {

			var idRecipiente = arguments[0];

		}
		else {

			var idRecipiente = "recipienteDados";

		}

		var retorno = new Array();
		var conteudo = this.pegarObj(idRecipiente).innerHTML;
		var linhas = conteudo.split("|");

		if (linhas.length > 0) {

			for (var i = 0; i < linhas.length; i++) {

				if (this.trim(linhas[i]) != "") {

					var partes = linhas[i].split("#");
					retorno[retorno.length] = new Array();

					for (var j = 0; j < partes.length; j++) {

						retorno[retorno.length - 1][retorno[retorno.length - 1].length] = partes[j];

					}

				}

			}

		}

		this.pegarObj(idRecipiente).innerHTML = "";

		return retorno;

	}

	/*

	Descricao: converte uma string XML para um objeto XML
	Retorno:
		- objetoXML = objeto XML (ou falso em caso de erro)
	Parametros:
		- stringXML = string contendo a estrutura para geracao do objeto XML

	*/

	this.converterStringXML = function (stringXML) {

		try {

			var objXML = new ActiveXObject("Msxml2.DOMDocument.3.0");
			objXML.async = false;
			objXML.loadXML(stringXML);

			return objXML;

		}
		catch(e) {

			try {

				var objParser = new DOMParser();
				var objXML = objParser.parseFromString(stringXML,"text/xml");

				return objXML;

			}
			catch(e) {

				return false;

			}

		}

	}

}

