jQuery(document).ready(function($) { 'use strict'; // Variáveis globais let currentModal = null; let isModalOpen = false; // Inicializar funcionalidades initProgramDetails(); initModal(); initTimelinePointer(); initResponsiveBehavior(); /** * Inicializar botões de detalhes dos programas */ function initProgramDetails() { // Clicar nos blocos de programa $(document).on('click', '.program-block', function(e) { e.preventDefault(); e.stopPropagation(); const programaId = $(this).data('programa-id'); if (programaId) { loadProgramDetails(programaId); } }); // Navegação entre dias $(document).on('click', '.day-tab', function(e) { e.preventDefault(); const dayKey = $(this).data('day'); // Atualizar tabs ativas $('.day-tab').removeClass('active'); $(this).addClass('active'); // Mostrar coluna do dia selecionado $('.day-column').removeClass('active'); $(`.day-column[data-day="${dayKey}"]`).addClass('active'); }); } /** * Carregar detalhes do programa via AJAX */ function loadProgramDetails(programaId) { const $programItem = $(`.program-item[data-programa-id="${programaId}"]`); // Adicionar estado de loading $programItem.addClass('loading'); $.ajax({ url: tv_programacao_ajax.ajax_url, type: 'POST', data: { action: 'get_programa_info', programa_id: programaId, nonce: tv_programacao_ajax.nonce }, success: function(response) { if (response.success) { populateModal(response.data); openModal(); } else { showError('Erro ao carregar informações do programa'); } }, error: function() { showError('Erro de conexão. Tente novamente.'); }, complete: function() { $programItem.removeClass('loading'); } }); } /** * Preencher modal com dados do programa */ function populateModal(data) { $('#modal-title').text(data.titulo); $('#modal-time').text(data.horario_inicio + ' - ' + data.horario_fim); $('#modal-duration').text(data.duracao + ' minutos'); $('#modal-presenter').text(data.apresentador || 'Não informado'); $('#modal-rating').text(getRatingText(data.classificacao)); $('#modal-categories').text(data.categorias ? data.categorias.join(', ') : 'Não categorizado'); $('#modal-synopsis').html(data.sinopse || 'Sinopse não disponível'); $('#modal-description').html(data.conteudo || 'Descrição não disponível'); if (data.imagem) { $('#modal-image').attr('src', data.imagem).show(); } else { $('#modal-image').hide(); } } /** * Obter texto da classificação indicativa */ function getRatingText(rating) { const ratings = { 'L': 'Livre', '10': '10 anos', '12': '12 anos', '14': '14 anos', '16': '16 anos', '18': '18 anos' }; return ratings[rating] || 'Não informado'; } /** * Inicializar modal */ function initModal() { // Fechar modal ao clicar no botão X $(document).on('click', '.modal-close', function() { closeModal(); }); // Fechar modal ao clicar fora dele $(document).on('click', '.programa-modal', function(e) { if (e.target === this) { closeModal(); } }); // Fechar modal com ESC $(document).on('keydown', function(e) { if (e.key === 'Escape' && isModalOpen) { closeModal(); } }); } /** * Abrir modal */ function openModal() { $('#programa-modal').fadeIn(300); isModalOpen = true; $('body').addClass('modal-open'); // Focar no modal para acessibilidade setTimeout(function() { $('#programa-modal').focus(); }, 300); } /** * Fechar modal */ function closeModal() { $('#programa-modal').fadeOut(300); isModalOpen = false; $('body').removeClass('modal-open'); } /** * Inicializar pointer da timeline */ function initTimelinePointer() { updateTimelinePointer(); // Atualizar a cada minuto setInterval(updateTimelinePointer, 60000); } /** * Atualizar posição do pointer da timeline */ function updateTimelinePointer() { const now = new Date(); const currentHour = now.getHours(); const currentMinute = now.getMinutes(); // Calcular posição (timeline de 24h) const minutesSinceMidnight = currentHour * 60 + currentMinute; const position = minutesSinceMidnight * 0.5; // 0.5px por minuto // Atualizar pointer da timeline $('.timeline-pointer').css('left', position + 'px'); // Atualizar estado dos programas (passado, atual, futuro) updateProgramStates(); } /** * Atualizar estados dos programas */ function updateProgramStates() { const now = new Date(); const currentTime = now.getHours() * 60 + now.getMinutes(); $('.program-block').each(function() { const $item = $(this); const timeText = $item.find('.program-time-range').text(); const [startTime, endTime] = timeText.split(' - '); if (startTime && endTime) { const startMinutes = timeToMinutes(startTime); const endMinutes = timeToMinutes(endTime); $item.removeClass('past current future'); if (currentTime >= startMinutes && currentTime <= endMinutes) { $item.addClass('current'); } else if (currentTime > endMinutes) { $item.addClass('past'); } else { $item.addClass('future'); } } }); } /** * Converter horário para minutos */ function timeToMinutes(timeString) { const [hours, minutes] = timeString.split(':').map(Number); return hours * 60 + minutes; } /** * Inicializar comportamento responsivo */ function initResponsiveBehavior() { // Ajustar layout em telas pequenas function adjustLayout() { const width = $(window).width(); if (width < 768) { $('.program-block').css('padding', '4px'); $('.program-title').css('font-size', '10px'); $('.program-time-range').css('font-size', '8px'); } else { $('.program-block').css('padding', '8px'); $('.program-title').css('font-size', '12px'); $('.program-time-range').css('font-size', '10px'); } } // Executar na inicialização adjustLayout(); // Executar no redimensionamento $(window).on('resize', debounce(adjustLayout, 250)); } /** * Função debounce para otimizar performance */ function debounce(func, wait) { let timeout; return function executedFunction(...args) { const later = () => { clearTimeout(timeout); func(...args); }; clearTimeout(timeout); timeout = setTimeout(later, wait); }; } /** * Mostrar mensagem de erro */ function showError(message) { // Criar toast de erro const $toast = $(`