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

De Wiki Gla
Ir para navegação Ir para pesquisar
 
(12 revisões intermediárias por 2 usuários não estão sendo mostradas)
Linha 1: Linha 1:
<div class="carousel-container">
<div class="carousel-container">
<div class="carousel-track">
    <div class="carousel-track">
<div class="carousel-slide global-event-widget">
        <div class="carousel-slide global-event-widget">
<img class="global-event-image" src="/images/0/0a/Anyevent.png" alt="Global Event">
            <a id="global-event-link" style="display: block;" href="https://wiki.gla.com.br/index.php/Eventos_Globais" target="_blank">
<div id="global-event-timer"></div>
              <img class="global-event-image" src="/images/0/0a/Anyevent.png" alt="Global Event">
</div>
            </a>
<div class="carousel-slide worldboss-widget">
            <div id="global-event-timer"></div>
<img class="worldboss-imagen" src="/images/9/93/Anywb_event.png">
        </div>
<div id="worldboss-timer"></div>
        <div class="carousel-slide worldboss-widget">
</div>
            <a id="worldboss-link" style="display: block;" href="#" target="_blank">
</div>
              <img class="worldboss-imagen" src="/images/9/93/Anywb_event.png">
            </a>
            <div id="worldboss-timer"></div>
        </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>
<div class="carousel-controls-images">
<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-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-skull carousel-thumb" data-index="1" title="World Boss"></i>
<!--i class="fa-solid fa-shield-halved carousel-thumb hidden" data-index="2" title="Ranked"></i-->
    <i class="fa-solid fa-shield-halved carousel-thumb" data-index="2" title="Ranked"></i>
</div>
</div>




