PageSourceSearch

https://www.islesofscilly-travel.co.uk/wp-content/cache/min/1/wp-c…/assets/js/custom-map.js?ver=1790255008

js islesofscilly-travel.co.uk collected 2026-09-24 18:48:41 UTC 7,182 bytes, 35 lines download raw bytes

1(function(){'use strict';function parseCoordinate(value){if(!value){return NaN}
2return parseFloat(String(value).replace(',','.').trim())}
3function parseNumber(value){if(!value){return NaN}
4return parseFloat(String(value).replace(',','.').trim())}
5function normalizeCoords(latValue,lngValue){const lat=parseCoordinate(latValue);const lng=parseCoordinate(lngValue);if(Number.isNaN(lat)||Number.isNaN(lng)){return null}
6let normalizedLat=lat;let normalizedLng=lng;if(normalizedLat<0&&normalizedLng>0){const temp=normalizedLat;normalizedLat=normalizedLng;normalizedLng=temp}
7return[normalizedLng,normalizedLat]}
8function escapeHtml(str){return String(str).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;').replace(/'/g,'&#039;')}
9function escapeAttribute(str){return escapeHtml(str)}
10function decodeEntities(str){const textarea=document.createElement('textarea');textarea.innerHTML=String(str||'');return textarea.value}
11function destroyMapOnWrapper(mapWrapper){if(mapWrapper&&mapWrapper._customMapboxMap){try{mapWrapper._customMapboxMap.remove()}catch(e){}
12mapWrapper._customMapboxMap=null}}
13function getFitBoundsOptions(){const narrow=window.matchMedia('(max-width: 767.98px)').matches;const pad=narrow?28:52;return{padding:{top:pad,bottom:pad,left:pad,right:pad},maxZoom:15,duration:0}}
14function resolvePinCoords(pins){if(!pins||!pins.length){return Promise.resolve([])}
15return Promise.all(pins.map(function(item){const coords=normalizeCoords(item.lat,item.lng);if(coords){return Promise.resolve(coords)}
16if(item.address){return fetch('https://api.mapbox.com/geocoding/v5/mapbox.places/'+encodeURIComponent(item.address)+'.json?limit=1&access_token='+MapData.token).then(function(res){return res.json()}).then(function(geo){if(geo.features&&geo.features.length){const c=geo.features[0].center;return[c[0],c[1]]}
17return null}).catch(function(error){console.error('Pin geocoding failed:',error);return null})}
18return Promise.resolve(null)}))}
19function buildBoundsFromCoords(validCoords){const bounds=new mapboxgl.LngLatBounds(validCoords[0],validCoords[0]);validCoords.forEach(function(c){bounds.extend(c)});return bounds}
20function initMap(mapWrapper,center,zoom,pins,resolvedPinCoords,mapElement,panel){destroyMapOnWrapper(mapWrapper);const validCoords=(resolvedPinCoords||[]).filter(function(c){return Array.isArray(c)&&c.length===2&&!Number.isNaN(c[0])&&!Number.isNaN(c[1])});const mapOptions={container:mapElement,style:'mapbox://styles/mapbox/streets-v11'};if(validCoords.length>=2){const b=buildBoundsFromCoords(validCoords);const c=b.getCenter();mapOptions.center=[c.lng,c.lat];mapOptions.zoom=Math.min(zoom,10)}else if(validCoords.length===1){mapOptions.center=validCoords[0];mapOptions.zoom=zoom}else{mapOptions.center=center;mapOptions.zoom=zoom}
21const map=new mapboxgl.Map(mapOptions);mapWrapper._customMapboxMap=map;map.addControl(new mapboxgl.NavigationControl(),'top-right');map.on('load',function(){map.resize();if(validCoords.length>=2){map.fitBounds(buildBoundsFromCoords(validCoords),getFitBoundsOptions())}});window.requestAnimationFrame(function(){map.resize();if(validCoords.length>=2){map.fitBounds(buildBoundsFromCoords(validCoords),getFitBoundsOptions())}});setTimeout(function(){map.resize();if(validCoords.length>=2){map.fitBounds(buildBoundsFromCoords(validCoords),getFitBoundsOptions())}},300);pins.forEach(function(item,index){const c=resolvedPinCoords[index];if(!c||!Array.isArray(c)||c.length!==2){return}
22addMarker(map,panel,c[0],c[1],item)})}
23function addMarker(map,panel,lng,lat,item){const marker=new mapboxgl.Marker().setLngLat([lng,lat]).addTo(map);marker.getElement().addEventListener('click',function(){if(!panel){return}
24const imageHtml=item.image&&item.image.url?'<div class="custom-map-popup__image-wrap"><img class="custom-map-popup__image" src="'+escapeAttribute(item.image.url)+'" alt="'+escapeHtml(decodeEntities(item.title||''))+'"></div>':'';const descriptionHtml=item.description?'<div class="custom-map-popup__description">'+item.description+'</div>':'';const buttonHtml=item.button_link&&item.button_link.url?'<div class="custom-map-popup__actions"><a class="btn custom-map-popup__button" href="'+escapeAttribute(item.button_link.url)+'"'+(item.button_link.target==='_blank'?' target="_blank" rel="noopener noreferrer"':'')+'><span>'+escapeHtml(decodeEntities(item.button_link.title||'Read more'))+'</span></a></div>':'';panel.innerHTML='<div class="custom-map-panel__header">'+'<button type="button" class="custom-map-panel__close">
24'+'<span class="custom-map-panel__close-icon">×</span>'+'<span class="custom-map-panel__close-text">Close</span>'+'</button>'+'</div>'+'<div class="custom-map-panel__content">'+'<div class="h4 custom-map-popup__title">'+escapeHtml(decodeEntities(item.title||''))+'</div>'+descriptionHtml+buttonHtml+imageHtml+'</div>';panel.classList.add('active');const closeButton=panel.querySelector('.custom-map-panel__close');if(closeButton){closeButton.addEventListener('click',function(){panel.classList.remove('active');panel.innerHTML=''})}})}
25function initCustomMapWrappers(root){if(typeof mapboxgl==='undefined'||typeof MapData==='undefined'){return}
26const scope=root&&root.querySelectorAll?root:document;const mapWrappers=scope.querySelectorAll?scope.querySelectorAll('.custom-map-wrapper'):[];if(!mapWrappers.length){return}
27mapboxgl.accessToken=MapData.token;mapWrappers.forEach(function(mapWrapper){const mapElement=mapWrapper.querySelector('.custom-map');const panel=mapWrapper.querySelector('.custom-map-panel');const mapId=mapWrapper.getAttribute('data-map-id');if(!mapElement||!mapId){return}
28destroyMapOnWrapper(mapWrapper);fetch(MapData.restBase+mapId).then(function(res){return res.json()}).then(function(data){if(!data||!data.map||!Array.isArray(data.pins)){console.log('Invalid data:',data);return}
29const mapSettings=data.map;const pins=data.pins;let center=[18.06,59.33];let zoom=5;if(mapSettings.zoom&&!Number.isNaN(parseNumber(mapSettings.zoom))){zoom=parseNumber(mapSettings.zoom)}
30const mapCoords=normalizeCoords(mapSettings.lat,mapSettings.lng);if(mapCoords){center=mapCoords;resolvePinCoords(pins).then(function(resolved){initMap(mapWrapper,center,zoom,pins,resolved,mapElement,panel)});return}
31if(mapSettings.address){fetch('https://api.mapbox.com/geocoding/v5/mapbox.places/'+encodeURIComponent(mapSettings.address)+'.json?limit=1&access_token='+MapData.token).then(function(res){return res.json()}).then(function(geo){if(geo.features&&geo.features.length){center=geo.features[0].center}
32return resolvePinCoords(pins)}).then(function(resolved){initMap(mapWrapper,center,zoom,pins,resolved,mapElement,panel)}).catch(function(){return resolvePinCoords(pins).then(function(resolved){initMap(mapWrapper,center,zoom,pins,resolved,mapElement,panel)})});return}
33resolvePinCoords(pins).then(function(resolved){initMap(mapWrapper,center,zoom,pins,resolved,mapElement,panel)})}).catch(function(error){console.error('Map data failed to load:',error)})})}
34window.initCustomMapWrappers=initCustomMapWrappers;function boot(){initCustomMapWrappers(document)}
35if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',boot)}else{boot()}})()

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.