﻿var MaskedInput = Class.create({
    initialize:function(p_id, p_tipo, p_opt){
        var aClass=this;
        
        aClass.obj=$(p_id);
        aClass.mask=aClass.maskType(p_tipo);
        aClass.obj.onblur=function(){
            var is = aClass.validation(p_tipo);
            if(!is){
                alert('O campo ['+ aClass.obj.title +'] é inválido! Preencha-o corretamente.');
                aClass.obj.value='';
        }}
        jQuery(function($){
            if(aClass.mask!='')
                $('#'+ p_id).mask(aClass.mask);
            else{
                if(p_tipo!='email'){
                    if(p_opt==null) $('#'+ p_id).priceFormat();
                    else $('#'+ p_id).priceFormat(p_opt);
            }}
        });
    },
    maskType:function(p_tipo){
        switch(p_tipo.toLowerCase()){
            case 'cep':
                return '99999-999';
                break;
            case 'date':
                return '99/99/9999';
                break;
            case 'phone':
                return '(99) 9999-9999';
                break;
            case 'cpf':
                return '999.999.999-99';
                break;
            case 'cnpj':
                return '99.999.999/9999-99';
                break;
            default:
                return '';
        };
    },
    validation:function(p_tipo){
        var value=this.obj.value;
        if(p_tipo!='email')value=value.replace(/\D/g,'');
        if(value.length==0)return true;
        switch(p_tipo.toLowerCase()){
            case 'date':
                return this.isDate();
                break;
            case 'email':
                return this.isEmail();
                break;
            case 'cpf':
            case 'cnpj':
                return this.isCpfCnpj();
                break;
            default:
                return true;
        };
    },
    isCpfCnpj:function(){
        var value = this.obj.value.replace(/\D/g,'');
        if(value.length > 11)return this.isCnpj(value);else return this.isCpf(value);
    },
    calcDigito:function(pEfetivo, pIsCnpj){
        var result='';
        var i, j, k, soma, dv;
        var cicloPeso=pIsCnpj?8:11;
        var maxDigitos=pIsCnpj?14:11;
        var calculado=pEfetivo.substring(0,(maxDigitos-2));
        for(j=1;j<=2;j++){
            k=2; soma=0;
            for(i=calculado.length-1;i>=0;i--){
	            soma+=(calculado.charAt(i)-'0')*k;
	            k=(k-1)%cicloPeso+2;
            }
            dv=11-soma%11;
            if(dv>9)dv=0;
            calculado+=dv;
            result+=dv
        }
        return result;
    },
    isCpf:function(pCpf){
        var algUnico=true, i;
        var base=pCpf.substring(0,(pCpf.length-2));
        var digitos=this.calcDigito(base, false);
        if(pCpf!=(''+base+digitos))return false;
        for(i=1;algUnico&&i<11;i++)algUnico=(pCpf.charAt(i-1)==pCpf.charAt(i));
        return(!algUnico);
    },
    isCnpj:function(pCnpj){
        var base=pCnpj.substring(0,8);
        var ordem=pCnpj.substring(8,12);
        var digitos=this.calcDigito((base+ordem), true);
        var algUnico=(pCnpj.charAt(0)!='0');
        if(pCnpj!=(''+base+ordem+digitos))return false;
        for(i=1;algUnico&&i<8;i++){algUnico=(pCnpj.charAt(i-1)==pCnpj.charAt(i));}
        if(algUnico||(ordem=='0000'))return false;
        return((base=='00000000')||(parseInt(ordem,10)<=300)||(base.substring(0,3)!='000'));
    },
    isDate:function(){
        var exp=null;
        var ano=parseFloat(this.obj.value.substring(6,10));
        if(ano%4==0) exp=/^((0?[1-9]|[12]\d)\/(0?[1-9]|1[0-2])|30\/(0?[13-9]|1[0-2])|31\/(0?[13578]|1[02]))\/(19|20)?\d{2}$/;
        else exp=/^((0?[1-9]|[12]\d)\/(0?[1]|0?[3-9]|1[0-2])|30\/(0?[13-9]|1[0-2])|31\/(0?[13578]|1[02]))\/(19|20)?\d{2}$/;
        return exp.test(this.obj.value);
    },
    isEmail:function(){
        var exp=/^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$/;
        return exp.test(this.obj.value);
    }
});
