// valida numero inteiros ou não
function valida_numero(numero,inteiro) {
	numero = new String(numero);
	
	if(numero.length==0)
		return false;
		
	var exp = /^\$|\./g ;

	// retira $ e .
	numero = numero.replace(exp, "");
	
	exp = /,/g ;
	
	// troca , por .
	numero = numero.replace(exp,".");

	numero = parseFloat(numero);
	
	if(isNaN(numero))
		return false;

	if(inteiro && numero!=Math.round(numero))
		return false;
		
	return true;

}

// verifica se um ano é bissexto
function ano_bi(ano) {
	if (ano % 100 == 0) {
		if (ano % 400 == 0) 
			return true; 
	}
	else 
		if ((ano % 4) == 0) 
			return true; 
	return false;
}


// Valida uma data
function valida_data(data) {
	var datePat = /^(\d{1,2})(\/|-|.)(\d{1,2})\2(\d{4})$/;

	var datadiv = data.match(datePat);

   	if (datadiv==null)
		return false;
	
	var dia = datadiv[1];
	var mes = datadiv[3];
	var ano = datadiv[4];

	if(dia<1 || dia>31 || mes<1 || mes>12 || ano < 2001)
		return false;

	if ((mes==4 || mes==6 || mes==9 || mes==11) && dia>30) 
		return false;
	
	if(mes==2)
		if(dia>29)
			return false;
		else
			if(dia==29 && !ano_bi(ano))
				return false;

	return true;

}

// valida CEP
function valida_cep(cep) {
	if(cep.length>9 || (cep.indexOf("-")==-1 && cep.length>8))
		return false;
	
	var pat = /((\d{4})(-)(\d{3}))|(\d{4})/;
	
	var cepdiv = cep.match(pat);
	
	if(cepdiv==null)
		return false;
	return true;
}


// Calculo do CNPJ 
function valida_cnpj(cnpj) {
	var erro = true; 
	var aux_cnpj = "";	
	var cnpj1=0,cnpj2=0;
	for(j=0;j<cnpj.length;j++)
		if(cnpj.substr(j,1)>="0" && cnpj.substr(j,1)<="9")
			aux_cnpj += cnpj.substr(j,1);
	if(aux_cnpj.length!=14)
		erro = false;
	else {
		cnpj1 = aux_cnpj.substr(0,12);
		cnpj2 = aux_cnpj.substr(aux_cnpj.length-2,2);
		fator = "543298765432";
		controle = "";
		for(j=0;j<2;j++) {
			soma = 0;
			for(i=0;i<12;i++) 
				soma += cnpj1.substr(i,1) * fator.substr(i,1);
			if(j==1) soma += digito * 2;
			digito = (soma * 10) % 11;
			if(digito==10) digito = 0;
			controle += digito;
			fator = "654329876543";
		} 
		if(controle!=cnpj2)
			erro = false;
	} 
	return erro;
}

// Validação do CPF
function valida_cpf(cpf) {
	var cpf = new String(cpf);
    var aux_cpf = "";
	
	if(cpf.length!=11)
		return false;
		
    for(j=0;j<cpf.length;j++)
  		if(cpf.substr(j,1)>="0" && cpf.substr(j,1)<="9")
   			aux_cpf += cpf.substr(j,1);
	if(aux_cpf.length!=11)
		return false;
    else {
    	var cpf1 = String(aux_cpf);
    	var cpf2 = cpf.substr(cpf.length-2,2);
      	var controle = "";
      	var start = 2;
      	var end = 10;
      	for(var i=1;i<=2;i++) {
      		var soma = 0;
      		for(j=start;j<=end;j++)
      			soma += cpf1.substr((j-i-1),1)*(end+1+i-j);
        	if(i==2)
          		soma += digito * 2;
        	digito = (soma * 10) % 11;
        	if(digito==10)
          		digito = 0;
        	controle += digito;
        	start = 3;
        	end = 11;
      	}
      	if(controle!=cpf2)
        	return false;
    }
	
	return true;
}


// Esta é uma função simples para validar emails
function valida_email(email) {
	var chars = "@#$&[]()/\\\{}!^:'\"";
	var pat=/^(.+)@(.+)$/;
	
	var emaildiv = email.match(pat);
	
	if(emaildiv==null)
		return false;
		
	var login = emaildiv[1];
	var dominio = emaildiv[2];
	
	for(var i=0;i<chars.length;i++) {
		if(login.indexOf(chars.substr(i,1))!=-1)
			return false;
	}
	
	for(var i=0;i<chars.length;i++) {
		if(dominio.indexOf(chars.substr(i,1))!=-1)
			return false;
	}
	
	return true;
}

