﻿CO.FormRotinas = {

    mascaraFormatoData: "dd/MM/yyyy",
    mascaraFormatoDataHora: "dd/MM/yyyy HH:mm",
    mascaraNumeroSeparadorMilhar: ".",
    mascaraNumeroSeparadorCasasDecimais: ",",
    mascaraNumeroCasasDecimais: 2,
    mascaraNumeroCasasDecimaisPeso: 4,

    mascaraDefinir: function (elemento, mascara) {
        if (!elemento)
            return;

        if (mascara == "data" || mascara == "dataHora") {
            if (mascara == "data") mascara = CO.FormRotinas.mascaraFormatoData;
            if (mascara == "dataHora") mascara = CO.FormRotinas.mascaraFormatoDataHora;

            mascara = CO.replace(mascara, "m", "#");
            mascara = CO.replace(mascara, "d", "#");
            mascara = CO.replace(mascara, "y", "#");
            mascara = CO.replace(mascara, "H", "#");
            mascara = CO.replace(mascara, "h", "#");
            mascara = CO.replace(mascara, "M", "#");
        }

        if (mascara == "inteiro" || mascara == "decimal") {
            elemento["onkeypress"] = function (event) {
                CO.FormRotinas.mascaraNumero(event, this, mascara);
            };

            if (mascara == "decimal")
                elemento["onblur"] = function () {
                    CO.FormRotinas.mascaraNumeroFormatar(this);
                };
            else
                elemento["onblur"] = null;
        }
        else
            if (mascara == "peso") {
                elemento["onkeypress"] = function (event) {
                    CO.FormRotinas.mascaraNumero(event, this, mascara, CO.FormRotinas.mascaraNumeroCasasDecimaisPeso);
                };

                elemento["onkeydown"] = null;
                elemento["onfocus"] = null;

                elemento["onblur"] = function () {
                    CO.FormRotinas.mascaraNumeroFormatar(this, CO.FormRotinas.mascaraNumeroCasasDecimaisPeso);
                }
            }
            else
                if (mascara == "") {
                    elemento["onkeypress"] = function () {
                        CO.FormRotinas.desabilitaAlerta(this); /*campoNormal(this);*/
                    };
                    elemento["onkeydown"] = null;
                    elemento["onfocus"] = null;
                    elemento["onblur"] = null;
                }
                else {
                    elemento["onkeypress"] = function (event) {
                        CO.FormRotinas.desabilitaAlerta(this); //campoNormal(this);
                        return CO.FormRotinas.mascaraFormatar(this, mascara, event);
                    };

                    elemento["onkeydown"] = function (event) {
                        CO.FormRotinas.desabilitaAlerta(this); //campoNormal(this);
                        //Se for Firefox ou Opera não trata a mascara, pois o evento onkeypress também é executado quando uma dessas teclas forem assionadas,
                        //Já os outros browsers é diferente, quando algumas dessas teclas é acionada, somente é executado o evento onkeydown.
                        if (!CO.browser.firefox && !CO.browser.opera) {
                            var code = window.event ? window.event.keyCode : event.which;

                            //Trata o evento quando precionado backspace, setas, delete, tab e etc.. (Essas teclas não acionam o evento onKeypress no IE, por isso são tratadas aqui).
                            if (code == 39 || code == 37 || code == 9 || code == 0 || code == 8 || code == 46) {
                                return CO.FormRotinas.mascaraFormatar(this, mascara, event);
                            }
                        }
                    };
                    elemento["onfocus"] = function (event) {
                        if (this.value == "") {
                            this.value = CO.replace(mascara, "#", "_");

                            CO.FormRotinas.mascaraSelecionarParteTexto(this, 0, 0);
                        }
                    };
                    elemento["onblur"] = function (event) {
                        if (this.value == CO.replace(mascara, "#", "_")) {
                            this.value = "";
                        }
                    };
                }
    },
    mascaraFormatar: function (src, mascara, evt) {

        var evento = null;
        if (window.event) evento = window.event;
        else evento = evt;

        //Variáveis de controle
        var code = evento.keyCode ? evento.keyCode : evento.which;

        //Se o texto estiver selecionado será apagado antes. (Code 9 TAB)
        if (document.selection && code != 9)//IE
        {
            if (document.selection.createRange().text == src.value) src.value = "";
        }
        else if (src.selectionStart != 'undefined' && code != 9)// != IE
        {
            if (src.value.substring(src.selectionStart, src.selectionEnd) == src.value) src.value = "";
        }

        var valorDigitado = String.fromCharCode(code);
        var indiceDigitado = CO.FormRotinas.mascaraObterIndiceValorDigitado(src);
        var mascaraPreenchida = false;

        //Teclas permitidas (Teclas)
        if (
            (code == 39 && evento.type == 'keydown') //Seta >
            || code == 37 || code == 9 || code == 0) {
            if (window.event) event.returnValue = true;
            return true;
        }

        //Se o for pressionado a tecla backspace será apagado os dados porém mantido a mascara.
        if (code == 8) {
            if (indiceDigitado > 0) {
                var valorIndiceMascara = mascara.substr(indiceDigitado - 1, 1);
                src.value = CO.FormRotinas.mascaraTrocaValorIndiceInput(src.value, indiceDigitado - 1, valorIndiceMascara.replace("#", "_"));
            }
            CO.FormRotinas.mascaraSelecionarParteTexto(src, indiceDigitado - 1, indiceDigitado - 1);

            if (window.event) event.returnValue = false;
            else evt.preventDefault();

            return false;
        }
        //Se o valor não for númerico cancela o evento.
        else if (isNaN(parseInt(valorDigitado))) {
            if (window.event) event.returnValue = false;
            else evt.preventDefault();

            return false;
        }

        //Percorre o campo preenchendo a mascara e o valor.
        while (!mascaraPreenchida) {
            var valorIndiceMascara = mascara.substr(indiceDigitado, 1);

            if (valorIndiceMascara == "") break;

            if (valorIndiceMascara != "#") {
                src.value = CO.FormRotinas.mascaraTrocaValorIndiceInput(src.value, indiceDigitado, valorIndiceMascara);
                indiceDigitado++;
            }
            else mascaraPreenchida = true;

            if (mascaraPreenchida) {
                src.value = CO.FormRotinas.mascaraTrocaValorIndiceInput(src.value, indiceDigitado, valorDigitado);
            }
        }

        //CO.FormRotinas.mascaraSelecionarParteTexto(src, indiceDigitado + 1, indiceDigitado + 1);
        CO.FormRotinas.mascaraPosicionaCursorProximoDigito(src, indiceDigitado, mascara);

        if (window.event) event.returnValue = false;
        else evt.preventDefault();

        return false;
    },
    mascaraPosicionaCursorProximoDigito: function (elemento, indiceDigitado, mascara) {
        var valorIndiceMascara = null;

        while (valorIndiceMascara != "#") {
            indiceDigitado++;

            valorIndiceMascara = mascara.substr(indiceDigitado, 1);
            if (valorIndiceMascara == "") { break; }
        }

        CO.FormRotinas.mascaraSelecionarParteTexto(elemento, indiceDigitado, indiceDigitado);
    },

    mascaraTrocaValorIndiceInput: function (valor, indiceDigitado, valorDigitado) {
        valor = valor.substring(0, indiceDigitado) + valorDigitado + valor.substring(indiceDigitado + 1, valor.length);
        return valor;
    },

    //Mascara somente para números
    mascaraNumero: function (evt, elemento, mascara, decimais) {
        var separadorMilhar = CO.FormRotinas.mascaraNumeroSeparadorMilhar;
        var separadorCasasDecimais = CO.FormRotinas.mascaraNumeroSeparadorCasasDecimais;

        if (decimais > 0)
            separadorCasasDecimais = decimais

        //campoNormal(elemento);
        CO.FormRotinas.desabilitaAlerta(elemento);

        var evento = null;
        if (window.event) evento = window.event;
        else evento = evt;

        //Variáveis de controle
        var tecla = evento.keyCode ? evento.keyCode : evento.which;
        if (tecla == 8 || tecla == 9 || tecla == 37 || tecla == 39 || tecla == 36 || tecla == 35)
        { return; }

        // Se a Tecla "." (Vírgula) não foi informa permite informar caso contrário irá bloquear.
        if (mascara == "decimal" || mascara == "peso" && tecla == 44 && elemento.value.indexOf(separadorCasasDecimais) == -1) {
            return;
        }

        if (tecla < 48 || tecla > 57) {
            if (window.event) event.returnValue = false;
            else evt.preventDefault();

            return;
        }

        if (mascara == "decimal" || mascara == "peso") {
            var indiceDigitado = CO.FormRotinas.mascaraObterIndiceValorDigitado(elemento);

            //Se o texto estiver selecionado será apagado antes. (Code 9 TAB)
            if (document.selection && tecla != 9)//IE
            {
                if (document.selection.createRange().text == elemento.value) {
                    elemento.value = "";
                    CO.FormRotinas.mascaraSelecionarParteTexto(elemento, 0, 0);
                }
                else {
                    var nrSelecao = document.selection.createRange().text.length;
                    var valor = elemento.value;
                    elemento.value = valor.substring(0, indiceDigitado);
                    elemento.value += valor.substring(indiceDigitado + nrSelecao);
                }
            }
            else if (elemento.selectionStart != 'undefined' && tecla != 9)// != IE
            {
                if (elemento.value.substring(elemento.selectionStart, elemento.selectionEnd) == elemento.value) {
                    elemento.value = "";
                }
                else {
                    var nrSelecao = elemento.value.substring(elemento.selectionStart, elemento.selectionEnd).length;
                    var valor = elemento.value;
                    elemento.value = valor.substring(0, indiceDigitado);
                    elemento.value += valor.substring(indiceDigitado + nrSelecao);
                }
            }

            var valorDigitado = String.fromCharCode(tecla);

            var valor = elemento.value;
            valor = valor.substring(0, indiceDigitado) + valorDigitado + valor.substring(indiceDigitado);

            var valorFinal = "";

            var itens = valor.split(separadorCasasDecimais);
            var nrMilharesTotal = itens[0].split(separadorMilhar).length - 1;
            var valoresAntesCasaDecimal = CO.replace(itens[0], separadorMilhar, "");
            var valoresDepoisCasaDecimal = itens.length > 1 ? itens[1] : "";

            var contaMilha = 1;
            var nrVirgula = 0;

            for (var i = valoresAntesCasaDecimal.length - 1; i >= 0; i--) {
                if (contaMilha > 3 && mascara == "decimal") {
                    contaMilha = 1;
                    valorFinal = separadorMilhar + valorFinal;
                    nrVirgula++;
                }
                valorFinal = valoresAntesCasaDecimal.split('')[i] + valorFinal;
                contaMilha++;
            }

            if (valoresDepoisCasaDecimal != "")
                valorFinal += separadorCasasDecimais + valoresDepoisCasaDecimal;

            elemento.value = valorFinal;

            if (window.event) event.returnValue = false;
            else evt.preventDefault();

            var nrVirgulasAdicionadas = nrVirgula - nrMilharesTotal;

            if (nrVirgulasAdicionadas < 0)
                nrVirgulasAdicionadas = 0;

            CO.FormRotinas.mascaraSelecionarParteTexto(elemento, indiceDigitado + nrVirgulasAdicionadas + 1, indiceDigitado + nrVirgulasAdicionadas + 1);
        }
    },
    mascaraNumeroFormatar: function (elemento, decimais) {
        elemento.value = CO.FormRotinas.mascaraNumeroFormatarValor(elemento.value, decimais);
    },
    mascaraNumeroFormatarValor: function (valor, decimais) {

        //Formata as casas decimais.
        var separadorMilhar = CO.FormRotinas.mascaraNumeroSeparadorMilhar;
        var separadorCasasDecimais = CO.FormRotinas.mascaraNumeroSeparadorCasasDecimais;

        var numeroCasasDecimais = CO.FormRotinas.mascaraNumeroCasasDecimais;

        if (decimais > 0)
            var numeroCasasDecimais = decimais;

        if (valor.indexOf(separadorCasasDecimais) > -1) {

            var itens = valor.split(separadorCasasDecimais);
            var valorCasasDecimais = itens[1];
            for (var i = valorCasasDecimais.length; i < numeroCasasDecimais; i++) {
                valor += "0";
            }
        }
        else {
            valor += separadorCasasDecimais;
            for (var i = 1; i <= numeroCasasDecimais; i++) {
                valor += "0";
            }
        }

        //formata todo o número.
        var valorFinal = "";

        var itens = valor.split(separadorCasasDecimais);
        var nrMilharesTotal = itens[0].split(separadorMilhar).length - 1;
        var valoresAntesCasaDecimal = CO.replace(itens[0], separadorMilhar, "");
        var valoresDepoisCasaDecimal = itens.length > 1 ? itens[1] : "";

        if (valoresAntesCasaDecimal == "") valoresAntesCasaDecimal = "0";

        var contaMilha = 1;
        var nrVirgula = 0;
        for (var i = valoresAntesCasaDecimal.length - 1; i >= 0; i--) {

            if (contaMilha > 3) {
                contaMilha = 1;
                valorFinal = separadorMilhar + valorFinal;
                nrVirgula++;
            }
            valorFinal = valoresAntesCasaDecimal.split('')[i] + valorFinal;
            contaMilha++;
        }

        if (valoresDepoisCasaDecimal != "")
            valorFinal += separadorCasasDecimais + valoresDepoisCasaDecimal;

        return valorFinal;
    },
    //Posiciona o cursor em uma determinada posição do texto, ou seleciona a área desejada.
    mascaraSelecionarParteTexto: function (input, selecInicio, selecFim) {
        if (input.setSelectionRange) {
            //input.focus();
            input.setSelectionRange(selecInicio, selecFim);
        }
        else if (input.createTextRange) {
            var range = input.createTextRange();
            range.collapse(true);
            range.moveEnd('character', selecFim);
            range.moveStart('character', selecInicio);
            range.select();
        }
    },

    mascaraObterIndiceValorDigitado: function (elemento) {
        if (elemento.createTextRange) {
            var r = document.selection.createRange().duplicate();
            r.moveEnd('character', elemento.value.length);
            if (r.text == '') return elemento.value.length;
            return elemento.value.lastIndexOf(r.text);
        } else return elemento.selectionStart;
    },

    desabilitaAlerta: function (campo) {
        if (campo.type == "select-one")
            campo.className = 'co-campo-select';
        else if (campo.type == "text" || campo.type == "textarea" || campo.type == "password")
            campo.className = 'co-campo';

        try {
            var elMsgErro = document.getElementById(campo.id + "Error");
            if (elMsgErro)
                elMsgErro.innerHTML = "";
        } catch (Error) { }

        CO.FormRotinas.exibirToolTip(campo, false);

        campo.onmouseover = null;
        campo.onmousemove = null;
        campo.onmouseout = null;
    },

    habilitaAlerta: function (campo, tooltip) {

        if (campo.type == "select-one")
            campo.className = 'co-campo-select-alerta';
        else if (campo.type == "text" || campo.type == "textarea" || campo.type == "password")
            campo.className = 'co-campo-alerta';

        if (tooltip) {
            campo.setAttribute("ToolTip", tooltip);
            campo.onmouseover = function () { CO.FormRotinas.exibirToolTip(this, true); };
            campo.onmousemove = function () { CO.FormRotinas.exibirToolTip(this, true); };
            campo.onmouseout = function () { CO.FormRotinas.exibirToolTip(this, false); };
        }
    },

    exibirToolTip: function (campo, exibir) {
        var el = campo;
        var msg = campo.getAttribute("ToolTip");

        //       var x = window.event.clientX + 10;
        //       var y = window.event.clientY;

        var x = window.event.clientX + 10;
        var y = 0;

        var elemento = el;
        var posicao = 0;

        while (elemento != null) {
            posicao += elemento.offsetTop;
            elemento = elemento.offsetParent;
        }
        y = posicao - 10;

        var toolTipDivId = "toolTipDiv";

        if (!document.getElementById(toolTipDivId)) {
            var newNode = document.createElement("div");
            newNode.setAttribute("id", toolTipDivId);
            newNode.setAttribute("class", "co-campo-toolTipDiv");
            newNode.setAttribute("style", "visibility: hidden;");
            document.body.appendChild(newNode);
        }

        var elToolTipDiv = document.getElementById(toolTipDivId);

        elToolTipDiv.style.position = "absolute";
        elToolTipDiv.style.left = x + "px";
        elToolTipDiv.style.top = y + "px";

        if (exibir) {
            elToolTipDiv.style.visibility = "visible";
            elToolTipDiv.style.display = "block";
        }
        else {
            elToolTipDiv.style.visibility = "hidden";
            elToolTipDiv.style.display = "none";
        }

        elToolTipDiv.style.zIndex = 10000;
        elToolTipDiv.innerHTML = msg;
    }
    ,
    checaNumerico: function (valor) {
        var mensagem = "Please, fill this field whith numbers only.";
        var msg = "";
        if (isNaN(valor)) msg = mensagem;
        return msg;
    },
    checaEmail: function (valor) {
        var mensagem = "Please, fill this field whith an valid e-mail.";
        var msg = "";
        var email = valor.match(/(\w+)@(.+)\.(\w+)$/);
        if (email == null) {
            msg = mensagem;
        }
        return msg;
    },
    checaCPF: function (valor) {
        var mensagem = "informe corretamente o número do CPF";
        var msg = "";
        if (valor.length != 11 || valor == "00000000000" || valor == "11111111111" ||
              valor == "22222222222" || valor == "33333333333" || valor == "44444444444" ||
              valor == "55555555555" || valor == "66666666666" || valor == "77777777777" ||
              valor == "88888888888" || valor == "99999999999")
            msg = mensagem;
        soma = 0;
        for (y = 0; y < 9; y++)
            soma += parseInt(valor.charAt(y)) * (10 - y);
        resto = 11 - (soma % 11);
        if (resto == 10 || resto == 11) resto = 0;
        if (resto != parseInt(valor.charAt(9)))
            msg = mensagem; soma = 0;
        for (y = 0; y < 10; y++)
            soma += parseInt(valor.charAt(y)) * (11 - y);
        resto = 11 - (soma % 11);
        if (resto == 10 || resto == 11) resto = 0;
        if (resto != parseInt(valor.charAt(10)))
            msg = mensagem;
        return msg;
    },

    checaCNPJ: function (valor) {
        var mensagem = "informe corretamente o número do CNPJ";
        var msg = "";
        var y;
        var c = valor.substr(0, 12);
        var dv = valor.substr(12, 2);
        var d1 = 0;
        for (y = 0; y < 12; y++) {
            d1 += c.charAt(11 - y) * (2 + (y % 8));
        }
        if (d1 == 0) msg = mensagem;
        d1 = 11 - (d1 % 11);
        if (d1 > 9) d1 = 0;
        if (dv.charAt(0) != d1) msg = mensagem;
        d1 *= 2;
        for (y = 0; y < 12; y++) {
            d1 += c.charAt(11 - y) * (2 + ((y + 1) % 8));
        }
        d1 = 11 - (d1 % 11);
        if (d1 > 9) d1 = 0;
        if (dv.charAt(1) != d1) msg = mensagem;
        return msg;
    },

    checaTelefone: function (valor) {
        var ok = true;

        if (valor.length != 14) ok = false;

        for (var i = 0; i <= 14; i++) {
            if (i == 0 || i == 3 || i == 9) {
                if (valor.charAt(0) != "(") ok = false;
                if (valor.charAt(3) != ")") ok = false;
                if (valor.charAt(9) != "-") ok = false;
            }
            else if (isNaN(valor.charAt(i))) ok = false;
        }

        if (!ok) return "informe corretamente o número do telefone com o DDD.";
        else return "";
    },

    definirAtributosCampo: function (formId, configCampo) {

        var campoNome = configCampo.nome;
        var obrigatorio = configCampo.obrigatorio;
        var tipo = configCampo.tipo;
        var mascara = configCampo.mascara;
        var formato = configCampo.formato;
        var compararComOCampo = configCampo.compararComOCampo;
        var tamanhoMaximo = configCampo.tamanhoMaximo;
        var valorMinimo = configCampo.valorMinimo;
        var valorMaximo = configCampo.valorMaximo;

        var form = CO.el(formId);
        var elemento = form[campoNome];

        if (elemento) {
        }
        else {
            alert('definirAtributosCampo:\r\nCampo Não Encontrado: ' + formId + "." + campoNome);
            return;
        }


        if (obrigatorio == "true") elemento.setAttribute("validarObrigatorio", "true");
        if (tipo != undefined && tipo != "") elemento.setAttribute("validarTipo", tipo);

        if (mascara != undefined && mascara != "") { CO.FormRotinas.mascaraDefinir(elemento, mascara); }
        else { elemento["onkeypress"] = function () { CO.FormRotinas.desabilitaAlerta(this); }; }

        if (elemento.type == "select-one") { elemento["onchange"] = function () { CO.FormRotinas.desabilitaAlerta(this); }; }

        if (formato) {
            elemento.setAttribute("formato", formato);

            switch (formato) {
                case "data": { CO.FormRotinas.mascaraDefinir(elemento, "##/##/####"); }
                    break;
                case "inteiro": { CO.FormRotinas.mascaraDefinir(elemento, "inteiro"); }
                    break;
                case "decimal": { CO.FormRotinas.mascaraDefinir(elemento, "decimal"); }
                    break;
                case "peso": { CO.FormRotinas.mascaraDefinir(elemento, "peso"); }
            }
        }

        if (compararComOCampo) {
            elemento.setAttribute("compararComOCampo", compararComOCampo);
        }

        if (tamanhoMaximo) {
            if (elemento.type == "text" || elemento.type == "textarea" || elemento.type == "password") {
                elemento.maxLength = parseInt(tamanhoMaximo);
            }
        }

        if (valorMinimo) {
            elemento.setAttribute("valorMinimo", valorMinimo);
        }

        if (valorMaximo) {
            elemento.setAttribute("valorMaximo", valorMaximo);
        }
    },
    definirEventos: function (formId) {
        var form = CO.el(formId);
        for (var i = 0; i < form.length; i++) {
            var campo = form[i];
            if (campo.getAttribute("mascara")) {
                CO.FormRotinas.mascaraDefinir(campo, campo.getAttribute("mascara"));
            }
            else if (campo.type == "text" || campo.type == "textarea" || campo.type == "password") {
                campo["onkeypress"] = function () { CO.FormRotinas.desabilitaAlerta(this); }
            }
        }
    },
    limparAlerta: function (formId) {
        var form = CO.el(formId);
        for (var i = 0; i < form.length; i++) {
            var campo = form[i];
            CO.FormRotinas.desabilitaAlerta(campo);
        }
    },

    //load
    load: function (id, formId, url, callbackOK, callbackErro) {
        //config={formId,url,cmdSubmit,cmdLoad}

        var form = CO.el(formId);
        var dados = "id=" + id;

        var escopo = this;
        CO.ajax(url, dados, loadOk, callbackErro);

        function loadOk(d) {
            if (!form)
                return;
            if (d == '') return;

            var obj = CO.eval(d).Dados;

            CO.FormRotinas.preencherDadosForm(form, obj);

            if (callbackOK) callbackOK(obj);
        }
    },
    preencherDadosForm: function (form, obj) {

        //Preenche o valor no campo de acordo com o valor da propriedade do objeto corrente.
        function tratarValorCampoForm(campo, valor) {

            if (campo != null) {

                if (campo.type == "select-one" && valor != null && (valor[0] != null && valor[0].Key != null)) //Se o campo for do tipo SELECT e o valor for uma lista. preenche o dropdown.
                {
                    CO.FormRotinas.preencherDropDownComDictionaryEntry(campo, valor);
                }

                if (campo.type == "text" || campo.type == "hidden" || campo.type == "textarea" || campo.type == "select-one" || campo.type == "password") {

                    CO.FormRotinas.preencherValorCampo(campo, valor);
                }
                else if (campo.nodeName && campo.nodeName.toLowerCase() == 'option' && campo.value == valor) {
                    campo.selected = true;
                }

                else if (campo.type == "radio" && campo.value == valor) {
                    campo.checked = true;
                }
                else if (campo.type == "checkbox") {
                    campo.checked = valor;
                }
                else if (campo.nodeName.toLowerCase() == "img") {
                    campo.src = valor;
                }
            }
        }

        //Percorre o objeto retornado do servidor.
        for (var itemObj in obj) {

            //Se existir algum campo no form com o mesmo "name" da item do objeto...
            if (form[itemObj]) {

                //Se tiver mais de um elemento no form com o mesmo "name", percorre todos tratando os valores..
                if (form[itemObj].length && form[itemObj].type != "select-one") {
                    for (var i = 0; i < form[itemObj].length; i++) {
                        tratarValorCampoForm(form[itemObj][i], obj[itemObj]);
                    }
                }
                else {//Senão preenche o valor do único elemento.
                    tratarValorCampoForm(form[itemObj], obj[itemObj]);
                }

            } //Se o item do objeto não existir no form, ainda assim verifica se existe algum elemento na página com o "id".
            else if (document.getElementById(itemObj)) {
                var elemento = document.getElementById(itemObj);

                if (elemento.nodeName.toLowerCase() == "label" || elemento.nodeName.toLowerCase() == "span") {
                    var valor = obj[itemObj] + "";

                    if (valor == "True" || valor == "False") {
                        elemento.innerHTML = valor == "True" ? "yes" : "no";
                    }
                    else elemento.innerHTML = obj[itemObj];
                }
                else if (elemento.nodeName.toLowerCase() == "img") {

                    elemento.src = obj[itemObj];
                }
            }
        }
    },
    preencherDropDownComDictionaryEntry: function (campo, lista) {
        campo.options.length = 0;
        for (var optionIndice = 0; optionIndice < lista.length; optionIndice++) {
            if (lista[optionIndice]) {
                var itemLista = lista[optionIndice];

                if (itemLista.Key != undefined && itemLista.Value != undefined) {
                    campo.options[optionIndice] = new Option(itemLista.Value, itemLista.Key);
                }
            }
        }
    },

    preencherValorCampo: function (campo, objValor) {
        var valor = objValor;

        if (campo.getAttribute("mascara")) {
            var mascara = campo.getAttribute("mascara");

            switch (mascara) {
                case "data":
                    {
                        if ((objValor.getMonth() + 1) == 1 && objValor.getDate() == 1 && objValor.getFullYear() == 1) {
                            valor = "";
                        }
                        else {

                            var dataFormatada = CO.dateFormat(valor, CO.FormRotinas.mascaraFormatoData);

                            valor = CO.FormRotinas.mascaraFormatoData;
                            valor = CO.replace(valor, "MM", objValor.getMonth() + 1);
                            valor = CO.replace(valor, "yyyy", objValor.getFullYear());
                            valor = CO.replace(valor, "yy", objValor.getYear());
                            valor = CO.replace(valor, "HH", objValor.getHours());
                            valor = CO.replace(valor, "mm", objValor.getMinutes());
                            valor = CO.replace(valor, "dd", objValor.getDate());

                            valor = dataFormatada;
                        }
                    } break;
                case "dataHora":
                    {
                        if ((objValor.getMonth() + 1) == 1 && objValor.getDate() == 1 && objValor.getFullYear() == 1) {
                            valor = "";
                        }
                        else {
                            var dataFormatada = CO.dateFormat(valor, CO.FormRotinas.mascaraFormatoDataHora);

                            valor = CO.FormRotinas.mascaraFormatoDataHora;
                            valor = CO.replace(valor, "MM", objValor.getMonth() + 1);
                            valor = CO.replace(valor, "yyyy", objValor.getFullYear());
                            valor = CO.replace(valor, "yy", objValor.getYear());
                            valor = CO.replace(valor, "HH", objValor.getHours());
                            valor = CO.replace(valor, "mm", objValor.getMinutes());
                            valor = CO.replace(valor, "dd", objValor.getDate());

                            valor = dataFormatada;
                        }
                    } break;

                case "decimal":
                    {
                        var separadorCasasDecimais = CO.FormRotinas.mascaraNumeroSeparadorCasasDecimais;
                        valor = CO.replace(objValor + "", ".", separadorCasasDecimais);
                        valor = CO.FormRotinas.mascaraNumeroFormatarValor(valor);

                        break;
                    }
                case "peso":
                    {
                        var separadorCasasDecimais = CO.FormRotinas.mascaraNumeroSeparadorCasasDecimais;
                        valor = CO.replace(objValor + "", ".", separadorCasasDecimais);
                        valor = CO.FormRotinas.mascaraNumeroFormatarValor(valor, 4);

                        break;
                    }

                default:
                    {
                        valor = objValor;
                    } break;
            }

            if (campo.type == "text" || campo.type == "hidden" || campo.type == "textarea" || campo.type == "select-one" || campo.type == "password") {
                campo.value = valor;
            }
            else if (campo.innerHTML) {
                campo.innerHTML = valor;
            }
        }
        else {
            valor = objValor;
        }
    },

    limpar: function (f) {
        f.reset();

        for (i = 0; i < f.length; i++) {
            var campoTipo = f[i].type;
            if (campoTipo == 'text' || campoTipo == 'password' || campoTipo == 'textarea') {
                f[i].value = '';
            }
        }
    },

    //Retorna um elemento do Campo
    campo: function (formId, nomeCampo) {

        var form = CO.el(formId);
        if (form) {
            if (form[nomeCampo]) {
                if (form[nomeCampo].length) {

                    var campo = null;

                    //Obtém o primeiro campo diferente de disabilitado.
                    for (var i = 0; i < form[nomeCampo].length; i++) {

                        if (!form[nomeCampo][i].getAttribute("disabled")) {
                            if (form[nomeCampo][i].tagName == "OPTION") {
                                if (form[nomeCampo][i].selected) campo = form[nomeCampo][i];
                                else continue;
                            }
                            else campo = form[nomeCampo][i];

                            break;
                        }
                    }

                    //Obtém o primeiro campo encontrado mesmo se estiver desabilitado.
                    if (campo == null) {
                        for (var i = 0; i < form[nomeCampo].length; i++) {
                            if (form[nomeCampo][i].tagName == "OPTION") {
                                if (form[nomeCampo][i].selected) campo = form[nomeCampo][i];
                                else continue;
                            }
                            else campo = form[nomeCampo][i];
                        }
                    }

                    if (campo == null) {
                        campo = form[nomeCampo][0];
                    }

                    return campo;
                }
                else return form[nomeCampo];
            }
            else {
                alert('FormRotinas.campo: Campo não encontrado.\r\n' + formId + "." + nomeCampo);
            }
        }
        else {
            alert('FormRotinas.campo: Form não encontrado.\r\n' + formId);
        }
    },

    obterListaCamposComando: function (formId) {
        var form = CO.el(formId);
        var dados = "";

        if (!form) return dados;

        for (i = 0; i < form.length; i++) {
            var campo = form[i];
            var campoName = form[i].name;
            var campoValor = form[i].value;
            var campoTipo = form[i].type;
            var ignorar = false;

            switch (campoTipo) {
                case "radio":
                    ignorar = !form[i].checked;
                    break;

                case "checkbox":
                    campoValor = form[i].checked;
                    break;
            }

            if (!ignorar) {
                dados += dados.length > 0 ? "&" : "";
                dados += campoName + "=" + CO.escape(campoValor);

                if (campoTipo == "select-one")//Se for select obtém o texto do ítem selecionado também.
                {
                    if (form[i] && form[i].selectedIndex >= 0 && form[i][form[i].selectedIndex].firstChild) {
                        dados += "&" + campoName + "Text=" + CO.escape(form[i][form[i].selectedIndex].firstChild.data);
                    }
                    else {
                        dados += "&" + campoName + "Text=";
                    }
                }
            }
        }
        return dados;
    },

    botao: function (formId, nome) {

        var form = CO.el(formId);
        return form[nome];
    },

    submit: function (formId, url, callbackOK, callbackErro) {
        var form = CO.el(formId);

        if (!form) {
            return;
        }

        //Limpa o estado de alerta.
        CO.FormRotinas.limparAlerta(formId);

        var dados = this.obterListaCamposComando(formId);
        CO.ajax(url, dados, function (d) {

            var obj = CO.eval(d);

            if (obj.OK == false) {
                if (!CO.FormRotinas.tratarRetornoSubmitErro(formId, obj)) {
                    if (callbackErro) callbackErro(obj.Dados);
                    else CO.mensagem(obj.Dados, 'alerta');
                }
            }
            else {
                if (obj.Dados) {
                    if (obj.MensagemOK) {
                        CO.mensagem(obj.MensagemOK, "sucesso", function () { CO.mensagemOff(); callbackOK(obj.Dados); });
                    } else {
                        callbackOK(obj.Dados)
                    }
                }
                else {
                    callbackOK(obj);
                }
            }

        }, callbackErro);
    },

    desabilitaCampo: function (campo) {
        if (campo) {
            campo.setAttribute("disabled")
        }
    },

    habilitaCampo: function (campo) {
        if (campo) {
            if (campo.getAttribute("disabled")) {
                campo.removeAttribute("disabled")
            }
        }
    },

    tratarRetornoSubmitErro: function (formId, obj) {
        var erroTratado = false;
        var form = CO.elOuNull(formId);

        if (obj.Dados.MensagemPopUp) {
            var msg = obj.Dados;

            if (msg.ListaCampos && form) {
                for (var i = 0; i < msg.ListaCampos.length; i++) {
                    var campoErr = obj.Dados.ListaCampos[i];

                    if (form[campoErr.CampoId]) {
                        CO.FormRotinas.habilitaAlerta(form[campoErr.CampoId], campoErr.Mensagem);
                    }
                    erroTratado = true;
                }
            }

            if (erroTratado) {
                CO.mensagem(msg.MensagemPopUp, 'alerta');
            }
        }

        return erroTratado;
    }
}
