const LINKS = [ { label: 'Google Maps', url: 'https://www.google.com/maps/search/?api=1&query={lat},{lon}', }, { label: 'Apple Maps', url: 'https://maps.apple.com/?q={lat},{lon}&t=m', }, { label: 'Default app', url: 'geo:{lat},{lon}', }, { label: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat={lat}&mlon={lon}&zoom=15&layers=M', }, ]; const heading = document.getElementById('heading'); route(); // TODO: route on hashChange function route() { const latLon = parseLatLon(location.hash.slice(1)); if (!latLon) { heading.textContent = 'not yet implemented'; } else { const linkList = document.getElementById('links'); document.getElementById('instructions').hidden = false; document.title = 'Open location'; heading.textContent = ''; const [lat, lon] = latLon; for (const link of LINKS) { const li = document.createElement('li'); const a = document.createElement('a'); a.href = link.url.replace('{lat}', lat).replace('{lon}', lon); a.textContent = link.label; li.appendChild(a); linkList.appendChild(li); } } } function parseLatLon(text) { if (text == '') { return null; } let [lat, lon] = text.split(','); lat = parseFloat(lat); lon = parseFloat(lon); if (Number.isNaN(lat) || Number.isNaN(lon)) { throw Error('failed to parse latitude or longitude'); } if (lat < -180 || lat > 180 || lon < -90 || lon > 90) { throw Error('latitude or longitude are out of range'); } return [lat, lon]; }