/**********************************/
/* Autor: Felipe Jaekel (12/2005) */
/**********************************/
/*   Funções específicas do site  */
/**********************************/

/*****************************************/
/* Alterna a visibilidade de um elemento */
/*****************************************/
function toggleDisplay(linha)
{
	if(document.getElementById(linha).style.display == 'none')
	{
		document.getElementById(linha).style.display = '';
	}
	else
	{
		document.getElementById(linha).style.display = 'none';
	}
}
/****************************************************/
/* Insere '...' caso o texto seja maior que a linha */
/****************************************************/
function fitText(ident, contador)
{
   //Tamanho pré definido baseado no comprimento da linha(excede um pouco para garantir)
   var fim = 250;

	for(var linha = 0; linha < contador; linha++)
	{
		//Diminui o tamanho do texto até caber dentro de uma linha
      //Cada linha tem 13 pixels, portanto se o texto for muito grande offsetHeight terá 26px, 39px ou +
      //No IE cada linha tem 14 pixels
      //Não é necessário um if para condicionar este while, pois ele mesmo já avalia se a condição é verdadeira para executar as repetições
      //O menor valor possível para duas linhas de texto é 26, portanto será testado com 25 para haver uma margem de folga, evitando assim loop infinito já que offsetHeight varia de navegador para navegador e quando há uma linha só ele é irredutível. Ex.: se a condição de teste fosse 14 e o gerasse 15, ocorreria loop infinito, porque mesmo se todas as letras fossem removidas o valor ainda seria 15 
		while(field(ident + linha).offsetHeight > 25)
		{
			//innerHTML contém todo o conteúdo que está dentro da tag, inclusive código html
			//--final faz com que primeiro seja feito o decremento e depois seja executado o resto
			field(ident + linha).innerHTML = field(ident + linha).innerHTML.substr(0, --fim) + '...&nbsp;';
		}

		//Reseta a variável final. Caso isso não seja feito a cada passagem no while ela terá um valor menor
		fim = 250;
	}
}

//-----------------------------------------------------------------------------
//Exibe uma confirmação para a troca de link na listagem
function confirmaTrocaLink(url)
{
	var confirma = confirm('Todas as informações não salvas serão PERDIDAS. Confirma?');

	if(confirma)
	{
		window.location = url;
	}
}

/*****************************************************************************/
/* Valida o login ao site */
/**************************/
function validaLogin(user, pwd, random, botao, JS, resolucao)
{
   //Se o campo for 'codCli' será exiibido 'Código' na mensagem de erro
   var usuario = (user == 'codCli') ? 'Código' : 'Usuário';

	if(field(user).value == '' || field(pwd).value == '')
	{
		if(field(user).value == '' && field(pwd).value != '')
		{
			alert(usuario + ' não informado');
			field(user).focus();
			return false;
		}
		else if(field(user).value != '' && field(pwd).value == '')
		{
			alert('Senha não informada');
			field(pwd).focus();
			return false;
		}
		else if(field(user).value == '' && field(pwd).value == '')
		{
			alert(usuario + ' e senha não informados');
			field(user).focus();
			return false;
		}
	}
	else
	{
		if(user == 'codCli')
		{
			//A variável erro receberá o retorno da função validaNumero
			erro = validaNumero(user);
			if(erro)
			{
				//Concatena a mensagem de erro com o nome do campo
				alert(erro+"Código");

				field(user).focus();
				field(user).select();
				return false;
			}
		}

		//Maxlenght deve ser aumentado para o mesmo tamanho do hash para que o mesmo seja retornado corretamente
		field(pwd).setAttribute('maxLength', 40);

		//Processa HMAC através do hash SHA1 do trim do uppercase da senha (as senhas geradas são sempre em uppercase, os espaços são removidos para evitar diferenças e o hash é feito porque a senha está criptografada no banco de dados)
      if(pwd == 'pwdCli')
      {
			/**
          * PS 83374
          */
         //field(pwd).value = hex_hmac_sha1(hex_sha1(trim(field(pwd).value.toUpperCase())), field(random).value);
         field(pwd).value = hex_sha1(trim(field(pwd).value.toUpperCase()));
		}
		else
		{
			field(pwd).value = hex_hmac_sha1(hex_sha1(trim(field(pwd).value)), field(random).value);
		}

		//Informa para o PHP que o JS está ativo
		field(JS).value = 'true';

      try
      {
			field(resolucao).value = screen.width + ' x ' + screen.height;
		}
		catch(e)
		{
			field(resolucao).value = e.toString();
		}

		disable(botao);

		return true;
	}
}
/*****************************************************************************/
/* Valida o formulário de contatos */
/***********************************/

