function setFunc(o,f){
    v_obj=o;
    v_fun=f;
    
    setTimeout(function(){
        v_obj.value = v_fun(v_obj.value);
    }, 1);
}

var maskForm  = {
    addEvent : function(obj, evType, fn){
        if (obj.addEventListener) obj.addEventListener(evType, fn, true);
        if (obj.attachEvent) obj.attachEvent("on"+evType, fn);
    },

    setNumero : function(obj){
        if(!maskForm.testNumero(obj.value)) obj.value = "";
        
        this.addEvent(obj, 'keypress', function(){
           setFunc(obj, maskForm.maskNumero)
        });
    },
    setMoeda : function(obj){
        if(!maskForm.testMoeda(obj.value)) obj.value = "";

        obj.value = maskForm.maskMoeda(obj.value);
        this.addEvent(obj, 'keypress', function(){
            setFunc(obj, maskForm.maskMoeda)
        });

        obj.style.textAlign = 'right';
    },
    setTel : function(obj){
        if(!maskForm.testTel(obj.value)) obj.value = "";
        
        this.addEvent(obj, 'keypress', function(){
            setFunc(obj, maskForm.maskTel)
        });

        obj.maxLength = 14;
    },
    setSimpleTel : function(obj){
        this.addEvent(obj, 'keypress', function(){
            setFunc(obj, maskForm.maskSimpleTel)
        });
        obj.maxLength = 9;
    },
    setCPF : function(obj){
        if(!maskForm.testCPF(obj.value)) obj.value = "";

        this.addEvent(obj, 'keypress', function(){
            setFunc(obj, maskForm.maskCPF)
        });
        
        obj.maxLength = 14;
    },

    setCEP : function(obj){
        if(!maskForm.testCEP(obj.value)) obj.value = "";

        this.addEvent(obj, 'keypress', function(){
            setFunc(obj, maskForm.maskCEP)
        });

        obj.maxLength = 9;
    },

    setRG : function(obj){
        this.addEvent(obj, 'keypress', function(){
            setFunc(obj, maskForm.maskRG)
        });
    },
    setCNPJ : function(obj){
        if(!maskForm.testCNPJ(obj.value)) obj.value = "";
        this.addEvent(obj, 'keypress', function(){
            setFunc(obj, maskForm.maskCNPJ)
        });
        
        obj.maxLength = 18;
    },
    setData : function(obj){
        
        //if(!maskForm.testData(obj.value)) obj.value = "";

        this.addEvent(obj, 'keypress', function(){
            setFunc(obj, maskForm.maskData)
        });

        obj.maxLength = 10;
    },
    setRequired: function(obj){
        obj.addClass('required');
    },
    setMinLength: function(obj, minLength){
        obj.addClass('minLength:' + minLength)
    },
    setEmail: function(obj){
        obj.addClass('validate-email');
    },
    setUrl: function(obj){
        obj.addClass('validate-url');
    },

    
    /* máscara para padrão número (apenas números)
     * @param v (string) input.value
     * @return string
     */
    maskNumero : function(v){
        return v.replace(/\D/, "");
    },
    testNumero : function(v){
        if(!RegExp(/^\d+$/).test(v)) return false;
        return true;
    },

    /* máscaras padrão para inputs */
    /* máscara para padrão dinheiro (apenas números, sem zero à esquerda, ...xxxx,xx)
     * @param v (string) input.value
     * @return string
     */
    maskMoeda : function(v){
        v=v.replace(/\D/g,"");
        v=v.replace(/^([\d]+)(\d{2})/,"$1,$2");
        v=v.replace(/^([0])([\d]+),(\d{2})/, "$2,$3");
        v=v.replace(/([\d]+)(\d{3})/,"$1.$2");
        v=v.replace(/([\d]+)(\d{3})/,"$1.$2");
        v=v.replace(/([\d]+)(\d{3})/,"$1.$2");

        if(v.length == 0) v = '0,00';
        if(v.length == 1) v = '0,0'+v;
        if(v.length == 2) v = '0,'+v;
        
        return v;
    },
    testMoeda : function(v){
        if(!RegExp(/^([^0][\d]+),(\d{2})/g).test(v)) return false;
        return true;
    },

    /* máscara para padrão telefone (apenas números, (xx) xxxx-xxxx)
     * @param v (string) input.value
     * @return string
     */
    maskTel : function(v){
        v=v.replace(/\D/g,"");
        v=v.replace(/^(\d\d)(\d)/g,"($1) $2");
        v=v.replace(/(\d{4})(\d)/,"$1-$2");
        return v
    },
    testTel : function(v){
        if(!RegExp(/^(\(\d{2}\))( )?(\d{4})-(\d{4})/g).test(v)) return false;
        return true;
    },
    maskSimpleTel : function(v){
        v=v.replace(/\D/g,"");
        v=v.replace(/^(\d{4})(\d)/, "$1-$2");
        return v;
    },

    maskCPF : function(v) {
        v=v.replace(/\D/g,"");
        v=v.replace(/(\d{3})(\d)/,"$1.$2");
        v=v.replace(/(\d{3})(\d)/,"$1.$2");
        v=v.replace(/(\d{3})(\d{1,2})$/,"$1-$2");
        return v
    },
    testCPF : function(v){
        if(!RegExp(/^(\d{3})\.(\d{3})\.(\d{3})-(\d{2})/g).test(v)) return false;
        return true;
    },

    maskRG : function(v){
      v=v.replace(/[^\d.-]/g,"");
      return v;
    },

    maskCEP : function(v){
        v=v.replace(/\D/g,"");
        v=v.replace(/^(\d{5})(\d)/,"$1-$2");
        return v;
    },
    
    testCEP : function(v){
        if(!RegExp(/^(\d{5})-(\d{3})/g).test(v)) return false;
        return true;
    },

    maskCNPJ : function(v){
        v=v.replace(/\D/g,"");
        v=v.replace(/^(\d{2})(\d)/,"$1.$2");
        v=v.replace(/^(\d{2})\.(\d{3})(\d)/,"$1.$2.$3");
        v=v.replace(/\.(\d{3})(\d)/,".$1/$2");
        v=v.replace(/(\d{4})(\d)/,"$1-$2");
        return v;
    },
    testCNPJ : function(v){
        if(!RegExp(/^(\d{2})\.(\d{3})\.(\d{3})\/(\d{4})-(\d{2})/g).test(v)) return false;
        return true;
    },
    
    maskData : function(v){
        v=v.replace(/\D/g,"");
        v=v.replace(/^(\d{2})([\d])/,"$1/$2");
        v=v.replace(/^(\d{2})\/(\d{2})([\d])/g, "$1/$2/$3");
        return v;
    },
    testData : function(v){
        if(!RegExp(/^(\d{2})\/(\d{2})\/(\d{4})/g).test(v)) return false;
        return true;
    }
}