﻿CO = {
    raizSite: "/",
    browser: {
        ie: navigator.userAgent.indexOf("MSIE") > -1,
        ie6: navigator.userAgent.indexOf("MSIE 6") > -1,
        ie7: navigator.userAgent.indexOf("MSIE 7") > -1,
        ie8: navigator.userAgent.indexOf("MSIE 8") > -1,
        firefox: navigator.userAgent.indexOf("Firefox") > -1,
        opera: navigator.userAgent.indexOf("Opera") > -1,
        safari: navigator.userAgent.indexOf("Safari") > -1 && navigator.userAgent.indexOf("Chrome") == -1,
        chrome: navigator.userAgent.indexOf("Chrome") > -1
    },

    masks: {
        "default": "ddd mmm dd yyyy HH:mm:ss",
        shortDate: "M/d/yy",
        mediumDate: "MMM d, yyyy",
        longDate: "MMMM d, yyyy",
        fullDate: "dddd, MMMM d, yyyy",
        shortTime: "h:mm TT",
        mediumTime: "h:mm:ss TT",
        longTime: "h:mm:ss TT Z",
        isoDate: "yyyy-MM-dd",
        isoTime: "HH:mm:ss",
        isoDateTime: "yyyy-MM-dd'T'HH:mm:ss",
        isoUtcDateTime: "UTC:yyyy-MM-dd'T'HH:mm:ss'Z'"
    },

    i18n: {
        dayNames: [
	        "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
	        "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
        ],
        monthNames: [
	        "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
	        "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
        ]
    },

    //Escape
    escape: function (conteudo) {
        if (CO.browser.firefox) {
            return encodeURIComponent(conteudo);
        }
        else { return escape(conteudo); }
    },
    //Retorna o elemento
    el: function (id) {
        var e = document.getElementById(id);
        if (e) { return e; }
        else {
            alert('Não foi possível encontrar o elemento ' + id);
            return null;
        }
    },

    //Retorna o elemento ou Null
    elOuNull: function (id) {
        return document.getElementById(id);
    },

    executarAposEnter: function (field, evt, callBack) {
        return false;
    },

    campoFoco: null,
    focarCampoAposMensagem: function () {
        if (CO.campoFoco) {
            if (typeof (CO.campoFoco) == 'object') {
                CO.campoFoco.focus();
            }
            else {
                var el = CO.el(CO.campoFoco);
                CO.campoFoco = el;
                CO.campoFoco.focus();
            }
        }
        CO.campoFoco = null;
    },

    //Oculta a mensagem
    mensagemOff: function () {

        var el = document.getElementById('CO_Framework_MensagemDiv');
        if (!el) return;
        el.style.display = 'none';

        document.body.removeChild(el);

        el = document.getElementById('CO_Framework_MensagemDivContainer');
        if (!el) return;
        el.style.display = 'none';

        document.body.removeChild(el);

        CO.focarCampoAposMensagem();
    },

    //mensagem
    mensagem: function (texto, icone, callback, callbackNo) {
        var el = document.getElementById('CO_Framework_MensagemDiv');

        if (!el)
            el = criarMensagemDiv();

        var titulo = '';
        var larguraPagina = this.obterLarguraPagina();
        var alturaPagina = this.obterAlturaPagina();
        var margemTopo = this.obterDistanciaTopoPagina();
        var areaVisivelAltura = screen.availHeight;

        if (larguraPagina < 0) larguraPagina = 0;

        el.style.zIndex = 995;
        el.style.display = '';
        el.style.height = (alturaPagina + 300) + "px";
        el.style.width = larguraPagina + "px";
        el.style.top = '0px';
        el.style.left = '0px';

        var msgDiv = document.getElementById('CO_Framework_MensagemDivContainer');

        var larguraCaixaMensagem = '400';   //msgDiv.clientWidth;
        var alturaCaixaMensagem = '164';   //msgDiv.clientHeight;

        var img = msgDiv.getElementsByTagName('img')[0];

        var botaoOK = msgDiv.getElementsByTagName('button')[0];
        var botaoYes = msgDiv.getElementsByTagName('button')[1];
        var botaoNo = msgDiv.getElementsByTagName('button')[2];

        var titulDiv = msgDiv.getElementsByTagName('div')[1];
        var textoDiv = msgDiv.getElementsByTagName('div')[2];

        switch (icone) {
            case 'alerta':
                titulo = 'Alerta...';

                img.src = CO.raizSite + 'content/imagens/img_msg_alerta.gif';
                if (callback) { botaoOK.onclick = callback; } else { botaoOK.onclick = CO.mensagemOff; }
                botaoYes.style.display = 'none';
                botaoNo.style.display = 'none';
                botaoOK.style.display = '';
                break;

            case 'pergunta':
                titulo = 'Pergunta...';

                img.src = CO.raizSite + 'content/imagens/img_msg_alerta.gif';
                if (callback) { botaoYes.onclick = callback; } else { botaoYes.onclick = CO.mensagemOff; }
                if (callbackNo) { botaoNo.onclick = callbackNo; } else { botaoNo.onclick = CO.mensagemOff; }
                botaoYes.style.display = '';
                botaoNo.style.display = '';
                botaoOK.style.display = 'none';
                break;

            case 'erro':
                titulo = 'Erro...'

                img.src = CO.raizSite + 'content/imagens/img_msg_erro.gif';
                if (callback) { botaoOK.onclick = callback; } else { botaoOK.onclick = CO.mensagemOff; }
                botaoYes.style.display = 'none';
                botaoNo.style.display = 'none';
                botaoOK.style.display = '';
                break;

            default:
                titulo = 'Informação...'

                botaoYes.style.display = 'none';
                botaoNo.style.display = 'none';
                botaoOK.style.display = '';
                img.src = CO.raizSite + 'content/imagens/img_msg_sucesso.gif';
                if (callback) { botaoOK.onclick = callback; } else { botaoOK.onclick = CO.mensagemOff; }
                break;
        }

        msgDiv.style.top = '45%';
        msgDiv.style.zIndex = 999;
        msgDiv.style.left = ((larguraPagina - larguraCaixaMensagem) / 2) + 'px';

        $(".co-framework-mensagem-container-texto").html(texto);
        $(".co-framework-mensagem-container-titulo").html(titulo);

        msgDiv.style.display = '';

        return null;

        //CriarMensagemDiv
        function criarMensagemDiv() {
            var el = document.createElement("DIV");

            el.className = 'co-div-framework-mensagem-fundo';
            el.id = 'CO_Framework_MensagemDiv';
            document.body.appendChild(el);

            var elMsg = document.createElement("DIV");
            elMsg.id = 'CO_Framework_MensagemDivContainer';
            elMsg.className = 'co-framework-mensagem-container';

            var html = ' '
            html = html + ' <div class="co-framework-mensagem-container-titulo"></div>';
            html = html + ' <div class="co-framework-mensagem-container-icone"><img src="' + CO.raizSite + 'content/imagens/img_mensagem_ok.gif"></div>';
            html = html + ' <div class="co-framework-mensagem-container-texto"></div>';
            html = html + ' <div class="co-framework-mensagem-container-botao"> ';
            html = html + '     <button style=""             class="co-framework-mensagem-container-botao-botoesConfirmacao">' + CO.mensagens.confirmar + '</button>';
            html = html + '     <button style="display:none" class="co-framework-mensagem-container-botao-botoesConfirmacao">' + CO.mensagens.confirmar + '</button>';
            html = html + '     <button style="display:none" class="co-framework-mensagem-container-botao-botoesConfirmacao">' + CO.mensagens.cancelar + '</button>';
            html = html + ' </div"> ';

            elMsg.innerHTML = html;
            document.body.appendChild(elMsg);

            return el;
        }
    },

    pergunta: function (textoPergunta, callbackSim, callbackNao) {
        CO.mensagem(textoPergunta, 'pergunta', callbackSim, callbackNao);
    },

    popup: function (titulo, texto, largura, altura, closeCallback) {
        var el = document.getElementById('CO_Framework_PopupDiv');
        if (!el) el = criarPopupDiv();

        var larguraPagina = this.obterLarguraPagina() - 10;
        var alturaPagina = this.obterAlturaPagina();
        var margemTopo = this.obterDistanciaTopoPagina();
        var areaVisivelAltura = screen.availHeight;

        if (larguraPagina < 0) larguraPagina = 0;

        el.style.zIndex = 0;
        el.style.display = '';
        el.style.height = alturaPagina + "px";
        el.style.width = "100%";
        el.style.top = '0px';
        el.style.left = '0px';

        var popupDiv = document.getElementById('CO_Framework_PopupDivContainer');

        var larguraCaixaMensagem = parseInt(largura);
        var alturaCaixaMensagem = parseInt(altura) + 40;

        var tituloDiv = document.getElementById('CO_Framework_PopupDivTituloLabel');
        var textoDiv = document.getElementById('CO_Framework_PopupDivTexto');

        var botaoClose = document.getElementById('CO_Framework_PopupDivCloseButton');
        botaoClose.onclick = function () {
            el.style.display = 'none';
            popupDiv.style.display = 'none';
        };

        var areaVisivelCalc = (areaVisivelAltura / 2);
        areaVisivelCalc = areaVisivelCalc - (alturaCaixaMensagem / 2);

        var topo = ((areaVisivelCalc + margemTopo)) - (96 / 2);

        var left = (larguraPagina / 2) - (larguraCaixaMensagem / 2);

        popupDiv.style.top = topo + 'px';
        popupDiv.style.zIndex = 1;
        popupDiv.style.left = left + 'px';

        tituloDiv.innerHTML = titulo;
        textoDiv.innerHTML = texto;

        popupDiv.style.height = alturaCaixaMensagem + "px";
        popupDiv.style.width = larguraCaixaMensagem + "px";
        popupDiv.style.display = '';

        //CriarMensagemDiv
        function criarPopupDiv() {
            var el = document.createElement("DIV");
            el.className = 'co-framework-popupFundo';
            el.id = 'CO_Framework_PopupDiv';
            document.body.appendChild(el);

            var elMsg = document.createElement("DIV");
            elMsg.id = 'CO_Framework_PopupDivContainer';
            elMsg.className = 'co-framework-popupContainer';

            elMsg.innerHTML = '<div id="CO_Framework_PopupDivTitulo" class="co-framework-popupTitulo">' +
                            '   <label id="CO_Framework_PopupDivTituloLabel" class="co-framework-popupTituloLabel"></label>' +
                            '   <button id="CO_Framework_PopupDivCloseButton" type="button" class="co-framework-popupTituloBotaoClose">X</button>' +
                            '</div>' +
                            '<div id="CO_Framework_PopupDivTexto" class="co-framework-popupTexto">Mensagem aqui</div>';

            document.body.appendChild(elMsg);

            return el;
        }
    },

    popupClose: function () {
        var popupDiv = document.getElementById('CO_Framework_PopupDivContainer');
        var el = document.getElementById('CO_Framework_PopupDiv');
        if (el) {
            el.style.display = 'none';
            popupDiv.style.display = 'none';
        }
    },

    // Ajax
    ajax: function (url, dados, funcaoCallBack, funcaoErro) {
        var _req = null;

        if (window.XMLHttpRequest) {
            _req = new XMLHttpRequest();
        }
        else if (window.ActiveXObject) {
            _req = new ActiveXObject("Microsoft.XMLHTTP");
        }

        CO.processando(true);

        _req.onreadystatechange = function () {
            if (_req.readyState == 4) {
                CO.processando(false);

                if (_req.status == 200) {

                    var textoRetorno = _req.responseText;

                    if (textoRetorno != "") {
                        var obj = CO.eval(textoRetorno);
                        if (obj && obj.MensagemPopup) {
                            var tipoMsg = "";
                            switch (obj.MensagemTipo) {
                                case 1: tipoMsg = "sucesso"; break;
                                case 2: tipoMsg = "alerta"; break;
                                case 3: tipoMsg = "erro"; break;
                            }
                            CO.processando(false);
                            CO.mensagem(obj.MensagemPopup, tipoMsg, function () { funcaoCallBack(obj); });
                            return;
                        }
                        else {
                            funcaoCallBack(textoRetorno);
                            return;
                        }
                    }
                }
                else {

                    if (_req.status == "0" || _req.status == "1230" || _req.status == "1231" || _req.status == "404" || _req.status == "12029") {
                        CO.mensagem("conection timed out!<br/>check your internet connection.");
                        return;
                    }

                    if (funcaoErro) {
                        funcaoErro(_req);
                    }
                    else {
                        CO.processando(false);
                        //alert("Erro no servidor:" + _req.status + "\r\nMensagem:" + _req.responseText);
                        var msg = "Erro no servidor:" + _req.status + "\r\nMensagem:" + _req.responseText;
                        CO.mensagem(msg);

                    }
                }
            }
        };

        //Chama o servidor
        _req.open("POST", url, true);
        _req.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=iso-8859-1");
        _req.setRequestHeader("Content-length", dados != null ? dados.length : 0);
        _req.send(dados);
    },

    eval: function (stringTexto) {
        try {
            if (stringTexto.indexOf("/Date(") > -1) {
                stringTexto = CO.replace(stringTexto, "\"\\/Date(", "new Date(");
                stringTexto = CO.replace(stringTexto, ")\\/\"", ")");
            }
            return eval("(" + stringTexto + ")");
        } catch (Error) { }
    },

    // Mudar Opacidade
    mudarOpacidade: function (opacidade, id) {
        if (CO.el(id)) {
            var object = CO.el(id).style;
            object.opacity = (opacidade / 100);
            object.MozOpacity = (opacidade / 100);
            object.KhtmlOpacity = (opacidade / 100);
            object.filter = "alpha(opacity=" + opacidade + ")";
        }
    },

    //Obtém a largura útil da págnia.
    obterLarguraPagina: function () {
        if (window.clientWidth) return window.clientWidth;
        return document.body.clientWidth;
    },

    //Obtém a altura da págnia.
    obterAlturaPagina: function () {
        if (window.clientHeight)
            return window.clientHeight;
        else if (document.documentElement.scrollTop)
            return document.documentElement.scrollHeight;
        else if (screen.height < document.body.scrollHeight)
            return document.body.scrollHeight;
        else
            return screen.height;
    },

    //Obtém a altura oculta com rolagem do topo.
    obterDistanciaTopoPagina: function () {
        if (window.scrollY)
            return window.scrollY;
        else if (document.documentElement.scrollTop)
            return document.documentElement.scrollTop;
        else
            return document.body.scrollTop;
    },

    nrRequisicoesProcessando: 0,
    // Pagina processando ou não, bloqueia o click do usuário enquanto está processando.
    processando: function (processando) {
        var popProcess = this.el("cm-fundo-processando");
        var imgProcess = this.el("cm-img-processando");

        if (imgProcess == null || popProcess == null) return;

        //Enquanto existir alguma requisição processando não oculta o icone processando.
        if (processando) this.nrRequisicoesProcessando++;
        else {
            if (this.nrRequisicoesProcessando > 0) this.nrRequisicoesProcessando--;
            else this.nrRequisicoesProcessando = 0;
        }

        var larguraPagina = this.obterLarguraPagina() - 10;
        var alturaPagina = this.obterAlturaPagina();
        var margemTopo = this.obterDistanciaTopoPagina();
        var areaVisivelAltura = screen.availHeight;

        if (larguraPagina < 0) larguraPagina = 0;

        popProcess.style.height = alturaPagina + "px";
        popProcess.style.width = "100%";
        popProcess.style.top = "0px";
        popProcess.style.left = "0px";

        var areaVisivelCalc = (areaVisivelAltura / 2);
        var topo = ((areaVisivelCalc + margemTopo)) - (96 / 2);

        imgProcess.style.top = topo + "px";

        if (this.nrRequisicoesProcessando == 0) {
            popProcess.style.display = "none";
            imgProcess.style.display = "none";
        }
        else {
            popProcess.style.display = "";
            imgProcess.style.display = "";
        }
    },

    replace: function (valor, chave, novoValor) {
        var retorno = valor;

        while (retorno.indexOf(chave) > -1) {
            retorno = retorno.replace(chave, novoValor);
        }
        return retorno;
    },

    elFilho: function (container, indice) {
        indice = !indice ? 1 : indice + 1;
        var contador = 0;

        for (var i = 0; i < container.childNodes.length; i++) {
            if (container.childNodes[i].nodeType == 1) //Elemento HTML
            {
                contador++;

                if (indice <= contador) {
                    return container.childNodes[i];
                    break;
                }
            }
        }

        if (indice <= contador) {
            return container.childNodes[indice];
        }
    },

    elAnterior: function (obj) {
        if (obj == null) {

            //DEBUG:
            alert('Erro funcao elAnterior: parametro null');

            return null;
        }

        var p = obj;

        do p = p.previousSibling;

        while (p && p.nodeType != 1);

        return p;

    },

    elProximo: function (obj) {
        if (obj == null) {

            //DEBUG:
            alert('Erro funcao elProximo: parametro null');

            return null;
        }
        var p = obj;

        do p = p.nextSibling;

        while (p && p.nodeType != 1);

        return p;

    },

    obterElementoClicado: function (e) {
        if (e != null) {
            return window.event ? window.event.srcElement : e.target;
        }
        else {
            return window.event ? window.event.srcElement : null;

        }
    },

    elParente: function (elemento, tag) {
        while (elemento.parentNode) {
            if (elemento.parentNode.nodeName.toUpperCase() == tag.toUpperCase()) {
                return elemento.parentNode;
            }
            elemento = elemento.parentNode;
        }
        return true;

    },

    topoPagina: function () {
        window.scrollTo(0, 0);
    },

    obterQueryString: function (item) {
        var qs = window.location.search.substring(1);
        var qa = qs.split("&");
        var ft;
        for (i = 0; i < qa.length; i++) {
            ft = qa[i].split("=");
            if (ft[0] == item) {
                return ft[1];
            }
        }
        return "";
    },

    tab: function (field, evt, next) {
        var keyCode = document.layers ? evt.which : document.all ? evt.keyCode : evt.keyCode;
        if (keyCode == 13) {
            if (next == null) {
                field.blur(); return false;
            } else {
                try {
                    CO.el(next).focus(); CO.el(next).select();
                    if (CO.el(next).getAttribute('mascara')) {
                        alert("passou");
                    }

                } catch (Error) { }
                return false;
            }
        }
    },

    trim: function (str) {
        return str.replace(/^\s+|\s+$/g, "");
    },

    tratarTextoOverFlowHidden: function () {
        var divs = document.getElementsByTagName("div");

        for (var i = 0; i < divs.length; i++) {
            if (divs[i].getAttribute("tratarTextoOverFlow")) {
                var el = divs[i];

                //Existe algum texto oculto?
                if (el.scrollHeight > parseInt(el.style.height.replace('px', ''))) {

                    var divTexto = document.createElement("div");
                    divTexto.style.styleFloat = "left";
                    divTexto.style.cssFloat = "left";
                    divTexto.style.overflow = "hidden";
                    divTexto.style.height = el.style.height;
                    divTexto.style.width = (parseInt(el.style.width.replace('px', '')) - 25) + "px";
                    divTexto.innerHTML = el.title;

                    var divReticencias = document.createElement("div");
                    divReticencias.style.styleFloat = "left";
                    divReticencias.style.cssFloat = "left";
                    divReticencias.style.height = el.style.height;
                    divReticencias.style.width = "20px";
                    divReticencias.style.verticalAlign = 'text-bottom';
                    divReticencias.innerHTML = "<table cellpadding=0 cellspacing=0 style='height:100%;width:20px;'><tr><td valign=bottom align=center style='margin:0px;padding:0px 0px 0px 5px;border:none;'>...</td></tr></table>";

                    el.innerHTML = "";

                    el.appendChild(divTexto);
                    el.appendChild(divReticencias);
                }
            }
        }
    },

    dateFormat: function () {
        var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,
		timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
		timezoneClip = /[^-+\dA-Z]/g,
		pad = function (val, len) {
		    val = String(val);
		    len = len || 2;
		    while (val.length < len) val = "0" + val;
		    return val;
		};

        return function (date, mask, utc) {
            var dF = CO;

            if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) {
                mask = date;
                date = undefined;
            }
            date = date ? new Date(date) : new Date;
            if (isNaN(date)) throw SyntaxError("invalid date");

            mask = String(dF.masks[mask] || mask || dF.masks["default"]);
            if (mask.slice(0, 4) == "UTC:") {
                mask = mask.slice(4);
                utc = true;
            }

            var _ = utc ? "getUTC" : "get",
			d = date[_ + "Date"](),
			D = date[_ + "Day"](),
			M = date[_ + "Month"](),
			y = date[_ + "FullYear"](),
			H = date[_ + "Hours"](),
			m = date[_ + "Minutes"](),
			s = date[_ + "Seconds"](),
			L = date[_ + "Milliseconds"](),
			o = utc ? 0 : date.getTimezoneOffset(),
			flags = {
			    d: d,
			    dd: pad(d),
			    ddd: dF.i18n.dayNames[D],
			    dddd: dF.i18n.dayNames[D + 7],
			    M: M + 1,
			    MM: pad(M + 1),
			    MMM: dF.i18n.monthNames[M],
			    MMMM: dF.i18n.monthNames[M + 12],
			    yy: String(y).slice(2),
			    yyyy: y,
			    h: H % 12 || 12,
			    hh: pad(H % 12 || 12),
			    H: H,
			    HH: pad(H),
			    m: m,
			    mm: pad(m),
			    s: s,
			    ss: pad(s),
			    l: pad(L, 3),
			    L: pad(L > 99 ? Math.round(L / 10) : L),
			    t: H < 12 ? "a" : "p",
			    tt: H < 12 ? "am" : "pm",
			    T: H < 12 ? "A" : "P",
			    TT: H < 12 ? "AM" : "PM",
			    Z: utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),
			    o: (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
			    S: ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]
			};

            return mask.replace(token, function ($0) {
                return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
            }
            );
        }
    } ()
}
