Ir para o conteúdo

MediaWiki:Common.js

De Normas Regulamentadoras

Nota: Após publicar, você pode ter que limpar o "cache" do seu navegador para ver as alterações.

  • Firefox / Safari: Pressione Shift enquanto clica Recarregar, ou pressione Ctrl-F5 ou Ctrl-R (⌘-R no Mac)
  • Google Chrome: Pressione Ctrl-Shift-R (⌘-Shift-R no Mac)
  • Edge: Pressione Ctrl enquanto clica Recarregar, ou pressione Ctrl-F5.
  • Opera: Pressione Ctrl-F5.
/* Página Normas - Texto Principal Lógica para Ativação de Notas Explicativas no texto de Norma/Anexo */
$(document).ready(function() {
    // 🌟 CORREÇÃO: Captura o HTML completo (preservando o <br /> e o <span> verde)
    var tituloAtualHtml = $('#titulo-cargo-atual').html();
    if (tituloAtualHtml && tituloAtualHtml.trim() !== "") {
        // 🌟 CORREÇÃO: Injeta como HTML estruturado para o navegador renderizar as tags
        $('#firstHeading').html(tituloAtualHtml);
        // Garante que a página do presente fique alinhada à esquerda perfeitamente
        $('#firstHeading').css('text-align', 'left');
    }

    // Varre todas as notas sobrescritas que possuem conteúdo vindo do banco (Código original mantido)
    $('.item-nr .nota-sup').each(function() {
        var textoNota = $(this).text().trim();
        
        // Se a nota contiver texto (ex: [1]), transforma esse texto no Tooltip oficial
        if (textoNota && textoNota !== "[]") {
            $(this).attr('title', 'Nota Explicativa ' + textoNota);
        }
    });
});

/* Tabela NR 04 Anexo 1 */
$(function() {
    // Função genérica para alternar visibilidade e limpar descendentes
    $('.linha-nivel-1, .linha-nivel-2, .linha-nivel-3').on('click', function(e) {
        e.stopPropagation();
        
        var nivelAtual = parseInt($(this).attr('class').match(/linha-nivel-(\d)/)[1]);
        var proximoNivel = nivelAtual + 1;
        
        // Se a linha já estiver aberta, estamos fechando (recolhendo)
        if ($(this).hasClass('aberto')) {
            // Remove a classe 'aberto' desta linha
            $(this).removeClass('aberto');
            
            // Fecha todos os descendentes (recursivo)
            $(this).nextUntil('.linha-nivel-' + nivelAtual).removeClass('show aberto');
        } else {
            // Se estamos abrindo:
            $(this).addClass('aberto');
            
            // Mostra apenas os filhos imediatos (do próximo nível)
            $(this).nextUntil('.linha-nivel-' + nivelAtual).filter('.linha-nivel-' + proximoNivel).addClass('show');
        }
    });
});


/* ==========================================================================
   SISTEMA ORBITAL DE ANEXOS - ENGINE COMPLETA UNIFICADA (nr.wiki.br)
   ========================================================================== */
