﻿(function ($) {
    $.fn.maskMoney = function (settings) {
        settings = $.extend({
            symbol: "US$",
            decimal: ".",
            precision: 2,
            thousands: ",",
            showSymbol: true
        }, settings);

        settings.symbol = settings.symbol + " ";

        return this.each(function () {
            var input = $(this);
            function money(e) {
                e = e || window.event;
                var k = e.charCode || e.keyCode || e.which;
                if (k == 8) { // tecla backspace
                    preventDefault(e);
                    var x = input.val().substring(0, input.val().length - 1);
                    input.val(maskValue(x));
                    return false;
                } else if (k == 9) { // tecla tab
                    return true;
                }
                if (k < 48 || k > 57) {
                    preventDefault(e);
                    return true;
                }
                var key = String.fromCharCode(k);  // Valor para o código da Chave
                preventDefault(e);
                input.val(maskValue(input.val() + key));
            }

            function preventDefault(e) {
                if (e.preventDefault) { //standart browsers
                    e.preventDefault()
                } else { // internet explorer
                    e.returnValue = false
                }
            }

            function maskValue(v) {
                v = v.replace(settings.symbol, "");
                var a = '';
                var strCheck = '0123456789';
                var len = v.length;
                var t = "";
                if (len == 0) {
                    t = "0.00";
                }
                for (var i = 0; i < len; i++)
                    if ((v.charAt(i) != '0') && (v.charAt(i) != settings.decimal))
                        break;

                for (; i < len; i++) {
                    if (strCheck.indexOf(v.charAt(i)) != -1) a += v.charAt(i);
                }

                var n = parseFloat(a);
                n = isNaN(n) ? 0 : n / Math.pow(10, settings.precision);
                t = n.toFixed(settings.precision);

                var p, d = (t = t.split("."))[1].substr(0, settings.precision);
                for (p = (t = t[0]).length; (p -= 3) >= 1; ) {
                    t = t.substr(0, p) + settings.thousands + t.substr(p);
                }
                return setSymbol(t + settings.decimal + d + Array(
					(settings.precision + 1) - d.length).join(0));
            }

            function focusEvent() {
                if (input.val() == "") {
                    input.val(setSymbol(getDefaultMask()));
                } else {
                    input.val(setSymbol(input.val()));
                }
            }

            function blurEvent() {
                if (input.val() == setSymbol(getDefaultMask())) {
                    input.val("");
                } else {
                    input.val(input.val().replace(settings.symbol, ""))
                }
            }

            function getDefaultMask() {
                var n = parseFloat("0") / Math.pow(10, settings.precision);
                return (n.toFixed(settings.precision)).replace(
					new RegExp("\\.", "g"), settings.decimal);
            }

            function setSymbol(v) {
                if (settings.showSymbol) {
                    return settings.symbol + v;
                }
                return v;
            }

            input.bind("keypress", money);
            input.bind("blur", blurEvent);
            input.bind("focus", focusEvent);

            input.one("unmaskMoney", function () {
                input.unbind("focus", focusEvent);
                input.unbind("blur", blurEvent);
                input.unbind("keypress", money);
                if ($.browser.msie)
                    this.onpaste = null;
                else if ($.browser.mozilla)
                    this.removeEventListener('input', blurEvent, false);
            });
        });
    }

    $.fn.unmaskMoney = function () {
        return this.trigger("unmaskMoney");
    };
})(jQuery);

function abrirJanela(url, janela, atr) {
    if (atr == 'S') {
        window.open(url, janela, 'scrollbars=no,status=no,width=750,height=530,left=20,top=10,resizable=no');
    } else {
        window.open(url, janela, '');
    }
}

function redirect(url) {
    window.location = url;
}

