/** montarExpressaoRegular
  - Descrição: Monta expressão regular  para uma mascara informada - usada para máscaras de digitos (CNPJ/CPF/DATA/CEP)
  - Evento: N/A Usado em funções
  - Dependência: Não
  - Exibe alerta :Não
  -Exemplo: montarExpressaoRegular('##.##.###-##')

  @param string  mascara
  máscara do campo
  @return string da expressao regular
  **/
function montarExpressaoRegular(mascara) {

    var tralha = 0;
    var expressao = "";

    //Monta a expressao regular dinamicamente
    for (ii = 0; ii < String(mascara).length; ii++) {
        if (String(mascara).substr(ii,1) == "#") {
            tralha++;
        } else {
            if (tralha == 0) {
                expressao = expressao + String(mascara).substr(ii,1);
            } else {
                expressao = expressao + "\\d{"+tralha+"}";
                expressao = expressao + String(mascara).substr(ii,1);
                tralha = 0;
            }
        }
    }

    if (tralha > 0) {
        expressao = expressao + "\\d{"+tralha+"}";
    }

    expressao = "^"+expressao+"$"

    //Fim da Montagem
    return expressao;
}


/** removerMascara
  - Descrição: Remove todos os caracteres que não sejam digitos ex:  /|. )(-+=*&¨%$#@!"':?]}{[``~ A-Z
  - Evento: onblur,  usado tambem em funções
  - Dependência: Não
  - Exibe alerta :Não
  -Exemplo: removerMascara('709.594.551-91')

 @param string texto
 texto para ser removida a mascara
 @return string
  **/
function removerMascara(texto) {
    return String(texto).replace(/[^0-9]/gi, "");
}


/** mascararCampoPress
  - Descrição: Mascara o campo conforme a máscara passada. Funcional para as máscaras (CNPJ-CPF-DATA(DD/MM/AAA)-DATA(MM/AAA)-CEP-HORA)
  - Evento: onKeyPress
  - Dependência: Não
  - Exibe alerta :Não
  -Exemplo: onKeyPress="return mascararCampoPress(this,'####/####',event);"

 @param Object CampoM
 Campo que deverá ser mascarado
 @param string  mascara
  Mascara que deverá ser aplicada no campo
  @param Object  Evento
 Objeto event
  @return bool
  **/
function mascararCampoPress(CampoM, mascara, Evento) {

    var tecla;

    if (Evento.which != null) { // Mozilla compatível
        if (!((Evento.which >= 48 && Evento.which <= 57) || Evento.which == 0 || Evento.which == 8 || Evento.which == 13)) {
            return false;
        } else {
            tecla=Evento.which;
        }
    } else { // MSIE compatível
        if (!((Evento.keyCode >= 48 && Evento.keyCode <= 57) || Evento.keyCode == 13)) {
            return false;
        } else {
            tecla=Evento.keyCode;
        }
    }

    var car;
    var saida='#';

    while (CampoM.value.length) {
        car = CampoM.value.charAt(CampoM.value.length-1);
        if (!(((car>='0') && (car<='9')) || (car==".") || (car=="-") || (car=="/"))) {
            CampoM.value=CampoM.value.substr(0,CampoM.value.length-1);
        } else break;
    }
    var texto = mascara.substring(CampoM.value.length)
    if ((texto.substring(0, 1) != saida) && (tecla != 8)) {
        CampoM.value += texto.substring(0, 1);
    }

    return true;
}

/** MascararCampoBlur
  - Descrição: Mascara o campo conforme a máscara passada. Funcional para as máscaras (CNPJ-CPF-DATA(DD/MM/AAA)-DATA(MM/AAA)-CEP-HORA)  - ONBLUR
  - Evento: onBlur e usada também em funções
  - Dependência: Não
  - Exibe alerta :Não
  -Exemplo: MascararCampoBlur(NOTeste,'###-##-##')   ou onblur="return MascararCampoBlur(this,'####/####');"

 @param Object CampoM
 Campo que deverá ser mascarado
 @param string  mascara
  Mascara que deverá ser aplicada no campo
   @return void , mas aplica a mascara ao campo do formulario
  **/
function mascararCampoBlur(CampoM, mascara) {

    //diferente de vazio
    if (CampoM.value != "") {
        var tam		  = 0;
        var cont   	  = 1;
        var tralha 	  = 0;
        var padrao 	  = "";
        var expressao = "";
        var valor;

        //Monta o padrão e a expressão regular sem mascara para usar no replace
        for (ii = 0; ii < String(mascara).length; ii++) {
            if (String(mascara).substr(ii,1) == "#") {
                tralha++;
                tam++;
            } else {
                if (tralha == 0) {
                    padrao = padrao + String(mascara).substr(ii,1);
                } else {
                    padrao = padrao + "$"+cont;
                    padrao = padrao + String(mascara).substr(ii,1);
                    expressao = expressao + "(\\d{"+tralha+"})";

                    tralha = 0;
                    cont++;
                }
            }
        }

        if (tralha > 0) {
            padrao = padrao + "$"+cont;
            expressao = expressao + "(\\d{"+tralha+"})";
        }

        expressao 	= "^"+expressao+"$";
        //Fim da Montagem Dinâmica
        //Desmascarando e Corte no tamanho
        valor 		= removerMascara(CampoM.value);	//Remove a máscara
        valor 		= valor.substr(0,tam);

        //Mascarando
        var expreg = new RegExp(expressao);
        valor = valor.replace(expreg, padrao);

        //Atribui ao campo
        CampoM.value = valor;
    }

    return;
}

/** ValidarMascara
  - Descrição: Valida se o valor informado para um campo obedece a máscara informada. Funcional para todos os valores que contem apenas numeros (0-9)  e literais (. - \ / )
  - Evento: pode usar no onBlur ou contido em outra função (geralmente)
  - Dependência: MontarExpressaoRegular
  - Exibe alerta :Não
  -Exemplo: onBlur="ValidarMascara(this,'####/####');"

 @param Object CampoV
 Campo que deverá ser validado
 @param string  mascara
  Mascara que deverá ser validada com o valor do campo
  @return bool
  **/
function validarMascara(CampoV, mascara) {

    if (CampoV.value != "") {
        var expressao = new RegExp(montarExpressaoRegular(mascara));
        return expressao.test(CampoV.value);
    } else {
        return false;
    }
}
