invalidChars = " /:,;"

function validEmail(email) {

	if (email == "") {
		return false
	}
	for (i=0; i<invalidChars.length; i++) {
		badChar = invalidChars.charAt(i)
		if (email.indexOf(badChar,0) > -1) {
			return false
		}
	}
	atPos = email.indexOf("@",1)
	if (atPos == -1) {
		return false
	}
	if (email.indexOf("@",atPos+1) != -1) {
		return false
	}
	periodPos = email.indexOf(".",atPos)
	if (periodPos == -1) {
		return false
	}
	if (periodPos+3 > email.length) {
		return false
	}
	return true
}



var cep_old = ''

function type_cep(cep) {

	if (cep.value.length < cep_old.length) {
		// backspace
		if (cep.value.length == 5) {
			cep.value = cep.value.substr(0,4)
		}
	}
	
	cep.value=cep.value.replace(/[^0-9\-]/gi,'')
	cep.value=cep.value.replace(/^\-/,'')
	cep.value=cep.value.replace(/^(.)\-(.*)/,'$1$2')
	cep.value=cep.value.replace(/^(..)\-(.*)/,'$1$2')
	cep.value=cep.value.replace(/^(...)\-(.*)/,'$1$2')
	cep.value=cep.value.replace(/^(....)\-(.*)/,'$1$2')

	if (cep.value.length == 5) {
		cep.value += '-'
	}
	
	cep.value=cep.value.replace(/^(.....\-)\-(.*)/,'$1$2')
	cep.value=cep.value.replace(/^(.....\-.)\-(.*)/,'$1$2')
	cep.value=cep.value.replace(/^(.....\-..)\-/,'$1')
	
	cep_old = cep.value
	return
}

var cpf_old =''

function type_cpf(cpf) {

	if (cpf.value.length < cpf_old.length) {
		// backspace
		if (cpf.value.length == 3) {
			cpf.value = cpf.value.substr(0,2)
		}
		if (cpf.value.length == 7) {
			cpf.value = cpf.value.substr(0,6)
		}
		if (cpf.value.length == 11) {
			cpf.value = cpf.value.substr(0,10)
		}
	}
	
	cpf.value=cpf.value.replace(/[^0-9\-\.]/gi,'')
	cpf.value=cpf.value.replace(/^\D/,'')
	cpf.value=cpf.value.replace(/^(.)\D(.*)/,'$1$2')
	cpf.value=cpf.value.replace(/^(..)\D(.*)/,'$1$2')
	cpf.value=cpf.value.replace(/^(...)\-(.*)/,'$1$2')
	cpf.value=cpf.value.replace(/^(....)\D(.*)/,'$1$2')
	cpf.value=cpf.value.replace(/^(.....)\D(.*)/,'$1$2')
	cpf.value=cpf.value.replace(/^(......)\D(.*)/,'$1$2')
	cpf.value=cpf.value.replace(/^(.......)\-(.*)/,'$1$2')
	cpf.value=cpf.value.replace(/^(........)\D(.*)/,'$1$2')
	cpf.value=cpf.value.replace(/^(.........)\D(.*)/,'$1$2')
	cpf.value=cpf.value.replace(/^(..........)\D(.*)/,'$1$2')
	cpf.value=cpf.value.replace(/^(...........)\.(.*)/,'$1$2')
	cpf.value=cpf.value.replace(/^(............)\D(.*)/,'$1$2')
	cpf.value=cpf.value.replace(/^(.............)\D/,'$1')
	
	if (cpf.value.length == 3 || cpf.value.length == 7) {
		cpf.value += '.' 
	}
	if (cpf.value.length == 11) {
		cpf.value += '-'
	}
	cpf_old = cpf.value
	return
}


function soNum(str) {

	str.value=str.value.replace(/[^0-9]/gi,'');
}



// Função que testa outros dígitos verificadores 
// O dado a ser testado e a base desejada devem ser passados como parâmetro 


function testaDig(q_Dado) {

	//Testa dígito na base 11
	
	return (base_11(q_Dado.substr(0,q_Dado.length-1)) == parseInt(q_Dado.substr(q_Dado.length-1,1)));
}


