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

De Wiki Gla
Ir para navegação Ir para pesquisar
Linha 1: Linha 1:
  <div class="map-container" id="map">
<div class="carousel-container">
     <!-- Caveiras e elementos serão inseridos via JS -->
    <div class="carousel-track">
  </div>
        <div class="carousel-slide global-event-widget">
            <img class="global-event-image" src="/images/0/0a/Anyevent.png" alt="Global Event">
            <div id="global-event-timer"></div>
        </div>
        <div class="carousel-slide worldboss-widget">
            <img class="worldboss-imagen" src="/images/9/93/Anywb_event.png">
            <div id="worldboss-timer"></div>
        </div>
        <div class="carousel-slide rankedd-widget">
            <img class="rankedd-image" src="/images/b/b0/Ranked_semranked_event.png" alt="Ranked Event">
            <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>
    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 = [
<script>
      { x: 280, y: 210, desc: "Cura escondida: Quebre a caixa para obter uma cura." },
    (function loadFontAwesome() {
      { x: 312, y: 196 },
        if (!document.querySelector('link[href*="font-awesome"]')) {
      { x: 245, y: 358, desc: "Após o chefe, o jogador com menos vida receberá uma cura automática." }
            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 = {};
 
        // 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
 


    const puzzleButton = {
      x: 244,
      y: 217,
      videoUrl: "https://www.youtube.com/embed/10rhyP32vdw"
    };


    const map = document.getElementById("map");
                if (nowMs >= eventStartMs && nowMs < eventEndMs) {
                    // Evento em andamento
                    globalEventsImage.setAttribute('src', event.src);
                    startGlobalEventCountdown(eventStartMs, eventEndMs);
                    return;
                }


    // Adiciona as caveiras
                if (nowMs < eventStartMs) {
    skulls.forEach((skull, index) => {
                    // Evento ainda não começou
      const icon = document.createElement("img");
                    globalEventsImage.setAttribute('src', event.src);
      icon.src = "https://i.ibb.co/PGyWF601/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");
                    if (eventStartMs - nowMs <= 60 * 60 * 1000) {
      popup.className = "popup";
                        // Falta menos de 1 hora => mostrar contador
      popup.innerHTML = `<strong>${skull.title}</strong><br>${skull.desc}`;
                        startGlobalEventCountdown(eventStartMs, eventEndMs);
      popup.style.left = (skull.x + 30) + "px";
                    } else {
      popup.style.top = (skull.y - 10) + "px";
                        // Falta mais de 1 hora => apenas mostrar o horário
                        globalEventsTimer.innerHTML = localTime;
                    }


      icon.addEventListener("click", () => {
                    return;
        popup.style.display = popup.style.display === "block" ? "none" : "block";
                }
      });
            }


      document.addEventListener("click", (e) => {
            globalEventsImage.setAttribute('src', '/images/0/0a/Anyevent.png');
        if (!icon.contains(e.target) && !popup.contains(e.target)) {
            globalEventsTimer.innerHTML = 'Acabaram os eventos por hoje';
          popup.style.display = "none";
         }
         }
      });


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


    // Adiciona os corações
        function setWorldBossEvent() {
    hearts.forEach((heart, index) => {
            const now = getBrazilTime();
      const icon = document.createElement("img");
            const [h, m, s] = [11, 00, 0];
      const desc = heart.desc || "Pegue o coração para se curar";
 
      icon.src = "https://i.ibb.co/QFBBbFcp/heart.png";
            const currentWeekday = now.getDay();
      icon.className = "heart-icon";
 
      icon.style.left = heart.x + "px";
            const lastFriday = new Date(createBrazilDate(h, m, s));
      icon.style.top = heart.y + "px";
            const daysSinceFriday = (currentWeekday >= 5) ? currentWeekday - 5 : currentWeekday + 2;
      icon.dataset.index = index;
            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 popup = document.createElement("div");
            const nowTime = now.getTime();
      popup.className = "popup";
            const nowDateOnly = new Date(now);
      popup.innerHTML = `<strong>Cura</strong><br>${desc}`;
            nowDateOnly.setHours(0, 0, 0, 0);
      popup.style.left = (heart.x + 30) + "px";
      popup.style.top = (heart.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);
                    });
                } 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);
                    });
                } 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);
                    });
                } 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;
            }
 
            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;
                }
            }


    // Ícone do Puzzle
            if (!found) {
    const button = document.createElement("img");
                // Mostrar próximo dia com eventos
    button.className = "puzzle-button";
                let daysToNext = 1;
    button.src = "https://i.ibb.co/C3HFyZmR/engrenagem-Png.png";
                while (daysToNext < 7) {
    button.alt = "Puzzle";
                    const nextDay = (day + daysToNext) % 7;
    button.style.left = puzzleButton.x + "px";
                    if (rankedEvents[nextDay]) break;
    button.style.top = puzzleButton.y + "px";
                    daysToNext++;
                }
                rankedImage.setAttribute('src', '/images/b/b0/Ranked_semranked_event.png');
                rankedTimer.innerHTML = `Em ${daysToNext} dia${daysToNext > 1 ? 's' : ''}`;
            }
        }


    const popup = document.createElement("div");
    popup.className = "popup";
    popup.style.left = (puzzleButton.x + 60) + "px";
    popup.style.top = (puzzleButton.y - 10) + "px";
    popup.innerHTML = `
      <strong>Desafio Puzzle</strong><br>
      <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", () => {
        document.addEventListener('DOMContentLoaded', function () {
      popup.style.display = popup.style.display === "block" ? "none" : "block";
            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();
        });
     })();


    document.addEventListener("click", (e) => {
      if (!button.contains(e.target) && !popup.contains(e.target)) {
        popup.style.display = "none";
      }
    });


     map.appendChild(button);
     // CSS
    map.appendChild(popup);
// CSS
     document.head.insertAdjacentHTML('beforeend', `
     document.head.insertAdjacentHTML('beforeend', `
   <style>
   <style>
     .map-container {
 
      position: relative;
     .carousel-controls-images {
      width: 811px;
        display: flex;
      height: 554px;
        justify-content: center;
      background: url('https://i.ibb.co/whW7nrt0/sabaody-Map.png') no-repeat center center;
        gap: 16px;
      background-size: cover;
        margin-top: 8px;
    }
 
    .carousel-thumb {
        font-size: 22px;
        color: #999;
        cursor: pointer;
        transition: color 0.3s, transform 0.3s;
        will-change: transform;
     }
     }


     .skull-icon {
     .carousel-thumb.active {
      position: absolute;
        color: #459cca;
      width: 24px;
        transform: scale(1.2);
      height: 24px;
      cursor: pointer;
      transition: transform 0.2s, filter 0.2s;
     }
     }


     .heart-icon {
     .carousel-thumb.hidden {
      position: absolute;
        display: none;
      width: 26px;
    }
      height: 26px;
 
      padding: 1px;
 
      cursor: pointer;
    .carousel-container {
      transition: transform 0.2s, filter 0.2s;
        width: 320px;
        height: 90px;
        overflow: hidden;
        margin: 0 auto;
        position: relative;
     }
     }


     .skull-icon:hover,
     .carousel-track {
    .heart-icon:hover,
        display: flex;
    .puzzle-button:hover {
        width: 100%;
      transform: scale(1.3);
        transition: transform 0.5s ease-in-out;
      filter: brightness(1.5);
     }
     }


     .popup {
     .carousel-slide {
      position: absolute;
        width: 100%;
      background: #1e1e1e;
        flex: 0 0 100%;
      color: #fff;
        height: 90px;
      padding: 10px 14px;
        position: relative;
      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 {
     .global-event-image,
      border-radius: 6px;
    .worldboss-imagen,
      margin-top: 6px;
    .rankedd-image {
      max-width: 100%;
        width: 100%;
        height: 100%;
        object-fit: cover;
     }
     }


     .puzzle-button {
     #global-event-timer,
      position: absolute;
    #worldboss-timer,
      cursor: pointer;
    #rankedd-timer {
      z-index: 999;
        user-select: none;
      width: 28px;
        pointer-events: none;
      height: 28px;
        position: absolute;
      transition: transform 0.2s, filter 0.2s;
        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;
     }
     }


     @keyframes fadeIn {
     .rankedd-image {
      from { opacity: 0; transform: translateY(-5px); }
        object-fit: fill !important;
      to { opacity: 1; transform: translateY(0); }
     }
     }
   </style>
   </style>
   `);
   `);
</script>
</script>

Edição das 15h25min 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 = {};
       // 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);
                   });
               } 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);
                   });
               } 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);
                   });
               } 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;
   }
 </style>
 `);

</script>