Ir para o conteúdo

MediaWiki:Common.js: mudanças entre as edições

De Normas Regulamentadoras
Sem resumo de edição
Sem resumo de edição
Linha 39: Linha 39:




/* Página Normas - Sistema Orbital - Lógica do Sistema Orbital com Auto-Ocultação e Suporte a Apelidos Dinâmicos */
/* ==========================================================================
/* Lógica do Sistema Orbital de Anexos com Tradução de Nomes e Auto-Ocultação */
  SISTEMA ORBITAL DE ANEXOS - ENGINE COMPLETA (nr.wiki.br)
/* Lógica do Sistema Orbital de Anexos com Links Inteligentes e Auto-Ocultação */
  ========================================================================== */
$(document).ready(function() {
function processarSistemaOrbital($containerOrbital) {
     var $containerOrbital = $('#sistema-orbital');
     if (!$containerOrbital.length) return;
 
     var $listaPlanetas = $containerOrbital.find('.planeta-satelite');
     var $listaPlanetas = $containerOrbital.find('.planeta-satelite');
     var totalPlanetas = $listaPlanetas.length;
     var totalPlanetas = $listaPlanetas.length;
Linha 59: Linha 60:


     if (urlAtual.indexOf('_AN_') !== -1 || urlAtual.indexOf(' AN ') !== -1) {
     if (urlAtual.indexOf('_AN_') !== -1 || urlAtual.indexOf(' AN ') !== -1) {
        // Captura o número do anexo no final da URL (ex: "NR-1_AN_1" ou "NR-1 AN 1")
         var partes = urlAtual.split(/_AN_| AN /i);
         var partes = urlAtual.split(/_AN_| AN /i);
         if (partes.length > 1) {
         if (partes.length > 1) {
Linha 65: Linha 65:
         }
         }
     } else {
     } else {
        // Se não achou "AN" na URL, o usuário está na página mãe (Origem 0)
         idAnexoAtivo = "0";
         idAnexoAtivo = "0";
     }
     }
Linha 71: Linha 70:
     // 2. DESABILITA O RE-CLIQUE COM PRECISÃO DO NAVEGADOR
     // 2. DESABILITA O RE-CLIQUE COM PRECISÃO DO NAVEGADOR
     if (idAnexoAtivo === "0") {
     if (idAnexoAtivo === "0") {
        // Desativa o link do Sol (Origem 0)
         var $sol = $containerOrbital.find('.bolha-centro');
         var $sol = $containerOrbital.find('.bolha-centro');
         var $spanSol = $sol.find('.nome-norma-centro').detach();
         var $spanSol = $sol.find('.nome-norma-centro').detach();
Linha 77: Linha 75:
     }
     }


     // Mapeamento manual de nomes especiais
     // Mapeamento manual de nomes especiais (Seu original)
     var mapeamentoNomes = {
     var mapeamentoNomes = {
         "30": "13-A",
         "30": "13-A",
Linha 92: Linha 90:
         var idOrigem = $item.data('anexo').toString().trim();
         var idOrigem = $item.data('anexo').toString().trim();
          
          
        // Se esta lua for a página aberta, remove o link e ativa a classe protetora
         if (idOrigem === idAnexoAtivo) {
         if (idOrigem === idAnexoAtivo) {
             $item.addClass('pagina-ativa');
             $item.addClass('pagina-ativa');
Linha 105: Linha 102:
                 $item.find('span').html("Anexo<br>" + textoSimples);
                 $item.find('span').html("Anexo<br>" + textoSimples);
             }
             }
            // Remove a tag <a> de link de dentro dela
             var $spanLimpo = $item.find('span').detach();
             var $spanLimpo = $item.find('span').detach();
             $item.empty().append($spanLimpo);
             $item.empty().append($spanLimpo);
         } else {
         } else {
            // Luas normais mantêm o link padrão
             if (mapeamentoNomes[idOrigem]) {
             if (mapeamentoNomes[idOrigem]) {
                 if (mapeamentoNomes[idOrigem] === "Glossário" || mapeamentoNomes[idOrigem] === "(*)") {
                 if (mapeamentoNomes[idOrigem] === "Glossário" || mapeamentoNomes[idOrigem] === "(*)") {
Linha 121: Linha 116:
         }
         }


        // CÁLCULO TRIGONOMÉTRICO ORIGINAL - EVITA EMPILHAMENTO
         var angulo = (index * (2 * Math.PI) / totalPlanetas) - (Math.PI / 2);  
         var angulo = (index * (2 * Math.PI) / totalPlanetas) - (Math.PI / 2);  
         var x = centroX + raio * Math.cos(angulo) - 22;  
         var x = centroX + raio * Math.cos(angulo) - 22;  
Linha 131: Linha 127:
             'height': '44px'
             'height': '44px'
         });
         });
    });
}
/* ==========================================================================
  INICIALIZAÇÃO DO SISTEMA E CARREGADOR DA MÁQUINA DO TEMPO
  ========================================================================== */