// Valida uma string em particular (tipo login ou senha)
function valida_string(string) {
	str = new String(string);
	if(str.length<5)
		return false;
	if(str.indexOf(" ")!=-1)
		return false;

	var chars = "@#$&[]()/\\\{}!^:'\"";

	for(var i=0;i<chars.length;i++) {
		if(str.indexOf(chars.substr(i,1))!=-1) {
			return false;
		}
	}
		
	return true;

}

// Valida o numero do Cartão de crédito
function valida_cartao(numero) {
	var str = new String(numero);

	if(str.length==0)
		return false;

	var peso = (str.length%2==0) ? 2 : 1;
	var soma = 0;
	
	for(var i=0;i<str.length;i++) {
		num = str.substr(i,1);
		vlr = num*peso;
		soma+= (vlr>9) ? vlr-9 : vlr;
		peso = (peso==2) ? 1 : 2;
	}

	return (soma%10==0 && soma!=0);
}

// Valida a Data de validade do cartão (mm/aa)
function valida_dtvalidade(data) {
	var datePat = /^(\d{1,2})(\/|-|.)(\d{1,2})$/;
	var dtdiv = data.match(datePat);
	
	if(dtdiv==null)
		return false;
	
	var dia = 31;
	var mes = parseInt(dtdiv[1]);
	var ano = parseInt(dtdiv[3]);
	
	if(mes<1 || mes>12 || ano<01)
		return false;
	
	var data = new Date();
	var mes_at = data.getMonth();
	var ano_at = data.getYear();
	mes_at++;
	ano+=2000; 
	
	var anomes = ano*100+mes;
	var anomes_at = ano_at*100+mes_at;
	
	if(anomes<anomes_at)
		return false;
	
	return true;		
}

function retira_car(numero) {

	var exp = /^\$|\./g ;

	numero = numero.replace(exp, "");
	
	return numero;

}

function valida_form(form,campos,nomescampos,tipos,status) {
	/*
	form = posição do formulário (0,1,...)
	campos = campos a verificar (0,1,2,...)
	tipos = tipo de cada campo:
			 	1-inteiro
				2-decimal
				3-data
				4-email
				5-cpf
				6-cnpj
				7-cep
				8-string
				9-login/senha
				10-confirmação de senha 
				11-Cartão de Crédito
				12-Validade do Cartão (mes/ano)
	status = 0 - não obrigatório, 1 - obrigatório
	*/

	var mensagem = "Os seguintes campos estão incorretos\n\n";
	var erro = false;
	
	form++;  
		
	for(var i=0;i<campos.length;i++) {
		resultado=true;
		valor = document.forms[form].elements[campos[i]].value;
		switch(tipos[i]) {
		case 1:
			resultado = valida_numero(valor,true);
			if(valor==0 && status[i]==1)
				resultado=false;
			document.forms[form].elements[campos[i]].value = retira_car(valor);
			break;
		case 2:
			resultado = valida_numero(valor,false);
			document.forms[form].elements[campos[i]].value = retira_car(valor);			
			break;
		case 3:
			resultado = valida_data(valor);
			break;
		case 4:
			resultado = valida_email(valor);
			break;
		case 5:
			resultado = valida_cpf(valor);
			break;
		case 6:
			resultado = valida_cnpj(valor);
			break;
		case 7:
			resultado = valida_cep(valor);
			break;
		case 8:
			resultado = (valor.length==0) ? false : true;
			break;
		case 9:
			resultado = valida_string(valor);
			break;
		case 10:
			resultado = valida_string(valor);
			if(resultado)
				resultado = (valor==document.forms[form].elements[campos[i-1]].value);
			break;
		case 11:
			resultado = valida_cartao(valor);
			break;
		case 12:
			resultado = valida_dtvalidade(valor);
			break;
		}
		
		if(!resultado && (status[i]==1 || (status[i]==0 && valor.length!=0))) {
			mensagem+= "- " + nomescampos[i] + "\n";
			erro = true;
		}
		
	}

	if(erro)
		alert(mensagem)
		
	return !erro;

}