<script>
<script>
(function loadFontAwesome() {
    (function loadFontAwesome() {
if (!document.querySelector('link[href*="font-awesome"]')) {
        if (!document.querySelector('link[href*="font-awesome"]')) {
const faLink = document.createElement('link');
            const faLink = document.createElement('link');
faLink.rel = 'stylesheet';
            faLink.rel = 'stylesheet';
faLink.href = 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css';
            faLink.href = 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css';
document.head.appendChild(faLink);
            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);
        }


const track = document.querySelector('.carousel-track');
        // Função para cargar os eventos a partir do JSON
const thumbs = document.querySelectorAll('.carousel-thumb');
        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();


let currentSlide = 0;
            } catch (error) {
let totalSlides = thumbs.length - 1;
                console.error('Error al cargar los eventos:', error);
let intervalId;
                alert('No se pudieron cargar los eventos. Por favor, inténtalo más tarde.');
            }
        }


function goToSlide(index) {
        const rankedEvents = {
currentSlide = (index + totalSlides + 1) % (totalSlides + 1);
            0: [ // domingo
track.style.transform = `translateX(-${currentSlide * 100}%)`;
                { hour: 15, image: "/images/7/7e/Ranked_duo_2v2_event.png", label: "Ranked Duo 2v2" },
thumbs.forEach(thumb => thumb.classList.remove('active'));
                { hour: 16, image: "/images/b/b1/Ranked_solo_2v2_event.png", label: "Ranked Solo 2v2" },
thumbs[currentSlide].classList.add('active');
                { 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" },
            ]
        };


function resetInterval() {
clearInterval(intervalId);
intervalId = setInterval(() => goToSlide(currentSlide + 1), 12000);
}


thumbs.forEach(thumb => {
        const alternatedEvents = [
thumb.addEventListener('click', () => {
            {
const idx = parseInt(thumb.getAttribute('data-index'));
                name: 'Marineford',
goToSlide(idx);
                image: '/images/e/e6/Marineford_event.png'
resetInterval();
            },
});
            {
});
                name: 'World Boss',
                image: '/images/9/93/Anywb_event.png'
            }


resetInterval();
        ];
(function () {
let globalEventsTimer, globalEventsImage, worldBossTimer, worldBossImage;
let globalEventsInterval, worldBossInterval, globalEventsInfo = {};


// Função para cargar os eventos a partir do JSON
        function getWeekNumber(date) {
async function cargarEventos() {
            const start = new Date(date.getFullYear(), 0, 1);
try {
            const diff = (date - start + ((start.getTimezoneOffset() - date.getTimezoneOffset()) * 60000));
const response = await fetch('https://wiki.gla.com.br/index.php?title=Globalevents.json&action=raw');
            const oneWeek = 604800000; // ms week
const data = await response.json();
            return Math.floor(diff / oneWeek);
globalEventsInfo = data;
        }
setGlobalEvent();


} catch (error) {
        function createBrazilDateFromYMD(year, month, day, hour, minute, second = 0) {
console.error('Error al cargar los eventos:', error);
            return new Date(
alert('No se pudieron cargar los eventos. Por favor, inténtalo más tarde.');
                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 alternatedEvents = [
                const now = getBrazilTime();
{
                const currentTime = now.getTime();
name: 'Marineford',
image: '/images/e/e6/Marineford_event.png'
},
{
name: 'World Boss',
image: '/images/9/93/Anywb_event.png'
}


];
                const sortedDates = Object.keys(events).sort(); // Asegura orden


function getWeekNumber(date) {
                for (const fechaStr of sortedDates) {
const start = new Date(date.getFullYear(), 0, 1);
                    const [year, month, day] = fechaStr.split('-').map(Number);
const diff = (date - start + ((start.getTimezoneOffset() - date.getTimezoneOffset()) * 60000));
                    const inicio = createBrazilDateFromYMD(year, month, day, 11, 0);
const oneWeek = 604800000; // ms en una semana
                    const fin = createBrazilDateFromYMD(year, month, day + 1, 9, 0);
return Math.floor(diff / oneWeek);
}


function getCurrentEventIndex(now) {
                    if (modo === 'actual' && currentTime >= inicio.getTime() && currentTime < fin.getTime()) {
const current = new Date(now);
                        return events[fechaStr];
const day = current.getDay();
                    }


// Encontrar último sábado a las 10:31
                    if (modo === 'proximo' && currentTime < inicio.getTime()) {
const lastSaturday = new Date(current);
                        return events[fechaStr];
const offset = (day >= 6) ? day - 6 : day + 1; // cuántos días restar para llegar al último sábado
                    }
lastSaturday.setDate(current.getDate() - offset);
                }
lastSaturday.setHours(10, 31, 0, 0); // 10:31 BR


if (current < lastSaturday) {
                return null;
lastSaturday.setDate(lastSaturday.getDate() - 7);
            } catch (error) {
}
                console.error('Error al obtener imagen del World Boss:', error);
                return null;
            }
        }


const weekNumber = getWeekNumber(lastSaturday);
        function pad(value) {
return weekNumber % 2; // par = World Boss, ímpar = Marineford
            return value < 10 ? '0' + value : value;
}
        }


function pad(value) {
        function getBrazilTime() {
return value < 10 ? '0' + value : value;
            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'
            });


function getBrazilTime() {
            const parts = formatter.formatToParts(new Date());
const formatter = new Intl.DateTimeFormat('en-US', {
            const values = Object.fromEntries(parts.map(({ type, value }) => [type, value]));
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());
            return new Date(
const values = Object.fromEntries(parts.map(({ type, value }) => [type, value]));
                parseInt(values.year),
                parseInt(values.month) - 1,
                parseInt(values.day),
                parseInt(values.hour),
                parseInt(values.minute),
                parseInt(values.second)
            );
        }


return new Date(
        function createBrazilDate(hour, minute, second = 0) {
parseInt(values.year),
            const today = getBrazilTime();
parseInt(values.month) - 1,
            return new Date(
parseInt(values.day),
                today.getFullYear(), today.getMonth(),
parseInt(values.hour),
                today.getDate(), hour,
parseInt(values.minute),
                minute, second
parseInt(values.second)
            );
);
        }
}


        function ajustarHoraBrasilALocal(dateBrasil) {
            const offsetUsuarioMin = dateBrasil.getTimezoneOffset();
            const offsetBrasilMin = 180;


            const diferenciaMin = offsetUsuarioMin - offsetBrasilMin;


function startGlobalEventCountdown(eventStartTime, eventEndTime) {
            return new Date(dateBrasil.getTime() - diferenciaMin * 60 * 1000);
if (globalEventsInterval) clearInterval(globalEventsInterval);
        }


globalEventsInterval = setInterval(() => {
        function startGlobalEventCountdown(eventStartTime, eventEndTime) {
const now = getBrazilTime().getTime();
            if (globalEventsInterval) clearInterval(globalEventsInterval);


if (now < eventStartTime) {
            globalEventsInterval = setInterval(() => {
// Ainda não começou, mostrar contagem regressiva
                const now = getBrazilTime().getTime();
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 createBrazilDate(hour, minute, second = 0) {
                if (now < eventStartTime) {
const today = getBrazilTime();
                    // Ainda não começou, mostrar contagem regressiva
return new Date(
                    const timeToStart = Math.floor((eventStartTime - now) / 1000);
today.getFullYear(), today.getMonth(),
                    const minutes = Math.floor(timeToStart / 60);
today.getDate(), hour,
                    const seconds = timeToStart % 60;
minute, second
                    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 ajustarHoraBrasilALocal(dateBrasil) {
        function rankedCountdown(eventStart, eventEnd) {
const offsetUsuarioMin = dateBrasil.getTimezoneOffset();
            if (rankedInterval) clearInterval(rankedInterval);
const offsetBrasilMin = 180;


const diferenciaMin = offsetUsuarioMin - offsetBrasilMin;
            rankedInterval = setInterval(() => {
                const now = getBrazilTime().getTime();


return new Date(dateBrasil.getTime() - diferenciaMin * 60 * 1000);
                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);


function worldBossCountdown(eventStartTime, eventEndTime) {
            worldBossInterval = setInterval(() => {
if (worldBossInterval) clearInterval(worldBossInterval);
                const now = getBrazilTime().getTime();


worldBossInterval = setInterval(() => {
                if (now < eventStartTime) {
const now = getBrazilTime().getTime();
                    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;


if (now < eventStartTime) {
                    worldBossTimer.innerHTML =
const diff = eventStartTime - now;
                        'Começa em: ' +
const totalSeconds = Math.floor(diff / 1000);
                        pad(hours) + ':' +
const hours = Math.floor(totalSeconds / 3600);
                        pad(minutes) + ':' +
const minutes = Math.floor((totalSeconds % 3600) / 60);
                        pad(seconds);
const seconds = totalSeconds % 60;
                } 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 =
                    worldBossTimer.innerHTML =
'Começa em: ' +
                        'Em andamento: ' +
pad(hours) + ':' +
                        pad(hours) + ':' +
pad(minutes) + ':' +
                        pad(minutes) + ':' +
pad(seconds);
                        pad(seconds);
} else if (now >= eventStartTime && now < eventEndTime) {
                } else {
const diff = eventEndTime - now;
                    clearInterval(worldBossInterval);
const totalSeconds = Math.floor(diff / 1000);
                    worldBossTimer.innerHTML = 'Evento finalizado';
const hours = Math.floor(totalSeconds / 3600);
                }
const minutes = Math.floor((totalSeconds % 3600) / 60);
            }, 1000);
const seconds = totalSeconds % 60;
        }


worldBossTimer.innerHTML =
        function setGlobalEvent() {
'Em andamento: ' +
            const userNow = new Date();
pad(hours) + ':' +
            const now = getBrazilTime();
pad(minutes) + ':' +
            const dayEvents = globalEventsInfo[now.getDay()] || [];
pad(seconds);
} else {
clearInterval(worldBossInterval);
worldBossTimer.innerHTML = 'Evento finalizado';
}
}, 1000);
}


function setGlobalEvent() {
            if (dayEvents.length === 0 && userNow.getDate() == now.getDate()) {
const userNow = new Date();
                globalEventsImage.setAttribute('src', '/images/0/0a/Anyevent.png');
const now = getBrazilTime();
                globalEventsTimer.innerHTML = 'Acabaram os eventos por hoje';
const dayEvents = globalEventsInfo[now.getDay()] || [];
                return;
            }


if (dayEvents.length === 0 && userNow.getDate() == now.getDate()) {
            for (let event of dayEvents) {
globalEventsImage.setAttribute('src', '/images/0/0a/Anyevent.png');
                const [h, m, s] = event.time.split(':').map(Number);
globalEventsTimer.innerHTML = 'Acabaram os eventos por hoje';
                const eventStartTime = createBrazilDate(h, m, s);
return;
                const eventEndTime = new Date(eventStartTime.getTime() + 5 * 60 * 1000);
}
                const eventStartMs = eventStartTime.getTime();
                const eventEndMs = eventEndTime.getTime();
                const nowMs = now.getTime();


for (let event of dayEvents) {
                const horaLocal = ajustarHoraBrasilALocal(eventStartTime);
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 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 && nowMs < eventEndMs) {
                if (nowMs < eventStartMs) {
// Evento em andamento
                    // Evento ainda não começou
globalEventsImage.setAttribute('src', event.src);
                    globalEventsImage.setAttribute('src', event.src);
startGlobalEventCountdown(eventStartMs, eventEndMs);
return;
}


if (nowMs < eventStartMs) {
                    if (eventStartMs - nowMs <= 60 * 60 * 1000) {
// Evento ainda não começou
                        // Falta menos de 1 hora => mostrar contador
globalEventsImage.setAttribute('src', event.src);
                        startGlobalEventCountdown(eventStartMs, eventEndMs);
                    } else {
                        // Falta mais de 1 hora => apenas mostrar o horário
                        globalEventsTimer.innerHTML = localTime;
                    }


if (eventStartMs - nowMs <= 60 * 60 * 1000) {
                    return;
// 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';
}
        }


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];


function setWorldBossEvent() {
            const currentWeekday = now.getDay();
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 lastFriday = new Date(createBrazilDate(h, m, s));
            const eventStartTime = lastFriday.getTime();
const daysSinceFriday = (currentWeekday >= 5) ? currentWeekday - 5 : currentWeekday + 2;
            const eventEndTime = eventStartTime + 22 * 60 * 60 * 1000;
lastFriday.setDate(now.getDate() - daysSinceFriday);
lastFriday.setHours(h, m, s, 0);


const eventStartTime = lastFriday.getTime();
            const weekNumber = getWeekNumber(lastFriday);
const eventEndTime = eventStartTime + 23 * 60 * 60 * 1000;
            const eventIndex = weekNumber % 2;
            const nextEventIndex = (eventIndex + 1) % 2;


const weekNumber = getWeekNumber(lastFriday);
            const currentEvent = alternatedEvents[eventIndex];
const eventIndex = weekNumber % 2;
            const nextEvent = alternatedEvents[nextEventIndex];
const nextEventIndex = (eventIndex + 1) % 2;


const currentEvent = alternatedEvents[eventIndex];
            const nowTime = now.getTime();
const nextEvent = alternatedEvents[nextEventIndex];
            const nowDateOnly = new Date(now);
            nowDateOnly.setHours(0, 0, 0, 0);


const nowTime = now.getTime();
            if (nowTime >= eventStartTime && nowTime < eventEndTime) {
const nowDateOnly = new Date(now);
                // Evento em andamento
nowDateOnly.setHours(0, 0, 0, 0);
                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);


if (nowTime >= eventStartTime && nowTime < eventEndTime) {
                const daysLeft = Math.round((nextFriday - nowDateOnly) / (24 * 60 * 60 * 1000));
// Evento em andamento
                if (nextEvent.name === 'World Boss') {
worldBossImage.setAttribute('src', currentEvent.image);
                    obtenerImagenWorldBoss('proximo').then(img => {
worldBossCountdown(eventStartTime, eventEndTime);
                        worldBossImage.setAttribute('src', img || nextEvent.image);
} else if (nowTime < eventStartTime) {
                        bossLink(img, nextEvent.image);
// Evento ainda não começou
                    });
worldBossImage.setAttribute('src', currentEvent.image);
                } else {
worldBossCountdown(eventStartTime, eventEndTime);
                    worldBossImage.setAttribute('src', nextEvent.image);
} else {
                }
// Evento já terminou, mostrar o próximo
                worldBossTimer.innerHTML = `Em ${daysLeft} dia${daysLeft > 1 ? 's' : ''}`;
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));
        function setRankedEvent() {
worldBossImage.setAttribute('src', nextEvent.image);
            const now = getBrazilTime();
worldBossTimer.innerHTML = `Em ${daysLeft} dia${daysLeft > 1 ? 's' : ''}`;
            const day = now.getDay();
}
            const todayEvents = rankedEvents[day];
}


document.addEventListener('DOMContentLoaded', function () {
            if (!todayEvents || todayEvents.length === 0) {
globalEventsTimer = document.getElementById('global-event-timer');
                rankedImage.setAttribute('src', '/images/b/b0/Ranked_semranked_event.png');
globalEventsImage = document.querySelector('.global-event-image');
                rankedTimer.innerHTML = 'Sem eventos hoje';
worldBossTimer = document.getElementById('worldboss-timer');
                return;
worldBossImage = document.querySelector('.worldboss-imagen');
            }
setWorldBossEvent();
cargarEventos();
});
})();


            let found = false;


// CSS
            for (let event of todayEvents) {
document.head.insertAdjacentHTML('beforeend', `
                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>
   <style>


  .carousel-controls-images {
    .carousel-controls-images {
display: flex;
        display: flex;
justify-content: center;
        justify-content: center;
gap: 16px;
        gap: 16px;
margin-top: 8px;
        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 {
    .carousel-thumb.hidden {
font-size: 22px;
        display: none;
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 {
    .carousel-container {
display: none;
        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-container {
    .carousel-slide {
width: 320px;
        width: 100%;
height: 90px;
        flex: 0 0 100%;
overflow: hidden;
        height: 90px;
margin: 0 auto;
        position: relative;
position: relative;
    }
}


.carousel-track {
    .global-event-image,
display: flex;
    .worldboss-imagen,
width: 100%;
    .rankedd-image {
transition: transform 0.5s ease-in-out;
        width: 100%;
}
        height: 100%;
        object-fit: cover;
    }


.carousel-slide {
    #global-event-timer,
width: 100%;
    #worldboss-timer,
flex: 0 0 100%;
    #rankedd-timer {
height: 90px;
        user-select: none;
position: relative;
        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;
    }


.global-event-image,
    .rankedd-image {
.worldboss-imagen {
        object-fit: fill !important;
width: 100%;
    }
height: 100%;
object-fit: cover;
}


#global-event-timer,
    .worldboss-imagen{
#worldboss-timer {
        user-select: unset;
user-select: none;
        cursor: pointer;
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;
}
   </style>
   </style>
   `);
   `);
</script>
</script>

Edição atual tal como às 16h22min 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>