Mudanças entre as edições de "Widget:VisnoTeste"

De Wiki Gla
Ir para navegação Ir para pesquisar
Linha 1: Linha 1:
<!DOCTYPE html>
<div class="carousel-container">
<html lang="pt-BR">
    <div class="carousel-track">
<head>
        <div class="carousel-slide global-event-widget">
  <meta charset="UTF-8">
            <a id="global-event-link" style="display: block;" href="https://wiki.gla.com.br/index.php/Eventos_Globais" target="_blank">
  <title>Mapa Interativo com Caveiras</title>
              <img class="global-event-image" src="/images/0/0a/Anyevent.png" alt="Global Event">
  <style>
            </a>
     body {
            <div id="global-event-timer"></div>
      margin: 0;
        </div>
      background: #0d0d0d;
        <div class="carousel-slide worldboss-widget">
      display: flex;
            <a id="worldboss-link" style="display: block;" href="#" target="_blank">
      justify-content: center;
              <img class="worldboss-imagen" src="/images/9/93/Anywb_event.png">
      align-items: center;
            </a>
      height: 100vh;
            <div id="worldboss-timer"></div>
      font-family: sans-serif;
        </div>
        <div class="carousel-slide rankedd-widget">
            <a id="ranked-link" style="display: block;" href="https://wiki.gla.com.br/index.php/PVP" target="_blank">
              <img class="rankedd-image" src="/images/b/b0/Ranked_semranked_event.png" alt="Ranked Event">
            </a>
            <div id="rankedd-timer"></div>
        </div>
    </div>
</div>
<div class="carousel-controls-images">
    <i class="fa-solid fa-star carousel-thumb active" data-index="0" title="Evento Global"></i>
    <i class="fa-solid fa-skull carousel-thumb" data-index="1" title="World Boss"></i>
    <i class="fa-solid fa-shield-halved carousel-thumb" data-index="2" title="Ranked"></i>
</div>
 
 
<script>
     (function loadFontAwesome() {
        if (!document.querySelector('link[href*="font-awesome"]')) {
            const faLink = document.createElement('link');
            faLink.rel = 'stylesheet';
            faLink.href = 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css';
            document.head.appendChild(faLink);
        }
    })();
 
    const track = document.querySelector('.carousel-track');
    const thumbs = document.querySelectorAll('.carousel-thumb');
 
    let currentSlide = 0;
    let totalSlides = thumbs.length - 1;
    let intervalId;
 
    function goToSlide(index) {
        currentSlide = (index + totalSlides + 1) % (totalSlides + 1);
        track.style.transform = `translateX(-${currentSlide * 100}%)`;
        thumbs.forEach(thumb => thumb.classList.remove('active'));
        thumbs[currentSlide].classList.add('active');
     }
     }


     .map-container {
     function resetInterval() {
      position: relative;
        clearInterval(intervalId);
      width: 811px;
        intervalId = setInterval(() => goToSlide(currentSlide + 1), 12000);
      height: 554px;
      background: url('sabaodyMap.png') no-repeat center center;
      background-size: cover;
     }
     }


     .skull-icon {
     thumbs.forEach(thumb => {
      position: absolute;
        thumb.addEventListener('click', () => {
      width: 24px;
            const idx = parseInt(thumb.getAttribute('data-index'));
      height: 24px;
            goToSlide(idx);
      cursor: pointer;
            resetInterval();
      transition: transform 0.2s, filter 0.2s;
        });
    }
    });
 
    resetInterval();
    (function () {
        let globalEventsTimer, globalEventsImage, worldBossTimer, worldBossImage, rankedTimer, rankedImage;
        let globalEventsInterval, worldBossInterval, rankedInterval, globalEventsInfo = {};
       
        const bossLinks = {
        "Aokiji_wb_event.png": "https://wiki.gla.com.br/index.php/Aokiji_(World_Boss)",
        "Shai_hulud_wb_event.png": "https://wiki.gla.com.br/index.php/Shai-Hulud",
        "Plesiosaur_wb_event.png": "https://wiki.gla.com.br/index.php/Plesiosaur",
        "Mihawk_wb_event.png": "https://wiki.gla.com.br/index.php/Mihawk_(World_Boss)",
        "Bananawani_wb_event.png": "https://wiki.gla.com.br/index.php/Bananawani",
        "Byakko_wb_event.png": "https://wiki.gla.com.br/index.php/Byakko",
        "Hiking_bear_wb_event.png": "https://wiki.gla.com.br/index.php/Hiking_Bear"
        };
 
        function bossLink(img, image){
        const imgSrc = img || image;
        const fileName = imgSrc.split('/').pop();
        const link = bossLinks[fileName] || 'https://wiki.gla.com.br/index.php/World_Boss';
        document.getElementById('worldboss-link').setAttribute('href', link);
        }
 
        // Função para cargar os eventos a partir do JSON
        async function cargarEventos() {
            try {
                const response = await fetch('https://wiki.gla.com.br/index.php?title=Globalevents.json&action=raw');
                const data = await response.json();
                globalEventsInfo = data;
                setGlobalEvent();
 
            } catch (error) {
                console.error('Error al cargar los eventos:', error);
                alert('No se pudieron cargar los eventos. Por favor, inténtalo más tarde.');
            }
        }
 
        const rankedEvents = {
            0: [ // domingo
                { hour: 15, image: "/images/7/7e/Ranked_duo_2v2_event.png", label: "Ranked Duo 2v2" },
                { hour: 16, image: "/images/b/b1/Ranked_solo_2v2_event.png", label: "Ranked Solo 2v2" },
                { hour: 17, image: "/images/e/ed/Ranked_1v1_event.png", label: "Ranked 1v1" },
            ],
            2: [ // terça
                { hour: 20, image: "/images/7/7e/Ranked_duo_2v2_event.png", label: "Ranked Duo 2v2" },
                { hour: 21, image: "/images/b/b1/Ranked_solo_2v2_event.png", label: "Ranked Solo 2v2" },
                { hour: 22, image: "/images/e/ed/Ranked_1v1_event.png", label: "Ranked 1v1" },
            ],
            4: [ // quinta
                { hour: 20, image: "/images/7/7e/Ranked_duo_2v2_event.png", label: "Ranked Duo 2v2" },
                { hour: 21, image: "/images/b/b1/Ranked_solo_2v2_event.png", label: "Ranked Solo 2v2" },
                { hour: 22, image: "/images/e/ed/Ranked_1v1_event.png", label: "Ranked 1v1" },
            ],
            6: [ // sabado
                { hour: 15, image: "/images/7/7e/Ranked_duo_2v2_event.png", label: "Ranked Duo 2v2" },
                { hour: 16, image: "/images/b/b1/Ranked_solo_2v2_event.png", label: "Ranked Solo 2v2" },
                { hour: 17, image: "/images/e/ed/Ranked_1v1_event.png", label: "Ranked 1v1" },
            ]
        };
 
 
        const alternatedEvents = [
            {
                name: 'Marineford',
                image: '/images/e/e6/Marineford_event.png'
            },
            {
                name: 'World Boss',
                image: '/images/9/93/Anywb_event.png'
            }
 
        ];
 
        function getWeekNumber(date) {
            const start = new Date(date.getFullYear(), 0, 1);
            const diff = (date - start + ((start.getTimezoneOffset() - date.getTimezoneOffset()) * 60000));
            const oneWeek = 604800000; // ms week
            return Math.floor(diff / oneWeek);
        }
 
        function createBrazilDateFromYMD(year, month, day, hour, minute, second = 0) {
            return new Date(
                year, month - 1, day,
                hour, minute, second
            );
        }
 
        async function obtenerImagenWorldBoss(modo = 'actual') {
            try {
                const response = await fetch('https://wiki.gla.com.br/index.php?title=Wbevents.json&action=raw');
                const data = await response.json();
                const events = data.world_boss_events;
 
                const now = getBrazilTime();
                const currentTime = now.getTime();
 
                const sortedDates = Object.keys(events).sort(); // Asegura orden
 
                for (const fechaStr of sortedDates) {
                    const [year, month, day] = fechaStr.split('-').map(Number);
                    const inicio = createBrazilDateFromYMD(year, month, day, 11, 0);
                    const fin = createBrazilDateFromYMD(year, month, day + 1, 9, 0);
 
                    if (modo === 'actual' && currentTime >= inicio.getTime() && currentTime < fin.getTime()) {
                        return events[fechaStr];
                    }
 
                    if (modo === 'proximo' && currentTime < inicio.getTime()) {
                        return events[fechaStr];
                    }
                }
 
                return null;
            } catch (error) {
                console.error('Error al obtener imagen del World Boss:', error);
                return null;
            }
        }
 
        function pad(value) {
            return value < 10 ? '0' + value : value;
        }
 
        function getBrazilTime() {
            const formatter = new Intl.DateTimeFormat('en-US', {
                timeZone: 'America/Sao_Paulo',
                hour12: false,
                year: 'numeric',
                month: '2-digit',
                day: '2-digit',
                hour: '2-digit',
                minute: '2-digit',
                second: '2-digit'
            });
 
            const parts = formatter.formatToParts(new Date());
            const values = Object.fromEntries(parts.map(({ type, value }) => [type, value]));
 
            return new Date(
                parseInt(values.year),
                parseInt(values.month) - 1,
                parseInt(values.day),
                parseInt(values.hour),
                parseInt(values.minute),
                parseInt(values.second)
            );
        }
 
        function createBrazilDate(hour, minute, second = 0) {
            const today = getBrazilTime();
            return new Date(
                today.getFullYear(), today.getMonth(),
                today.getDate(), hour,
                minute, second
            );
        }
 
        function ajustarHoraBrasilALocal(dateBrasil) {
            const offsetUsuarioMin = dateBrasil.getTimezoneOffset();
            const offsetBrasilMin = 180;
 
            const diferenciaMin = offsetUsuarioMin - offsetBrasilMin;
 
            return new Date(dateBrasil.getTime() - diferenciaMin * 60 * 1000);
        }
 
        function startGlobalEventCountdown(eventStartTime, eventEndTime) {
            if (globalEventsInterval) clearInterval(globalEventsInterval);
 
            globalEventsInterval = setInterval(() => {
                const now = getBrazilTime().getTime();
 
                if (now < eventStartTime) {
                    // Ainda não começou, mostrar contagem regressiva
                    const timeToStart = Math.floor((eventStartTime - now) / 1000);
                    const minutes = Math.floor(timeToStart / 60);
                    const seconds = timeToStart % 60;
                    globalEventsTimer.innerHTML = pad(minutes) + ":" + pad(seconds);
                } else if (now >= eventStartTime && now < eventEndTime) {
                    // Já começou, mostrar "Iniciando: mm:ss"
                    const timeRemaining = Math.ceil((eventEndTime - now) / 1000);
                    const minutes = Math.floor(timeRemaining / 60);
                    const seconds = timeRemaining % 60;
                    globalEventsTimer.innerHTML = 'Iniciando: ' + pad(minutes) + ":" + pad(seconds);
                } else {
                    // Terminou
                    clearInterval(globalEventsInterval);
                    setGlobalEvent();
                }
            }, 1000);
        }
 
        function rankedCountdown(eventStart, eventEnd) {
            if (rankedInterval) clearInterval(rankedInterval);
 
            rankedInterval = setInterval(() => {
                const now = getBrazilTime().getTime();
 
                if (now < eventStart) {
                    const timeLeft = Math.floor((eventStart - now) / 1000);
                    const min = Math.floor(timeLeft / 60);
                    const sec = timeLeft % 60;
                    rankedTimer.innerHTML = 'Começa em: ' + pad(min) + ':' + pad(sec);
                } else if (now >= eventStart && now < eventEnd) {
                    const timeLeft = Math.floor((eventEnd - now) / 1000);
                    const min = Math.floor(timeLeft / 60);
                    const sec = timeLeft % 60;
                    rankedTimer.innerHTML = 'Em andamento: ' + pad(min) + ':' + pad(sec);
                } else {
                    clearInterval(rankedInterval);
                    rankedTimer.innerHTML = 'Evento finalizado';
                }
            }, 1000);
        }
 
        function worldBossCountdown(eventStartTime, eventEndTime) {
            if (worldBossInterval) clearInterval(worldBossInterval);
 
            worldBossInterval = setInterval(() => {
                const now = getBrazilTime().getTime();
 
                if (now < eventStartTime) {
                    const diff = eventStartTime - now;
                    const totalSeconds = Math.floor(diff / 1000);
                    const hours = Math.floor(totalSeconds / 3600);
                    const minutes = Math.floor((totalSeconds % 3600) / 60);
                    const seconds = totalSeconds % 60;
 
                    worldBossTimer.innerHTML =
                        'Começa em: ' +
                        pad(hours) + ':' +
                        pad(minutes) + ':' +
                        pad(seconds);
                } else if (now >= eventStartTime && now < eventEndTime) {
                    const diff = eventEndTime - now;
                    const totalSeconds = Math.floor(diff / 1000);
                    const hours = Math.floor(totalSeconds / 3600);
                    const minutes = Math.floor((totalSeconds % 3600) / 60);
                    const seconds = totalSeconds % 60;
 
                    worldBossTimer.innerHTML =
                        'Em andamento: ' +
                        pad(hours) + ':' +
                        pad(minutes) + ':' +
                        pad(seconds);
                } else {
                    clearInterval(worldBossInterval);
                    worldBossTimer.innerHTML = 'Evento finalizado';
                }
            }, 1000);
        }
 
        function setGlobalEvent() {
            const userNow = new Date();
            const now = getBrazilTime();
            const dayEvents = globalEventsInfo[now.getDay()] || [];
 
            if (dayEvents.length === 0 && userNow.getDate() == now.getDate()) {
                globalEventsImage.setAttribute('src', '/images/0/0a/Anyevent.png');
                globalEventsTimer.innerHTML = 'Acabaram os eventos por hoje';
                return;
            }
 
            for (let event of dayEvents) {
                const [h, m, s] = event.time.split(':').map(Number);
                const eventStartTime = createBrazilDate(h, m, s);
                const eventEndTime = new Date(eventStartTime.getTime() + 5 * 60 * 1000);
                const eventStartMs = eventStartTime.getTime();
                const eventEndMs = eventEndTime.getTime();
                const nowMs = now.getTime();
 
                const horaLocal = ajustarHoraBrasilALocal(eventStartTime);
 
                const localTime = horaLocal.toLocaleTimeString(undefined, {
                    hour: '2-digit',
                    minute: '2-digit',
                    hour12: false
                });
                //Converte a hora dependendo do fuso horário do usuário
 
 
 
                if (nowMs >= eventStartMs && nowMs < eventEndMs) {
                    // Evento em andamento
                    globalEventsImage.setAttribute('src', event.src);
                    startGlobalEventCountdown(eventStartMs, eventEndMs);
                    return;
                }


    .heart-icon {
                if (nowMs < eventStartMs) {
      position: absolute;
                    // Evento ainda não começou
      width: 26px;
                    globalEventsImage.setAttribute('src', event.src);
      height: 26px;
      padding: 1px;
      cursor: pointer;
      transition: transform 0.2s, filter 0.2s;
    }


    .skull-icon:hover,
                    if (eventStartMs - nowMs <= 60 * 60 * 1000) {
    .heart-icon:hover,
                        // Falta menos de 1 hora => mostrar contador
    .puzzle-button:hover {
                        startGlobalEventCountdown(eventStartMs, eventEndMs);
      transform: scale(1.3);
                    } else {
      filter: brightness(1.5);
                        // Falta mais de 1 hora => apenas mostrar o horário
    }
                        globalEventsTimer.innerHTML = localTime;
                    }


    .popup {
                    return;
      position: absolute;
                }
      background: #1e1e1e;
            }
      color: #fff;
      padding: 10px 14px;
      border-radius: 8px;
      border: 1px solid #444;
      box-shadow: 0 0 10px rgba(255, 255, 255, 0.1);
      display: none;
      z-index: 10;
      max-width: 500px;
      font-size: 14px;
      animation: fadeIn 0.3s ease-out;
    }


    .popup iframe {
            globalEventsImage.setAttribute('src', '/images/0/0a/Anyevent.png');
      border-radius: 6px;
            globalEventsTimer.innerHTML = 'Acabaram os eventos por hoje';
      margin-top: 6px;
        }
      max-width: 100%;
    }


    .puzzle-button {
      position: absolute;
      cursor: pointer;
      z-index: 999;
      width: 28px;
      height: 28px;
      transition: transform 0.2s, filter 0.2s;
    }


    @keyframes fadeIn {
        function setWorldBossEvent() {
      from { opacity: 0; transform: translateY(-5px); }
            const now = getBrazilTime();
      to { opacity: 1; transform: translateY(0); }
            const [h, m, s] = [11, 00, 0];
    }
  </style>
</head>
<body>
  <div class="map-container" id="map">
    <!-- Caveiras e elementos serão inseridos via JS -->
  </div>


  <script>
            const currentWeekday = now.getDay();
    const skulls = [
      {
        x: 410, y: 220,
        title: "White Skull",
        desc: "Boss: White Skull<br>Área sombria, cuidado com os ataques surpresa!"
      },
      {
        x: 650, y: 125,
        title: "Red Fang",
        desc: "Boss: Red Fang<br>Possui resistência a fogo. Traga ataques de gelo!"
      },
      {
        x: 250, y: 410,
        title: "Void Wraith",
        desc: "Boss: Void Wraith<br>Evite ataques diretos. Usa magia de sombras."
      },
      {
        x: 248, y: 320,
        title: "Night Howler",
        desc: "Boss: Night Howler<br>Ataca com velocidade e confusão. Use proteção contra atordoamento!"
      }
    ];


    const hearts = [
            const lastFriday = new Date(createBrazilDate(h, m, s));
      { x: 280, y: 210, desc: "Cura escondida: Quebre a caixa para obter uma cura." },
            const daysSinceFriday = (currentWeekday >= 5) ? currentWeekday - 5 : currentWeekday + 2;
      { x: 312, y: 196 },
            lastFriday.setDate(now.getDate() - daysSinceFriday);
      { x: 245, y: 358, desc: "Após o chefe, o jogador com menos vida receberá uma cura automática." }
            lastFriday.setHours(h, m, s, 0);
    ];


    const puzzleButton = {
            const eventStartTime = lastFriday.getTime();
      x: 225,
            const eventEndTime = eventStartTime + 22 * 60 * 60 * 1000;
      y: 210,
      videoUrl: "https://www.youtube.com/embed/10rhyP32vdw"
    };


    const map = document.getElementById("map");
            const weekNumber = getWeekNumber(lastFriday);
            const eventIndex = weekNumber % 2;
            const nextEventIndex = (eventIndex + 1) % 2;


    // Adiciona as caveiras
            const currentEvent = alternatedEvents[eventIndex];
    skulls.forEach((skull, index) => {
            const nextEvent = alternatedEvents[nextEventIndex];
      const icon = document.createElement("img");
      icon.src = "Whiteskull.png";
      icon.className = "skull-icon";
      icon.style.left = skull.x + "px";
      icon.style.top = skull.y + "px";
      icon.dataset.index = index;


      const popup = document.createElement("div");
            const nowTime = now.getTime();
      popup.className = "popup";
            const nowDateOnly = new Date(now);
      popup.innerHTML = `<strong>${skull.title}</strong><br>${skull.desc}`;
            nowDateOnly.setHours(0, 0, 0, 0);
      popup.style.left = (skull.x + 30) + "px";
      popup.style.top = (skull.y - 10) + "px";


      icon.addEventListener("click", () => {
            if (nowTime >= eventStartTime && nowTime < eventEndTime) {
        popup.style.display = popup.style.display === "block" ? "none" : "block";
                // Evento em andamento
      });
                if (currentEvent.name === 'World Boss') {
                    obtenerImagenWorldBoss('actual').then(img => {
                        worldBossImage.setAttribute('src', img || currentEvent.image);
                        bossLink(img, currentEvent.image);
                    });
                } else {
                    worldBossImage.setAttribute('src', currentEvent.image);
                }
                worldBossCountdown(eventStartTime, eventEndTime);
            } else if (nowTime < eventStartTime) {
                // Evento ainda não começou
                if (currentEvent.name === 'World Boss') {
                    obtenerImagenWorldBoss('proximo').then(img => {
                        worldBossImage.setAttribute('src', img || currentEvent.image);
                        bossLink(img, currentEvent.image);
                    });
                } else {
                    worldBossImage.setAttribute('src', currentEvent.image);
                }
                worldBossCountdown(eventStartTime, eventEndTime);
            } else {
                // Evento já terminou, mostrar o próximo
                const nextFriday = new Date(lastFriday);
                nextFriday.setDate(lastFriday.getDate() + 7);
                nextFriday.setHours(0, 0, 0, 0);


      document.addEventListener("click", (e) => {
                const daysLeft = Math.round((nextFriday - nowDateOnly) / (24 * 60 * 60 * 1000));
        if (!icon.contains(e.target) && !popup.contains(e.target)) {
                if (nextEvent.name === 'World Boss') {
          popup.style.display = "none";
                    obtenerImagenWorldBoss('proximo').then(img => {
                        worldBossImage.setAttribute('src', img || nextEvent.image);
                        bossLink(img, nextEvent.image);
                    });
                } else {
                    worldBossImage.setAttribute('src', nextEvent.image);
                }
                worldBossTimer.innerHTML = `Em ${daysLeft} dia${daysLeft > 1 ? 's' : ''}`;
            }
         }
         }
      });


      map.appendChild(icon);
        function setRankedEvent() {
      map.appendChild(popup);
            const now = getBrazilTime();
    });
            const day = now.getDay();
            const todayEvents = rankedEvents[day];
 
            if (!todayEvents || todayEvents.length === 0) {
                rankedImage.setAttribute('src', '/images/b/b0/Ranked_semranked_event.png');
                rankedTimer.innerHTML = 'Sem eventos hoje';
                return;
            }


    // Adiciona os corações
            let found = false;
    hearts.forEach((heart, index) => {
      const icon = document.createElement("img");
      const desc = heart.desc || "Pegue o coração para se curar";
      icon.src = "heart.png";
      icon.className = "heart-icon";
      icon.style.left = heart.x + "px";
      icon.style.top = heart.y + "px";
      icon.dataset.index = index;


      const popup = document.createElement("div");
            for (let event of todayEvents) {
      popup.className = "popup";
                const start = createBrazilDate(event.hour, 0, 0);
      popup.innerHTML = `<strong>Cura</strong><br>${desc}`;
                const end = new Date(start.getTime() + 60 * 60 * 1000);
      popup.style.left = (heart.x + 30) + "px";
                const nowMs = now.getTime();
      popup.style.top = (heart.y - 10) + "px";


      icon.addEventListener("click", () => {
                if (nowMs < start.getTime()) {
        popup.style.display = popup.style.display === "block" ? "none" : "block";
                    rankedImage.setAttribute('src', event.image);
      });
                    if (start.getTime() - nowMs <= 60 * 60 * 1000) {
                        rankedCountdown(start.getTime(), end.getTime());
                    } else {
                        const local = ajustarHoraBrasilALocal(start).toLocaleTimeString(undefined, {
                            hour: '2-digit',
                            minute: '2-digit',
                            hour12: false
                        });
                        rankedTimer.innerHTML = local;
                    }
                    found = true;
                    break;
                } else if (nowMs >= start.getTime() && nowMs < end.getTime()) {
                    rankedImage.setAttribute('src', event.image);
                    rankedCountdown(start.getTime(), end.getTime());
                    found = true;
                    break;
                }
            }


      document.addEventListener("click", (e) => {
            if (!found) {
        if (!icon.contains(e.target) && !popup.contains(e.target)) {
                // Mostrar próximo dia com eventos
          popup.style.display = "none";
                let daysToNext = 1;
                while (daysToNext < 7) {
                    const nextDay = (day + daysToNext) % 7;
                    if (rankedEvents[nextDay]) break;
                    daysToNext++;
                }
                rankedImage.setAttribute('src', '/images/b/b0/Ranked_semranked_event.png');
                rankedTimer.innerHTML = `Em ${daysToNext} dia${daysToNext > 1 ? 's' : ''}`;
            }
         }
         }
      });


      map.appendChild(icon);
      map.appendChild(popup);
    });


     // Ícone do Puzzle
        document.addEventListener('DOMContentLoaded', function () {
     const button = document.createElement("img");
            globalEventsTimer = document.getElementById('global-event-timer');
     button.className = "puzzle-button";
            globalEventsImage = document.querySelector('.global-event-image');
     button.src = "puzzle.png";
            worldBossTimer = document.getElementById('worldboss-timer');
    button.alt = "Puzzle";
            worldBossImage = document.querySelector('.worldboss-imagen');
     button.style.left = puzzleButton.x + "px";
            rankedTimer = document.getElementById('rankedd-timer');
     button.style.top = puzzleButton.y + "px";
            rankedImage = document.querySelector('.rankedd-image');
            setWorldBossEvent();
            setRankedEvent();
            cargarEventos();
        });
    })();
 
 
     // CSS
     document.head.insertAdjacentHTML('beforeend', `
  <style>
 
    .carousel-controls-images {
        display: flex;
        justify-content: center;
        gap: 16px;
        margin-top: 8px;
     }
 
    .carousel-thumb {
        font-size: 22px;
        color: #999;
        cursor: pointer;
        transition: color 0.3s, transform 0.3s;
        will-change: transform;
     }
 
    .carousel-thumb.active {
        color: #459cca;
        transform: scale(1.2);
     }
 
    .carousel-thumb.hidden {
        display: none;
    }
 
 
    .carousel-container {
        width: 320px;
        height: 90px;
        overflow: hidden;
        margin: 0 auto;
        position: relative;
     }
 
    .carousel-track {
        display: flex;
        width: 100%;
        transition: transform 0.5s ease-in-out;
    }
 
    .carousel-slide {
        width: 100%;
        flex: 0 0 100%;
        height: 90px;
        position: relative;
    }


     const popup = document.createElement("div");
     .global-event-image,
     popup.className = "popup";
     .worldboss-imagen,
     popup.style.left = (puzzleButton.x + 60) + "px";
     .rankedd-image {
    popup.style.top = (puzzleButton.y - 10) + "px";
        width: 100%;
    popup.innerHTML = `
         height: 100%;
      <strong>Desafio Puzzle</strong><br>
         object-fit: cover;
      <iframe width="400" height="260"
     }
         src="${puzzleButton.videoUrl}"
         frameborder="0"
        allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
        allowfullscreen>
      </iframe>
     `;


     button.addEventListener("click", () => {
     #global-event-timer,
      popup.style.display = popup.style.display === "block" ? "none" : "block";
    #worldboss-timer,
     });
    #rankedd-timer {
        user-select: none;
        pointer-events: none;
        position: absolute;
        bottom: 3%;
        left: 3px;
        padding: 2px 5px;
        font-size: 1.2em;
        font-weight: bold;
        color: #fff;
        text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
        background: linear-gradient(to right, rgba(25, 25, 25, 0.85), rgba(0, 0, 0, 0));
        border-top-right-radius: 4px;
        border-bottom-right-radius: 4px;
        max-width: fit-content;
     }


     document.addEventListener("click", (e) => {
     .rankedd-image {
      if (!button.contains(e.target) && !popup.contains(e.target)) {
        object-fit: fill !important;
        popup.style.display = "none";
     }
      }
     });


     map.appendChild(button);
     .worldboss-imagen{
    map.appendChild(popup);
        user-select: unset;
   </script>
        cursor: pointer;
</body>
    }
</html>
   </style>
  `);
