const propertiesArray = [{id:"12-bcv523395",pos:{lat:55.188402744645,lng:-6.7109123015747}},{id:"38-ppr104562",pos:{lat:55.175409558891,lng:-6.7157576792374}},{id:"38-ppr108082",pos:{lat:55.1855695,lng:-6.6986791}},{id:"38-ppr213886",pos:{lat:55.175470827573,lng:-6.7155431025162}},{id:"38-ppr560905",pos:{lat:55.175409558891,lng:-6.7157576792374}},{id:"11-MPY671089",pos:{lat:55.1850889731793,lng:-6.71900893617629}},{id:"38-ppr794820",pos:{lat:55.1718142,lng:-6.7116512}},{id:"38-ppr793135",pos:{lat:55.18318491646,lng:-6.7183086112228}},{id:"38-ppr793145",pos:{lat:55.18318491646,lng:-6.7183086112228}},{id:"38-ppr793149",pos:{lat:55.18318491646,lng:-6.7183086112228}},{id:"12-bcv801580",pos:{lat:55.188402744645,lng:-6.7109123015747}},{id:"129-1000_RS0004",pos:{lat:55.185383,lng:-6.70522}},{id:"3-LBR251180",pos:{lat:55.187734,lng:-6.712761}},{id:"3-LBR251178",pos:{lat:55.187734,lng:-6.712761}},{id:"12-bcv834368",pos:{lat:55.188402744645,lng:-6.7109123015747}},{id:"12-bcv834529",pos:{lat:55.188402744645,lng:-6.7109123015747}},{id:"140-18433732",pos:{lat:55.185199,lng:-6.719189}},{id:"140-18446834",pos:{lat:55.184902,lng:-6.719067}},{id:"18-CNRCJBE2926",pos:{lat:55.2085235,lng:-6.6594794}},{id:"38-ppr851067",pos:{lat:55.18735457609,lng:-6.7195483809509}},{id:"38-ppr852528",pos:{lat:55.1744458,lng:-6.7203637}},{id:"38-ppr860123",pos:{lat:55.1719512,lng:-6.7099077}},{id:"12-bcv858895",pos:{lat:55.1877063,lng:-6.7067149}},{id:"38-ppr516366",pos:{lat:55.174261960049,lng:-6.7171131668648}},{id:"140-18540196",pos:{lat:55.186637,lng:-6.719227}},{id:"140-18540197",pos:{lat:55.185226,lng:-6.7192}},{id:"140-18540199",pos:{lat:55.185218,lng:-6.719196}},{id:"12-bcv884003",pos:{lat:55.1872403,lng:-6.7120215}},{id:"18-CNRCJBE2990",pos:{lat:55.2088706602705,lng:-6.65623092228661}},{id:"18-CNRCJBE2991",pos:{lat:55.2088706602705,lng:-6.65623092228661}},{id:"18-CNRCJBE2992",pos:{lat:55.2088706602705,lng:-6.65623092228661}},{id:"18-CNRCJBE2993",pos:{lat:55.2088706602705,lng:-6.65623092228661}},{id:"18-CNRCJBE2994",pos:{lat:55.2088706602705,lng:-6.65623092228661}},{id:"10-873126",pos:{lat:55.186401587801,lng:-6.7194841852705}},{id:"10-873135",pos:{lat:55.186401587801,lng:-6.7194841852705}},{id:"10-873138",pos:{lat:55.186401587801,lng:-6.7194841852705}},{id:"10-873139",pos:{lat:55.186401587801,lng:-6.7194841852705}},{id:"10-873142",pos:{lat:55.186481215101,lng:-6.7194090834181}},{id:"10-873379",pos:{lat:55.187748920801,lng:-6.7197685366458}},{id:"10-873835",pos:{lat:55.173992659926,lng:-6.7221355338359}},{id:"10-873838",pos:{lat:55.173992659926,lng:-6.7221355338359}},{id:"10-873904",pos:{lat:55.186138306579,lng:-6.7192487879893}},{id:"10-873909",pos:{lat:55.184480454153,lng:-6.718244415182}},{id:"10-873960",pos:{lat:55.168989988942,lng:-6.7058004008298}},{id:"10-873974",pos:{lat:55.186483265466,lng:-6.7178999200725}},{id:"10-874020",pos:{lat:55.188720525952,lng:-6.7184428404835}},{id:"10-874028",pos:{lat:55.175266374082,lng:-6.71565831802}},{id:"10-874029",pos:{lat:55.175218316469,lng:-6.7153522489773}},{id:"10-874030",pos:{lat:55.175178261865,lng:-6.7153625319658}},{id:"10-874061",pos:{lat:55.177210726355,lng:-6.7110963777684}},{id:"10-874077",pos:{lat:55.1765795,lng:-6.7206846}},{id:"10-874080",pos:{lat:55.186401587801,lng:-6.7194841852705}},{id:"10-874082",pos:{lat:55.174205172514,lng:-6.7221608532961}},{id:"10-874102",pos:{lat:55.175698285569,lng:-6.7198122187598}},{id:"10-874103",pos:{lat:55.1862668,lng:-6.7155307}},{id:"10-874121",pos:{lat:55.186552692095,lng:-6.7192857710257}},{id:"10-874129",pos:{lat:55.1851999,lng:-6.719189}},{id:"10-874139",pos:{lat:55.176575954013,lng:-6.7206746737724}},{id:"10-874140",pos:{lat:55.174347,lng:-6.704276}},{id:"10-874145",pos:{lat:55.174790003242,lng:-6.7077494368689}},{id:"10-874163",pos:{lat:55.1851999,lng:-6.719189}},{id:"10-874164",pos:{lat:55.186138306579,lng:-6.7192487879893}},{id:"10-874165",pos:{lat:55.186401587801,lng:-6.7194841852705}},{id:"10-874174",pos:{lat:55.17651252225,lng:-6.7058751240761}},{id:"10-886310",pos:{lat:55.179858719276,lng:-6.6987096760473}},{id:"11-880333",pos:{lat:55.178582028991,lng:-6.710925555208}},{id:"11-888757",pos:{lat:55.184052609784,lng:-6.7110938976748}},{id:"11-890267",pos:{lat:55.1824602,lng:-6.7211655}},{id:"10-890821",pos:{lat:55.1854644,lng:-6.7174481}},{id:"12-bcv890363",pos:{lat:55.1862849,lng:-6.7144175}},]; 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); }