window.processarSistemaOrbital = function($containerOrbital) {
    if (!$containerOrbital.length) return;

    var $listaPlanetas = $containerOrbital.find('.planeta-satelite');
    var totalPlanetas = $listaPlanetas.length;

    // Se não houver planetas na data, esconde a caixa inteira e encerra imediatamente
    if (totalPlanetas === 0) {
        $containerOrbital.closest('.caixa-orbital-container').hide();
        return; 
    } else {
        $containerOrbital.closest('.caixa-orbital-container').show();
    }

    // 1. IDENTIFICA A PÁGINA ATUAL PELA URL DO NAVEGADOR (Decodifica %20 e caracteres especiais)
    var urlParamsOrbital = new URLSearchParams(window.location.search);
    var urlAtual = decodeURIComponent(window.location.pathname); 
    var idAnexoAtivo = "0"; // Padrão é a página mãe (SOL)

    if (urlParamsOrbital.has('anexoq')) {
        idAnexoAtivo = urlParamsOrbital.get('anexoq').trim();
    } else if (urlAtual.indexOf('_AN_') !== -1 || urlAtual.indexOf(' AN ') !== -1) {
        var partes = urlAtual.split(/_AN_| AN /i);
        if (partes && partes.length > 1 && partes[1]) {
            idAnexoAtivo = partes[1].trim(); 
        }
    }

    // 2. DESABILITA O RE-CLIQUE COM PRECISÃO DO NAVEGADOR
    if (idAnexoAtivo === "0") {
        var $sol = $containerOrbital.find('.bolha-centro');
        if ($sol.length) {
            var $spanSol = $sol.find('.nome-norma-centro').detach();
            $sol.empty().append($spanSol);
        }
    }

    // Mapeamento manual de nomes especiais (Seu original)
    var mapeamentoNomes = {
        "30": "13-A",
        "50": "Glossário",
        "60": "(*)"
    };

    var raio = 96;     
    var centroX = 120; 
    var centroY = 120; 

    $listaPlanetas.each(function(index) {
        var $item = $(this);
        var idOrigem = $item.data('anexo').toString().trim();
        var apelidoCargo = $item.attr('title') || ""; // Captura o apelido vindo da predefinição Cargo

        // Define qual texto vai aparecer escrito DENTRO da bolha verde
        var textoInterno = mapeamentoNomes[idOrigem] || idOrigem;

        // Aplica o texto interno na tag span correspondente
        if (textoInterno === "Glossário" || textoInterno === "(*)") {
            $item.find('span').html(textoInterno);
        } else {
            $item.find('span').html("Anexo<br>" + textoInterno);
        }
        
        // AJUSTE DO BALÃO (TOOLTIP): Se houver um apelido descritivo no Cargo, injeta no link
        if (apelidoCargo) {
            $item.find('a').attr('title', apelidoCargo);
        } else {
            $item.find('a').attr('title', "Anexo " + textoInterno);
        }

        // Se esta lua for a página aberta, remove o link e altera a classe protetora (Seu original)
        if (idOrigem === idAnexoAtivo) {
            $item.addClass('pagina-ativa');
            var $spanLimpo = $item.find('span').detach();
            $item.empty().append($spanLimpo);
        }

        // CÁLCULO TRIGONOMÉTRICO ORIGINAL
        var angulo = (index * (2 * Math.PI) / totalPlanetas) - (Math.PI / 2); 
        var x = centroX + raio * Math.cos(angulo) - 22; 
        var y = centroY + raio * Math.sin(angulo) - 22; 

        $item.css({
            'left': x + 'px',
            'top': y + 'px',
            'width': '44px',  
            'height': '44px'
        });
    });
};

// 🔧 GATILHO DE PARTIDA DA BARRA DO PRESENTE (LIGA A FIAÇÃO)
$(document).ready(function() {
    if (typeof window.processarSistemaOrbital === 'function') {
        window.processarSistemaOrbital($('#sistema-orbital'));
    }
});


/* ==========================================================================
   CIRCUITO DO TEMPO DELOREAN - MOTOR UNIFICADO (nr.wiki.br)
   ========================================================================== */
$(document).ready(function() {
    
    // 🔧 FUNÇÃO CIRÚRGICA: Transmuta os textos das tomadas em elementos HTML reais clicáveis
    function materializarControlesDeLorean() {
        $('.delorean-input-dock').each(function() {
            var $dock = $(this);
            if (!$dock.find('#delorean-target-input').length) {
                var minDate = $dock.data('min');
                var maxDate = $dock.data('max');
                var normaNum = $dock.data('norma');
                
                // Monta o input de texto de forma limpa
                $dock.html('<input type="text" id="delorean-target-input" class="led-input-field" placeholder="88/88/8888" maxlength="10" data-min="' + minDate + '" data-max="' + maxDate + '" data-norma="' + normaNum + '">');
                
                // 💥 CORREÇÃO REAL: Aplica o autocomplete sem travar a linha de execução
                $dock.find('input').attr('autocomplete', 'off');
            }
        });

        $('.delorean-button-dock').each(function() {
            var $dock = $(this);
            if (!$dock.find('#delorean-activation-lever').length) {
                $dock.html('<button id="delorean-activation-lever" class="delorean-lever-btn">ATIVAR CIRCUITO DO TEMPO</button>');
            }
        });
    }

    // Executa a materialização imediatamente nas páginas comuns do presente
    materializarControlesDeLorean();

    // 1. Máscara automática DD/MM/AAAA para digitação limpa no input físico
    $(document).on('input', '#delorean-target-input', function() {
        var v = this.value.replace(/\D/g, '');
        if (v.length > 2) v = v.substring(0,2) + '/' + v.substring(2);
        if (v.length > 5) v = v.substring(0,5) + '/' + v.substring(5,9);
        this.value = v;
    });

    // 2. Disparo da Alavanca do Tempo (Botão de Ativação)
$(document).on('click', '#delorean-activation-lever', function(e) {
    e.preventDefault();

    var input = $('#delorean-target-input');
    var dataDigitada = input.val();
    
    if (!dataDigitada || dataDigitada.length < 10) {
        alert('Por favor, insira a data completa no formato DD/MM/AAAA.');
        return;
    }

    var partes = dataDigitada.split('/');
    var dia = parseInt(partes[0], 10);
    var mes = parseInt(partes[1], 10) - 1;
    var ano = parseInt(partes[2], 10);
    var dataDestino = new Date(ano, mes, dia);
    
    var dataMin = new Date(input.data('min') + 'T00:00:00');
    var dataMax = new Date(input.data('max') + 'T00:00:00');
    var norma = input.data('norma') || '1';

    if (dataDestino < dataMin || dataDestino > dataMax || isNaN(dataDestino.getTime())) {
        alert('❌ ERRO NOS CIRCUITOS DO TEMPO!\nA data escolhida está fora dos limites históricos permitidos para esta norma.');
        return;
    }

    var anoF = dataDestino.getFullYear();
    var mesF = String(dataDestino.getMonth() + 1).padStart(2, '0');
    var diaF = String(dataDestino.getDate()).padStart(2, '0');
    var dataFinalUrl = anoF + '-' + mesF + '-' + diaF;

    window.location.href = window.location.origin + '/index.php?title=Estudo_Transversal&normaq=' + norma + '&date=' + dataFinalUrl;
});

    // 🔧 PONTE DE CONEXÃO COM O AJAX: 
    window.ativarControlesInjetados = function() {
        materializarControlesDeLorean();
    };
});


