const propertiesArray = [{id:"12-bcv298416",pos:{lat:55.1038072,lng:-6.9486019}},{id:"125-PAUB674113",pos:{lat:54.9873922,lng:-6.831601}},{id:"133-18029714",pos:{lat:55.094928,lng:-6.892595}},{id:"133-17596853",pos:{lat:55.02407,lng:-7.082015}},{id:"140-16189852",pos:{lat:55.001216,lng:-7.298856}},{id:"140-15852463",pos:{lat:55.139839,lng:-6.946148}},{id:"140-17348070",pos:{lat:55.049438,lng:-6.948535}},{id:"140-15852440",pos:{lat:55.139839,lng:-6.946148}},{id:"140-17365774",pos:{lat:55.042446,lng:-7.03552}},{id:"140-15739213",pos:{lat:55.13932,lng:-6.945034}},{id:"140-17798259",pos:{lat:54.955028,lng:-6.9686}},{id:"140-17798369",pos:{lat:54.955028,lng:-6.9686}},{id:"140-17798279",pos:{lat:54.955028,lng:-6.9686}},{id:"140-17959197",pos:{lat:54.892494,lng:-7.016481}},{id:"140-17402893",pos:{lat:55.041652,lng:-7.024794}},{id:"140-17399954",pos:{lat:55.041652,lng:-7.024794}},{id:"140-18328306",pos:{lat:55.014362,lng:-6.99049}},{id:"122-163930",pos:{lat:55.0522857,lng:-6.9412347}},{id:"140-18380423",pos:{lat:55.042419,lng:-6.91823}},{id:"140-18400041",pos:{lat:55.015193,lng:-7.04238}},{id:"140-18407831",pos:{lat:54.892829,lng:-7.016924}},{id:"12-bcv830726",pos:{lat:55.0454563,lng:-6.9336758}},{id:"122-173436",pos:{lat:55.1046132,lng:-6.9509881}},{id:"12-bcv837584",pos:{lat:55.0388556,lng:-6.9420205}},{id:"12-bcv837589",pos:{lat:55.0388556,lng:-6.9420205}},{id:"12-bcv831796",pos:{lat:55.0343406,lng:-6.9418897}},{id:"122-178702",pos:{lat:55.0412722,lng:-7.0419465}},{id:"133-18451565",pos:{lat:55.052562,lng:-6.950934}},{id:"122-180414",pos:{lat:55.0581954,lng:-6.8910744}},{id:"122-180507",pos:{lat:55.052519,lng:-6.9426947}},{id:"133-18492873",pos:{lat:55.05289,lng:-6.932433}},{id:"133-18493700",pos:{lat:55.043617,lng:-6.951971}},{id:"140-18275663",pos:{lat:55.052284,lng:-6.941234}},{id:"122-181350",pos:{lat:55.0545318,lng:-6.937313}},{id:"12-bcv862529",pos:{lat:55.0380609,lng:-6.9322018}},{id:"12-bcv863249",pos:{lat:55.0388556,lng:-6.9420205}},{id:"133-18508217",pos:{lat:55.076866,lng:-6.965575}},{id:"140-18518351",pos:{lat:55.047546,lng:-6.927644}},{id:"133-18519178",pos:{lat:55.040279,lng:-6.950543}},{id:"140-18519554",pos:{lat:55.043258,lng:-6.92628}},{id:"122-184548",pos:{lat:55.034889,lng:-6.942875}},{id:"133-18524216",pos:{lat:55.037807,lng:-6.931971}},{id:"122-185391",pos:{lat:55.042428,lng:-7.030341}},{id:"122-185512",pos:{lat:55.051015,lng:-6.947552}},{id:"133-18539792",pos:{lat:55.046649,lng:-6.948089}},{id:"171-629472",pos:{lat:55.077993953975,lng:-6.893322051001}},{id:"171-635712",pos:{lat:55.032875914924,lng:-6.9623269718963}},{id:"171-953298",pos:{lat:55.013379348939,lng:-6.9940947520106}},{id:"171-1037666",pos:{lat:55.068046347451,lng:-6.9362679794685}},{id:"171-1040003",pos:{lat:55.040769795105,lng:-6.9342817452904}},{id:"133-18542513",pos:{lat:55.046627,lng:-6.924001}},{id:"122-186829",pos:{lat:55.045568,lng:-6.952061}},{id:"133-18546284",pos:{lat:55.023044,lng:-7.028852}},{id:"12-bcv887475",pos:{lat:55.0380444,lng:-6.944491}},{id:"133-18552181",pos:{lat:55.044769,lng:-6.921901}},{id:"140-18553031",pos:{lat:55.037952,lng:-6.945458}},{id:"133-18511070",pos:{lat:55.044647,lng:-6.943386}},]; let map; let markersArray = []; let markersArrayAll = []; let markersArrayChanged = []; let clusterMarkersArray = []; const infoWindow = document.querySelector(".info-window-control"); async function initMap() { const { Map, InfoWindow } = await google.maps.importLibrary("maps","geometry"); const { AdvancedMarkerElement } = await google.maps.importLibrary("marker"); let sw = new google.maps.LatLng(54.019510, -8.349163); let ne = new google.maps.LatLng(55.343439, -5.438346); let bounds = new google.maps.LatLngBounds(sw, ne); // Map Options let mapOptions = { zoom: 14, mapTypeId: google.maps.MapTypeId.ROADMAP, mapId: "1c886fcb938b1123", disableDefaultUI: false, streetViewControl: true, streetViewControlOptions: { position: google.maps.ControlPosition.RIGHT_TOP, }, }; map = new Map(document.getElementById("area_map"), mapOptions); var _markerCluster = new markerClusterer.MarkerClusterer({map,algorithmOptions: { radius: 80}}); buildMakers(propertiesArray, AdvancedMarkerElement, bounds, InfoWindow); setMapBounds(map, markersArray); setMapMarkers( _markerCluster, markersArray, "add"); let ClusterChanged = "N"; google.maps.event.addListener(map, "idle", () => { markersArray.length = 0; markersArrayChanged.length = 0; markersArrayAll.map((property, i) => { let position = { lat:property.position.lat, lng: property.position.lng }; if(map.getBounds().contains(position)){ markersArray.push(property); } else { markersArrayChanged.push(property); } }); if(markersArrayChanged.length != 0 ){ ClusterChanged = "Y"; setMapMarkers( _markerCluster, markersArrayChanged, "remove"); setMapMarkers( _markerCluster, markersArray, "add"); } if(markersArrayChanged.length == 0 && ClusterChanged == "Y"){ ClusterChanged = "N"; setMapMarkers( _markerCluster, markersArrayAll, "add"); } }); google.maps.event.addListener(_markerCluster, 'click', function(cluster) { clusterMarkersArray = [] var markers = cluster.markers; for (let i in markers) { let position = { lat:markers[i].position.lat, lng: markers[i].position.lng }; var clusterMarkers = clusterMarkersArray; for (i = 0; i < clusterMarkers.length; i++) { var p1 = new google.maps.LatLng(clusterMarkers[i].lat, clusterMarkers[i].lng), p2 = new google.maps.LatLng(position.lat, position.lng); if(p1.equals(p2)){ var quot = 360.0 / clusterMarkersArray.length; var newLat = position.lat + -.00012 * Math.cos(+quot * i); //+ -.00008 * Math.cos((+quot * i) / 180 * Math.PI); //x var newLng = position.lng + -.00012 * Math.sin(+quot * i); //+ -.0008 * Math.sin((+quot * i) / 180 * Math.PI); //Y markers[i].position = {lat:newLat,lng:newLng}; } } clusterMarkersArray.push(position); } }); } function buildMakers(properties, AdvancedMarkerElement, bounds, InfoWindow){ const infoWindow = new InfoWindow(); properties.map((property, i) => { let position = {lat:property.pos.lat,lng:property.pos.lng}; // check if maker is withing NI Bounds if(bounds.contains(position)){ const icon = document.createElement("img"); icon.src = "/images/pin32x.png"; const marker = new AdvancedMarkerElement({ map, position: position, content: icon, gmpClickable: true, }); // Add a click listener for each marker, and set up the info window. marker.addListener("click", () => { infoWindow.close(); markerClick(marker, property.id, infoWindow); }); // check if maker is withing NI Bounds if(bounds.contains(position)){ markersArray.push(marker); markersArrayAll.push(marker); } } }); //console.timeEnd('build markers'); $("#map-loading").addClass('hide'); } function markerClick(marker, id, infoWindow){ const request = new Request("/_search-includes/marker-info?id="+id) fetch(request) .then((response) => { if (response.status === 200) { return response.json(); } else { throw new Error("Something went wrong on API server!"); } }) .then((response) => { const infoWindowContent = buildContent(response); infoWindow.setContent(infoWindowContent); infoWindow.open(marker.map, marker); }) .catch((error) => { console.error(error); }); } function buildContent(property){ content = `
${property.add1}, ${property.add2}
${property.agent.name}
${property.statust}
New Home
${property.pricet} ${property.poa != 1 ? `£${property.price}${ property.sector === "RR" && !["Weekly", "Per Week", "Weekly Rental Of"].includes(property.pricet) ? 'pm' : '' }` : property.price }
  • ${property.beds}
  • ${property.reps}
  • ${property.baths}
${property.hline}

${property.add1}

${property.add2}
`; return content; } function setMapMarkers(_markerCluster, _MarkersArray, Action){ var mc = _markerCluster; var ma = _MarkersArray; if(Action == "add"){ mc.addMarkers(ma); } if(Action == "remove"){ mc.removeMarkers(ma); } if(Action == "clear"){ mc.clearMarkers(); } } function setMapBounds(map, markers){ var boundsmarkers = new google.maps.LatLngBounds(); for (var i = 0; i < markers.length; i++) { let position = { lat: markers[i].position.lat, lng: markers[i].position.lng }; boundsmarkers.extend(position); } map.fitBounds(boundsmarkers); }