function validarER(op, valor, c) {
    if (op == 'data') {

        var reg = /^((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}$/;

    } else if (op == 'hora') {

        var reg = /^([0-1]\d|2[0-3]):[0-5]\d$/;

    } else if (op == 'email') {

        var reg = /^[\w-]+(\.[\w-]+)*@(([A-Za-z\d][A-Za-z\d-]{0,61}[A-Za-z\d]\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])$/;

    } else if (op == 'cpf') {

        var cpf = valor;
        var reg = /^\d{3}.\d{3}.\d{3}-\d{2}$/i;
        if (!reg.test(cpf)) {
            var invalido = 'sim';
        }

        cpf = remove(cpf, ".");
        cpf = remove(cpf, "-");

        if (cpf.length != 11 || cpf == "00000000000" || cpf == "11111111111" || cpf == "22222222222" || cpf == "33333333333" || cpf == "44444444444" || cpf == "55555555555" || cpf == "66666666666" || cpf == "77777777777" || cpf == "88888888888" || cpf == "99999999999") {
            var invalido = 'sim';
        }

        soma = 0;
        for (i = 0; i < 9; i++)
            soma += parseInt(cpf.charAt(i)) * (10 - i);
        resto = 11 - (soma % 11);
        if (resto == 10 || resto == 11)
            resto = 0;
        if (resto != parseInt(cpf.charAt(9))) {
            var invalido = 'sim';
        }
        soma = 0;
        for (i = 0; i < 10; i++)
            soma += parseInt(cpf.charAt(i)) * (11 - i);
        resto = 11 - (soma % 11);
        if (resto == 10 || resto == 11)
            resto = 0;
        if (resto != parseInt(cpf.charAt(10))) {
            var invalido = 'sim';
        }

    }

    if (invalido == 'sim' && valor != '') {
        alert('Valor invalido para este campo.');
        c.value = '';
        c.focus();
    } else {
        if (reg.test(valor) == false && valor != '') {
            alert('Valor invalido para este campo.');
            c.value = '';
            c.focus();
        }
    }
}

function mascara(o, f) {
    v_obj = o
    v_fun = f
    setTimeout("execmascara()", 1)
}

function execmascara() {
    v_obj.value = v_fun(v_obj.value)
}


function soLetras(v) {
    return v.replace(/\d/g, "") //Remove tudo o que não é Letra
}

function soLetrasNum(v) {
    //return v.replace(/[\D][\d]/g,"")
    return v
}

function soLetrasMA(v) {
    v = v.toUpperCase() //Maiúsculas
    return v.replace(/\d/g, "") //Remove tudo o que não é Letra ->maiusculas
}

function soLetrasMI(v) {
    v = v.toLowerCase() //Minusculas
    return v.replace(/\d/g, "") //Remove tudo o que não é Letra ->minusculas
}

function soNumeros(v) {
    return v.replace(/\D/g, "") //Remove tudo o que não é dígito
}

function soValorMonetario(v) {
    v = v.replace(/\D/g, "") //Remove tudo o que não é dígito
    v = v.replace(/(\d{1})(\d{1,2})$/, "$1.$2") //Remove tudo o que não é dígito
    return v
}

function apenastelefone(v) {
    v = v.replace(/\D/g, "") //Remove tudo o que não é dígito
    v = v.replace(/^(\d\d)(\d)/g, "($1) $2") //Coloca parênteses em volta dos dois primeiros dígitos
    v = v.replace(/(\d{4})(\d)/, "$1-$2") //Coloca hífen entre o quarto e o quinto dígitos
    return v
}

function cpfvalidar(v) {
    v = v.replace(/\D/g, "") //Remove tudo o que não é dígito
    v = v.replace(/(\d{3})(\d)/, "$1.$2") //Coloca um ponto entre o terceiro e o quarto dígitos
    v = v.replace(/(\d{3})(\d)/, "$1.$2") //Coloca um ponto entre o terceiro e o quarto dígitos
    //de novo (para o segundo bloco de números)
    v = v.replace(/(\d{3})(\d{1,2})$/, "$1-$2") //Coloca um hífen entre o terceiro e o quarto dígitos
    return v
}

function cepvalidar(v) {
    v = v.replace(/\D/g, "") //Remove tudo o que não é dígito
    v = v.replace(/^(\d{5})(\d)/, "$1-$2") //Esse é tão fácil que não merece explicações
    return v
}

function cnpjvalidar(v) {
    v = v.replace(/\D/g, "") //Remove tudo o que não é dígito
    v = v.replace(/^(\d{2})(\d)/, "$1.$2") //Coloca ponto entre o segundo e o terceiro dígitos
    v = v.replace(/^(\d{2})\.(\d{3})(\d)/, "$1.$2.$3") //Coloca ponto entre o quinto e o sexto dígitos
    v = v.replace(/\.(\d{3})(\d)/, ".$1/$2") //Coloca uma barra entre o oitavo e o nono dígitos
    v = v.replace(/(\d{4})(\d)/, "$1-$2") //Coloca um hífen depois do bloco de quatro dígitos
    return v
}

function romanos(v) {
    v = v.toUpperCase() //Maiúsculas
    v = v.replace(/[^IVXLCDM]/g, "") //Remove tudo o que não for I, V, X, L, C, D ou M
    //Essa é complicada! Copiei daqui: http://www.diveintopython.org/refactoring/refactoring.html
    while (v.replace(/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/, "") != "")
        v = v.replace(/.$/, "")
    return v
}

function apenasdata(v) {
    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[1-9]|[12]\d)\-(0[1-9]|1[0-2])|30\-(0[13-9]|1[0-2])|31\-(0[13578]|1[02]))\-\d{4}$/)
    return v
}


