/**
* Limpa um formulário qualquer
* 
* Realiza um loop por todos os elementos de um formulário
* e retira todos os dados preenchidos
* 
* O parâmetro pagina é para o caso de um formulário
* ser muito extenso e por isso ser programado em javascript
* para que fique em várias páginas e depois envie todo o
* conteúdo do formulário de uma vez só
* 
*/
function limpar(idform,pagina)
{
	if(document.getElementById(idform).elements)
	{
		var elementosform = document.getElementById(idform).elements;
		var qtde = elementosform.length;
		var elemento, paginacampo='';
	
		//percorre os elementos do form
		for(x=0;x<qtde;x++) 
		{
			elemento = elementosform[x];
			if(pagina)	paginacampo = elemento.getAttribute('pagina');
			if(!paginacampo||paginacampo==pagina)
			{
				//verificando o tipo do input
				switch(elemento.type)
				{
					case 'text': case 'password': case 'textarea': case 'select-one': case 'select-multiple':
						elemento.value = '';
					break;
					case 'checkbox': case 'radio':
						elemento.checked = false;
					break;
				}
			}
		}
	}
}

/**
* Valida um formulário qualquer
* 
* Realiza um loop por todos os elementos de um formulário
* e varifica o atributo validacao e retorna o erro para o 
* objeto de id erro_[nome do objeto validado] de acordo com
* o tipo de validação
*
* O parâmetro 'pagina' é para o caso de um formulário
* ser muito extenso e por isso ser programado em javascript
* para que fique em várias páginas e depois envie todo o
* conteúdo do formulário de uma vez só
*
* O parâmetro 'submeter' indica se o formulário deve ou não 
* ser submetido após a validação, isso caso não ocorra erro
*
* Tipos de Validação :
* 
* 'obrigatorio' : validacao que verifica só se o campo esta ou não vazio
* 'email' 		: além de verificar o preenchimento verifica também se foi escrito um email válido
* 'cpf-cnpj' 	: verifica se o cnpj ou cpf digitado é válido e real
* 'cpf' 		: verifica se o cpf digitado é válido e real
* 'cnpj' 		: verifica se o cnpj digitado é válido e real
* 'senha' 		: verifica se a senha esta preenchida e se ela é válida de acordo com o campo conf_[nome do objeto validado]
*/
var grupocampos;
function validaForm(idform,submeter,pagina,option_)
{
	grupocampos = new Array();
	objValidacao = formularios[idform];

	var elementosform = document.getElementById(idform).elements;
	var qtde = elementosform.length;
	var elemento, erro, erroradio=0, x, op,  erro_obj, nome_campo_erro;
	var objErroForm = document.getElementById('erro_' + idform);

	if(!objValidacao)
	{
		return true;
	}	

	var podeEnviar = true;


	//percorre o form para primeiramente limpar os erros
	for(x=0;x<qtde;x++) 
	{
		elemento = elementosform[x];
		
		if(objValidacao[elemento.name])
		{
			idErro = objValidacao[elemento.name].idErro;
		}	
		
		if(!idErro) idErro = 'erro_'+elemento.name;
	
		if(document.getElementById(idErro))
		{
			//console.log('Vai limpar ' + idErro);
			document.getElementById(idErro).innerHTML = '';
			document.getElementById(idErro).style.display = 'none';
		}
	}	
	
	//percorre os elementos do form
	for(x=0;x<qtde;x++) 
	{
		elemento = elementosform[x];

		op                 = '';
		params             = '';
		erro_personalizado = '';
		idErro             = '';
		naoObrigatorio     = false;
		
		if(objValidacao[elemento.name])
		{
			//console.log(objValidacao[elemento.name]);
			op                 = objValidacao[elemento.name].tipo;
			params             = objValidacao[elemento.name].params;
			erro_personalizado = objValidacao[elemento.name].mensagem;
			idErro             = objValidacao[elemento.name].idErro;
			naoObrigatorio     = (objValidacao[elemento.name].naoObrigatorio) ? true : false;
		}	
			
		if(!erro_personalizado) erro_personalizado = 'Campo Inválido!';
		if(!idErro) idErro = 'erro_'+elemento.name;
		
		erro = '';
		
		if(naoObrigatorio && grupocampos[idErro] != 'erro')
		{
			if(elemento.value == '')
			{
				if(grupocampos[idErro] == 'conteudo')
				{
					grupocampos[idErro] = 'erro';
					erro = 1;
				}
				else
				{
					grupocampos[idErro] = 'vazio';
				}
			}
			else 
			{
				if(grupocampos[idErro] == 'vazio')
				{
					grupocampos[idErro] = 'erro'
					erro = 1;
				}
				else
				{
					grupocampos[idErro] = 'conteudo';
				}
			}
		}
		
		if(op && document.getElementById(idErro))
		{
			erro_obj = document.getElementById(idErro);

			switch(op)
			{   
				case 'numerico':
					if(naoObrigatorio && elemento.value == '')
					{
						break;
					}	

					if(!elemento.value.match(/^[0-9]{1,}$/))
					{
						erro = 1;
					}
				break;
				
				case 'ddd':
					if(naoObrigatorio && elemento.value == '')
					break;
					if(!elemento.value.match(/^[0-9]{1,}$/) || !validaDDD(elemento.value))
					{
						erro = 1;
					}
				break;
				
				case 'tamanho':
					switch(elemento.type)
					{
						case 'text': case 'password': case 'textarea':
							if(params.match(/[0-9]{1,},[0-9]{1,}/))
							{
								limites = params.split(",");
								//Se existe o limite superior
								if(limites[1] > 0)
								{
									if(elemento.value.length > limites[1])
									{
										erro = 1;
									}	
								}
								
								if(elemento.value.length < limites[0])
								{
									erro = 1;
								}	
							}
						break;
					}
					
				break;
				case 'obrigatorio': //campo comum
					switch(elemento.type)
					{
						case 'text': case 'password': case 'hidden': case 'textarea': case 'select-one': case 'select-multiple':
							if(!elemento.value.length)
							{
								erro = 1;
							}
						break;
						case 'checkbox': case 'radio':
						if(nome_campo_erro!=elemento.name)
						{
							if(elemento.checked)
							{
								nome_campo_erro = elemento.name;
								erroradio = 0;
							}
							else
							{
								erro_obj.innerHTML = erro_personalizado;
								erroradio = 1;
							}
						}
						break;
					}
					
				break;
				case 'email': //campo com email
					if(!validaEmail(elemento.value))
					{
						erro = 1;

					   if(!elemento.value.length)
					   {
							erro_personalizado = 'Indique o seu email';
					   }
					}
				break;
				case 'data': //campo com data
					if(!validaData(elemento.value))
					{
						erro = 1;
					}
				break;
				case 'cpf': //campo com cpf
					if(!validaCpfCnpj(elemento.value,0))
					{
						erro = 1;
					}
				break;
				case 'cnpj': //campo com cnpj
					if(!validaCpfCnpj(elemento.value,1))
					{
						erro = 1;
					}
				break;
				case 'senha': //campo senha e confirmacao de senha
					if(elemento.value.length && elemento.value == document.getElementById('conf_'+elemento.name).value)
					{
						//erro_obj.innerHTML = '';
					}
					else
					{
						erro = 1;
					}
				break;
			}
			
			if(erro == 1)
			{
				podeEnviar = false;
				erro_obj.innerHTML = erro_personalizado;
				erro_obj.style.display = 'block';
				objErroForm.style.display = 'block';
			}
		}
	}
	if(erroradio) erro=1;
	
	if(podeEnviar)
	{
		//if(submeter!='n')
		//document.getElementById(idform).submit();
		return true;
	}
	//if(option_!='noalert')
	//alert('Preencha todos os campos obrigatórios corretamente');
	return false;
}

