| 1 |
(function(){ |
| 2 |
function parseMarkers(root){ |
| 3 |
var el = root.querySelector('.aibui-map-markers'); |
| 4 |
if(!el) return []; |
| 5 |
try{ return JSON.parse(el.textContent || '[]') || []; }catch(e){ return []; } |
| 6 |
} |
| 7 |
|
| 8 |
function initOSM(root){ |
| 9 |
// lazy-load Leaflet from CDN if not already present |
| 10 |
var ensure = function(cb){ |
| 11 |
if(window.L && window.L.map){ cb(); return; } |
| 12 |
var css = document.createElement('link'); |
| 13 |
css.rel = 'stylesheet'; |
| 14 |
css.href = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.css'; |
| 15 |
document.head.appendChild(css); |
| 16 |
var s = document.createElement('script'); |
| 17 |
s.src = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.js'; |
| 18 |
s.onload = cb; document.head.appendChild(s); |
| 19 |
}; |
| 20 |
ensure(function(){ |
| 21 |
var lat = parseFloat(root.getAttribute('data-center-lat')||'0'); |
| 22 |
var lng = parseFloat(root.getAttribute('data-center-lng')||'0'); |
| 23 |
var zoom = parseInt(root.getAttribute('data-zoom')||'12',10); |
| 24 |
var zoomCtl = root.getAttribute('data-zoom-control')==='1'; |
| 25 |
var draggable = root.getAttribute('data-draggable')==='1'; |
| 26 |
var canvas = root.querySelector('.aibui-map-canvas'); |
| 27 |
if(!canvas) return; |
| 28 |
var map = L.map(canvas, { zoomControl: zoomCtl, dragging: draggable }).setView([lat,lng], zoom); |
| 29 |
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 19, attribution: '© OpenStreetMap' }).addTo(map); |
| 30 |
var markers = parseMarkers(root); |
| 31 |
markers.forEach(function(m){ |
| 32 |
var marker = L.marker([parseFloat(m.lat)||0, parseFloat(m.lng)||0]).addTo(map); |
| 33 |
if(m.title){ marker.bindPopup(m.title); } |
| 34 |
}); |
| 35 |
}); |
| 36 |
} |
| 37 |
|
| 38 |
function initGoogle(root){ |
| 39 |
var apiKey = root.getAttribute('data-api-key')||''; |
| 40 |
var ensure = function(cb){ |
| 41 |
if(window.google && window.google.maps){ cb(); return; } |
| 42 |
var cbName = '__aibui_gmaps_cb_'+Math.random().toString(36).slice(2); |
| 43 |
window[cbName] = function(){ cb(); delete window[cbName]; }; |
| 44 |
var s = document.createElement('script'); |
| 45 |
var base = 'https://maps.googleapis.com/maps/api/js'; |
| 46 |
var qs = (apiKey ? ('key='+encodeURIComponent(apiKey)+'&') : '') + 'callback='+cbName; |
| 47 |
s.src = base + '?' + qs; |
| 48 |
s.async = true; s.defer = true; document.head.appendChild(s); |
| 49 |
}; |
| 50 |
ensure(function(){ |
| 51 |
var lat = parseFloat(root.getAttribute('data-center-lat')||'0'); |
| 52 |
var lng = parseFloat(root.getAttribute('data-center-lng')||'0'); |
| 53 |
var zoom = parseInt(root.getAttribute('data-zoom')||'12',10); |
| 54 |
var zoomCtl = root.getAttribute('data-zoom-control')==='1'; |
| 55 |
var draggable = root.getAttribute('data-draggable')==='1'; |
| 56 |
var canvas = root.querySelector('.aibui-map-canvas'); |
| 57 |
if(!canvas) return; |
| 58 |
var map = new google.maps.Map(canvas, { center:{lat:lat, lng:lng}, zoom: zoom, zoomControl: zoomCtl, draggable: draggable }); |
| 59 |
var markers = parseMarkers(root); |
| 60 |
markers.forEach(function(m){ |
| 61 |
var mk = new google.maps.Marker({ position: {lat: parseFloat(m.lat)||0, lng: parseFloat(m.lng)||0}, map: map, title: m.title||'' }); |
| 62 |
if(m.title){ |
| 63 |
var infowindow = new google.maps.InfoWindow({ content: m.title }); |
| 64 |
mk.addListener('click', function(){ infowindow.open({ anchor: mk, map }); }); |
| 65 |
} |
| 66 |
}); |
| 67 |
}); |
| 68 |
} |
| 69 |
|
| 70 |
function boot(){ |
| 71 |
var roots = document.querySelectorAll('.wp-block-ai-builder-aibui-map'); |
| 72 |
for(var i=0;i<roots.length;i++){ |
| 73 |
var r = roots[i]; |
| 74 |
var provider = r.getAttribute('data-provider')||'osm'; |
| 75 |
if(provider==='google') initGoogle(r); else initOSM(r); |
| 76 |
} |
| 77 |
} |
| 78 |
if(document.readyState==='loading'){ |
| 79 |
document.addEventListener('DOMContentLoaded', boot); |
| 80 |
}else{ boot(); } |
| 81 |
})(); |
| 82 |
|
| 83 |
|
| 84 |
|