(function(){ function parseMarkers(root){ var el = root.querySelector('.aibui-map-markers'); if(!el) return []; try{ return JSON.parse(el.textContent || '[]') || []; }catch(e){ return []; } } function initOSM(root){ // lazy-load Leaflet from CDN if not already present var ensure = function(cb){ if(window.L && window.L.map){ cb(); return; } var css = document.createElement('link'); css.rel = 'stylesheet'; css.href = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.css'; document.head.appendChild(css); var s = document.createElement('script'); s.src = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.js'; s.onload = cb; document.head.appendChild(s); }; ensure(function(){ var lat = parseFloat(root.getAttribute('data-center-lat')||'0'); var lng = parseFloat(root.getAttribute('data-center-lng')||'0'); var zoom = parseInt(root.getAttribute('data-zoom')||'12',10); var zoomCtl = root.getAttribute('data-zoom-control')==='1'; var draggable = root.getAttribute('data-draggable')==='1'; var canvas = root.querySelector('.aibui-map-canvas'); if(!canvas) return; var map = L.map(canvas, { zoomControl: zoomCtl, dragging: draggable }).setView([lat,lng], zoom); L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 19, attribution: '© OpenStreetMap' }).addTo(map); var markers = parseMarkers(root); markers.forEach(function(m){ var marker = L.marker([parseFloat(m.lat)||0, parseFloat(m.lng)||0]).addTo(map); if(m.title){ marker.bindPopup(m.title); } }); }); } function initGoogle(root){ var apiKey = root.getAttribute('data-api-key')||''; var ensure = function(cb){ if(window.google && window.google.maps){ cb(); return; } var cbName = '__aibui_gmaps_cb_'+Math.random().toString(36).slice(2); window[cbName] = function(){ cb(); delete window[cbName]; }; var s = document.createElement('script'); var base = 'https://maps.googleapis.com/maps/api/js'; var qs = (apiKey ? ('key='+encodeURIComponent(apiKey)+'&') : '') + 'callback='+cbName; s.src = base + '?' + qs; s.async = true; s.defer = true; document.head.appendChild(s); }; ensure(function(){ var lat = parseFloat(root.getAttribute('data-center-lat')||'0'); var lng = parseFloat(root.getAttribute('data-center-lng')||'0'); var zoom = parseInt(root.getAttribute('data-zoom')||'12',10); var zoomCtl = root.getAttribute('data-zoom-control')==='1'; var draggable = root.getAttribute('data-draggable')==='1'; var canvas = root.querySelector('.aibui-map-canvas'); if(!canvas) return; var map = new google.maps.Map(canvas, { center:{lat:lat, lng:lng}, zoom: zoom, zoomControl: zoomCtl, draggable: draggable }); var markers = parseMarkers(root); markers.forEach(function(m){ var mk = new google.maps.Marker({ position: {lat: parseFloat(m.lat)||0, lng: parseFloat(m.lng)||0}, map: map, title: m.title||'' }); if(m.title){ var infowindow = new google.maps.InfoWindow({ content: m.title }); mk.addListener('click', function(){ infowindow.open({ anchor: mk, map }); }); } }); }); } function boot(){ var roots = document.querySelectorAll('.wp-block-ai-builder-aibui-map'); for(var i=0;i