/*

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(haystack);
		needle = this.converterLowercase(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.strtolower = 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.strtoupper = 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",
										"A", "A", "A", "A", "A",
										"E", "E", "E", "E",
										"I", "I", "I", "I",
										"O", "O", "O", "O", "O",
										"U", "U", "U", "U", "C"
										);

		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 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 = this.trim(senha);

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

		if(senha.length < 4) {
			return false;
		}

		return true;
	}

	/*

	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: Altera o atributo de um elemeto de acordo com o browser
	Retorno:
	Parametros: 
		-	idObjeto = id do objeto que possivelmente sera alterado
		-	nomeAtributo = nome do atributo que possivelmente sera alterado
		-	valorAtributo = valor do atributo que possivelmente sera alterado

	*/

	this.corrigirStiloBrowser = function(idObjeto,nomeAtributo,valorAtributo){
	
		var browser = this.versaoBrowser();
	
		var obj = this.pegarObj(idObjeto);
	
		var nomeBrowser = "Internet Explorer";
		var versaoBrowser = "6";
	
		if(arguments.length > 3) {
			versaoBrowser = arguments[3];
	
			if(arguments.length > 4) {
				nomeBrowser = arguments[3];
			}
		}
	
		if(browser[0] == nomeBrowser && browser[1] == versaoBrowser) {
	
			obj.style.setAttribute(nomeAtributo,valorAtributo);
	
		}

	}

	/*

	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 eh valida
	Retorno:
		- boolean = retorna true caso a data seja valida ou false caso seja invalida
	Parametros:
		- dataReferencia = data que sera verificada
	*/
	this.verificarData = function (dataReferencia) {
	
		var reDate = /^((0[1-9]|[12]\d)\/(0[1-9]|1[0-2])|30\/(0[13-9]|1[0-2])|31\/(0[13578]|1[02]))\/\d{4}$/;
	
		if(dataReferencia == null || dataReferencia == "") {
			return false;
		}
	
		if(reDate.test(dataReferencia)) {
			return true;
		}
		
		return false;
	}


	/*

	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)||(tecla > 95)&&(tecla < 106))) {

				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: formata o campo para aceitar apenas digitos que compoe uma placa de um veiculo
	Retorno: nao retorna nenhuma informacao
	Parametros:
		- obj = objeto que recebera a formatacao

	*/

	this.campoPlacaVeiculo = function (obj) {

		var mascara = "000-0000";

		obj.maxLength = 8;

		if (!obj.tagName) {

			obj = this.pegarObj(obj);

		}

		if (!obj) {

			return false;

		}

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

		obj.onkeydown = function (e) {

			this.onkeydownCampoPlacaVeiculo(e);

			if (!e) {

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

			}
			else {

				var tecla = e.which;

			}

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

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

    		var posicaoCampo = 0;    
    		var novoValorCampo="";
    		var tamanhoMascara = obj.value.length;

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

					if(mascara.charAt(i) == "-") {

						novoValorCampo += mascara.charAt(i);
						posicaoCampo++;

					}
					else {

						novoValorCampo += obj.value.charAt(posicaoCampo);
						posicaoCampo++;

					}

				}

				obj.value = novoValorCampo;

			}
			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));

		}

	}

	/*

	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: faz download de um arquivo
	Retorno: nao retorna nenhuma informacao
	Parametros:
		- link = link para o arquivo desejado

	*/	
	
	this.download = function(link) {

		location.href=link;

	}

	//Descricao: monta paginas de navegacao, exemplo:navegacao de Noticias, Depoimentos e Dicas e Curiosidades
	//Retorno:	conteudo html de paginacao
	//Parametros:
	// - paginaEscolhida = numero da pagina para a qual deseja ir
	// - qtde_registroPorPagina = quantidade de registros que aparecerao na pagina
	// - qtde_maximaPagina = quantidade maxima de paginas que serao exibidadas na barra de navegacao
	// - qtdeTotalRegistros = quantidade total de registros de todas as paginas

	this.montarPaginas = function (paginaEscolhida, qtde_registroPorPagina, qtde_maximaPagina, qtdeTotalRegistros) {

		var retorno = "";
	
		retorno+= "<table width='100%' border='0' cellspacing='0' cellpadding='0'>";
		retorno+= "	<tr>";
	
		if(qtdeTotalRegistros > 0) {
	
			qtdTotalPaginas = Math.ceil(qtdeTotalRegistros / qtde_registroPorPagina);
	
			var indice = (paginaEscolhida < qtde_maximaPagina ? 1 : (paginaEscolhida == qtdTotalPaginas ? 1 + (paginaEscolhida - qtde_maximaPagina) : 2 + (paginaEscolhida - qtde_maximaPagina)));
	
			var i = 1;
	
			if(paginaEscolhida > 1) {	//Chamada para a pagina anterior
	
				retorno+= "<td width='6%' align='left'><img onclick='goPag("+(paginaEscolhida - 1)+");' style='cursor:pointer;' title='Pagina "+(paginaEscolhida - 1)+"' src='/images/seta_anterior.gif' width='23px' height='22px' border='0'></td><td>";
	
			}
			else {	//Quando a pagina escolhido for a primeira pagina 
	
				retorno+= "<td width='6%'  align='left'><img src='/images/seta_anterior.gif' width='23px' height='22px' border='0'></td><td>";
	
			}
	
			while(i <= qtde_maximaPagina && indice <= qtdTotalPaginas) {
	
				if(indice == paginaEscolhida) {	//Pagina escolhida(selecionada)
	
			    retorno+= " | <span class='tahoma vermelho'>"+(indice < 10 ? '0'+indice : indice)+"</span>";
	
			  }
			  else {	//Pagina sem selecionamento
	
			    retorno+= " | <span title='Pagina "+indice+"' style='cursor:pointer;' onclick='goPag("+indice+");' class='tahoma cinzaEscuro sublinhado'>"+(indice < 10 ? '0'+indice : indice)+"</span>";
	
				}
	
			  i++;
	
			  indice++;
			}
	
			if(paginaEscolhida < qtdTotalPaginas) {	//Chamada para a proxima pagina
	
				retorno+= "</td><td width='8%' align='right'><img onclick='goPag("+(paginaEscolhida + 1)+");' style='cursor:pointer;' title='Pagina "+(paginaEscolhida + 1)+"' src='/images/seta_proximo.gif' width='23px' height='22px'  border='0'></td>";
	
			}
			else {	//Quando a pagina escolhido for a ultima pagina 
	
				retorno+= "</td><td width='8%' align='right'><img src='/images/seta_proximo.gif' width='23px' height='22px'  border='0'></td>";
	
			}
	
		}
		else {	//Quando o total de registros nao for maior que zero
	
			retorno+= "		<td width='6%' align='left'><img src='/images/seta_anterior.gif' width='23px' height='22px'></td>";
			retorno+= "		<td width='86%' class='tahoma'></td>";
			retorno+= "		<td width='8%' align='right'><img src='/images/seta_proximo.gif' width='23px' height='22px'></td>";
	
		}
	
		retorno+= "	</tr>";
		retorno+= "</table>";
	
		return retorno;

	}
	
	//Descricao: remove o itens de uma combobox
	//Retorno:	true(em caso de sucesso) ou false(em case de erro)
	//Parametros:
	// - idSelect = identificador da combobox que terao seu itens removidos
	// - qtdeRestante(opcional) defalt(1) = quantidade de itens que restarao no elemento
	this.removerItensCombo = function(idSelect) {
		try {
			var objSelec = this.pegarObj(idSelect);
			var qtdeRestante = 1;

			if(arguments.length > 1) {
				qtdeRestante = arguments[1];
			}

			while(objSelec.length > 1) {
				objSelec.remove(objSelec.length - 1);
			}

			return true;
		}
		catch(e) {
			return false;
		}
	
	}

	//Descricao: verifica se o parametro paassao contem somente numeros
	//Retorno:	true(caso seja tudo numero) ou false(em caso contrario)
	//Parametros:
	// - strNumero = string numerica para ser verificada
	this.ehNumero = function (strNumero) {

		var expressao = /^\d*[0-9]$/;
		if(expressao.test(strNumero)) {
			return true
		}

		return false;

	}

}