/* ==========================================================================
    Mapa de Portarias: Vigências
   ========================================================================== */
window.processarInfograficoVigencia = function() {
    var $container = $('#infografico-vigencia');
    if ($container.length === 0) return;

    var $itens = $container.find('.timeline-item');
    if ($itens.length === 0) return;

    var numeroBloco = 1;
    var grupoValido = [];
    var itensArray = $itens.toArray();
    $container.empty();

    for (var i = 0; i < itensArray.length; i++) {
        var $item = $(itensArray[i]);
        var verbo = $item.data('verbo');

        grupoValido.push($item);

        if (verbo === 'R' || i === itensArray.length - 1) {
            var $wrapper = $('<div class="bloco-grupo bloco-' + numeroBloco + '"></div>');
            
            for (var j = 0; j < grupoValido.length; j++) {
                $wrapper.append(grupoValido[j]);
            }

            if (numeroBloco === 1) {
                var $tituloVigencias = $('<div class="titulo-bloco-vigencias">Vigências</div>');
                $container.append($tituloVigencias);
            }

            $container.append($wrapper);
            grupoValido = [];
            numeroBloco++;
        }
    }

    var $todosOsBlocos = $container.find('.bloco-grupo');
    var totalBlocos = $todosOsBlocos.length;

    $todosOsBlocos.each(function(index) {
        var $bloco = $(this);
        var bNumero = index + 1;

        if (bNumero === 1) {
            $bloco.css({ 'background-color': '#27ae60', 'color': '#ffffff' });
        } 
        else if (bNumero === totalBlocos && totalBlocos > 1) {
            $bloco.css({ 'background-color': '#0D0D0D', 'color': '#ffffff' });
        } 
        else {
            var passos = totalBlocos - 2;
            var posicaoIntermediaria = index - 1;
            var percentual = passos > 1 ? (posicaoIntermediaria / (passos - 1)) : 0;

            var r = Math.round(188 + (percentual * (83 - 188)));
            var g = Math.round(244 + (percentual * (144 - 244)));
            var b = Math.round(212 + (percentual * (145 - 212)));
            
            var textoCor = '#2c3e50'; 
            if (percentual > 0.7) { textoCor = '#ffffff'; }

            $bloco.css({ 'background-color': 'rgb(' + r + ',' + g + ',' + b + ')', 'color': textoCor });
        }
    });
};

// Gatilho padrão para a página normal (com o delay de 200ms que você já usava)
$(document).ready(function() {
    setTimeout(function() {
        if (typeof window.processarInfograficoVigencia === 'function') {
            window.processarInfograficoVigencia();
        }
    }, 200);
});
/* ==========================================================================
   CARREGADOR DA PÁGINA DE ESTUDO TRANSVERSAL (AJAX SEGURO - nr.wiki.br)
   ========================================================================== */
