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

De Wiki Gla
Ir para navegação Ir para pesquisar
Etiqueta: Reversão manual
Linha 1: Linha 1:
<div class="personaje-box">
<div class="carousel-container">
    <div class="personaje-header">
<div class="carousel-track">
        <div class="personaje-info">
<div class="carousel-slide global-event-widget">
            <div class="nombre">Mohji</div>
<img class="global-event-image" src="/images/0/0a/Anyevent.png" alt="Global Event">
            <div class="tier">Tier: Bronze</div>
<div id="global-event-timer"></div>
            <div class="clase">Clase: Bruiser/Especialista</div>
</div>
        </div>
<div class="carousel-slide worldboss-widget">
        <img src="/images/3/36/Mohji-splash.png" alt="Arte del personaje">
<img class="worldboss-imagen" src="/images/9/93/Anywb_event.png">
        <div class="personaje-tabs">
<div id="worldboss-timer"></div>
            <button class="tab-btn active" data-tab="habilidades">Habilidades</button>
</div>
            <button class="tab-btn" data-tab="skins">Skins</button>
</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 hidden" data-index="2" title="Ranked"></i-->
</div>
 
 
<script>
(function loadFontAwesome() {
if (!document.querySelector('link[href*="font-awesome"]')) {
const faLink = document.createElement('link');
faLink.rel = 'stylesheet';
faLink.href = 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css';
document.head.appendChild(faLink);
}
})();
 
const track = document.querySelector('.carousel-track');
const thumbs = document.querySelectorAll('.carousel-thumb');
 
let currentSlide = 0;
let totalSlides = thumbs.length - 1;
let intervalId;
 
function goToSlide(index) {
currentSlide = (index + totalSlides + 1) % (totalSlides + 1);
track.style.transform = `translateX(-${currentSlide * 100}%)`;
thumbs.forEach(thumb => thumb.classList.remove('active'));
thumbs[currentSlide].classList.add('active');
}
 
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;
let globalEventsInterval, worldBossInterval, 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 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 en una semana
return Math.floor(diff / oneWeek);
}
 
function getCurrentEventIndex(now) {
const current = new Date(now);
const day = current.getDay();
 
// Encontrar último sábado a las 10:31
const lastSaturday = new Date(current);
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


    <div class="tab-content active" id="habilidades">
if (current < lastSaturday) {
        <div class="habilidades-container">
lastSaturday.setDate(lastSaturday.getDate() - 7);
            <div class="prueba">
}
                <div class="cuadros-container">
                    <!-- Cuadros generados dinámicamente vía <script> -->
                </div>
                <div class="descripcion-container">
                    <!-- Descripción dinámica aquí -->
                </div>
                <div class="atributos-container">
                    <!-- Atributos dinámicos aquí -->
                </div>
            </div>
            <div class="video-container">
                <!-- Video dinámico aquí -->
            </div>
        </div>
    </div>


    <div class="tab-content" id="skins">
const weekNumber = getWeekNumber(lastSaturday);
        <!-- Aquí maqueta de skins -->
return weekNumber % 2; // par = World Boss, ímpar = Marineford
    </div>
}
</div>
 
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)
);
}


