const propertiesArray = [{id:"2-ARM12703",pos:{lat:54.3964777934403,lng:-6.77819030978699}},{id:"2-ARM15969",pos:{lat:54.4016086251183,lng:-6.78129054365539}},{id:"61-PLIK0A23",pos:{lat:54.3468366,lng:-6.651011}},{id:"61-PLIK0A283",pos:{lat:54.3412978,lng:-6.5449047}},{id:"2-ARM16496",pos:{lat:54.4763077,lng:-6.6445774}},{id:"107-11138536",pos:{lat:54.22771,lng:-6.491979}},{id:"118-136270",pos:{lat:54.3579339,lng:-6.664094}},{id:"136-NEW230441",pos:{lat:54.273483,lng:-6.458391}},{id:"138-TH81376",pos:{lat:54.3950477390776,lng:-6.65550883911743}},{id:"118-151883",pos:{lat:54.3601461,lng:-6.6639699}},{id:"61-PLIK0A36",pos:{lat:54.3478109,lng:-6.6530232}},{id:"62-12594662",pos:{lat:54.3493,lng:-6.65418}},{id:"2-ARM17363",pos:{lat:54.3528358205685,lng:-6.65415314921264}},{id:"157-942413",pos:{lat:54.345997062393,lng:-6.669329601265}},{id:"157-996921",pos:{lat:54.354312246214,lng:-6.6688326673293}},{id:"62-12665077",pos:{lat:54.296798,lng:-6.511519}},{id:"157-1010237",pos:{lat:54.351004687046,lng:-6.670535695121}},{id:"157-1014460",pos:{lat:54.319842004313,lng:-6.5292097074097}},{id:"2-ARM17751",pos:{lat:54.2773859,lng:-6.5118729}},{id:"2-COM17927",pos:{lat:54.3490968172076,lng:-6.65281201349182}},{id:"62-12719316",pos:{lat:54.361099,lng:-6.628499}},{id:"2-COM18141",pos:{lat:54.3505458912318,lng:-6.6527371020912}},{id:"62-12743614",pos:{lat:54.359367,lng:-6.641594}},{id:"61-PLIK0A482",pos:{lat:54.2937540162107,lng:-6.84463574686946}},{id:"136-NEW250307",pos:{lat:54.35394,lng:-6.654831}},{id:"2-ARM18288",pos:{lat:54.3540783,lng:-6.6645655}},{id:"2-ARM18333",pos:{lat:54.3395441683801,lng:-6.6353475196434}},{id:"136-NEW250324",pos:{lat:54.359521,lng:-6.634599}},{id:"157-1035428",pos:{lat:54.34021358054,lng:-6.6692790513457}},{id:"62-18796550",pos:{lat:54.359134,lng:-6.640161}},{id:"157-1037446",pos:{lat:54.349406721409,lng:-6.6573404264881}},{id:"2-ARM18373",pos:{lat:54.3480837018545,lng:-6.67100651534424}},{id:"32-PQ6860",pos:{lat:54.3450369,lng:-6.6656019}},{id:"61-PLIK0A493",pos:{lat:54.3581043445514,lng:-6.62913656787014}},{id:"61-PLIK0A495",pos:{lat:54.2963854530508,lng:-6.51637191276956}},{id:"61-PLIK0A497",pos:{lat:54.3313745912198,lng:-6.6846780584673}},{id:"61-PLIK0A499",pos:{lat:54.3377536,lng:-6.6378662}},{id:"2-ARM18167",pos:{lat:54.3314474,lng:-6.6406284}},{id:"2-ARM18166",pos:{lat:54.3323487,lng:-6.6393349}},{id:"2-ARM18168",pos:{lat:54.332349,lng:-6.6393254}},{id:"2-ARM18169",pos:{lat:54.3314716,lng:-6.6405854}},{id:"2-ARM18730",pos:{lat:54.349735,lng:-6.6526876}},]; 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); }