
/**
 * Função de validação de CPF.
 */
function validaCPF(sCPF) {

    if (sCPF == "") return false;
    var i;
    var intDigito;
    var varQuociente;
    var iCPF = new Array();
    var iDig = new Array();
    for (i = 1;i<10;i++) {
        iCPF[i] = sCPF.substr(i-1, 1);
        iCPF[i] = parseInt(iCPF[i]);
	}

	for(nI=1; nI <= iCPF.length; nI++){
		if(nI == 1){
			var nAnterior = iCPF[nI];
		}else{
			var nAnterior = iCPF[nI-1];
		}

		if(isNaN(iCPF[nI])==true){
			break;
		}else{
			if(nAnterior != iCPF[nI]){
				var bIguais = false;
				break;
			}else{
				var bIguais = true;
			}
		}
	}
	if(bIguais) return false;
	iDig[1] = sCPF.substr(9, 1);
    iDig[1] = parseInt(iDig[1]);
    iDig[2] = sCPF.substr(10, 1);
    iDig[2] = parseInt(iDig[2]);
    intDigito = (iCPF[9] * 2) + (iCPF[8] * 3) + (iCPF[7] * 4);
    intDigito = intDigito + (iCPF[6] * 5) + (iCPF[5] * 6) + (iCPF[4] * 7);
    intDigito = intDigito + (iCPF[3] * 8) + (iCPF[2] * 9) + (iCPF[1] * 10);
    intDigito = (intDigito * 10) % 11;
    if (intDigito == 10) intDigito = 0;
    if (intDigito !== iDig[1])return false;
    intDigito = (iDig[1] * 2) + (iCPF[9] * 3) + (iCPF[8] * 4) + (iCPF[7] * 5);
    intDigito = intDigito + (iCPF[6] * 6) + (iCPF[5] * 7) + (iCPF[4] * 8);
    intDigito = intDigito + (iCPF[3] * 9) + (iCPF[2] * 10) + (iCPF[1] * 11);
    intDigito = (intDigito * 10) % 11;
    if (intDigito == 10) intDigito = 0;
    if (intDigito !== iDig[2]) return false;

	return true;
}

/**
 * Função de validação de CGC.
 */
function validaCGC(field) {

	field = limpa(field);

	if( (field == "") || (field == " ") || (field == '00000000000000'))
		return false;

	if(field.length != 14) {
		  return false;
	 }

	first_digit  = field.charAt(12);
	second_digit = field.charAt(13);
	field = field.substring(0,12);
	first_verified  = calcMod11(field,5,2);  // Através do modulo 11 descobre qual é o primeiro digito do final
	second_verified = calcMod11(field + first_verified,6,2);  // Através do modulo 11 descobre qual é o segundo digito do final

	 /*
		  Se os dois digitos gerados pelo modulo11 forem iguais aos dois últimos
		  digitos digitados pelo usuário, validação de CGC OK.
	 */
	if( (first_verified == first_digit) && (second_verified==second_digit) ){
		return true;
	} else {
		return false;
	}
}

/**
 * Função de checar validação de CPF.
 */
function chk_CPF(ti) {

	if(ti.value != ""){
		if(!validaCPF(ti.value)) {
			alert("CPF inválido.");
			if(!ti.disabled) {
				ti.focus();
				ti.select();
			}
			return false;
		}
	}
	return true;
	//document.form1.submit();
}

/**
 * Função de checar validação de CGC.
 */
function chk_CGC(ti) {

	if(ti.value != ""){
		if(!validaCGC(ti.value)) {
			alert("CNPJ inválido.\n"+limpa(ti.value));
			if(!ti.disabled) {
				ti.focus();
				ti.select();
			}
			return false;
		}
	}
	return true;
}

/**
 * Cálculo do Módulo 11. Requerida pela validação de CGC.
 */
function calcMod11(field,start, finish) {
	t_i      = 0;
	t_sum    = 0;
	t_aux    = 0;
	t_digito = 0;
	t_peso   = 0;
	t_tam    = 0;
	t_char   = 'z';
	t_peso   = start;
	t_tam    = (field.length >= 13 ? t_tam = 13 : t_tam = 12);

	for(t_i=0 ; t_i< t_tam ; t_i++){
		t_char = field.charAt(t_i);
		t_sum = t_sum + ( (parseInt(t_char)) * t_peso);
		t_peso = t_peso > finish ? --t_peso : (start + (9 - start));
	}

	t_aux    = t_sum % 11;
	t_aux    = 11 - t_aux;
	t_digito = (t_aux >= 10 ? 0 : t_aux);

	return t_digito;
}

function limpa(val){
	var ret = "";

	re = new RegExp("[./-]", "gi");

	ret = val.replace(re, "");

	return ret;
}