mw.loader.using(['mediawiki.util', 'mediawiki.api']).then(function() {
    $(document).ready(function() {
        var rootContainer = $('#estudo-transversal-root');
        
        if (rootContainer.length) {
            var urlParams = new URLSearchParams(window.location.search);
            var norma = urlParams.get('normaq'); 
            var anexo = urlParams.get('anexoq'); // 🪐 Nova captura do planeta/anexo
            var data = urlParams.get('date');

            if (!norma) {
                rootContainer.html('<div style="text-align:center; padding:30px; color:red; font-weight:bold;">❌ ERRO: Identificador da norma (normaq) ausente no painel.</div>');
                return;
            }

            if (!data) {
                rootContainer.html('<div style="text-align:center; padding:30px; color:red; font-weight:bold;">❌ ERRO: Coordenada temporal ausente.</div>');
                return;
            }

            // 🛠️ CHAVEAMENTO DINÂMICO DE PREDEFINIÇÕES DE ACORDO COM O ESPAÇO
            var wikitextToRender = '';
            var textoTitulo = '';

            if (anexo && anexo !== "0") {
                // Se houver anexoq na URL, invoca o Anexo Datado
                wikitextToRender = '{{ExibirPaginaAnexoDatado|norma=' + norma + '|origem=' + anexo + '|data=' + data + '}}';
                textoTitulo = 'Anexo ' + anexo + ' da NR-' + norma;
            } else {
                // Se anexo for nulo ou zero, invoca a Norma Mãe Datada
                wikitextToRender = '{{ExibirPaginaNormaDatada|norma=' + norma + '|data=' + data + '}}';
                textoTitulo = 'NR-' + norma;
            }

           new mw.Api().post({
            action: 'parse',
            text: wikitextToRender,
            contentmodel: 'wikitext',
            format: 'json',
            disablelimitreport: true
        }).done(function(res) {
            if (res && res.parse && res.parse.text) {
                // 1) Injeta o wikitexto do Cargo na página
                rootContainer.html(res.parse.text['*']);

            // 2) Monta o Relógio Digital se houver coordenada de data
            if (data && data.indexOf('-') !== -1) {
                var partesData = data.split('-');
                if (partesData.length === 3) {
                    var dataFormatada = partesData[2] + '/' + partesData[1] + '/' + partesData[0];
                    
                    // 🌟 AJUSTE: Monta o painel do relógio centralizado e prepara para receber o título embaixo
                    $('#firstHeading').html(
                        '<div style="text-align: center; margin-bottom: 12px;">' +
                            '<span style="font-family: \'DeLoreanDigital\', monospace; font-size: 1.1em; color: #ff9f43; letter-spacing: 2px;">' + textoTitulo + '</span>' +
                            '<span style="font-family: \'DeLoreanDigital\', monospace; font-size: 0.9em; color: #27ae60; letter-spacing: 2px; margin-left: 15px; text-transform: lowercase;">em </span>' +
                            '<span style="font-family: \'DeLoreanDigital\', monospace; font-size: 1.1em; color: #27ae60; letter-spacing: 2px; margin-left: 15px;">' + dataFormatada + '</span>' +
                        '</div>'
                    );
                }
            }

            // 3) Captura o texto longo do Cargo e aplica a estilização transversal
            var textoDoCargo = $('#titulo-cargo-dinamico').html();
            if (textoDoCargo) {
                $('#titulo-cargo-injetado').remove();
                
                // 🌟 TRATAMENTO ESPERTO: Se houver a palavra "Anexo" no texto vindo do banco, nós a envolvemos na classe verde automaticamente
                if (textoDoCargo.toLowerCase().indexOf('anexo') !== -1) {
                    // 🌟 CORREÇÃO: Removido o caractere oculto do meio da classe verde
                    textoDoCargo = textoDoCargo.replace(/(Anexo.*)/i, '<br><span class="titulo-anexo-verde">$1</span>');

                }

                var htmlFormatado = '<div id="titulo-cargo-injetado" class="topo-titulo-norma-datada">' + textoDoCargo + '</div>';
                $('#firstHeading').append(htmlFormatado);
                $('#titulo-cargo-dinamico').hide();
            }


                // Reativa os periféricos injetados originais do seu sistema
                if (typeof window.ativarControlesInjetados === 'function') {
                    window.ativarControlesInjetados();
                }
                if (typeof window.processarSistemaOrbital === 'function') {
                    window.processarSistemaOrbital($('#sistema-orbital'));
                }
                setTimeout(function() {
                    if (typeof window.processarInfograficoVigencia === 'function') {
                        window.processarInfograficoVigencia();
                    }
                }, 100);

            } else {
                rootContainer.html('<div style="text-align:center; padding:30px; color:red;">❌ Erro ao renderizar registros históricos.</div>');
            }
        }).fail(function() {
            rootContainer.html('<div style="text-align:center; padding:30px; color:red;">❌ Erro crítico de conexão de rede temporal.</div>');
        });
        }
    });
});