mw.loader.using(['mediawiki.util', 'mediawiki.api']).then(function() {
    $(document).ready(function() {
       
        // Executa o sistema orbital imediatamente nas páginas comuns atuais
        processarSistemaOrbital($('#sistema-orbital'));
        // ==================================================================
        // ROTINA DA PÁGINA DE ESTUDO TRANSVERSAL (AJAX)
        // ==================================================================
        var rootContainer = $('#estudo-transversal-root');
        if (rootContainer.length) {
            var getUrlParameter = function(sParam) {
                var sPageURL = window.location.search.substring(1),
                    sURLVariables = sPageURL.split('&'),
                    sParameterName, i;
                for (i = 0; i < sURLVariables.length; i++) {
                    sParameterName = sURLVariables[i].split('=');
                    if (sParameterName === sParam) {
                        return sParameterName === undefined ? true : decodeURIComponent(sParameterName);
                    }
                }
                return false;
            };
            var norma = getUrlParameter('normaq') || '1';
            var data = getUrlParameter('date');
            if (!data) {
                rootContainer.html('<div style="text-align:center; padding:30px; color:red; font-weight:bold;">❌ ERRO: Nenhuma coordenada temporal fornecida.</div>');
                return;
            }
            var wikitextToRender = '{{ExibirPaginaNormaDatada|norma=' + norma + '|data=' + data + '}}';
            new mw.Api().post({
                action: 'parse',
                text: wikitextToRender,
                contentmodel: 'wikitext',
                format: 'json',
                disablelimitreport: true
            }).done(function(dataResult) {
                if (dataResult && dataResult.parse && dataResult.parse.text) {
                    // 1. Injeta o HTML histórico retornado pelo Cargo
                    rootContainer.html(dataResult.parse.text['*']);
                    // 2. Materializa o painel do DeLorean de saltos contínuos
                    var inputDock = $('#delorean-input-dock');
                    var buttonDock = $('#delorean-button-dock');
                    if (inputDock.length && buttonDock.length) {
                        var minDate = inputDock.data('min');
                        var maxDate = inputDock.data('max');
                        var normaNum = inputDock.data('norma');
                        inputDock.html('<input type="text" id="delorean-target-input" class="led-input-field" placeholder="DD/MM/AAAA" maxlength="10" data-min="' + minDate + '" data-max="' + maxDate + '" data-norma="' + normaNum + '">');
                        buttonDock.html('<button id="delorean-activation-lever" class="delorean-lever-btn">ATIVAR CIRCUITO DO TEMPO</button>');
                    }
                    // 3. RODA O SEU SISTEMA ORBITAL HISTÓRICO COM RE-CÁLCULO TRIGONOMÉTRICO
                    processarSistemaOrbital($('#sistema-orbital-historico'));
                } else {
                    rootContainer.html('<div style="text-align:center; padding:30px; color:red;">❌ Falha ao processar os registros históricos.</div>');
                }
            }).fail(function() {
                rootContainer.html('<div style="text-align:center; padding:30px; color:red;">❌ Erro crítico de conexão com os circuitos da Wiki.</div>');
            });
        }
     });
     });
});
});

Edição das 13h09min de 4 de agosto de 2026

/* Página Normas - Texto Principal  Lógica para Ativação de Notas Explicativas no texto de Norma/Anexo */
$(document).ready(function() {
    // Varre todas as notas sobrescritas que possuem conteúdo vindo do banco
    $('.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 (nr.wiki.br)
   ========================================================================== */
function processarSistemaOrbital($containerOrbital) {
    if (!$containerOrbital.length) return;

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

    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
    var urlAtual = window.location.pathname; 
    var idAnexoAtivo = null;

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

    // 2. DESABILITA O RE-CLIQUE COM PRECISÃO DO NAVEGADOR
    if (idAnexoAtivo === "0") {
        var $sol = $containerOrbital.find('.bolha-centro');
        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();
        
        if (idOrigem === idAnexoAtivo) {
            $item.addClass('pagina-ativa');
            var textoSimples = idOrigem;
            if (mapeamentoNomes[idOrigem]) {
                textoSimples = mapeamentoNomes[idOrigem];
            }
            
            if (textoSimples === "Glossário" || textoSimples === "(*)") {
                $item.find('span').html(textoSimples);
            } else {
                $item.find('span').html("Anexo<br>" + textoSimples);
            }
            var $spanLimpo = $item.find('span').detach();
            $item.empty().append($spanLimpo);
        } else {
            if (mapeamentoNomes[idOrigem]) {
                if (mapeamentoNomes[idOrigem] === "Glossário" || mapeamentoNomes[idOrigem] === "(*)") {
                    $item.find('span').html(mapeamentoNomes[idOrigem]);
                } else {
                    $item.find('span').html("Anexo<br>" + mapeamentoNomes[idOrigem]);
                }
            } else {
                $item.find('span').html("Anexo<br>" + idOrigem);
            }
        }

        // CÁLCULO TRIGONOMÉTRICO ORIGINAL - EVITA EMPILHAMENTO
        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'
        });
    });
}