// Inicio da validação de CPF
// Calculo do digito modulo 11 


function base_11(qNumero) {

	var numero, i, produto, multiplicador, digito;
     
	// Calcula digito do modulo 11

	numero = qNumero;
	multiplicador = 2;
	produto = 0;
  	for (i = numero.length; i>=1; i--) {
  		produto += (multiplicador * parseInt(numero.substr(i-1,1)));
  		if (multiplicador == 9) {
  			multiplicador = 2;
  		} else {
  			multiplicador++;
  		}
	}

	// Exceção

	digito = 11 - (produto % 11);
	if (digito == 10 || digito == 11) {
		digito = 0;
	}
	return digito;	
}

// Validação de CPF

function validaCPF(cpf) {

	cpf = cpf.replace(/\D/g,'')
	var digito = ""
	var soma = 0
	var resto = 0
	
	if (cpf.length != 11) {
		return false
	}
   // Calcula o primeiro dígito verificador
	regua = new Array(11, 10, 9, 8, 7, 6, 5, 4, 3, 2)
	soma = 0
	for (i=1; i<=9; i++) {
		soma = soma + (regua[i] * (cpf.charCodeAt(i-1) - 48))
	}
	resto = soma % 11
	if (resto == 0 || resto == 1) {
		digito = "0"
	} else {
		digito = (11-resto).toString()
	}
	if (digito != cpf.charAt(9)) {
		return false
	}
	
	//Calcula o segundo dígito verificador
	soma = 0
	resto = 0
	for (i=0; i<=9; i++) {
		soma = soma + (regua[i] * (cpf.charCodeAt(i) - 48))
	}
	resto = soma % 11
	if (resto == 0 || resto == 1) {
		digito = "0"
	} else {
		digito = (11-resto).toString()
	}
	if (cpf.charAt(10) != digito) {
		return false
	} 
	return true
}



function isValidCCNumber(cardNumber, cardType) {
  
  // cardType => Mastercard , Visa , Diners Club
  
  var isValid = false;
  var ccCheckRegExp = /[^\d ]/;
  isValid = !ccCheckRegExp.test(cardNumber);

  if (isValid) {
    var cardNumbersOnly = cardNumber.replace(/ /g,"");
    var cardNumberLength = cardNumbersOnly.length;
    var lengthIsValid = false;
    var prefixIsValid = false;
    var prefixRegExp;

    switch(cardType) {
      case "Mastercard":
        lengthIsValid = (cardNumberLength == 16);
        prefixRegExp = /^5[1-5]/;
        break;

      case "Visa":
        lengthIsValid = (cardNumberLength == 16 || cardNumberLength == 13);
        prefixRegExp = /^4/;
        break;

/*
      case "amex":
        lengthIsValid = (cardNumberLength == 15);
        prefixRegExp = /^3(4|7)/;
        break;
*/
      case "Diners Club":
        lengthIsValid = (cardNumberLength == 14);
        prefixRegExp = /^3(01|02|03|04|05|06|6|8)/;
        break;

      default:
        prefixRegExp = /^$/;
        alert("Bandeira inválida");
    }
    prefixIsValid = prefixRegExp.test(cardNumbersOnly);
    isValid = prefixIsValid && lengthIsValid;
  }
	
  if (isValid) {
  
    var numberProduct;
    var numberProductDigitIndex;
    var checkSumTotal = 0;

    for (digitCounter = cardNumberLength - 1; 
    digitCounter >= 0; 
    digitCounter--) {
      checkSumTotal += parseInt (cardNumbersOnly.charAt(digitCounter));
      digitCounter--;
      numberProduct = String((cardNumbersOnly.charAt(digitCounter) * 2));
      for (var productDigitCounter = 0;
      productDigitCounter < numberProduct.length; 
      productDigitCounter++) {
        checkSumTotal += 
        parseInt(numberProduct.charAt(productDigitCounter));
      }
    }
    isValid = (checkSumTotal % 10 == 0);
  }

  return isValid;
}