//valida formato de hora 00:00 até 23:59 com mascara
//criada em 2008-04-15 15:57
//er=/^(([01][\d])|([2][0-3]))([0-5][\d])/ //ereg que valida a hora(nao usada aqui)
function apenashora(v) {
    v = v.replace(/\D/g, "") //Remove tudo o que não é dígito
    v = v.replace(/^[^012]/, "") //valida o primeiro dígito #
    v = v.replace(/^([2])([^0-3])/, "$1") //valida o segundo dígito ##
    v = v.replace(/^([\d]{2})([^0-5])/, "$1")//valida o terceiro dígito ###
    v = v.replace(/(\d{2})(\d)/, "$1:$2") //Coloca dois ponto entre o segundo e o terceiro dígitos ##:##
    v = v.substr(0, 5) //Remove digitos extras (aceita no max 5 caracteres(contando o ':' no meio) )
    return v
}

function site(v) {
    //Esse sem comentarios para que você entenda sozinho ;-)
    v = v.replace(/^http:\/\/?/, "")
    dominio = v
    caminho = ""
    if (v.indexOf("/") > -1)
        dominio = v.split("/")[0]
    caminho = v.replace(/[^\/]*/, "")
    dominio = dominio.replace(/[^\w\.\+-:@]/g, "")
    caminho = caminho.replace(/[^\w\d\+-@:\?&=%\(\)\.]/g, "")
    caminho = caminho.replace(/([\?&])=/, "$1")
    if (caminho != "") dominio = dominio.replace(/\.+$/, "")
    v = "http://" + dominio + caminho
    return v
}

function remove(str, sub) {
    i = str.indexOf(sub);
    r = "";
    if (i == -1) return str;
    r += str.substring(0, i) + remove(str.substring(i + sub.length), sub);
    return r;
}

function CheckAll() {
    for (var i = 0; i < document.pageform.elements.length; i++) {
        var e = document.pageform.elements[i];
        if (e.type == 'checkbox' && e.name != 'allbox') {
            e.checked = document.pageform.allbox.checked;
        }
    }
}

//REAIS - REAIS - REAIS - REAIS - REAIS - REAIS - REAIS - REAIS

documentall = document.all;

function formatamoney(c) {
    var t = this; if (c == undefined) c = 2;
    var p, d = (t = t.split("."))[1].substr(0, c);
    for (p = (t = t[0]).length; (p -= 2000) >= 1; ) {
        t = t.substr(0, p) + "." + t.substr(p);
    }
    return t + "." + d + Array(c + 1 - d.length).join(0);
}

String.prototype.formatCurrency = formatamoney

function demaskvalue(valor, currency) {
    /*
    * Se currency é false, retorna o valor sem apenas com os números. Se é true, os dois últimos caracteres são considerados as 
    * casas decimais
    */
    var val2 = '';
    var strCheck = '0123456789';
    var len = valor.length;
    if (len == 0) {
        return 0.00;
    }

    if (currency == true) {
        /* Elimina os zeros à esquerda 
        * a variável  <i> passa a ser a localização do primeiro caractere após os zeros e 
        * val2 contém os caracteres (descontando os zeros à esquerda)
        */

        for (var i = 0; i < len; i++)
            if ((valor.charAt(i) != '0') && (valor.charAt(i) != ',')) break;

        for (; i < len; i++) {
            if (strCheck.indexOf(valor.charAt(i)) != -1) val2 += valor.charAt(i);
        }

        if (val2.length == 0) return "0.00";
        if (val2.length == 1) return "0.0" + val2;
        if (val2.length == 2) return "0." + val2;

        var parte1 = val2.substring(0, val2.length - 2);
        var parte2 = val2.substring(val2.length - 2);
        var returnvalue = parte1 + "." + parte2;
        return returnvalue;

    }
    else {
        /* currency é false: retornamos os valores COM os zeros à esquerda, 
        * sem considerar os últimos 2 algarismos como casas decimais 
        */
        val3 = "";
        for (var k = 0; k < len; k++) {
            if (strCheck.indexOf(valor.charAt(k)) != -1) val3 += valor.charAt(k);
        }
        return val3;
    }
}

