/*

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: 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: Torna a primeira letra da string em maiuscula
	Retorno:
		- texto = texto com a letra inicial em maiuscula
	Parametros:
		- textoInicial = texto a ser modificado

	*/

	this.ucfirst = function (textoInicial) {

		var f = textoInicial.charAt(0).toUpperCase();

    return f + textoInicial.substr(1, textoInicial.length-1);

	}

	/*

	Descricao: encontra a posicao da primeira ocorrencia de uma string
	Retorno:
		- retorna a posicao numerica da primeira ocorrencia de "needle" dentro "haystack", caso nao encontre retorna (false);
	Parametros:
		- haystack = string que sera varrida na busca
		- needle = string que sera buscada
		- offset = posicao da qual iniciara a busca

	*/

	this.strpos = function (haystack, needle, offset) {

		if(offset == undefined) {

			offset = 0;

    }

    var i = haystack.indexOf( needle, offset ); // returns -1

    return (i >= 0 ? i : false);

	}

	/*

	Descricao: encontra a posicao da ultima ocorrencia de uma string case-insensitive em uma string
	Retorno:
		- retorna a posicao numerica da ultima ocorrencia de "needle" dentro "haystack", caso nao encontre retorna (false);
	Parametros:
		- haystack = string que sera varrida na busca
		- needle = string que sera buscada

	*/

	this.strripos = function (haystack, needle) {

		haystack = this.converterLowercase(String(haystack));
		needle = this.converterLowercase(String(needle));

    var i = haystack.lastIndexOf(needle); // returns -1

    return (i >= 0 ? i : false);

	}

	/*

	Descricao: converte os caracteres para letra minuscula (inclusive caracteres extendidos)
	Retorno: texto com letras em minuscula
	Parametros:
		- textoInicial = texto a ser convertido
	
	*/

	this.converterLowercase = function (textoInicial) {

		var caracteresEspeciais = new Array();

		caracteresEspeciais[caracteresEspeciais.length] = new Array("á","Á");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("à","À");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("ã","Ã");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("â","Â");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("ä","Ä");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("é","É");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("è","È");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("ê","Ê");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("ë","Ë");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("í","Í");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("ì","Ì");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("î","Î");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("ï","Ï");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("ó","Ó");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("ò","Ò");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("õ","Õ");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("ô","Ô");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("ö","Ö");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("ú","Ú");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("ù","Ù");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("û","Û");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("ü","Ü");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("ç","Ç");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("ñ","Ñ");

		textoInicial = textoInicial.toLowerCase();

		for (var i in caracteresEspeciais) {

			textoInicial.replace(caracteresEspeciais[i][1],caracteresEspeciais[i][0]);

		}

		return textoInicial;

	}

	/*
	
	Descricao: converte os caracteres para letra maiuscula (inclusive caracteres extendidos)
	Retorno: texto com letras em maiuscula
	Parametros:
		- textoInicial = texto a ser convertido
	
	*/

	this.converterUppercase = function (textoInicial) {

		var caracteresEspeciais = new Array();

		caracteresEspeciais[caracteresEspeciais.length] = new Array("Á","á");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("À","à");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("Ã","ã");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("Â","â");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("Ä","ä");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("É","é");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("È","è");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("Ê","ê");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("Ë","ë");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("Í","í");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("Ì","ì");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("Î","î");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("Ï","ï");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("Ó","ó");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("Ò","ò");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("Õ","õ");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("Ô","ô");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("Ö","ö");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("Ú","ú");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("Ù","ù");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("Û","û");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("Ü","ü");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("Ç","ç");
		caracteresEspeciais[caracteresEspeciais.length] = new Array("Ñ","ñ");

		textoInicial = textoInicial.toUpperCase();

		for (var i in caracteresEspeciais) {

			textoInicial.replace(caracteresEspeciais[i][1],caracteresEspeciais[i][0]);

		}

		return textoInicial;

	}

	/*

	Descricao: Torna a primeira letra de cada palavra da string em maiuscula
	Retorno:
		- texto = texto com a letra inicial de cada palavra em maiuscula
	Parametros:
		- textoInicial = texto a ser modificado

	*/

	this.ucwords = function(textoInicial) {

    return textoInicial.replace(/^(.)|\s(.)/g, function ( $1 ) { return $1.toUpperCase ( ); } );

	}

	/*

  Descricao: retira todos os acentos de uma string
	Retorno: uma string sem acentuacao
	Parametro:
	 - texto = uma string que deseja-se retirar os acentos

	*/

	this.retiraAcentos = function (texto) {

	  array1 = new Array(
										"á", "à", "â", "ã", "ä",
										"é", "è", "ê", "ë",
										"í", "ì", "î", "ï",
										"ó", "ò", "ô", "õ", "ö",
										"ú", "ù", "û", "ü", "ç", "ñ",
										"Á", "À", "Â", "Ã", "Ä",
										"É", "È", "Ê", "Ë",
										"Í", "Ì", "Î", "Ï",
										"Ó", "Ò", "Ô", "Õ", "Ö",
										"Ú", "Ù", "Û", "Ü", "Ç", "Ñ"
										);

	  array2 = new Array(
										"a", "a", "a", "a", "a",
										"e", "e", "e", "e",
										"i", "i", "i", "i",
										"o", "o", "o", "o", "o",
										"u", "u", "u", "u", "c", "n",
										"A", "A", "A", "A", "A",
										"E", "E", "E", "E",
										"I", "I", "I", "I",
										"O", "O", "O", "O", "O",
										"U", "U", "U", "U", "C", "N"
										);

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

			texto = texto.replace(array1[i], array2[i]);

		}

	  return texto;

	}

	/*

	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: Verifica se um usuario e valido
	Retorno:
		- boolean = verdadeiro caso seja valido e falso caso seja invalido
	Parametros:
		- usuario = usuario que sera verificado

	*/

	this.verificarUsuario = function (usuario) {

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

			var expressaoUsuario = new RegExp("^([a-z]+[a-z0-9]*_*[a-z0-9]+)$");

			return expressaoUsuario.test(usuario);

		}
		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: 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: retorna as combinacoes possiveis de um determinado numero (a partir de uma quantidade de digitos que serao agrupados)
	Retorno:
		- combinacoes = array contendo as combinacoes
	Parametros:
		- numeros = array contendo os numeros que serao combinados
		- qtdeAgrupamento = os numeros serao agrupados de X em X

	*/

	this.combinacoes = function(numeros, qtdeAgrupamento) {

		var retorno = new Array();
		var indiceAtual = new Array();
		var qtdeCombinacoes = Math.floor(this.fatorial(numeros.length) / (this.fatorial(numeros.length - qtdeAgrupamento) * this.fatorial(qtdeAgrupamento)));

		var maiorIndiceColuna = 0;

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

			indiceAtual[i] = i;

		}

		retorno[retorno.length] = new Array();

		for (var j  = 0; j < qtdeAgrupamento; j++) {

			retorno[retorno.length - 1][j] = numeros[indiceAtual[j]];

		}

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

			for (var j = qtdeAgrupamento - 1; j >= 0; j--) {

				maiorIndiceColuna = numeros.length - qtdeAgrupamento + j;

				if (indiceAtual[j] < maiorIndiceColuna) {

					indiceAtual[j]++;

					for (var k = j + 1; k < qtdeAgrupamento; k++) {

						indiceAtual[k] = indiceAtual[j] + k - j;

					}

					break;

				}

			}

			retorno[retorno.length] = new Array();

			for (var j  = 0; j < qtdeAgrupamento; j++) {

				retorno[retorno.length - 1][j] = numeros[indiceAtual[j]];

			}

		}

		return retorno;

	}

	/*

	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(dataReferencia.substr(2,1) != '/' || dataReferencia.substr(5,1) != '/') {
			return false;
		}

		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: verifica se um horario e valido ou nao
	Retorno:
		- boolean = retorna verdadeiro caso o horario seja valido ou falso caso seja invalido
	Parametros:
		- horarioReferencia = horario que sera verificado

	*/

	this.verificarHorario = function (horarioReferencia) {

		horarioReferencia = this.trim(horarioReferencia);

		if( (horarioReferencia.length < 5) || ( (horarioReferencia.length > 5 && horarioReferencia.length < 8) || horarioReferencia.length > 8 ) ) {

			return false;

		}

		if(horarioReferencia.length == 5) {

			horarioReferencia+=":00";

		}

		if(horarioReferencia.substr(2,1) != ":" || horarioReferencia.substr(5,1) != ":") {

			return false;

		}
		

		if (arguments.length > 2) {

			var horaReferencia = this.inteiro(arguments[0]);
			var minutoReferencia = this.inteiro(arguments[1]);
			var segundoReferencia = this.inteiro(arguments[2]);

		}
		else {

			var partes = horarioReferencia.split(":");

			var horaReferencia = this.inteiro(partes[0]);
			var minutoReferencia = this.inteiro(partes[1]);
			var segundoReferencia = this.inteiro(partes[2]);

			if(isNaN(partes[0]) || isNaN(partes[1]) || isNaN(partes[2])) {

				return false;

			}

		}

		var novoHorario = new Date();

		novoHorario.setHours(horaReferencia);
		novoHorario.setMinutes(minutoReferencia);

		if ((novoHorario.getHours() != horaReferencia)||(novoHorario.getMinutes() != minutoReferencia) || (segundoReferencia > 60 || segundoReferencia < 0)) {

			return false;

		}
		else {

			return true;

		}

	}

	/*

	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) {

		if (!obj.tagName) {

			obj = this.pegarObj(obj);

		}

		if (!obj) {

			return false;

		}

		obj.maxLength = 10;

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

		obj.onblur = function (e) {

			this.onblur2(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.onchange2 = (obj.onchange) ? obj.onchange : function (e) { return false; };

		obj.onchange = function (e) {

			this.onchange2(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.onkeydown2 = (obj.onkeydown) ? obj.onkeydown : function (e) { return false; };

		obj.onkeydown = function (e) {

			this.onkeydown2(e);

			if (!e) {

				e = window.event;
				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 {

				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 == 191)))) {	// 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) {

		if (!obj.tagName) {

			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 {

				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 {

				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;
			var teclaShift = e.shiftKey;

		}
		else {

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

		}

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

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

			return false;

		}

		return true;

	}

	/*

	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.onkeydown = this.processaAtalhoEnter;

	}

	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: limita a quantidade maxima de caracter de um objeto
	Retorno: nao retorna nenhuma informacao
	Parametros:
		- obj = objeto ao qual sera atribuida a funcao
		- max = quantidade maxima escolhida

	*/

	this.limitaCaracter = function(obj, max) {

		var str = obj.value;

		if(str.length > max) {

			obj.value = this.trim(str.substring(0,max));

		}
		else {

			this.trim(obj.value)

		}

	}

	/*

	Descricao: Verifica se a senha informada pelo usuario e valida
	Retorno:
		- boolean = verdadeiro caso seja valida e falso caso seja invalida
	Parametros:
		- senha = usuario que sera verificado

	*/

	this.verificarSenha = function (senha) {

		if (this.trim(senha) == "") {
			return false;
		}

		var tmp = objGeral.trim(senha);

		if(senha.length != tmp.length) {
			return false;
		}

		if(senha.length < 6 || senha.length > 15) {
			return false;
		}

		return true;
	}

	/*

	Descricao: foca um determinado objeto
	Retorno: nao retorna nenhuma informacao
	Parametros:
		- idObj = identificador do objeto

	*/

	this.focarObj = function (idObj) {

		var obj = this.pegarObj(idObj);

		obj.focus();

	}

	/*

	Descricao: verifica se ip passado e valido
	Retorno: true(caso seja valido) ou false(caso seja invalido)
	Parametros:
		- ip = IP a ser verificado

	*/
	this.verificarIP = function(ip) {
		
		ipRegExp = /^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})$/
    return ipRegExp.test(ip);

	}

	/*

	Descricao: faz download de um arquivo
	Retorno: nao retorna nenhuma informacao
	Parametros:
		- link = link para o arquivo desejado

	*/	
	
	this.download = function(link) {

		location.href=link;

	}

}