function validaContato(formobj, tipo)
{
   var fieldRequired, fieldDescription;

   switch(tipo)
   {
   	case 'Comercial':
   	{
   		fieldRequired		=	Array('nome', 'cargo', 'cidade', 'uf', 'ddd', 'fone', 'email', 'empresa', 'texto');
			fieldDescription	= 	Array('Nome', 'Cargo', 'Cidade', 'Estado', 'DDD', 'Número', 'Email', 'Empresa',
												'Texto');
			break;
		}
		case 'SAC':
		{
   		fieldRequired		=	Array('codigo', 'nome', 'cargo', 'cidade', 'uf', 'ddd', 'fone', 'email', 'empresa',
   											'texto');
			fieldDescription	= 	Array('Código', 'Nome', 'Cargo', 'Cidade', 'Estado', 'DDD', 'Número', 'Email',
												'Empresa', 'Texto');
			break;
		}
      //Diretoria e Gerência
		default:
		{
			fieldRequired		= 	Array('setor', 'texto');
			fieldDescription	= 	Array('Setor', 'Texto');
		}
   }

   //Armazena as mensagens de erro dos campos que serão tratados com expressões regulares
	var erro = '';

   //Usando tratamento de exceções evita erros caso um dos campos não exista
   try
	{
		//Testa se o código é válido
		/*var codigo = formobj.codigo.value;
		if(codigo != '' && !codigo.match(/^\d{1,4}$/))
		{
			erro += ' - Código deve ser numérico \n';
		}*/

		//Testa se o ddd é válido
		var ddd = formobj.ddd.value;
		if(ddd != '' && !ddd.match(/^(0?)\d{2}$/))
		{
			erro += ' - DDD deve escrito no formato 0XX ou XX \n';
		}

		//Testa se o telefone é válido
		var fone = formobj.fone.value;
		if(fone != '' && !fone.match(/^\d{3,4}(\-?)\d{4}$/))
		{
			erro += ' - Telefone inválido \n';
		}
	}
	catch(e){}

   //Testa se o email é válido
   var email = formobj.email.value;

	//Advanced Email Check credit-
	//By JavaScript Kit (http://www.javascriptkit.com)
	//The regexp makes the following assumptions regarding what a valid email address is:
	// -Contains a least one character procedding the "@"
	// -Contains a "@" following the procedding character(s)
	// -Contains at least one character following the "@", followed by a dot (.), followed by either a two character or three character string (a two character country code or the standard three character US code, such as com, edu etc)
   var filtro	= 	/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;

	if(email != '' && !email.match(filtro))
	{
		erro += ' - Email inválido \n';
	}

	var alertMsg = '';
	var l_Msg = alertMsg.length;

	for(var i = 0; i < fieldRequired.length; i++)
	{
		var obj = formobj.elements[fieldRequired[i]];
		if(obj)
		{
			if(!obj.disabled)
			{
				switch(obj.type)
				{
					case 'text':
					case 'textarea':
						if (obj.value == '' || obj.value == null)
						{
							alertMsg += ' - ' + fieldDescription[i] + '\n';
						}
						break;
					case 'select-one':
						if (obj.selectedIndex == 0)
						{
							alertMsg += ' - ' + fieldDescription[i] + '\n';
						}
						break;
					default:
				}
				if(obj.type == undefined)
				{
					var blnchecked = false;
					for (var j = 0; j < obj.length; j++)
					{
						if(obj[j].checked)
						{
							blnchecked = true;
						}
					}
					if(!blnchecked)
					{
						alertMsg += ' - ' + fieldDescription[i] + '\n';
					}
				}
			}
		}
	}
	if(alertMsg.length == l_Msg && erro.length == 0)
	{
		formobj.enviar.disabled = true;
		formobj.limpar.disabled = true;
		return true;
	}
	else
	{
		alert(erro + alertMsg);
		return false;
	}
}
/*****************************************************************************/
/* Amplia uma imagem do sistema */
/********************************/
function ampliaImagemSistema(nome)
{
	window.open('/imagens/sistema/'+nome, '', 'height=300px, width=600px, location=no, menubar=no, resizable=no, scrollbars=no, status=no, toolbar=no');

   //Evita que seja aberta uma janela padrão do navegador
	return false;
}

