Esta empresa não indica advogados e não presta serviço privativo da advocacia.

Velório Online

Acompanhe as cerimônias de onde estiver, com respeito e privacidade.

Como funciona

1

Selecione a cidade onde está acontecendo o velório

2

Localize o nome da pessoa que está sendo velada

3

Acesse com a senha fornecida pela família

Acessar Velório Online

Benefício exclusivo dos planos Afagu
Velório Online
Ao vivo HD 1080p
body: new URLSearchParams({ action: 'load_adiau_clients', nonce: '40771db274' }) }); const data = await response.json(); if (data.success) { displayVelorioClients(data.data); } else { document.getElementById('velorioClientList').innerHTML = '
Erro ao carregar clientes
'; } } catch (error) { console.error('Erro:', error); document.getElementById('velorioClientList').innerHTML = '
Erro ao carregar clientes
'; } } function displayVelorioClients(clients) { const clientList = document.getElementById('velorioClientList'); // Filtrar cliente específico const filteredClients = clients.filter(client => { const fantasyName = client.fantasyName || client.fantasiName || ''; return !fantasyName.includes('R. C. de Freitas Administradora de Planos Funerários EIRELI'); }); if (filteredClients.length === 0) { clientList.innerHTML = '
Nenhuma cidade encontrada
'; return; } clientList.innerHTML = filteredClients.map(client => { const fantasyName = client.fantasyName || client.fantasiName || 'Nome não disponível'; const socialReason = client.socialReason || ''; return `

${fantasyName}

`; }).join(''); } async function selectVelorioClient(clientId, clientName) { selectedVelorioClient = { id: clientId, name: clientName }; document.getElementById('velorioClientStep').classList.add('hidden'); document.getElementById('velorioTransmissionStep').classList.remove('hidden'); document.getElementById('velorioTransmissionList').innerHTML = '
Carregando transmissões...
'; try { const response = await fetch('https://www.afagu.com.br/wp-admin/admin-ajax.php', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, body: new URLSearchParams({ action: 'load_adiau_transmissions', nonce: '40771db274', client_id: clientId }) }); const data = await response.json(); if (data.success) { if (data.data && data.data.length > 0) { displayVelorioTransmissions(data.data); } else { document.getElementById('velorioTransmissionList').innerHTML = '
Nenhuma transmissão ativa no momento
'; } } else { document.getElementById('velorioTransmissionList').innerHTML = '
Erro ao carregar transmissões
'; } } catch (error) { console.error('Erro:', error); document.getElementById('velorioTransmissionList').innerHTML = '
Erro ao carregar transmissões
'; } } function displayVelorioTransmissions(transmissions) { const transmissionList = document.getElementById('velorioTransmissionList'); if (transmissions.length === 0) { transmissionList.innerHTML = '
Nenhuma transmissão ativa
'; return; } transmissionList.innerHTML = transmissions.map(trans => `

${trans.deceasedName}

${trans.eventType === 'BURIAL' ? 'Sepultamento' : trans.eventType}

Nascimento: ${formatVelorioDate(trans.deceasedBirthDate)}

Falecimento: ${formatVelorioDate(trans.deceasedDeathDate)}

Local: ${trans.location.name}

Período: ${trans.attendanceStartDate} até ${trans.attendanceEndDate}

${trans.burialPlace ? `

Sepultamento: ${trans.burialPlace} - ${trans.burialDate}

` : ''}
`).join(''); } function selectVelorioTransmission(transmissionId) { selectedVelorioTransmission = transmissionId; document.getElementById('velorioTransmissionStep').classList.add('hidden'); document.getElementById('velorioPasswordStep').classList.remove('hidden'); document.getElementById('velorioPasswordInput').value = ''; document.getElementById('velorioPasswordError').classList.add('hidden'); document.getElementById('velorioPasswordInput').focus(); } async function validateVelorioPassword() { const password = document.getElementById('velorioPasswordInput').value; const errorDiv = document.getElementById('velorioPasswordError'); if (!password) { errorDiv.textContent = 'Por favor, digite a senha'; errorDiv.classList.remove('hidden'); return; } try { const response = await fetch('https://www.afagu.com.br/wp-admin/admin-ajax.php', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, body: new URLSearchParams({ action: 'validate_adiau_password', nonce: '40771db274', transmission_id: selectedVelorioTransmission, password: password }) }); const data = await response.json(); if (data.success) { velorioTransmissionData = data.data; // Preencher título/subtítulo do modal const sub = `${velorioTransmissionData.location.name} - ${velorioTransmissionData.location.city.name}/${velorioTransmissionData.location.state.uf}`; document.getElementById('velorioModalTitle').textContent = velorioTransmissionData.deceasedName || 'Transmissão ao Vivo'; document.getElementById('velorioModalSub').textContent = sub; // Renderizar player dentro do modal e abrir const html = buildVelorioPlayerHTML(); document.getElementById('velorioModalContent').innerHTML = html; openVelorioModal(); // Inicializar players após inserir HTML const transmission = velorioTransmissionData.services.find(s => s.type === 'TRANSMISSION'); const cameras = transmission?.transmission?.cameras || []; setTimeout(() => { initializeVelorioPlayers(cameras); }, 100); } else { errorDiv.textContent = data.data || 'Senha incorreta'; errorDiv.classList.remove('hidden'); } } catch (error) { console.error('Erro:', error); errorDiv.textContent = 'Erro ao validar senha'; errorDiv.classList.remove('hidden'); } } function buildVelorioPlayerHTML() { const transmission = velorioTransmissionData.services.find(s => s.type === 'TRANSMISSION'); const cameras = transmission?.transmission?.cameras || []; let playerHTML = ''; if (cameras.length > 0) { // Se há apenas uma câmera, exibir em fullscreen if (cameras.length === 1) { const camera = cameras[0]; playerHTML = `

Para assistir este vídeo, ative o JavaScript e considere atualizar para um navegador que suporte vídeo HTML5

Inicializando...
HD
`; } // Se há múltiplas câmeras, exibir uma principal e controles para alternar else { // Primeira câmera como principal playerHTML = `
`; cameras.forEach((camera, index) => { const isActive = index === 0 ? '' : 'hidden'; playerHTML += `

Para assistir este vídeo, ative o JavaScript e considere atualizar para um navegador que suporte vídeo HTML5

Inicializando...
${camera.name}
`; }); playerHTML += `
`; // Mostrar controles de câmera se houver múltiplas setTimeout(() => { showCameraControls(cameras); }, 100); } } else { playerHTML = `

Nenhuma transmissão disponível

Não há câmeras ativas no momento.

`; } return playerHTML; } function initializeVelorioPlayers(cameras) { if (cameras.length === 0) return; // Configurar dados de patrocínio baseado na API setupSponsorshipData(); cameras.forEach((camera, index) => { const statusDiv = document.getElementById(`velorio-status-${index}`); const videoSrc = camera.url; if (!statusDiv) return; // Inicializar Video.js player const player = videojs(`velorio-video-${index}`, { fluid: true, responsive: true, aspectRatio: '16:9', playbackRates: [0.5, 1, 1.25, 1.5, 2], html5: { vhs: { overrideNative: true }, nativeVideoTracks: false, nativeAudioTracks: false, nativeTextTracks: false } }); // Sistema de heartbeat para detectar conexão perdida let heartbeatInterval = null; let lastTimeUpdate = Date.now(); const startHeartbeat = () => { heartbeatInterval = setInterval(() => { const now = Date.now(); if (player.currentTime() > 0 && (now - lastTimeUpdate) > 10000) { statusDiv.textContent = 'Conexão perdida - Reconectando...'; statusDiv.classList.add('text-yellow-400'); } }, 5000); }; const stopHeartbeat = () => { if (heartbeatInterval) { clearInterval(heartbeatInterval); heartbeatInterval = null; } }; // Event listeners do Video.js player.ready(() => { statusDiv.textContent = 'Player pronto'; // Configurar source player.src({ src: videoSrc, type: 'application/x-mpegURL' }); // Event listeners player.on('timeupdate', () => { lastTimeUpdate = Date.now(); }); player.on('loadedmetadata', () => { statusDiv.textContent = 'Stream carregado'; statusDiv.classList.add('text-green-400'); startHeartbeat(); }); player.on('play', () => { statusDiv.textContent = '▶️ Reproduzindo'; statusDiv.classList.add('text-green-400'); }); player.on('pause', () => { statusDiv.textContent = '⏸️ Pausado'; statusDiv.classList.remove('text-green-400', 'text-red-400'); }); player.on('waiting', () => { statusDiv.textContent = '⏳ Buffering...'; statusDiv.classList.remove('text-green-400', 'text-red-400'); }); player.on('playing', () => { statusDiv.textContent = '🔴 AO VIVO'; statusDiv.classList.add('text-red-400'); statusDiv.classList.remove('text-green-400'); }); player.on('error', (e) => { const error = player.error(); statusDiv.classList.add('text-red-400'); if (error) { switch(error.code) { case 1: // MEDIA_ERR_ABORTED statusDiv.textContent = 'Reprodução interrompida'; break; case 2: // MEDIA_ERR_NETWORK statusDiv.textContent = 'Erro de rede - Reconectando...'; setTimeout(() => { try { player.load(); } catch (e) { statusDiv.textContent = 'Falha na reconexão'; console.error('Erro na reconexão:', e); } }, 2000); break; case 3: // MEDIA_ERR_DECODE statusDiv.textContent = 'Erro de decodificação'; break; case 4: // MEDIA_ERR_SRC_NOT_SUPPORTED statusDiv.textContent = 'Formato não suportado'; break; default: statusDiv.textContent = 'Erro no player'; break; } } else { statusDiv.textContent = 'Erro desconhecido'; } console.error('Video.js Error:', error, e); }); // Auto-play (se permitido pelo navegador) player.play().catch(e => { statusDiv.textContent = 'Clique no play para iniciar'; console.log('Autoplay prevented:', e); }); }); // Armazenar referência do player window[`velorioPlayer${index}`] = player; }); } // Variáveis globais para controle das câmeras let currentActiveCamera = 0; let sponsorshipConfig = null; // Função para configurar dados de patrocínio da API function setupSponsorshipData() { if (!velorioTransmissionData || !velorioTransmissionData.services) return; // Procurar serviço de CONFIG (flores) const flowerService = velorioTransmissionData.services.find(s => s.type === 'CONFIG'); if (flowerService && flowerService.configs && flowerService.configs.length > 0) { sponsorshipConfig = flowerService.configs[0]; // Atualizar elementos de patrocínio com dados da API const cameras = velorioTransmissionData.services.find(s => s.type === 'TRANSMISSION')?.transmission?.cameras || []; cameras.forEach((camera, index) => { updateSponsorshipElements(index); }); } } // Função para atualizar elementos de patrocínio function updateSponsorshipElements(index) { if (!sponsorshipConfig) return; const titleElement = document.getElementById(`velorio-service-title-${index}`); const iconElement = document.getElementById(`velorio-service-icon-${index}`); if (titleElement) titleElement.textContent = sponsorshipConfig.title || 'Flores'; // Atualizar ícone com imagem da API se disponível if (iconElement && sponsorshipConfig.image) { iconElement.src = sponsorshipConfig.image; iconElement.alt = sponsorshipConfig.title || 'Serviço'; } } // Função para mostrar controles de câmera function showCameraControls(cameras) { if (cameras.length <= 1) return; const controlsContainer = document.getElementById('velorioModalCameraControls'); if (!controlsContainer) return; let controlsHTML = `
Câmeras: `; cameras.forEach((camera, index) => { const isActive = index === 0 ? 'bg-white text-black' : 'bg-white/20 text-white hover:bg-white/30'; controlsHTML += ` `; }); controlsHTML += '
'; controlsContainer.innerHTML = controlsHTML; controlsContainer.classList.remove('hidden'); } // Função para alternar entre câmeras function switchCamera(cameraIndex) { // Pausar player atual const currentPlayer = window[`velorioPlayer${currentActiveCamera}`]; if (currentPlayer) { currentPlayer.pause(); } // Esconder container atual const currentContainer = document.getElementById(`velorio-camera-container-${currentActiveCamera}`); if (currentContainer) { currentContainer.classList.add('hidden'); } // Atualizar botão atual const currentBtn = document.getElementById(`camera-btn-${currentActiveCamera}`); if (currentBtn) { currentBtn.className = 'bg-white/20 text-white hover:bg-white/30 px-4 py-2 rounded-lg text-sm font-medium transition-all duration-200'; } // Mostrar novo container const newContainer = document.getElementById(`velorio-camera-container-${cameraIndex}`); if (newContainer) { newContainer.classList.remove('hidden'); } // Atualizar botão novo const newBtn = document.getElementById(`camera-btn-${cameraIndex}`); if (newBtn) { newBtn.className = 'bg-white text-black px-4 py-2 rounded-lg text-sm font-medium transition-all duration-200'; } // Reproduzir novo player const newPlayer = window[`velorioPlayer${cameraIndex}`]; if (newPlayer) { newPlayer.play().catch(e => console.log('Play error:', e)); } currentActiveCamera = cameraIndex; } // Adicionar funcionalidade para o header auto-hide (estilo YouTube) let headerTimeout; function setupHeaderAutoHide() { const header = document.getElementById('velorioModalHeader'); const modal = document.getElementById('velorioModal'); if (!header || !modal) return; const showHeader = () => { header.style.opacity = '1'; header.style.pointerEvents = 'auto'; clearTimeout(headerTimeout); headerTimeout = setTimeout(hideHeader, 3000); }; const hideHeader = () => { if (!modal.querySelector('video:hover') && !header.matches(':hover')) { header.style.opacity = '0'; header.style.pointerEvents = 'none'; } }; modal.addEventListener('mousemove', showHeader); modal.addEventListener('touchstart', showHeader); header.addEventListener('mouseenter', () => clearTimeout(headerTimeout)); header.addEventListener('mouseleave', () => { headerTimeout = setTimeout(hideHeader, 1000); }); // Mostrar header inicialmente showHeader(); } // Funções de navegação function backToVelorioClients() { document.getElementById('velorioTransmissionStep').classList.add('hidden'); document.getElementById('velorioClientStep').classList.remove('hidden'); } function backToVelorioTransmissions() { document.getElementById('velorioPasswordStep').classList.add('hidden'); document.getElementById('velorioTransmissionStep').classList.remove('hidden'); } function backToVelorioPassword() { closeVelorioModal(); } // Modal helpers function openVelorioModal() { const modal = document.getElementById('velorioModal'); if (!modal) return; modal.classList.remove('hidden'); document.body.classList.add('overflow-hidden'); // Setup header auto-hide functionality setTimeout(() => setupHeaderAutoHide(), 100); } function closeVelorioModal() { const modal = document.getElementById('velorioModal'); if (!modal) return; modal.classList.add('hidden'); document.body.classList.remove('overflow-hidden'); stopVelorioSponsorship(); // Resetar variável de câmera ativa currentActiveCamera = 0; // Esconder controles de câmera const cameraControls = document.getElementById('velorioModalCameraControls'); if (cameraControls) { cameraControls.classList.add('hidden'); } // Limpar players do Video.js for (let i = 0; i < 10; i++) { // Assumindo máximo de 10 câmeras const player = window[`velorioPlayer${i}`]; if (player) { try { player.dispose(); window[`velorioPlayer${i}`] = null; } catch (e) { console.warn('Erro ao limpar player:', e); } } } // Limpar conteúdo para liberar memória const container = document.getElementById('velorioModalContent'); if (container) container.innerHTML = ''; } // Fechar no botão X e no overlay document.addEventListener('DOMContentLoaded', function() { const closeBtn = document.getElementById('velorioModalClose'); const modal = document.getElementById('velorioModal'); if (closeBtn) closeBtn.addEventListener('click', closeVelorioModal); if (modal) { modal.addEventListener('click', function(ev) { if (ev.target === modal) closeVelorioModal(); }); } }); function formatVelorioDate(dateStr) { if (!dateStr) return ''; const [year, month, day] = dateStr.split('-'); return `${day}/${month}/${year}`; }