/**
* Verifica se um email é válido
* 
* Faz uma verificação através de
* uma expressão regular para ver se um email
* é válido
*/
function validaEmail(email)
{
	if(email.length > 80)
	{
		return (false);
	}

	var regularExpression = /^[\w!#$%&'*+\/=?^`{|}~-]+(\.[\w!#$%&'*+\/=?^`{|}~-]+)*@(([\w-]+\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])$/;
	if (regularExpression.test(email))
	{
		return(true);
	}
	return(false);
}

/**
* Verifica se uma data é válida
*
*/
function validaData(data)
{
	var regularExpression  = /^\d{1,2}\/\d{1,2}\/\d{1,4}$/;
	if (!regularExpression.test(data))
	{
		return false;
	}
	var bissexto = 0;
	if (data.length == 10)
	{
		var dia = data.substr(0,2)
		var mes = data.substr(3,2)
		var ano = data.substr(6,4)
		if ((ano > 1900)||(ano < 2100))
		{
			switch (mes)
			{
				case '01': case '03': case '05': case '07': case '08': case '10': case '12':
					if  (dia <= 31)	return true;
				break;
				
				case '04': case '06': case '09': case '11':
					if(dia <= 30) return true;
				break;
				case '02':
					if((ano % 4 == 0) || (ano % 100 == 0) || (ano % 400 == 0)) bissexto = 1;
					if((bissexto == 1) && (dia <= 29)) return true;				
					if((bissexto != 1) && (dia <= 28))	return true;
				break;
			}
		}
	}	
	return false;
}

/**
* Verifica se o arquivo é válido
* 
* Verifica se a extensão do arquivo
* colocado nos campos 'file' é válida
* para o tipo de informação que ele deveria comportar
*/
function verify_extension (ob,id_ob,tipo_ob)
{
	if(tipo_ob=='image')
	{
		arrayext = {".jpg":"1",".gif":"1",".jpeg":"1",".png":"1"};
	}
	else
	{
		arrayext = {".doc":"1",".xls":"1",".pdf":"1",".txt":"1"};
	}
	tam_ob = ob.value.length;
	ext_ob = ob.value.substr(tam_ob-4);
	ext_ob = ext_ob.toLowerCase();
	if(!arrayext[ext_ob])
	{
		alert('Extensão Inválida!');
		htmlv = document.getElementById(id_ob).innerHTML;
		document.getElementById(id_ob).innerHTML = '';
		document.getElementById(id_ob).innerHTML = htmlv;
	}
}

function validaDDD(ddd)
{
	var ddds = new Array(11,12,13,14,15,16,17,18,19,21,22,24,27,28,31,32,33,34,35,37,38,41,42,43,44,45,46,47,48,49,51,53,54,55,61,62,63,64,65,66,67,68,69,71,73,74,75,77,79,81,82,83,84,85,86,87,88,89,91,92,93,94,95,96,97,98,99);
	if(in_array(ddd,ddds)) return true;
	return false;
}

/***************** Funcões para validação de CPF e CNPJ ***************************/

/**
* Valida cnpj ou cpf
* 
* Valida um cnpj ou cpf de acordo com
* a string passada
*
* Tipos de Validação :
* '0' : valida cpf
* '1' : valida cnpj
* '2' : valida ambos
* 
* Retorna 1 para sucesso ou 0 para erro
*/
function validaCpfCnpj(num,tipo)
{
	if(tipo==0) return(validate_cpf(num));
	if(tipo==1) return(validate_cnpj(num.substr(1))||validate_cnpj(num));
	if(tipo==2) return(validate_cnpj(num.substr(1))||validate_cnpj(num)||validate_cpf(num));
}

/**
* Função usada para validação do cpf/cnpj
* 
* Retira tudo que não é número
* de uma string
* Exemplo: entrada->'123.123.123-12' saída->'12312312312'
*/
function cleaner(str)
{
	var numeros = "0123456789";
	var tamanho = str.length;
	var retorno = "",i,indexof,letra;
	for ( i=0; i<tamanho; i++ ){
		letra = str.substr(i,1);
		indexof = numeros.lastIndexOf(letra);
		if ( indexof > -1 ){ 
			retorno = retorno + letra; 
		}
	}
	return(retorno);
}

/**
* Função usada para validação do cpf/cnpj
* 
* reverte uma string
* Exemplo: entrada->'johnathan peres' saída->'serep nathanhoj'
*/
function strrev(str_rev_)
{
	var str_rev_ret_ = '',xxx;
	for(xxx=str_rev_.length;xxx>=0;xxx--)
	str_rev_ret_ += str_rev_.substr(xxx,1);
	return(str_rev_ret_);
}

/**
* Função usada para validação do cpf/cnpj
* 
* checa se o cpf/cnpj é falsificado
*/
function checaFalsificado(istringue, lente)
{
	var fake = '',j,x;
	for(j=0;j<10;j++)
	{
		fake = '';
		for(x=0;x<lente;x++);
		{
			fake = fake + j;
		}
		if(istringue == fake) return(1);
	}
	return(0)
}

/**
* Função usada para validação do cpf/cnpj
* 
* Valida o cpf
*/
function validate_cpf(cpftovalidate) 
{
	cpftovalidate = cleaner(cpftovalidate);
	if(cpftovalidate=='' || cpftovalidate.length != 11)
	{
		return(0);
	}
	else
	{
		if(checaFalsificado(cpftovalidate, 11))
		{
			return(0);
		}
		else
		{
			var dv = 0,k,xxx;
			var subcpftovalidate = cpftovalidate.substr(0,9);
			
			for(k=0;k<=9;k++)
			{
				xxx = subcpftovalidate.substr(k,1);
				dv += (xxx*(10-k));
			}
			
			if (dv == 0) return(0);
			dv = 11 - (dv % 11); 
			if(dv > 9) dv = 0;
			if(cpftovalidate.substr(9,1) != dv) return(0);
			dv *= 2;
			for(k=0;k<=9;k++)
			{
				xxx = subcpftovalidate.substr(k,1);
				dv += (xxx*(11-k));
			}
			dv = 11 - (dv % 11); 
			if(dv > 9) dv = 0;
			if(cpftovalidate.substr(10,1) != dv) return(0);
			return(1);
		}
	}
}

/**
* Função usada para validação do cpf/cnpj
* 
* Valida o cnpj
*/
function validate_cnpj(cnpjtovalidate) 
{
	cnpjtovalidate = cleaner(cnpjtovalidate);
	if(cnpjtovalidate=='' || cnpjtovalidate.length != 14)
	{
		return(0);
	}
	else
	{
		if(checaFalsificado(cnpjtovalidate, 14))
		{
			return(0);
		}
		else
		{
			var i,sub_cnpj,reverse_cnpj,dv1,dv2,rest,sum=0,multiplier=0;
			reverse_cnpj = strrev(cnpjtovalidate.substr(0,12));
			for (i=0;i<=11;i++)
			{
				if(i == 0 || i == 8)multiplier=2;
				multiply = (reverse_cnpj.substr(i,1) * multiplier);
				sum = sum + multiply;
				multiplier++;

			}
			rest = sum % 11;
			if (rest == 0 || rest == 1)  dv1= 0;
			else dv1 = 11 - rest;
			
			sub_cnpj = cnpjtovalidate.substr(0,12)
			reverse_cnpj = strrev(sub_cnpj+dv1);
			
			sum=0;
			for (i = 0; i <= 12; i++)
			{
				if(i == 0 || i == 8)multiplier=2;
				multiply = (reverse_cnpj.substr(i,1) * multiplier);
				sum = sum + multiply;
				multiplier++;

			}
			rest = sum % 11;
			if (rest == 0 || rest == 1)  dv2 = 0;
			else dv2 = 11 - rest;

			if (dv1== cnpjtovalidate.substr(12,1) && dv2 == cnpjtovalidate.substr(13,1)) return(1);
			else return(0);
		}
	}
}