/**
 ******************************************
 * Algoritmo para teste de força da senha *
 ******************************************
 * Fraca:
 * - Apenas números
 * - Apenas letras
 * - Menor ou igual a 6 caracteres
 * Média:
 * - Letras e números
 * - Entre 6 e 8 caracteres
 * Forte:
 * - Maior ou igual a 8 caracteres
 * - Símbolos
 * - Alternância entre maiúsculas e minúsculas
 */
   //-----------------------------------------------------------------------------
   // Construtor da classe
	function novaSenha(campo)
	{
      //TESTAR ALTERNANCIA E REPETICAO DE CARACTERES DE ACORDO COM O TAMANHO DA SENHA


      //Propriedades
   	this.senha = trim(field(campo).value);

      //Metodos
   	this.testeSimples	 = testeSimples;
   	this.testeAvancado = testeAvancado;
   	this.determinaTipo = determinaTipo;
   	this.countChar 	 = countChar;

      //Chama o método testeSimples(), que chamará os demais
   	this.testeSimples();

		//-----------------------------------------------------------------------------
		// Teste simples
		function testeSimples()
		{
			var erro = ['Sua senha não foi aprovada pelo(s) seguinte(s) motivo(s)'];

			//Contador do vetor. Começa em 1 porque a chave 0 foi inicializada
			var i = 1;

			//Testa se a senha é fraca
			if(this.senha.match(/^\d*$/))
			{
				erro[i++] = '- Contém apenas números';
			}
			if(this.senha.match(/^[a-z]*$/i))
			{
				erro[i++] = '- Contém apenas letras';
			}
			if(this.senha.length <= 6)
			{
				erro[i++] = '- Muito curta';
			}

			//Testa se houve erro. Se não houver parte para o teste avançado
			if(erro.length > 1)
			{
				alert(formata.msgErro(erro).join('\n'));
				setFocus(campo);
				return;
			}
			else
			{
				this.testeAvancado();
			}
		}

		//-----------------------------------------------------------------------------
		// Teste avançado(caracter por caracter)
		function testeAvancado()
		{
			//Transforma a string em vetor
			this.senha = this.senha.split('');

			//Vetor de estados
			var tipo  = ['digit', 'alpha', 'symbol'];

			//Armazena o estado atual
			var atual = '';

			//Determina o tipo do primeiro caracter para condicionar os demais
			atual = this.determinaTipo(this.senha[0]);
			if(!atual)
			{
				alert('Sua senha é inválida pelo seguinte motivo: \n\n - O primeiro caracter é inválido');
				setFocus(campo);
				return;
			}

         //Conta quantas vezes uma variável do mesmo tipo foi repetida
         var tipoIgual = 0;

			//Testa os demais caracteres da senha
			for(i = 1; i < this.senha.length; i++)
			{
            if(senha[i] == senha[i + 1])
            {
					alert('Sua senha não foi aprovada porque houve repetição de caracteres \n\n Exemplos: aa, 44, ##');
					setFocus(campo);
					return;
            }

				//Variável auxiliar para evitar que determina tipo seja executada duas vezes no mesmo caracter
				var tmp = this.determinaTipo(this.senha[i]);

            if(tmp == atual)
				{
               tipoIgual++;
               if(tipoIgual == 2)
               {
						alert('Sua senha não foi aprovada devido ao mesmo tipo de caracter ter se repetido mais de duas vezes \n\n Exemplos: xFd, 486, @#!');
						setFocus(campo);
						return;
					}
				}
				else
				{
					atual = tmp;

               //Como os tipos são diferentes, reseta tipoIgual
					tipoIgual = 0;
				}

				if(this.countChar(this.senha, this.senha[i], i))
				{
					alert('Sua senha não foi aprovada devido a repetição do mesmo caracter mais de duas vezes \n\n Exemplo: a1&1x1');
					setFocus(campo);
					return;
				}
			}

			//-----------------------------------------------------------------------------
			// Se não houve nenhum erro, grava a senha no banco
			//dojo.io.bind({});
			alert('Senha ok');
		}

		//-----------------------------------------------------------------------------
		// Função auxiliar para determinar o tipo do caracter
		function determinaTipo(caracter)
		{
			if(caracter.match(/^\d$/))
			{
				return 'digit';
			}
			else if(caracter.match(/^[a-z]$/i))
			{
				return 'alpha';
			}
			else if(caracter.match(/^[!@#$%&*()_+\/]$/))
			{
				return 'symbol';
			}
			else
			{
				return false;
			}
		}

		//-----------------------------------------------------------------------------
		// Função auxiliar para determinar se um caracter foi digitado mais de duas vezes alternamente
		function countChar(str, caracter, pos)
		{
			var total = 0;
			var primeiraOcorrencia = false;

			for(var i = 0; i <= pos; i++)
			{
            if(!primeiraOcorrencia)
            {
					if(str[i] == caracter)
					{
						total++;
					}
					primeiraOcorrencia = true;
            }
            else
            {
					if(str[i + 1] == caracter)
					{
						total++;
					}
            }
			}

			return (total > 2);
		}
	}