<script>
    (function () {
        const buttons = document.querySelectorAll(".tab-btn");
        const contents = document.querySelectorAll(".tab-content");


        buttons.forEach(btn => {
            btn.addEventListener("click", () => {
                buttons.forEach(b => b.classList.remove("active"));
                contents.forEach(c => c.classList.remove("active"));


                btn.classList.add("active");
function startGlobalEventCountdown(eventStartTime, eventEndTime) {
                const tab = btn.getAttribute("data-tab");
if (globalEventsInterval) clearInterval(globalEventsInterval);
                document.getElementById(tab).classList.add("active");
            });
        });
    })();


    const skins = [
globalEventsInterval = setInterval(() => {
        {
const now = getBrazilTime().getTime();
            imagen: "/images/7/7a/Mohji-original.gif",
            tooltip: "Recompensa de Missão Especial"
        },
        {
            imagen: "/images/a/ac/Mohji-five-star.gif",
            tooltip: "Desbloqueia ao fazer Upgrade para Prata 5 Estrela"
        }
    ];


    const contenedorSkins = document.querySelector("#skins");
if (now < eventStartTime) {
    contenedorSkins.innerHTML = generarHTMLSkins(skins);
// 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 createBrazilDate(hour, minute, second = 0) {
const today = getBrazilTime();
return new Date(
today.getFullYear(), today.getMonth(),
today.getDate(), hour,
minute, second
);
}


    const habilidades = [
function ajustarHoraBrasilALocal(dateBrasil) {
        {
const offsetUsuarioMin = dateBrasil.getTimezoneOffset();
            nombre: "Bite",
const offsetBrasilMin = 180;
            icon: "/images/0/0e/Bitemohji.png",
            level: 1,
            descripcion: "Richie usa suas presas de leão para morder o inimigo causando dano e gerando energia.",
            atributos: "2, 10, 15, 9",
            video: "/images/8/88/Mohji_sk1.webm"
        },
        {
            nombre: "Beast Claw",
            icon: "/images/5/57/Beast-claw.png",
            level: 5,
            descripcion: "Richie usa suas garras para arranhar todos os inimigos à sua frente, gerando energia.",
            atributos: "5, 20, 18, 18",
            video: "/images/3/33/Mohji_sk2.webm"
        },
        {
            nombre: "Enraged Bite",
            icon: "/images/6/65/Enraged-bite.png",
            level: 12,
            descripcion: "Richie gasta energia para desferir uma mordida feroz no inimigo alvo, causando dano aos inimigos ao redor do alvo.",
            atributos: "10, -40, 30, 30",
            video: "/images/5/5e/Mohji_sk3.webm"
        },
        {
            nombre: "Richie Roar",
            icon: "/images/8/82/Richie-roar.png",
            level: 20,
            descripcion: "Com um alto rugido, Richie provoca os inimigos próximos a ele. Tomados pelo medo, seus inimigos ficam silenciados e sofrem redução de 60 na velocidade de movimento durante 3 segundos.",
            atributos: "30, -, -, -",
            video: "/images/3/37/Mohji_sk4.webm"
        },
        {
            nombre: "Enraged Claw",
            icon: "/images/e/e3/Enraged-claw.png",
            level: 30,
            descripcion: "Richie gasta energia para executar um poderoso ataque de garra que corta o ar, cortando todos à sua frente em uma longa distância.",
            atributos: "10, -40, 40, 40",
            video: "/images/9/94/Mohji_sk5.webm"
        },
        {
            nombre: "Tammer Whip",
            icon: "/images/6/69/Tammer-whip.png",
            level: 50,
            descripcion: "Mohji usa seu chicote para golpear todos os inimigos em um longo alcance à sua frente, causando dano e puxando-os para mais perto dele e de Richie.",
            atributos: "20, -, 30, 30",
            video: "/images/6/64/Mohji_sk6.webm"
        },


        {
const diferenciaMin = offsetUsuarioMin - offsetBrasilMin;
            nombre: "Cat Leap",
            icon: "/images/d/da/Cat-leap.png",
            level: 70,
            descripcion: "Mohji ordena que Richie dê um salto para frente, causando dano a todos os inimigos próximos no momento em que ele atinge o chão, reduzindo a velocidade de movimento dos inimigos em 120 por 6 segundos.",
            atributos: "35, -, 40, 40",
            video: "/images/1/16/Mohji_sk7.webm"
        },
        {
            nombre: "Emote",
            icon: "/images/4/4b/Icon-emote.png",
            level: 25,
            descripcion: "",
            atributos: "10, -, -, -",
            video: "/images/7/7c/Mohji_emote.webm"
        }
    ];


    const cuadrosContainer = document.querySelector('.cuadros-container');
return new Date(dateBrasil.getTime() - diferenciaMin * 60 * 1000);
    const descripcionContainer = document.querySelector('.descripcion-container');
}
    const atributosContainer = document.querySelector('.atributos-container');
    const videoContainer = document.querySelector('.video-container');


    const cuadros = [];


    habilidades.forEach((hab, index) => {
function worldBossCountdown(eventStartTime, eventEndTime) {
        const div = document.createElement('div');
if (worldBossInterval) clearInterval(worldBossInterval);
        div.classList.add('cuadro');
        div.innerHTML = `<img src="${hab.icon}" alt="${hab.nombre}" style="width: 100%; height: 100%; object-fit: cover;">`;
        div.title = hab.nombre;
        div.addEventListener('click', () => {
            descripcionContainer.innerHTML = `
  <h3 style="margin-bottom: 4px; color: white;">${hab.nombre}</h3>
  <p style="margin: 0 0 6px;">Level: ${hab.level}</p>
  <p>${hab.descripcion}</p>
`;


            atributosContainer.innerHTML = generarHTMLAtributos(hab.atributos);
worldBossInterval = setInterval(() => {
            videoContainer.innerHTML =
const now = getBrazilTime().getTime();
                `<video id="video-habilidad" width="100%" height="250" controls loop playsinline>
                    <source src="${hab.video}" type="video/webm">
                    Tu navegador no soporta este video.
                </video>`;
            cuadros.forEach(c => c.classList.remove('activo'));
            div.classList.add('activo');
        });
        cuadros.push(div);
        cuadrosContainer.appendChild(div);
    });


    function generarHTMLAtributos(valoresStr) {
if (now < eventStartTime) {
        const valores = valoresStr.split(',').map(v => v.trim());
const diff = eventStartTime - now;
        const labels = ["Recarga", "Energía", "Poder PVE", "Poder PVP"];
const totalSeconds = Math.floor(diff / 1000);
        const icons = [
const hours = Math.floor(totalSeconds / 3600);
            "/images/b/b1/Icon-cooldown.png",
const minutes = Math.floor((totalSeconds % 3600) / 60);
            "/images/3/38/Icon-energy.png",
const seconds = totalSeconds % 60;
            "/images/7/7a/Icon-pve.png",
            "/images/5/5f/Icon-pvp.png"
        ];


        return `
worldBossTimer.innerHTML =
    <h4 class="attribute-title">Atributos</h4>
'Começa em: ' +
    <div class="attribute--cardsContainer">
pad(hours) + ':' +
      ${valores.map((valor, i) => {
pad(minutes) + ':' +
            let formatted;
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;


            if (valor === "-") {
worldBossTimer.innerHTML =
                formatted = "-";
'Em andamento: ' +
            } else {
pad(hours) + ':' +
                let num = parseInt(valor);
pad(minutes) + ':' +
                formatted = (i === 1 && !isNaN(num)) ? `${num > 0 ? '+' : ''}${num}` : valor;
pad(seconds);
            }
} else {
clearInterval(worldBossInterval);
worldBossTimer.innerHTML = 'Evento finalizado';
}
}, 1000);
}


            return `
function setGlobalEvent() {
          <span class="simple-tooltip simple-tooltip-inline tooltipstered" data-simple-tooltip="<p><b>${labels[i]}</b></p>">
const userNow = new Date();
            <div class="cardAttribute">
const now = getBrazilTime();
              <img src="${icons[i]}" class="cardAttribute--icon">
const dayEvents = globalEventsInfo[now.getDay()] || [];
              <h2 class="cardAttribute--value">${formatted}${i === 0 && formatted !== '-' ? ' seg' : ''}</h2>
            </div>
          </span>
        `;
        }).join('')}
    </div>
  `;
    }


    function generarHTMLSkins(listaSkins) {
if (dayEvents.length === 0 && userNow.getDate() == now.getDate()) {
        return `
globalEventsImage.setAttribute('src', '/images/0/0a/Anyevent.png');
    <div class="card-skins">
globalEventsTimer.innerHTML = 'Acabaram os eventos por hoje';
      <span class="card-skins-title">Skins</span>
return;
      <div class="skins--container">
}
        ${listaSkins.map(skin => `
          <span class="simple-tooltip simple-tooltip-inline tooltipstered" data-simple-tooltip="<center><b>${skin.tooltip}</b></center>">
            <img class="skins--imageSkin" src="${skin.imagen}" alt="">
          </span>
        `).join('')}
      </div>
    </div>
  `;
    }


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();


    if (cuadros.length > 0) {
const horaLocal = ajustarHoraBrasilALocal(eventStartTime);
        cuadros[0].click();
    }
</script>


<style>
const localTime = horaLocal.toLocaleTimeString(undefined, {
    .personaje-box {
hour: '2-digit',
        background: #1e1e1e;
minute: '2-digit',
        border-radius: 12px;
hour12: false
        padding: 16px;
});
        color: #fff;
//Converte a hora dependendo do fuso horário do usuário
        font-family: 'Segoe UI', sans-serif;
        max-width: 1100px;
        margin: auto;
        border: 2px solid #444;
    }


    .personaje-header {
        display: flex;
        gap: 20px;
        border-bottom: 2px solid #555;
        padding-bottom: 10px;
        flex-direction: column;
    }


    .personaje-header img {
        width: 230px;
        position: absolute;
        right: 16%;
    }


    .personaje-info .nombre {
if (nowMs >= eventStartMs && nowMs < eventEndMs) {
        font-size: 32px;
// Evento em andamento
        font-weight: bold;
globalEventsImage.setAttribute('src', event.src);
    }
startGlobalEventCountdown(eventStartMs, eventEndMs);
return;
}


    .personaje-info .tier,
if (nowMs < eventStartMs) {
    .personaje-info .clase {
// Evento ainda não começou
        font-size: 16px;
globalEventsImage.setAttribute('src', event.src);
        color: #bbb;
    }


    .personaje-tabs {
if (eventStartMs - nowMs <= 60 * 60 * 1000) {
        margin-block: 4px;
// Falta menos de 1 hora => mostrar contador
        display: flex;
startGlobalEventCountdown(eventStartMs, eventEndMs);
        gap: 12px;
} else {
        justify-content: flex-start;
// Falta mais de 1 hora => apenas mostrar o horário
    }
globalEventsTimer.innerHTML = localTime;
}


    .tab-btn {
return;
        padding: 8px 20px;
}
        background: #333;
}
        color: white;
        border: none;
        border-radius: 8px;
        font-size: 18px;
        cursor: pointer;
    }


    .tab-btn.active {
globalEventsImage.setAttribute('src', '/images/0/0a/Anyevent.png');
        background: #007bff;
globalEventsTimer.innerHTML = 'Acabaram os eventos por hoje';
        font-weight: bold;
}
    }


    .tab-content {
        display: none;
        margin-top: 20px;
        animation: fadeIn 0.4s ease;
    }


    .tab-content.active {
function setWorldBossEvent() {
        display: block;
const now = getBrazilTime();
    }
const [h, m, s] = [11, 00, 0];


    .habilidades-container {
const currentWeekday = now.getDay();
        display: flex;
        gap: 20px;
    }


    .prueba {
const lastFriday = new Date(createBrazilDate(h, m, s));
        flex: 1;
const daysSinceFriday = (currentWeekday >= 5) ? currentWeekday - 5 : currentWeekday + 2;
        display: flex;
lastFriday.setDate(now.getDate() - daysSinceFriday);
        flex-direction: column;
lastFriday.setHours(h, m, s, 0);
        gap: 10px;
    }


    .cuadros-container {
const eventStartTime = lastFriday.getTime();
        display: flex;
const eventEndTime = eventStartTime + 23 * 60 * 60 * 1000;
        justify-content: center;
        flex-wrap: wrap;
        gap: 10px;
        width: 100%;
    }


    .cuadros-container .cuadro {
const weekNumber = getWeekNumber(lastFriday);
        width: 60px;
const eventIndex = weekNumber % 2;
        height: 60px;
const nextEventIndex = (eventIndex + 1) % 2;
        border-radius: 5px;
        cursor: pointer;
    }


    .cuadro.activo {
const currentEvent = alternatedEvents[eventIndex];
        border: 1px solid #007bff;
const nextEvent = alternatedEvents[nextEventIndex];
    }


    .descripcion-container,
const nowTime = now.getTime();
    .atributos-container {
const nowDateOnly = new Date(now);
        padding: 10px;
nowDateOnly.setHours(0, 0, 0, 0);
        background-color: #715757;
        border-radius: 5px;
    }


    .video-container {
if (nowTime >= eventStartTime && nowTime < eventEndTime) {
        width: 400px;
// Evento em andamento
        height: 200px;
worldBossImage.setAttribute('src', currentEvent.image);
        flex-shrink: 0;
worldBossCountdown(eventStartTime, eventEndTime);
        align-self: center;
} else if (nowTime < eventStartTime) {
        background-color: #000;
// Evento ainda não começou
    }
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);


    .attribute--cardsContainer {
const daysLeft = Math.round((nextFriday - nowDateOnly) / (24 * 60 * 60 * 1000));
        display: flex;
worldBossImage.setAttribute('src', nextEvent.image);
        justify-content: center;
worldBossTimer.innerHTML = `Em ${daysLeft} dia${daysLeft > 1 ? 's' : ''}`;
        gap: 20px;
}
        flex-wrap: wrap;
}
        margin-top: 10px;
        background: unset;
        border: unset;
    }


    .cardAttribute {
document.addEventListener('DOMContentLoaded', function () {
        width: 80px;
globalEventsTimer = document.getElementById('global-event-timer');
        height: 90px;
globalEventsImage = document.querySelector('.global-event-image');
        background-color: #473838;
worldBossTimer = document.getElementById('worldboss-timer');
        border-radius: 8px;
worldBossImage = document.querySelector('.worldboss-imagen');
        display: flex;
setWorldBossEvent();
        flex-direction: column;
cargarEventos();
        align-items: center;
});
        justify-content: center;
})();
        text-align: center;
        padding: 5px;
        box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
        transition: transform 0.2s;
    }


    .cardAttribute--icon {
        height: 28px;
        margin-bottom: 14px;
    }


    .cardAttribute--value {
// CSS
        font-size: 14px !important;
document.head.insertAdjacentHTML('beforeend', `
        font-weight: bold;
  <style>
        margin: 0 !important;
        color: white;
        border-bottom: unset;
    }


    .attribute-title,
  .carousel-controls-images {
    .card-skins-title {
display: flex;
        font-size: 1.4em;
justify-content: center;
        text-align: center;
gap: 16px;
        justify-self: center;
margin-top: 8px;
        letter-spacing: 1px;
}
        font-family: sans-serif !important;
        border-bottom: 2px solid #9d9c9c;
        color: white !important;
        padding-bottom: 8px;
        margin-bottom: 16px;
        width: 75%;
    }


    .card-skins {
.carousel-thumb {
        padding: 16px;
font-size: 22px;
        border-radius: 12px;
color: #999;
        box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
cursor: pointer;
        margin-top: 20px;
transition: color 0.3s, transform 0.3s;
    }
will-change: transform;
}


    .card-skins-title {
.carousel-thumb.active {
        display: block;
color: #459cca;
        border-bottom: unset;
transform: scale(1.2);
        font-size: 18px;
}
        font-weight: bold;
        margin-bottom: 12px;
    }


    .skins--container {
.carousel-thumb.hidden {
        display: flex;
display: none;
        gap: 16px;
}
        flex-wrap: wrap;
        justify-content: center;
    }


    .skins--imageSkin {
        width: 200px;
        height: auto;
        background-color: #fefefe;
        border-radius: 6px;
        border: 1px solid #ccc;
        transition: transform 0.2s;
    }


    .skins--imageSkin:hover {
  .carousel-container {
        transform: scale(1.05);
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;
}


    @keyframes fadeIn {
.global-event-image,
        from {
.worldboss-imagen {
            opacity: 0;
width: 100%;
        }
height: 100%;
object-fit: cover;
}


        to {
#global-event-timer,
            opacity: 1;
#worldboss-timer {
        }
user-select: none;
    }
pointer-events: none;
</style>
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>
  `);
</script>

Edição das 17h15min de 14 de maio 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; let globalEventsInterval, worldBossInterval, 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 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 en una semana return Math.floor(diff / oneWeek); }

function getCurrentEventIndex(now) { const current = new Date(now); const day = current.getDay();

// Encontrar último sábado a las 10:31 const lastSaturday = new Date(current); 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) { lastSaturday.setDate(lastSaturday.getDate() - 7); }

const weekNumber = getWeekNumber(lastSaturday); return weekNumber % 2; // par = World Boss, ímpar = Marineford }

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 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 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 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 + 23 * 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 worldBossImage.setAttribute('src', currentEvent.image); worldBossCountdown(eventStartTime, eventEndTime); } else if (nowTime < eventStartTime) { // Evento ainda não começou 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)); worldBossImage.setAttribute('src', nextEvent.image); worldBossTimer.innerHTML = `Em ${daysLeft} dia${daysLeft > 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'); setWorldBossEvent(); 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 { width: 100%; height: 100%; object-fit: cover; }

  1. global-event-timer,
  2. worldboss-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; }

 </style>
 `);

</script>