// ================= FUNCIONES ================= // Cargar repetidoras desde Google Sheets async function cargarRepetidorasDesdeGoogle() { const statusDiv = document.getElementById('status-message'); statusDiv.className = 'mt-4 p-4 bg-blue-100 text-blue-800 rounded-lg'; statusDiv.innerHTML = '🔄 Cargando datos desde Google Sheets...'; statusDiv.classList.remove('hidden'); try { const respuesta = await fetch(URL_GOOGLE_SHEETS); if (!respuesta.ok) throw new Error('Error en la red'); const texto = await respuesta.text(); const filas = texto.trim().split('\n'); // Procesar filas (asumiendo formato: lat,lon,indicativo,frecuencia,desplazamiento,tono,ubicacion,pais) repetidorasCargadas = filas.slice(1).map(fila => { const datos = fila.split(',').map(d => d.trim().replace(/^"|"$/g, '')); // Quitar comillas si existen if(datos.length < 7) return null; return { lat: parseFloat(datos), lon: parseFloat(datos), indicativo: datos, frecuencia: datos, desplazamiento: datos, tono: datos, ubicacion: datos, pais: datos || 'Desconocido' }; }).filter(r => r && !isNaN(r.lat) && !isNaN(r.lon)); statusDiv.className = 'mt-4 p-4 bg-green-100 text-green-800 rounded-lg'; statusDiv.innerHTML = `✅ Cargadas ${repetidorasCargadas.length} repetidoras desde Google Sheets.`; console.log('✅ Repetidoras cargadas:', repetidorasCargadas.length); } catch (error) { console.error('❌ Error cargando desde Google:', error); repetidorasCargadas = [...repetidorasRespaldo]; statusDiv.className = 'mt-4 p-4 bg-yellow-100 text-yellow-800 rounded-lg'; statusDiv.innerHTML = `⚠️ No se pudo cargar desde Google Sheets. Usando lista de respaldo local (${repetidorasRespaldo.length} repetidoras).`; } } // Calcular distancia entre dos coordenadas (Fórmula Haversine) function calcularDistancia(lat1, lon1, lat2, lon2) { const R = 6371; // Radio de la tierra en km const dLat = (lat2 - lat1) * Math.PI / 180; const dLon = (lon2 - lon1) * Math.PI / 180; const a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) * Math.sin(dLon/2) * Math.sin(dLon/2); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); return R * c; } // Buscar repetidoras function buscarRepetidoras() { const ubicacionInput = document.getElementById('ubicacion').value.trim(); const distanciaMax = parseFloat(document.getElementById('distancia').value) || 100; const resultsContainer = document.getElementById('results-container'); const statusDiv = document.getElementById('status-message'); let userLat, userLon; // Obtener ubicación del usuario if (ubicacionInput) { const coords = ubicacionInput.split(',').map(n => parseFloat(n.trim())); if (coords.length === 2 && !isNaN(coords) && !isNaN(coords)) { [userLat, userLon] = coords; realizarBusqueda(userLat, userLon, distanciaMax, resultsContainer); } else { mostrarError(statusDiv, 'Formato de ubicación inválido. Usa: lat, lon (ej: -33.45, -70.67)'); } } else { if (navigator.geolocation) { statusDiv.className = 'mt-4 p-4 bg-blue-100 text-blue-800 rounded-lg'; statusDiv.innerHTML = '📍 Obteniendo tu ubicación...'; statusDiv.classList.remove('hidden'); navigator.geolocation.getCurrentPosition( (position) => { userLat = position.coords.latitude; userLon = position.coords.longitude; realizarBusqueda(userLat, userLon, distanciaMax, resultsContainer); }, (error) => { console.error('Error geolocalización:', error); mostrarError(statusDiv, 'No se pudo obtener tu ubicación. Por favor ingresa coordenadas manualmente.'); } ); } else { mostrarError(statusDiv, 'Geolocalización no soportada por tu navegador. Ingresa coordenadas manualmente.'); } } } function realizarBusqueda(lat, lon, maxDist, container) { const statusDiv = document.getElementById('status-message'); const resultados = repetidorasCargadas .map(rep => { const dist = calcularDistancia(lat, lon, rep.lat, rep.lon); return { ...rep, distancia: dist }; }) .filter(rep => rep.distancia <= maxDist) .sort((a, b) => a.distancia - b.distancia); if (resultados.length === 0) { container.innerHTML = `

📡 No se encontraron repetidoras en un radio de ${maxDist} km.

Intenta aumentar la distancia máxima.

`; statusDiv.className = 'mt-4 p-4 bg-yellow-100 text-yellow-800 rounded-lg'; statusDiv.innerHTML = `ℹ️ Búsqueda completada. 0 resultados en ${maxDist} km.`; statusDiv.classList.remove('hidden'); return; } let html = `
`; resultados.forEach(rep => { const distanciaStr = rep.distancia < 1 ? `${(rep.distancia * 1000).toFixed(0)} m` : `${rep.distancia.toFixed(1)} km`; html += `

${rep.indicativo}

${distanciaStr}

📡 Frecuencia: ${rep.frecuencia}

⬆️ Desplazamiento: ${rep.desplazamiento}

🔊 Tono: ${rep.tono}

📍 Ubicación: ${rep.ubicacion}

🏳️ País: ${rep.pais}

`; }); html += `
`; container.innerHTML = html; statusDiv.className = 'mt-4 p-4 bg-green-100 text-green-800 rounded-lg'; statusDiv.innerHTML = `✅ Se encontraron ${resultados.length} repetidoras dentro de ${maxDist} km.`; statusDiv.classList.remove('hidden'); } function mostrarError(div, mensaje) { div.className = 'mt-4 p-4 bg-red-100 text-red-800 rounded-lg'; div.innerHTML = `❌ ${mensaje}`; div.classList.remove('hidden'); document.getElementById('results-container').innerHTML = ''; } // ================= EVENT LISTENERS ================= document.addEventListener('DOMContentLoaded', () => { // Cargar datos al iniciar cargarRepetidorasDesdeGoogle(); // Botón buscar document.getElementById('buscar-btn').addEventListener('click', buscarRepetidoras); // Menú móvil const menuBtn = document.getElementById('mobile-menu-btn'); const mobileMenu = document.getElementById('mobile-menu'); menuBtn.addEventListener('click', () => { mobileMenu.classList.toggle('hidden'); }); // Cerrar menú móvil al hacer clic en un enlace mobileMenu.querySelectorAll('a').forEach(link => { link.addEventListener('click', () => { mobileMenu.classList.add('hidden'); }); }); });