jQuery(document).ready(function($) { // Itera sobre cada instância de calendário na página $('.em-calendario-wrapper').each(function() { const calendarWrapper = $(this); let currentDate = new Date(); const header = calendarWrapper.find('.em-mes-ano'); const weekDaysContainer = calendarWrapper.find('.em-dias-semana'); const daysGrid = calendarWrapper.find('.em-dias-grid'); // Nomes para internacionalização const monthNames = ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"]; const weekDayNames = ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb"]; function renderCalendar() { daysGrid.html(''); // Usar .html('') é um pouco mais rápido que .empty() weekDaysContainer.empty(); const month = currentDate.getMonth(); const year = currentDate.getFullYear(); // Define o cabeçalho (Mês Ano) header.text(monthNames[month] + ' ' + year); // Renderiza os dias da semana weekDayNames.forEach(day => { weekDaysContainer.append(`${day}`); }); const firstDayOfMonth = new Date(year, month, 1).getDay(); const daysInMonth = new Date(year, month + 1, 0).getDate(); // Preenche os dias vazios no início do mês for (let i = 0; i < firstDayOfMonth; i++) { daysGrid.append('
'); } // Renderiza os dias do mês for (let i = 1; i <= daysInMonth; i++) { const dayCell = $(`
${i}
`); // Marca o dia de hoje const today = new Date(); if (i === today.getDate() && month === today.getMonth() && year === today.getFullYear()) { dayCell.addClass('today'); } daysGrid.append(dayCell); } loadEventsForMonth(year, month); } function loadEventsForMonth(year, month) { const startDate = `${year}-${String(month + 1).padStart(2, '0')}-01`; const endDate = new Date(year, month + 1, 0).toISOString().split('T')[0]; $.ajax({ url: eventosManager.ajaxurl, type: 'POST', data: { action: 'get_eventos_calendario', security: eventosManager.nonce, start: startDate, end: endDate }, success: function(response) { if (response.success) { markEventsOnCalendar(response.data); } }, error: function() { console.error('Erro ao carregar eventos.'); } }); } function markEventsOnCalendar(events) { // 1. Agrupar eventos por data const eventsByDate = events.reduce((acc, event) => { const eventDate = event.start.split('T')[0]; if (!acc[eventDate]) { acc[eventDate] = []; } acc[eventDate].push(event); return acc; }, {}); // 2. Limpar eventos antigos e renderizar os novos daysGrid.find('.em-dia-celula').each(function() { const cell = $(this); const date = cell.data('date'); // Limpa conteúdo de eventos anteriores cell.find('.em-event-list').remove(); cell.removeClass('has-event'); if (eventsByDate[date]) { cell.addClass('has-event'); const eventList = $('
'); eventsByDate[date].forEach(event => { const eventEl = $(``); eventEl.text(event.title); eventList.append(eventEl); }); cell.append(eventList); } }); } // Navegação calendarWrapper.find('.em-nav-btn').on('click', function() { const direction = $(this).data('nav'); const currentMonth = currentDate.getMonth(); if (direction === 'prev') { currentDate.setMonth(currentMonth - 1); } else if (direction === 'next') { currentDate.setMonth(currentMonth + 1); } else if (direction === 'today') { currentDate = new Date(); } renderCalendar(); }); // Botão de Tela Cheia calendarWrapper.find('.em-view-btn[data-view="fullscreen"]').on('click', function() { calendarWrapper.toggleClass('em-fullscreen-mode'); $('body').toggleClass('em-fullscreen-active'); if (calendarWrapper.hasClass('em-fullscreen-mode')) { // Adiciona botão de fechar calendarWrapper.append(''); } else { // Remove botão de fechar calendarWrapper.find('.em-close-fullscreen-btn').remove(); } }); // Fechar tela cheia com o botão 'X' (evento delegado) calendarWrapper.on('click', '.em-close-fullscreen-btn', function() { calendarWrapper.removeClass('em-fullscreen-mode'); $('body').removeClass('em-fullscreen-active'); $(this).remove(); }); // Renderização inicial renderCalendar(); }); });