String.prototype.luhnCheck = function()
{
    var luhnArr = [[0,2,4,6,8,1,3,5,7,9],[0,1,2,3,4,5,6,7,8,9]], sum = 0;
    this.replace(/\D+/g,"").replace(/[\d]/g, function(c, p, o){
        sum += luhnArr[ (o.length-p)&1 ][ parseInt(c,10) ];
    });
    return (sum%10 === 0);
};

function vCartao(cartao){
  return cartao.luhnCheck()
}

function validaCPF(cpf) {
  if (cpf.length < 11) return false
  var nonNumbers = /\D/
  if (nonNumbers.test(cpf))return false
  if (cpf == "00000000000" || cpf == "11111111111" ||
      cpf == "22222222222" || cpf == "33333333333" ||
      cpf == "44444444444" || cpf == "55555555555" ||
      cpf == "66666666666" || cpf == "77777777777" ||
      cpf == "88888888888" || cpf == "99999999999")
          return false
  var a = []
  var b = new Number
  var c = 11
  for (i=0; i<11; i++){
    a[i] = cpf.charAt(i)
    if (i < 9) b += (a[i] * --c)
  }
  if ((x = b % 11) < 2) { a[9] = 0 } else { a[9] = 11-x }
  b = 0
  c = 11
  for (y=0; y<10; y++) b += (a[y] * c--)
  if ((x = b % 11) < 2) { a[10] = 0 } else { a[10] = 11-x }
  if ((cpf.charAt(9) != a[9]) || (cpf.charAt(10) != a[10]))return false
  return true
}

function vCPF(t){
  try{
    if(t=="")return true
    return validaCPF(t.replace(/\D/g,""))
  }catch(e){alert(e)}
}

function vNumero(t){
  return t.replace(/\d*/,"")==""
}

function vObrigatorio(t){
  return t!=""
}
function vChecked(t, i) {
  return $(i).attr("checked")
}
function vEmail(t){
  return t.replace(/^\w[\w\.\+-]+@\w[\w\.\+-]+\.\w\w+$/,"")==""
}

function vCEP(t){
  return t.replace(/^\d{5}-\d{3}$/,"")==""
}

function vConfirma(t,i){
  return i.value==i.form.elements[i.name+"2"].value
}

function vData(t){
  v=v.replace(/\D/g,"") //Remove tudo o que não é dígito
	v=v.replace(/(\d{2})(\d)/,"$1-$2") //Coloca um ponto entre o segundo e o terceiro dígitos
	v=v.replace(/(\d{2})(\d)/,"$1-$2") //Coloca um ponto entre o quarto e o quinto dígitos
	//v=v.replace(/^[0-3]?\d\/[01]?\d\/(\d{2}|\d{4})$/)
	v=v.replace(/^((0[1-9]|[12]\d)\-(0[1-9]|1[0-2])|30\-(0[13-9]|1[0-2])|31\-(0[13578]|1[02]))\-\d{4}$/)
	//v=v.replace(/^(0[1-9]|[012][0-9]|3[01])/\-(0[1-9]|1[012])/\-([12][0-9]{3})/,"")
	return v
}
validadores={
  "vNumero":vNumero,
  "vEmail":vEmail,
  "vCPF":vCPF,
  "vCEP":vCEP,
  "vConfirma":vConfirma,
  "vData":vData,
  "vObrigatorio":vObrigatorio,
  "vChecked":vChecked,
  "vCartao":vCartao
}

erros={
  "vNumero":"o campo permite apenas números",
  "vEmail":"digite corretamente o e-mail",
  "vCEP":"digite corretamente o CEP",
  "vCPF":"número de CPF inválido",
  "vConfirma":"digite corretamente a confirmação",
  "vData":"digite corretamente a data",
  "vObrigatorio":"o campo precisa ser preenchido",
  "vChecked":"Precisa ser ticado",
  "vCartao":"Cartão de crédito inválido"
}

mascaras={
  "vMaskNumero":[ [/\D/g,""]                                        , false      ],
  "vMaskCPF":   [ [/^(\d{3})(\d{3})(\d{3})(\d{2})$/,"$1.$2.$3-$4"]  , [/\D/g,""] ],
  "vMaskData":  [ [/^(\d{2})(\d{2})(\d{4})$/,"$1/$2/$3"]            , [/\D/g,""] ],
  "vMaskCEP":   [ [/^(\d{5})(\d{3})$/,"$1-$2"]                      , [/\D/g,""] ]
}

function showErros(er){
  var txterr="Por favor, corrija os seguintes erros:\n"
  for(var i=0;i<er.length;i++){
    txterr+=" * "+$(er[i]).parent().find("span").text()+": "+er[i][1]+"\n"
    er[i][0].parentNode.className+=" vErro"
  }
  alert(txterr)
}

function validaForm(){
  this.ferros=[]
  $(this).find("label:visible")
    .removeClass("vErro")
    .each(function(){
      var vals=this.className.split(" ")
      for(var i=0;i<vals.length;i++)
        try{
          var fn=validadores[vals[i]]
          if(fn != undefined){
            var inp=$(this).find("input, textarea, select")[0]
            if(!fn(inp.value,inp)){
              $(this).parents("form")[0].ferros.push([inp,erros[vals[i]]])
            }
          }
        }catch(e){}
    })
  if(this.ferros.length>0){
    showErros(this.ferros)
    return false
  }
}

function mascarar(inp,n){
  var lbl=inp.parentNode
  var vals=lbl.className.split(" ")
  for(var j=0;j<vals.length;j++){
    try{
      var fn = mascaras[vals[j]]
      if(fn != undefined)
        inp.value=inp.value.replace(fn[n][0],fn[n][1])
    }catch(e){}
  }
}

$(function(){
  $("form.vForm").live("submit", validaForm)
})