/* ==========================================================================
   INICIALIZAÇÃO DO SISTEMA E CARREGADOR DA MÁQUINA DO TEMPO
   ========================================================================== */
mw.loader.using(['mediawiki.util', 'mediawiki.api']).then(function() {
    $(document).ready(function() {
        
        // Executa o sistema orbital imediatamente nas páginas comuns atuais
        processarSistemaOrbital($('#sistema-orbital'));

        // ==================================================================
        // ROTINA DA PÁGINA DE ESTUDO TRANSVERSAL (AJAX)
        // ==================================================================
        var rootContainer = $('#estudo-transversal-root');
        if (rootContainer.length) {
            var getUrlParameter = function(sParam) {
                var sPageURL = window.location.search.substring(1),
                    sURLVariables = sPageURL.split('&'),
                    sParameterName, i;
                for (i = 0; i < sURLVariables.length; i++) {
                    sParameterName = sURLVariables[i].split('=');
                    if (sParameterName === sParam) {
                        return sParameterName === undefined ? true : decodeURIComponent(sParameterName);
                    }
                }
                return false;
            };

            var norma = getUrlParameter('normaq') || '1';
            var data = getUrlParameter('date');

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

            var wikitextToRender = '{{ExibirPaginaNormaDatada|norma=' + norma + '|data=' + data + '}}';

            new mw.Api().post({
                action: 'parse',
                text: wikitextToRender,
                contentmodel: 'wikitext',
                format: 'json',
                disablelimitreport: true
            }).done(function(dataResult) {
                if (dataResult && dataResult.parse && dataResult.parse.text) {
                    // 1. Injeta o HTML histórico retornado pelo Cargo
                    rootContainer.html(dataResult.parse.text['*']);

                    // 2. Materializa o painel do DeLorean de saltos contínuos
                    var inputDock = $('#delorean-input-dock');
                    var buttonDock = $('#delorean-button-dock');
                    if (inputDock.length && buttonDock.length) {
                        var minDate = inputDock.data('min');
                        var maxDate = inputDock.data('max');
                        var normaNum = inputDock.data('norma');
                        inputDock.html('<input type="text" id="delorean-target-input" class="led-input-field" placeholder="DD/MM/AAAA" maxlength="10" data-min="' + minDate + '" data-max="' + maxDate + '" data-norma="' + normaNum + '">');
                        buttonDock.html('<button id="delorean-activation-lever" class="delorean-lever-btn">ATIVAR CIRCUITO DO TEMPO</button>');
                    }

                    // 3. RODA O SEU SISTEMA ORBITAL HISTÓRICO COM RE-CÁLCULO TRIGONOMÉTRICO
                    processarSistemaOrbital($('#sistema-orbital-historico'));

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


/* Lógica de Agrupamento em Blocos Sólidos para o Infográfico Histórico */
$(document).ready(function() {
    var $container = $('#infografico-vigencia');
    if ($container.length === 0) return;

    // Aguarda um instante para garantir que o Cargo renderizou todas as linhas na tela
    setTimeout(function() {
        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);

            // A cada portaria de Redação 'R' ou no final da fila, fecha o bloco sólido
            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]);
                }

                // Injeta o rótulo "Vigências" acima do Bloco 1 (Verde)
                if (numeroBloco === 1) {
                    var $tituloVigencias = $('<div class="titulo-bloco-vigencias">Vigências</div>');
                    $container.append($tituloVigencias);
                }

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

        // --- NOVA LÓGICA DE DEGRADÊ DINÂMICO ---
        var $todosOsBlocos = $container.find('.bloco-grupo');
        var totalBlocos = $todosOsBlocos.length;

        $todosOsBlocos.each(function(index) {
            var $bloco = $(this);
            var bNumero = index + 1; // Bloco 1, Bloco 2, etc.

            // CASO 1: É o Primeiro Bloco -> Sempre VERDE
            if (bNumero === 1) {
                $bloco.css({
                    'background-color': '#27ae60',
                    'color': '#ffffff'
                });
            } 
            // CASO 2: É o Último Bloco (e existe mais de um bloco) -> Sempre PRETO
            else if (bNumero === totalBlocos && totalBlocos > 1) {
                $bloco.css({
                    'background-color': '#0D0D0D',
                    'color': '#ffffff'
                });
            } 
            // CASO 3: Blocos Intermediários -> Degradê calculado do cinza claro ao escuro
            else {
                // Fórmulas matemáticas para gerar tons de cinza azulados/esverdeados harmônicos
                // Quanto maior o index, mais escuro fica o bloco intermediário
                var passos = totalBlocos - 2; // Desconta o primeiro e o último
                var posicaoIntermediaria = index - 1; // Posição dele entre os do meio (0 a passos-1)
                
                // Calcula o percentual de evolução do meio (0% para o primeiro do meio, 100% para o último do meio)
                var percentual = passos > 1 ? (posicaoIntermediaria / (passos - 1)) : 0;

                // Transição suave de cores (RGB inicial #bcf4d4 até RGB final #539091)
                var r = Math.round(188 + (percentual * (83 - 188)));
                var g = Math.round(244 + (percentual * (144 - 244)));
                var b = Math.round(212 + (percentual * (145 - 212)));
                
                // Texto escuro para contrastar bem com os blocos intermediários que são claros
                var textoCor = '#2c3e50'; 
                
                // Se o tom calculado ficar muito escuro nas etapas finais, muda o texto para branco automaticamente
                if (percentual > 0.7) {
                    textoCor = '#ffffff';
                }

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

    }, 200); // Aumentado para 200ms para garantir a leitura de NRs longas
});


/* ==========================================================================
   CIRCUITO DO TEMPO DELOREAN - INJEÇÃO DINÂMICA (nr.wiki.br)
   ========================================================================== */
$(document).ready(function() {
    var inputDock = $('#delorean-input-dock');
    var buttonDock = $('#delorean-button-dock');

    // Se os containers existirem na página, materializa os elementos visuais
    if (inputDock.length && buttonDock.length) {
        var minDate = inputDock.data('min');
        var maxDate = inputDock.data('max');
        var normaNum = inputDock.data('norma');

        // Constrói o HTML puro direto no navegador (fibra óptica)
        inputDock.html('<input type="text" id="delorean-target-input" class="led-input-field" placeholder="DD/MM/AAAA" maxlength="10" data-min="' + minDate + '" data-max="' + maxDate + '" data-norma="' + normaNum + '">');
        buttonDock.html('<button id="delorean-activation-lever" class="delorean-lever-btn">ATIVAR CIRCUITO DO TEMPO</button>');
    }

    // Máscara automática DD/MM/AAAA para digitação limpa no input injetado
    $(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;
    });

    // Disparo da Alavanca do Tempo (Botão de Ativação)
    $(document).on('click', '#delorean-activation-lever', function() {
        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');

        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 = mw.util.getUrl('Estudo_Transversal', { normaq: norma, date: dataFinalUrl });
    });
});

/* ==========================================================================
   CARREGADOR DE CONTEÚDO HISTÓRICO - VERSÃO TIMEOUT (nr.wiki.br)
   ========================================================================== */
// Usamos o gancho nativo do MediaWiki para garantir que a API e os utilitários existam
mw.loader.using(['mediawiki.util', 'mediawiki.api']).then(function() {
    $(document).ready(function() {
        var rootContainer = $('#estudo-transversal-root');
        
        if (rootContainer.length) {
            // Função auxiliar para capturar parâmetros da URL
            var getUrlParameter = function(sParam) {
                var sPageURL = window.location.search.substring(1),
                    sURLVariables = sPageURL.split('&'),
                    sParameterName,
                    i;
                for (i = 0; i < sURLVariables.length; i++) {
                    sParameterName = sURLVariables[i].split('=');
                    if (sParameterName[0] === sParam) {
                        return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);
                    }
                }
                return false;
            };

            var norma = getUrlParameter('normaq') || '1';
            var data = getUrlParameter('date');

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

            // Monta a chamada exata da predefinição datada
            var wikitextToRender = '{{ExibirPaginaNormaDatada|norma=' + norma + '|data=' + data + '}}';

            // Dispara via API nativa do MediaWiki (Garante compatibilidade total)
            new mw.Api().post({
                action: 'parse',
                text: wikitextToRender,
                contentmodel: 'wikitext',
                format: 'json',
                disablelimitreport: true
            }).done(function(data) {
                if (data && data.parse && data.parse.text) {
                    // Substitui a mensagem pelo HTML completo do Cargo!
                    rootContainer.html(data.parse.text['*']);
                } else {
                    rootContainer.html('<div style="text-align:center; padding:30px; color:red;">❌ Falha ao processar os registros históricos no banco de dados Cargo.</div>');
                }
            }).fail(function() {
                rootContainer.html('<div style="text-align:center; padding:30px; color:red;">❌ Erro crítico de conexão com os circuitos do tempo da Wiki.</div>');
            });
        }
    });
});