public function OnLoadPageData() { require_once 'stoolball/ground-manager.class.php'; $manager = new GroundManager($this->GetSettings(), $this->GetDataConnection()); $manager->FilterByActive(true); # Check for team type if (isset($_GET["team-type"])) { # Sanitise input to ensure we work only with integers $team_types = explode(",", $_GET['team-type']); foreach ($team_types as $key => $value) { if (!is_numeric($value)) { unset($team_types[$key]); } else { $team_types[$key] = (int) $team_types[$key]; } } if (count($team_types)) { $manager->FilterByTeamType($team_types); } } # Check for player type $player_type = null; if (isset($_GET['player']) and is_numeric($_GET['player'])) { $player_type = (int) $_GET['player']; } if ($player_type === 0) { $manager->FilterByActive(false); } else { if (!is_null($player_type)) { $a_player_types = is_null($player_type) ? null : array($player_type); if ($player_type == PlayerType::JUNIOR_MIXED) { $a_player_types[] = PlayerType::GIRLS; $a_player_types[] = PlayerType::BOYS; } $manager->FilterByPlayerType($a_player_types); } } $manager->ReadAll(); $grounds = $manager->GetItems(); unset($manager); # JavaScript will create two sets of markers, one for each ground, and one for each team. # This is so that, when clustered, we can display the number of teams by creating a marker for each (even though they're actually duplicates). # You can't get an infoWindow for a cluster though, so once we're zoomed in far enough switch to using the ground markers, which are unique. ?> $(function() { // Make the placeholder big enough for a map var mapControl = document.getElementById("map"); mapControl.style.width = '100%'; mapControl.style.height = '600px'; // Create the map var myLatlng = new google.maps.LatLng(51.8157917, -0.9166621); // Aylesbury var myOptions = { zoom : 6, center : myLatlng, mapTypeId : google.maps.MapTypeId.ROADMAP }; var map = new google.maps.Map(mapControl, myOptions); var groundMarkers = [], teamMarkers = []; var info; var clusterer; var previousZoom = map.getZoom(); function createGroundMarkers() { <?php foreach ($grounds as $ground) { /* @var $ground Ground */ if (!$ground->GetAddress()->GetLatitude() or !$ground->GetAddress()->GetLongitude()) { continue; } $content = $this->InfoWindowContent($ground); echo $this->MarkerScript($ground, $content, "groundMarkers"); } ?> } function createTeamMarkers() { <?php foreach ($grounds as $ground) { /* @var $ground Ground */ if (!$ground->GetAddress()->GetLatitude() or !$ground->GetAddress()->GetLongitude()) { continue; } $content = $this->InfoWindowContent($ground); $teams = $ground->Teams()->GetItems(); $length = count($teams); for ($i = 0; $i < $length; $i++) { echo $this->MarkerScript($ground, $content, "teamMarkers"); } } ?> } function removeMarkers(removeMarkers) { var length = removeMarkers.length; for (var i = 0; i < length; i++) { removeMarkers[i].setMap(null); } } function plotMarkers(addMarkers) { var style = [{ url: '/images/features/map-markers.gif', height: 67, width: 31, textColor: '#ffffff', textSize: 10 }]; if (clusterer) clusterer.clearMarkers(); clusterer = new MarkerClusterer(map, addMarkers, { 'gridSize': 30, styles: style}); } function zoomChanged() { var currentZoom = map.getZoom(); if (previousZoom < 14 && currentZoom >= 14) { removeMarkers(teamMarkers); plotMarkers(groundMarkers); } else if (previousZoom >= 14 && currentZoom < 14) { removeMarkers(groundMarkers); plotMarkers(teamMarkers); } previousZoom = currentZoom; } google.maps.event.addListener(map, 'zoom_changed', zoomChanged); createGroundMarkers(); createTeamMarkers(); plotMarkers(teamMarkers); }); <?php exit; }