</script>

Edição das 16h37min de 13 de junho de 2025


<script>

   (function loadFontAwesome() {
       if (!document.querySelector('link[href*="font-awesome"]')) {
           const faLink = document.createElement('link');
           faLink.rel = 'stylesheet';
           faLink.href = 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css';
           document.head.appendChild(faLink);
       }
   })();
   const track = document.querySelector('.carousel-track');
   const thumbs = document.querySelectorAll('.carousel-thumb');
   let currentSlide = 0;
   let totalSlides = thumbs.length - 1;
   let intervalId;
   function goToSlide(index) {
       currentSlide = (index + totalSlides + 1) % (totalSlides + 1);
       track.style.transform = `translateX(-${currentSlide * 100}%)`;
       thumbs.forEach(thumb => thumb.classList.remove('active'));
       thumbs[currentSlide].classList.add('active');
   }
   function resetInterval() {
       clearInterval(intervalId);
       intervalId = setInterval(() => goToSlide(currentSlide + 1), 12000);
   }
   thumbs.forEach(thumb => {
       thumb.addEventListener('click', () => {
           const idx = parseInt(thumb.getAttribute('data-index'));
           goToSlide(idx);
           resetInterval();
       });
   });
   resetInterval();
   (function () {
       let globalEventsTimer, globalEventsImage, worldBossTimer, worldBossImage, rankedTimer, rankedImage;
       let globalEventsInterval, worldBossInterval, rankedInterval, globalEventsInfo = {};
       
       const bossLinks = {
       "Aokiji_wb_event.png": "https://wiki.gla.com.br/index.php/Aokiji_(World_Boss)",
       "Shai_hulud_wb_event.png": "https://wiki.gla.com.br/index.php/Shai-Hulud",
       "Plesiosaur_wb_event.png": "https://wiki.gla.com.br/index.php/Plesiosaur",
       "Mihawk_wb_event.png": "https://wiki.gla.com.br/index.php/Mihawk_(World_Boss)",
       "Bananawani_wb_event.png": "https://wiki.gla.com.br/index.php/Bananawani",
       "Byakko_wb_event.png": "https://wiki.gla.com.br/index.php/Byakko",
       "Hiking_bear_wb_event.png": "https://wiki.gla.com.br/index.php/Hiking_Bear"
       };
       function bossLink(img, image){
       const imgSrc = img || image;
       const fileName = imgSrc.split('/').pop();
       const link = bossLinks[fileName] || 'https://wiki.gla.com.br/index.php/World_Boss';
       document.getElementById('worldboss-link').setAttribute('href', link);
       }
       // Função para cargar os eventos a partir do JSON
       async function cargarEventos() {
           try {
               const response = await fetch('https://wiki.gla.com.br/index.php?title=Globalevents.json&action=raw');
               const data = await response.json();
               globalEventsInfo = data;
               setGlobalEvent();
           } catch (error) {
               console.error('Error al cargar los eventos:', error);
               alert('No se pudieron cargar los eventos. Por favor, inténtalo más tarde.');
           }
       }
       const rankedEvents = {
           0: [ // domingo
               { hour: 15, image: "/images/7/7e/Ranked_duo_2v2_event.png", label: "Ranked Duo 2v2" },
               { hour: 16, image: "/images/b/b1/Ranked_solo_2v2_event.png", label: "Ranked Solo 2v2" },
               { hour: 17, image: "/images/e/ed/Ranked_1v1_event.png", label: "Ranked 1v1" },
           ],
           2: [ // terça
               { hour: 20, image: "/images/7/7e/Ranked_duo_2v2_event.png", label: "Ranked Duo 2v2" },
               { hour: 21, image: "/images/b/b1/Ranked_solo_2v2_event.png", label: "Ranked Solo 2v2" },
               { hour: 22, image: "/images/e/ed/Ranked_1v1_event.png", label: "Ranked 1v1" },
           ],
           4: [ // quinta
               { hour: 20, image: "/images/7/7e/Ranked_duo_2v2_event.png", label: "Ranked Duo 2v2" },
               { hour: 21, image: "/images/b/b1/Ranked_solo_2v2_event.png", label: "Ranked Solo 2v2" },
               { hour: 22, image: "/images/e/ed/Ranked_1v1_event.png", label: "Ranked 1v1" },
           ],
           6: [ // sabado
               { hour: 15, image: "/images/7/7e/Ranked_duo_2v2_event.png", label: "Ranked Duo 2v2" },
               { hour: 16, image: "/images/b/b1/Ranked_solo_2v2_event.png", label: "Ranked Solo 2v2" },
               { hour: 17, image: "/images/e/ed/Ranked_1v1_event.png", label: "Ranked 1v1" },
           ]
       };


       const alternatedEvents = [
           {
               name: 'Marineford',
               image: '/images/e/e6/Marineford_event.png'
           },
           {
               name: 'World Boss',
               image: '/images/9/93/Anywb_event.png'
           }
       ];
       function getWeekNumber(date) {
           const start = new Date(date.getFullYear(), 0, 1);
           const diff = (date - start + ((start.getTimezoneOffset() - date.getTimezoneOffset()) * 60000));
           const oneWeek = 604800000; // ms week
           return Math.floor(diff / oneWeek);
       }
       function createBrazilDateFromYMD(year, month, day, hour, minute, second = 0) {
           return new Date(
               year, month - 1, day,
               hour, minute, second
           );
       }
       async function obtenerImagenWorldBoss(modo = 'actual') {
           try {
               const response = await fetch('https://wiki.gla.com.br/index.php?title=Wbevents.json&action=raw');
               const data = await response.json();
               const events = data.world_boss_events;
               const now = getBrazilTime();
               const currentTime = now.getTime();
               const sortedDates = Object.keys(events).sort(); // Asegura orden
               for (const fechaStr of sortedDates) {
                   const [year, month, day] = fechaStr.split('-').map(Number);
                   const inicio = createBrazilDateFromYMD(year, month, day, 11, 0);
                   const fin = createBrazilDateFromYMD(year, month, day + 1, 9, 0);
                   if (modo === 'actual' && currentTime >= inicio.getTime() && currentTime < fin.getTime()) {
                       return events[fechaStr];
                   }
                   if (modo === 'proximo' && currentTime < inicio.getTime()) {
                       return events[fechaStr];
                   }
               }
               return null;
           } catch (error) {
               console.error('Error al obtener imagen del World Boss:', error);
               return null;
           }
       }
       function pad(value) {
           return value < 10 ? '0' + value : value;
       }
       function getBrazilTime() {
           const formatter = new Intl.DateTimeFormat('en-US', {
               timeZone: 'America/Sao_Paulo',
               hour12: false,
               year: 'numeric',
               month: '2-digit',
               day: '2-digit',
               hour: '2-digit',
               minute: '2-digit',
               second: '2-digit'
           });
           const parts = formatter.formatToParts(new Date());
           const values = Object.fromEntries(parts.map(({ type, value }) => [type, value]));
           return new Date(
               parseInt(values.year),
               parseInt(values.month) - 1,
               parseInt(values.day),
               parseInt(values.hour),
               parseInt(values.minute),
               parseInt(values.second)
           );
       }
       function createBrazilDate(hour, minute, second = 0) {
           const today = getBrazilTime();
           return new Date(
               today.getFullYear(), today.getMonth(),
               today.getDate(), hour,
               minute, second
           );
       }
       function ajustarHoraBrasilALocal(dateBrasil) {
           const offsetUsuarioMin = dateBrasil.getTimezoneOffset();
           const offsetBrasilMin = 180;
           const diferenciaMin = offsetUsuarioMin - offsetBrasilMin;
           return new Date(dateBrasil.getTime() - diferenciaMin * 60 * 1000);
       }
       function startGlobalEventCountdown(eventStartTime, eventEndTime) {
           if (globalEventsInterval) clearInterval(globalEventsInterval);
           globalEventsInterval = setInterval(() => {
               const now = getBrazilTime().getTime();
               if (now < eventStartTime) {
                   // Ainda não começou, mostrar contagem regressiva
                   const timeToStart = Math.floor((eventStartTime - now) / 1000);
                   const minutes = Math.floor(timeToStart / 60);
                   const seconds = timeToStart % 60;
                   globalEventsTimer.innerHTML = pad(minutes) + ":" + pad(seconds);
               } else if (now >= eventStartTime && now < eventEndTime) {
                   // Já começou, mostrar "Iniciando: mm:ss"
                   const timeRemaining = Math.ceil((eventEndTime - now) / 1000);
                   const minutes = Math.floor(timeRemaining / 60);
                   const seconds = timeRemaining % 60;
                   globalEventsTimer.innerHTML = 'Iniciando: ' + pad(minutes) + ":" + pad(seconds);
               } else {
                   // Terminou
                   clearInterval(globalEventsInterval);
                   setGlobalEvent();
               }
           }, 1000);
       }
       function rankedCountdown(eventStart, eventEnd) {
           if (rankedInterval) clearInterval(rankedInterval);
           rankedInterval = setInterval(() => {
               const now = getBrazilTime().getTime();
               if (now < eventStart) {
                   const timeLeft = Math.floor((eventStart - now) / 1000);
                   const min = Math.floor(timeLeft / 60);
                   const sec = timeLeft % 60;
                   rankedTimer.innerHTML = 'Começa em: ' + pad(min) + ':' + pad(sec);
               } else if (now >= eventStart && now < eventEnd) {
                   const timeLeft = Math.floor((eventEnd - now) / 1000);
                   const min = Math.floor(timeLeft / 60);
                   const sec = timeLeft % 60;
                   rankedTimer.innerHTML = 'Em andamento: ' + pad(min) + ':' + pad(sec);
               } else {
                   clearInterval(rankedInterval);
                   rankedTimer.innerHTML = 'Evento finalizado';
               }
           }, 1000);
       }
       function worldBossCountdown(eventStartTime, eventEndTime) {
           if (worldBossInterval) clearInterval(worldBossInterval);
           worldBossInterval = setInterval(() => {
               const now = getBrazilTime().getTime();
               if (now < eventStartTime) {
                   const diff = eventStartTime - now;
                   const totalSeconds = Math.floor(diff / 1000);
                   const hours = Math.floor(totalSeconds / 3600);
                   const minutes = Math.floor((totalSeconds % 3600) / 60);
                   const seconds = totalSeconds % 60;
                   worldBossTimer.innerHTML =
                       'Começa em: ' +
                       pad(hours) + ':' +
                       pad(minutes) + ':' +
                       pad(seconds);
               } else if (now >= eventStartTime && now < eventEndTime) {
                   const diff = eventEndTime - now;
                   const totalSeconds = Math.floor(diff / 1000);
                   const hours = Math.floor(totalSeconds / 3600);
                   const minutes = Math.floor((totalSeconds % 3600) / 60);
                   const seconds = totalSeconds % 60;
                   worldBossTimer.innerHTML =
                       'Em andamento: ' +
                       pad(hours) + ':' +
                       pad(minutes) + ':' +
                       pad(seconds);
               } else {
                   clearInterval(worldBossInterval);
                   worldBossTimer.innerHTML = 'Evento finalizado';
               }
           }, 1000);
       }
       function setGlobalEvent() {
           const userNow = new Date();
           const now = getBrazilTime();
           const dayEvents = globalEventsInfo[now.getDay()] || [];
           if (dayEvents.length === 0 && userNow.getDate() == now.getDate()) {
               globalEventsImage.setAttribute('src', '/images/0/0a/Anyevent.png');
               globalEventsTimer.innerHTML = 'Acabaram os eventos por hoje';
               return;
           }
           for (let event of dayEvents) {
               const [h, m, s] = event.time.split(':').map(Number);
               const eventStartTime = createBrazilDate(h, m, s);
               const eventEndTime = new Date(eventStartTime.getTime() + 5 * 60 * 1000);
               const eventStartMs = eventStartTime.getTime();
               const eventEndMs = eventEndTime.getTime();
               const nowMs = now.getTime();
               const horaLocal = ajustarHoraBrasilALocal(eventStartTime);
               const localTime = horaLocal.toLocaleTimeString(undefined, {
                   hour: '2-digit',
                   minute: '2-digit',
                   hour12: false
               });
               //Converte a hora dependendo do fuso horário do usuário


               if (nowMs >= eventStartMs && nowMs < eventEndMs) {
                   // Evento em andamento
                   globalEventsImage.setAttribute('src', event.src);
                   startGlobalEventCountdown(eventStartMs, eventEndMs);
                   return;
               }
               if (nowMs < eventStartMs) {
                   // Evento ainda não começou
                   globalEventsImage.setAttribute('src', event.src);
                   if (eventStartMs - nowMs <= 60 * 60 * 1000) {
                       // Falta menos de 1 hora => mostrar contador
                       startGlobalEventCountdown(eventStartMs, eventEndMs);
                   } else {
                       // Falta mais de 1 hora => apenas mostrar o horário
                       globalEventsTimer.innerHTML = localTime;
                   }
                   return;
               }
           }
           globalEventsImage.setAttribute('src', '/images/0/0a/Anyevent.png');
           globalEventsTimer.innerHTML = 'Acabaram os eventos por hoje';
       }


       function setWorldBossEvent() {
           const now = getBrazilTime();
           const [h, m, s] = [11, 00, 0];
           const currentWeekday = now.getDay();
           const lastFriday = new Date(createBrazilDate(h, m, s));
           const daysSinceFriday = (currentWeekday >= 5) ? currentWeekday - 5 : currentWeekday + 2;
           lastFriday.setDate(now.getDate() - daysSinceFriday);
           lastFriday.setHours(h, m, s, 0);
           const eventStartTime = lastFriday.getTime();
           const eventEndTime = eventStartTime + 22 * 60 * 60 * 1000;
           const weekNumber = getWeekNumber(lastFriday);
           const eventIndex = weekNumber % 2;
           const nextEventIndex = (eventIndex + 1) % 2;
           const currentEvent = alternatedEvents[eventIndex];
           const nextEvent = alternatedEvents[nextEventIndex];
           const nowTime = now.getTime();
           const nowDateOnly = new Date(now);
           nowDateOnly.setHours(0, 0, 0, 0);
           if (nowTime >= eventStartTime && nowTime < eventEndTime) {
               // Evento em andamento
               if (currentEvent.name === 'World Boss') {
                   obtenerImagenWorldBoss('actual').then(img => {
                       worldBossImage.setAttribute('src', img || currentEvent.image);
                       bossLink(img, currentEvent.image);
                   });
               } else {
                   worldBossImage.setAttribute('src', currentEvent.image);
               }
               worldBossCountdown(eventStartTime, eventEndTime);
           } else if (nowTime < eventStartTime) {
               // Evento ainda não começou
               if (currentEvent.name === 'World Boss') {
                   obtenerImagenWorldBoss('proximo').then(img => {
                       worldBossImage.setAttribute('src', img || currentEvent.image);
                       bossLink(img, currentEvent.image);
                   });
               } else {
                   worldBossImage.setAttribute('src', currentEvent.image);
               }
               worldBossCountdown(eventStartTime, eventEndTime);
           } else {
               // Evento já terminou, mostrar o próximo
               const nextFriday = new Date(lastFriday);
               nextFriday.setDate(lastFriday.getDate() + 7);
               nextFriday.setHours(0, 0, 0, 0);
               const daysLeft = Math.round((nextFriday - nowDateOnly) / (24 * 60 * 60 * 1000));
               if (nextEvent.name === 'World Boss') {
                   obtenerImagenWorldBoss('proximo').then(img => {
                       worldBossImage.setAttribute('src', img || nextEvent.image);
                       bossLink(img, nextEvent.image);
                   });
               } else {
                   worldBossImage.setAttribute('src', nextEvent.image);
               }
               worldBossTimer.innerHTML = `Em ${daysLeft} dia${daysLeft > 1 ? 's' : }`;
           }
       }
       function setRankedEvent() {
           const now = getBrazilTime();
           const day = now.getDay();
           const todayEvents = rankedEvents[day];
           if (!todayEvents || todayEvents.length === 0) {
               rankedImage.setAttribute('src', '/images/b/b0/Ranked_semranked_event.png');
               rankedTimer.innerHTML = 'Sem eventos hoje';
               return;
           }
           let found = false;
           for (let event of todayEvents) {
               const start = createBrazilDate(event.hour, 0, 0);
               const end = new Date(start.getTime() + 60 * 60 * 1000);
               const nowMs = now.getTime();
               if (nowMs < start.getTime()) {
                   rankedImage.setAttribute('src', event.image);
                   if (start.getTime() - nowMs <= 60 * 60 * 1000) {
                       rankedCountdown(start.getTime(), end.getTime());
                   } else {
                       const local = ajustarHoraBrasilALocal(start).toLocaleTimeString(undefined, {
                           hour: '2-digit',
                           minute: '2-digit',
                           hour12: false
                       });
                       rankedTimer.innerHTML = local;
                   }
                   found = true;
                   break;
               } else if (nowMs >= start.getTime() && nowMs < end.getTime()) {
                   rankedImage.setAttribute('src', event.image);
                   rankedCountdown(start.getTime(), end.getTime());
                   found = true;
                   break;
               }
           }
           if (!found) {
               // Mostrar próximo dia com eventos
               let daysToNext = 1;
               while (daysToNext < 7) {
                   const nextDay = (day + daysToNext) % 7;
                   if (rankedEvents[nextDay]) break;
                   daysToNext++;
               }
               rankedImage.setAttribute('src', '/images/b/b0/Ranked_semranked_event.png');
               rankedTimer.innerHTML = `Em ${daysToNext} dia${daysToNext > 1 ? 's' : }`;
           }
       }


       document.addEventListener('DOMContentLoaded', function () {
           globalEventsTimer = document.getElementById('global-event-timer');
           globalEventsImage = document.querySelector('.global-event-image');
           worldBossTimer = document.getElementById('worldboss-timer');
           worldBossImage = document.querySelector('.worldboss-imagen');
           rankedTimer = document.getElementById('rankedd-timer');
           rankedImage = document.querySelector('.rankedd-image');
           setWorldBossEvent();
           setRankedEvent();
           cargarEventos();
       });
   })();


   // CSS
   document.head.insertAdjacentHTML('beforeend', `
 <style>
   .carousel-controls-images {
       display: flex;
       justify-content: center;
       gap: 16px;
       margin-top: 8px;
   }
   .carousel-thumb {
       font-size: 22px;
       color: #999;
       cursor: pointer;
       transition: color 0.3s, transform 0.3s;
       will-change: transform;
   }
   .carousel-thumb.active {
       color: #459cca;
       transform: scale(1.2);
   }
   .carousel-thumb.hidden {
       display: none;
   }


   .carousel-container {
       width: 320px;
       height: 90px;
       overflow: hidden;
       margin: 0 auto;
       position: relative;
   }
   .carousel-track {
       display: flex;
       width: 100%;
       transition: transform 0.5s ease-in-out;
   }
   .carousel-slide {
       width: 100%;
       flex: 0 0 100%;
       height: 90px;
       position: relative;
   }
   .global-event-image,
   .worldboss-imagen,
   .rankedd-image {
       width: 100%;
       height: 100%;
       object-fit: cover;
   }
   #global-event-timer,
   #worldboss-timer,
   #rankedd-timer {
       user-select: none;
       pointer-events: none;
       position: absolute;
       bottom: 3%;
       left: 3px;
       padding: 2px 5px;
       font-size: 1.2em;
       font-weight: bold;
       color: #fff;
       text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
       background: linear-gradient(to right, rgba(25, 25, 25, 0.85), rgba(0, 0, 0, 0));
       border-top-right-radius: 4px;
       border-bottom-right-radius: 4px;
       max-width: fit-content;
   }
   .rankedd-image {
       object-fit: fill !important;
   }
   .worldboss-imagen{
       user-select: unset;
       cursor: pointer;
    }
 </style>
 `);

</script>