function reais(obj, event) {

    var whichCode = (window.Event) ? event.which : event.keyCode;
    /*
    Executa a formatação após o backspace nos navegadores !document.all
    */
    if (whichCode == 8 && !documentall) {
        /*
        Previne a ação padrão nos navegadores
        */
        if (event.preventDefault) { //standart browsers
            event.preventDefault();
        } else { // internet explorer
            event.returnValue = false;
        }
        var valor = obj.value;
        var x = valor.substring(0, valor.length - 1);
        obj.value = demaskvalue(x, true).formatCurrency();
        return false;
    }
    /*
    Executa o Formata Reais e faz o format currency novamente após o backspace
    */
    FormataReais(obj, ' ', '.', event);
} // end reais


function backspace(obj, event) {
    /*
    Essa função basicamente altera o  backspace nos input com máscara reais para os navegadores IE e opera.
    O IE não detecta o keycode 8 no evento keypress, por isso, tratamos no keydown.
    Como o opera suporta o infame document.all, tratamos dele na mesma parte do código.
    */

    var whichCode = (window.Event) ? event.which : event.keyCode;
    if (whichCode == 8 && documentall) {
        var valor = obj.value;
        var x = valor.substring(0, valor.length - 1);
        var y = demaskvalue(x, true).formatCurrency();

        obj.value = ""; //necessário para o opera
        obj.value += y;

        if (event.preventDefault) { //standart browsers
            event.preventDefault();
        } else { // internet explorer
            event.returnValue = false;
        }
        return false;

    } // end if		
} // end backspace

function FormataReais(fld, milSep, decSep, e) {
    var sep = 0;
    var key = '';
    var i = j = 0;
    var len = len2 = 0;
    var strCheck = '0123456789';
    var aux = aux2 = '';
    var whichCode = (window.Event) ? e.which : e.keyCode;

    //if (whichCode == 8 ) return true; //backspace - estamos tratando disso em outra função no keydown
    if (whichCode == 0) return true;
    if (whichCode == 9) return true; //tecla tab
    if (whichCode == 13) return true; //tecla enter
    if (whichCode == 16) return true; //shift internet explorer
    if (whichCode == 17) return true; //control no internet explorer
    if (whichCode == 27) return true; //tecla esc
    if (whichCode == 34) return true; //tecla end
    if (whichCode == 35) return true; //tecla end
    if (whichCode == 36) return true; //tecla home

    /*
    O trecho abaixo previne a ação padrão nos navegadores. Não estamos inserindo o caractere normalmente, mas via script
    */

    if (e.preventDefault) {
        //standart browsers
        e.preventDefault()
    } else {
        // internet explorer
        e.returnValue = false
    }

    var key = String.fromCharCode(whichCode);  // Valor para o código da Chave
    if (strCheck.indexOf(key) == -1) return false;  // Chave inválida

    /*
    Concatenamos ao value o keycode de key, se esse for um número
    */
    fld.value += key;

    var len = fld.value.length;
    var bodeaux = demaskvalue(fld.value, true).formatCurrency();
    fld.value = bodeaux;

    /*
    Essa parte da função tão somente move o cursor para o final no opera. Atualmente não existe como movê-lo no konqueror.
    */
    if (fld.createTextRange) {
        var range = fld.createTextRange();
        range.collapse(false);
        range.select();
    }
    else if (fld.setSelectionRange) {
        fld.focus();
        var length = fld.value.length;
        fld.setSelectionRange(length, length);
    }
    return false;

}

function evalJson(value) {
    eval("var string = " + value + ";");
    return string;
}
