var numeros = "0123456789";
function sonumeros(obj,tipo,e)
{
	if(tipo=='data')
    {
		numeros = "0123456789/";
	}
	else if(tipo=='hora')
    {
		numeros = "0123456789:";
	}
	else
	{
		numeros = "0123456789";
	}
	
    str = obj.value;
    tamanho = str.length;
    retorno = "";
    for ( i=0; i<tamanho; i++ )
    {
    	letra = str.substr(i,1);
    	indexof = numeros.lastIndexOf(letra);
    	if ( indexof > -1 )
    	{ 
    		retorno = retorno + letra; 
    	}
    }
    
    if(tipo=='cpf')
    {
    	if(retorno.length > 9)		obj.value = retorno.substr(0,3)+'.'+retorno.substr(3,3)+'.'+retorno.substr(6,3)+'-'+retorno.substr(9,2);
		else if(retorno.length > 6)	obj.value = retorno.substr(0,3)+'.'+retorno.substr(3,3)+'.'+retorno.substr(6,3);
		else if(retorno.length > 3)	obj.value = retorno.substr(0,3)+'.'+retorno.substr(3,3);
		else obj.value = retorno;
    }
    else if(tipo=='cnpj')
    {
	    if(retorno.length > 15)
	    {
	    	retorno = retorno.substr(0,15);
	    }
    	if(retorno.length == 15)  obj.value = retorno.substr(0,3)+'.'+retorno.substr(3,3)+'.'+retorno.substr(6,3)+'/'+retorno.substr(9,4)+'-'+retorno.substr(13,2);
    	else if(retorno.length == 14)  obj.value = retorno.substr(0,2)+'.'+retorno.substr(2,3)+'.'+retorno.substr(5,3)+'/'+retorno.substr(8,4)+'-'+retorno.substr(12,2);
    	else if(retorno.length > 12)  obj.value = retorno.substr(0,2)+'.'+retorno.substr(2,3)+'.'+retorno.substr(5,3)+'/'+retorno.substr(8,4)+'-'+retorno.substr(12,2);
    	else if(retorno.length > 8)	  obj.value = retorno.substr(0,2)+'.'+retorno.substr(2,3)+'.'+retorno.substr(5,3)+'/'+retorno.substr(8,4);
    	else if(retorno.length > 5)	  obj.value = retorno.substr(0,2)+'.'+retorno.substr(2,3)+'.'+retorno.substr(5,3);
    	else if(retorno.length > 2)	  obj.value = retorno.substr(0,2)+'.'+retorno.substr(2,3);
    	else obj.value = retorno;
    }
    else if(tipo=='cep')
    {
    	if(retorno.length > 5)	obj.value = retorno.substr(0,5)+'-'+retorno.substr(5,3);
    	else obj.value = retorno;
    }
    else
    {
    	obj.value = retorno;
    }
    
}

/**
* 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]
*/
function validaForm(idform,submeter,pagina,option_)
{
	var elementosform = document.getElementById(idform).elements;
	var qtde = elementosform.length;
	var elemento, erro, erroradio=0, x, op, paginacampo='', erro_obj, nome_campo_erro;
    
	//percorre os elementos do form
	for(x=0;x<qtde;x++) 
	{
		elemento = elementosform[x];
		op = elemento.getAttribute('validacao');
		erro_personalizado = elemento.getAttribute('msgerro');
		if(!erro_personalizado) erro_personalizado = 'Campo Inválido!';
		
		if(pagina)	paginacampo = elemento.getAttribute('pagina');
		if(!paginacampo||paginacampo==pagina)
		if(op&&document.getElementById('erro_'+elemento.name))
		{
			erro_obj = document.getElementById('erro_'+elemento.name);
			switch(op)
			{
				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_obj.innerHTML = '';
							}
							else
							{
								erro_obj.innerHTML = erro_personalizado;
								erro = 1;
							}
						break;
						case 'checkbox': case 'radio':
						if(nome_campo_erro!=elemento.name)
						{
							if(elemento.checked)
							{
								erro_obj.innerHTML = '';
								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_obj.innerHTML = '';
					}
					else
					{
						erro_obj.innerHTML = erro_personalizado;
						erro = 1;
					}
				break;
				case 'cpf': //campo com cpf
					if(validaCpfCnpj(elemento.value,0))
					{
						erro_obj.innerHTML = '';
					}
					else
					{
						erro_obj.innerHTML = erro_personalizado;
						erro = 1;
					}
				break;
				case 'cnpj': //campo com cnpj
					if(validaCpfCnpj(elemento.value,1))
					{
						erro_obj.innerHTML = '';
					}
					else
					{
						erro_obj.innerHTML = erro_personalizado;
						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_obj.innerHTML = erro_personalizado;
						erro = 1;
					}
				break;
			}
		}
	}
	if(erroradio) erro=1;
	if(!erro)
	{
		if(submeter!='n')
		document.getElementById(idform).submit();
		return(1);
	}
	if(option_!='noalert')
	alert('Preencha todos os campos corretamente\nOs campos com * são obrigatórios.');
	return(0);
}

/**
* Verifica se um email é válido
* 
* Faz uma verificação atravéz de
* uma expressão regular para ver se um email
* é válido
*/
function validaEmail(email)
{
	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 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;
	}
}

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