public function __construct(Ground $ground)
 {
     $this->ground = $ground;
     $this->searchable = new SearchItem("ground", "ground" . $ground->GetId(), $ground->GetNavigateUrl(false), $ground->GetNameAndTown());
     $this->searchable->Description($this->GetSearchDescription());
     $this->searchable->WeightOfType(800);
     $keywords = array($ground->GetAddress()->GetLocality(), $ground->GetAddress()->GetTown());
     $this->searchable->Keywords(implode(" ", $keywords));
     $content = array($ground->GetAddress()->GetStreetDescriptor(), $ground->GetAddress()->GetAdministrativeArea(), $ground->GetDirections(), $ground->GetParking(), $ground->GetFacilities());
     $this->searchable->FullText(implode(" ", $content));
     $this->searchable->RelatedLinksHtml('<ul>' . '<li><a href="' . $ground->GetStatsNavigateUrl() . '">Statistics</a></li>' . '</ul>');
 }
 function OnPageLoad()
 {
     echo '<div class="ground vcard" typeof="schema:Place" about="' . $this->ground->GetLinkedDataUri() . '">';
     $o_fn = new XhtmlElement('h1', htmlentities($this->ground->GetNameAndTown(), ENT_QUOTES, "UTF-8", false));
     $o_fn->SetCssClass('fn');
     $o_fn->AddAttribute("property", "schema:name");
     echo $o_fn;
     require_once 'xhtml/navigation/tabs.class.php';
     $tabs = array('Summary' => '', 'Statistics' => $this->ground->GetStatsNavigateUrl());
     echo new Tabs($tabs);
     ?>
     <div class="box tab-box">
         <div class="dataFilter"></div>
         <div class="box-content">
     <?php 
     $address = new XhtmlElement("div");
     $address->AddAttribute("rel", "schema:address");
     $address->AddAttribute("resource", $this->ground->GetLinkedDataUri() . "#PostalAddress");
     $postal = new PostalAddressControl($this->ground->GetAddress());
     $postal->AddAttribute("about", $this->ground->GetLinkedDataUri() . "#PostalAddress");
     $address->AddControl($postal);
     echo $address;
     # Show teams based at this ground
     if ($this->ground->Teams()->GetCount()) {
         require_once "stoolball/team-list-control.class.php";
         echo "<h2>Teams based at this ground</h2>" . new TeamListControl($this->ground->Teams()->GetItems());
     }
     if (!is_null($this->ground->GetAddress()->GetLatitude()) and !is_null($this->ground->GetAddress()->GetLongitude())) {
         $o_geo = new XhtmlElement('div');
         $o_geo->SetXhtmlId('geoGround');
         $o_geo->AddAttribute("rel", "schema:geo");
         $o_geo->AddAttribute("resource", $this->ground->GetLinkedDataUri() . "#geo");
         $o_latlong = new XhtmlElement('p');
         $o_latlong->SetCssClass('geo');
         # geo microformat
         $o_latlong->AddAttribute("about", $this->ground->GetLinkedDataUri() . "#geo");
         $o_latlong->AddAttribute("typeof", "schema:GeoCoordinates");
         $o_latlong->AddControl('Latitude ');
         $o_lat = new XhtmlElement('span', (string) $this->ground->GetAddress()->GetLatitude());
         $o_lat->SetCssClass('latitude');
         # geo microformat
         $o_lat->AddAttribute("property", "schema:latitude");
         $o_latlong->AddControl($o_lat);
         $o_latlong->AddControl('; longitude ');
         $o_long = new XhtmlElement('span', (string) $this->ground->GetAddress()->GetLongitude());
         $o_long->SetCssClass('longitude');
         # geo microformat
         $o_long->AddAttribute("property", "schema:longitude");
         $o_latlong->AddControl($o_long);
         $o_geo->AddControl($o_latlong);
         $s_place = '';
         $s_class = '';
         switch ($this->ground->GetAddress()->GetGeoPrecision()) {
             case GeoPrecision::Exact():
                 $s_place = $this->ground->GetNameAndTown();
                 $s_class = 'exact';
                 break;
             case GeoPrecision::Postcode():
                 $s_place = $this->ground->GetAddress()->GetPostcode();
                 $s_class = 'postcode';
                 break;
             case GeoPrecision::StreetDescriptor():
                 $s_place = $this->ground->GetAddress()->GetStreetDescriptor() . ', ' . $this->ground->GetAddress()->GetTown();
                 $s_class = 'street';
                 break;
             case GeoPrecision::Town():
                 $s_place = $this->ground->GetAddress()->GetTown();
                 $s_class = 'town';
                 break;
         }
         $o_map_link = new XhtmlAnchor('Map of <span class="' . $s_class . '">' . htmlentities($s_place, ENT_QUOTES, "UTF-8", false) . '</span> on Google Maps', 'http://maps.google.co.uk/?z=16&amp;q=' . urlencode($this->ground->GetNameAndTown()) . '@' . $this->ground->GetAddress()->GetLatitude() . ',' . $this->ground->GetAddress()->GetLongitude() . '&amp;ll=' . $this->ground->GetAddress()->GetLatitude() . ',' . $this->ground->GetAddress()->GetLongitude());
         $o_map = new XhtmlElement('div', $o_map_link);
         $o_geo->AddControl($o_map);
         echo $o_geo;
     }
     if ($this->ground->GetDirections()) {
         echo new XhtmlElement('h2', 'Directions');
         $s_directions = htmlentities($this->ground->GetDirections(), ENT_QUOTES, "UTF-8", false);
         $s_directions = XhtmlMarkup::ApplyCharacterEntities($s_directions);
         $s_directions = XhtmlMarkup::ApplyParagraphs($s_directions);
         $s_directions = XhtmlMarkup::ApplySimpleTags($s_directions);
         echo $s_directions;
     }
     if ($this->ground->GetParking()) {
         echo new XhtmlElement('h2', 'Parking');
         $s_parking = htmlentities($this->ground->GetParking(), ENT_QUOTES, "UTF-8", false);
         $s_parking = XhtmlMarkup::ApplyCharacterEntities($s_parking);
         $s_parking = XhtmlMarkup::ApplyParagraphs($s_parking);
         $s_parking = XhtmlMarkup::ApplySimpleTags($s_parking);
         $s_parking = XhtmlMarkup::ApplyLinks($s_parking);
         echo $s_parking;
     }
     if ($this->ground->GetFacilities()) {
         echo new XhtmlElement('h2', 'Facilities');
         $s_facilities = htmlentities($this->ground->GetFacilities(), ENT_QUOTES, "UTF-8", false);
         $s_facilities = XhtmlMarkup::ApplyCharacterEntities($s_facilities);
         $s_facilities = XhtmlMarkup::ApplyParagraphs($s_facilities);
         $s_facilities = XhtmlMarkup::ApplySimpleTags($s_facilities);
         $s_facilities = XhtmlMarkup::ApplyLinks($s_facilities);
         echo $s_facilities;
     }
     $o_meta = new XhtmlElement('p');
     $o_meta->SetCssClass('metadata');
     $o_meta->AddControl('Status: ');
     $o_uid = new XhtmlElement('span', $this->ground->GetLinkedDataUri());
     $o_uid->SetCssClass('uid');
     $o_meta->AddControl($o_uid);
     $o_meta->AddControl(' last updated at ');
     $o_rev = new XhtmlElement('abbr', Date::BritishDateAndTime($this->ground->GetDateUpdated()));
     $o_rev->SetTitle(Date::Microformat($this->ground->GetDateUpdated()));
     $o_rev->SetCssClass('rev');
     $o_meta->AddControl($o_rev);
     $o_meta->AddControl(', sort as ');
     $o_url = new XhtmlAnchor(htmlentities($this->ground->GetAddress()->GenerateSortName(), ENT_QUOTES, "UTF-8", false), $this->ground->GetNavigateUrl());
     $o_url->SetCssClass('url sort-string');
     $o_meta->AddControl($o_url);
     echo $o_meta;
     echo "</div>";
     ?>
     </div>
     </div>
     <?php 
     $this->AddSeparator();
     $o_user = new UserEditPanel($this->GetSettings(), 'this ground');
     $o_user->AddCssClass("with-tabs");
     if (AuthenticationManager::GetUser()->Permissions()->HasPermission(PermissionType::MANAGE_GROUNDS)) {
         $o_user->AddLink("edit this ground", $this->ground->GetEditGroundUrl());
         $o_user->AddLink("delete this ground", $this->ground->GetDeleteGroundUrl());
     }
     echo $o_user;
     # Show top players
     if ($this->has_player_stats) {
         require_once 'stoolball/statistics-highlight-table.class.php';
         echo new StatisticsHighlightTable($this->best_batting, $this->most_runs, $this->best_bowling, $this->most_wickets, $this->most_catches, "All seasons");
     }
 }
 /**
  * Populates the collection of business objects from raw data
  *
  * @return bool
  * @param MySqlRawData $o_result
  */
 protected function BuildItems(MySqlRawData $o_result)
 {
     # use CollectionBuilder to handle duplicates
     $o_ground_builder = new CollectionBuilder();
     $o_ground = null;
     while ($row = $o_result->fetch()) {
         # check whether this is a new ground
         if (!$o_ground_builder->IsDone($row->ground_id)) {
             # store any exisiting ground
             if ($o_ground != null) {
                 $this->Add($o_ground);
             }
             # create the new ground
             $o_ground = new Ground($this->o_settings);
             $o_ground->SetId($row->ground_id);
             $o_ground->SetDirections($row->directions);
             $o_ground->SetParking($row->parking);
             $o_ground->SetFacilities($row->facilities);
             $o_ground->SetShortUrl($row->short_url);
             $o_ground->SetDateUpdated($row->date_changed);
             if (isset($row->update_search) and $row->update_search == 1) {
                 $o_ground->SetSearchUpdateRequired();
             }
             $o_address = $o_ground->GetAddress();
             $o_address->SetSaon($row->saon);
             $o_address->SetPaon($row->paon);
             $o_address->SetStreetDescriptor($row->street_descriptor);
             $o_address->SetLocality($row->locality);
             $o_address->SetTown($row->town);
             $o_address->SetAdministrativeArea($row->administrative_area);
             $o_address->SetPostcode($row->postcode);
             if (isset($row->latitude)) {
                 $o_address->SetGeoLocation($row->latitude, $row->longitude, $row->geo_precision);
             }
             $o_ground->SetAddress($o_address);
         }
         if (isset($row->team_name)) {
             $team = new Team($this->GetSettings());
             $team->SetName($row->team_name);
             $team->SetShortUrl($row->team_short_url);
             $team->SetPlayerType($row->player_type_id);
             $o_ground->Teams()->Add($team);
         }
     }
     # store final ground
     if ($o_ground != null) {
         $this->Add($o_ground);
     }
 }
 /**
  * Helper to build ground for a match from raw data
  *
  * @param Match $o_match
  * @param DataRow $o_row
  */
 private function BuildGround(Match $o_match, $o_row)
 {
     if (isset($o_row->ground_id)) {
         $o_ground = new Ground($this->GetSettings());
         $o_ground->SetId($o_row->ground_id);
         if (isset($o_row->ground_short_url)) {
             $o_ground->SetShortUrl($o_row->ground_short_url);
         }
         if (isset($o_row->town)) {
             $o_addr = $o_ground->GetAddress();
             $o_addr->SetSaon($o_row->saon);
             $o_addr->SetPaon($o_row->paon);
             if (isset($o_row->street_descriptor)) {
                 $o_addr->SetStreetDescriptor($o_row->street_descriptor);
             }
             if (isset($o_row->locality)) {
                 $o_addr->SetLocality($o_row->locality);
             }
             $o_addr->SetTown($o_row->town);
             if (isset($o_row->postcode)) {
                 $o_addr->SetPostcode($o_row->postcode);
             }
         }
         if (isset($o_row->latitude)) {
             $o_addr->SetGeoLocation($o_row->latitude, $o_row->longitude, $o_row->geo_precision);
         }
         $o_match->SetGround($o_ground);
         unset($o_ground);
     }
 }
 /**
  * Populates the collection of business objects from raw data
  *
  * @return bool
  * @param MySqlRawData $o_result
  */
 protected function BuildItems(MySqlRawData $o_result)
 {
     $this->Clear();
     /* @var $o_team Team */
     # use CollectionBuilder to handle duplicates
     $o_team_builder = new CollectionBuilder();
     $o_season_builder = new CollectionBuilder();
     $o_team = null;
     while ($row = $o_result->fetch()) {
         # check whether this is a new team
         if (!$o_team_builder->IsDone($row->team_id)) {
             # store any exisiting team
             if ($o_team != null) {
                 $this->Add($o_team);
                 $o_season_builder->Reset();
             }
             # create the new team
             $o_team = new Team($this->o_settings);
             $o_team->SetId($row->team_id);
             $o_team->SetName($row->team_name);
             if (isset($row->website)) {
                 $o_team->SetWebsiteUrl($row->website);
             }
             if (isset($row->active)) {
                 $o_team->SetIsActive($row->active);
             }
             if (isset($row->team_type)) {
                 $o_team->SetTeamType($row->team_type);
             }
             if (isset($row->intro)) {
                 $o_team->SetIntro($row->intro);
             }
             if (isset($row->playing_times)) {
                 $o_team->SetPlayingTimes($row->playing_times);
             }
             if (isset($row->cost)) {
                 $o_team->SetCost($row->cost);
             }
             if (isset($row->contact)) {
                 $o_team->SetContact($row->contact);
             }
             if (isset($row->contact_nsa)) {
                 $o_team->SetPrivateContact($row->contact_nsa);
             }
             if (isset($row->short_url)) {
                 $o_team->SetShortUrl($row->short_url);
             }
             if (isset($row->player_type_id)) {
                 $o_team->SetPlayerType($row->player_type_id);
             }
             $o_team->SetSchoolYears(array(1 => isset($row->year1) and $row->year1, 2 => isset($row->year2) and $row->year2, 3 => isset($row->year3) and $row->year3, 4 => isset($row->year4) and $row->year4, 5 => isset($row->year5) and $row->year5, 6 => isset($row->year6) and $row->year6, 7 => isset($row->year7) and $row->year7, 8 => isset($row->year8) and $row->year8, 9 => isset($row->year9) and $row->year9, 10 => isset($row->year10) and $row->year10, 11 => isset($row->year11) and $row->year11, 12 => isset($row->year12) and $row->year12));
             if (isset($row->update_search) and $row->update_search == 1) {
                 $o_team->SetSearchUpdateRequired();
             }
             if (isset($row->date_changed)) {
                 $o_team->SetLastAudit(new AuditData($row->modified_by_id, $row->known_as, $row->date_changed));
             }
             $club = new Club($this->GetSettings());
             if (isset($row->club_id)) {
                 $club->SetId($row->club_id);
                 if (isset($row->club_name)) {
                     $club->SetName($row->club_name);
                 }
                 if (isset($row->twitter)) {
                     $club->SetTwitterAccount($row->twitter);
                 }
                 if (isset($row->facebook)) {
                     $club->SetFacebookUrl($row->facebook);
                 }
                 if (isset($row->instagram)) {
                     $club->SetInstagramAccount($row->instagram);
                 }
                 if (isset($row->clubmark)) {
                     $club->SetClubmarkAccredited($row->clubmark);
                 }
                 if (isset($row->club_short_url)) {
                     $club->SetShortUrl($row->club_short_url);
                 }
             }
             # If the website is actually a Facebook page, move it, overriding the club Facebook page is necessary
             if (strpos($o_team->GetWebsiteUrl(), 'facebook.com/') !== false) {
                 $club->SetFacebookUrl($o_team->GetWebsiteUrl());
                 $o_team->SetWebsiteUrl('');
             }
             $o_team->SetClub($club);
             if (isset($row->ground_id) and $row->ground_id) {
                 $o_ground = new Ground($this->o_settings);
                 $o_ground->SetId($row->ground_id);
                 $address = $o_ground->GetAddress();
                 if (isset($row->saon)) {
                     $address->SetSaon($row->saon);
                 }
                 if (isset($row->town)) {
                     if (isset($row->paon)) {
                         $address->SetPaon($row->paon);
                     }
                     if (isset($row->street_descriptor)) {
                         $address->SetStreetDescriptor($row->street_descriptor);
                     }
                     if (isset($row->locality)) {
                         $address->SetLocality($row->locality);
                     }
                     $address->SetTown($row->town);
                     if (isset($row->administrative_area)) {
                         $address->SetAdministrativeArea($row->administrative_area);
                     }
                     if (isset($row->postcode)) {
                         $address->SetPostcode($row->postcode);
                     }
                     if (isset($row->latitude)) {
                         $address->SetGeoLocation($row->latitude, $row->longitude, null);
                     }
                     $o_ground->SetAddress($address);
                 }
                 if (isset($row->ground_short_url)) {
                     $o_ground->SetShortUrl($row->ground_short_url);
                 }
                 $o_team->SetGround($o_ground);
             }
         }
         # Competition/Season a cause of multiple rows
         if (isset($row->season_id) and !$o_season_builder->IsDone($row->season_id) and isset($row->competition_id)) {
             $o_season = new Season($this->o_settings);
             $o_season->SetId($row->season_id);
             $o_season->SetName($row->season_name);
             $o_season->SetIsLatest($row->is_latest);
             $o_season->SetStartYear($row->start_year);
             $o_season->SetEndYear($row->end_year);
             if (isset($row->season_short_url)) {
                 $o_season->SetShortUrl($row->season_short_url);
             }
             $o_competition = new Competition($this->o_settings);
             $o_competition->SetId($row->competition_id);
             $o_competition->SetName($row->competition_name);
             $o_season->SetCompetition($o_competition);
             $o_team->Seasons()->Add(new TeamInSeason(null, $o_season, isset($row->withdrawn_league) ? $row->withdrawn_league : null));
             unset($o_season);
             unset($o_competition);
         }
     }
     # store final team
     if ($o_team != null) {
         $this->Add($o_team);
     }
     return true;
 }
 private function MarkerScript(Ground $ground, $content, $markersArrayName)
 {
     # And marker and click event to trigger info window. Wrap info window in function to isolate marker, otherwise the last marker
     # is always used for the position of the info window.
     return "var marker = new google.maps.Marker({\r\n        position : new google.maps.LatLng(" . $ground->GetAddress()->GetLatitude() . "," . $ground->GetAddress()->GetLongitude() . "),\r\n        shadow: Stoolball.Maps.WicketShadow(),\r\n        icon: Stoolball.Maps.WicketIcon(),\r\n        title : '" . str_replace("'", "\\'", $ground->GetNameAndTown()) . "'\r\n      });\r\n      {$markersArrayName}.push(marker);\r\n\r\n      (function(marker){\r\n          google.maps.event.addListener(marker, 'click', function()\r\n          {\r\n            var content = {$content};\r\n            if (!info) info = new google.maps.InfoWindow();\r\n            info.setContent(content);\r\n            info.open(map, marker);\r\n          });\r\n      })(marker);\r\n      ";
 }
 /**
  * Gets all the grounds that can be used to filter player statistics, indexed by
  * ground id
  * @return Ground[]
  */
 public function ReadGroundsForFilter()
 {
     $ground = $this->GetSettings()->GetTable('Ground');
     $statistics = $this->GetSettings()->GetTable('PlayerMatch');
     # Apply only the player filter, because the user can't change that one
     $where = "";
     if (count($this->filter_players)) {
         $where .= "AND {$statistics}.player_id IN (" . implode(",", $this->filter_players) . ") ";
     }
     if ($where) {
         $where = "WHERE " . substr($where, 3, strlen($where) - 3);
     }
     $sql = "SELECT DISTINCT {$ground}.ground_id, saon, paon, locality, town\r\n\t\tFROM {$ground} INNER JOIN {$statistics} ON {$ground}.ground_id = {$statistics}.ground_id\r\n\t\t{$where}\r\n\t\tORDER BY sort_name";
     $data = $this->GetDataConnection()->query($sql);
     $grounds = array();
     while ($row = $data->fetch()) {
         $ground = new Ground($this->GetSettings());
         $ground->SetId($row->ground_id);
         $ground->GetAddress()->SetSaon($row->saon);
         $ground->GetAddress()->SetPaon($row->paon);
         $ground->GetAddress()->SetLocality($row->locality);
         $ground->GetAddress()->SetTown($row->town);
         $grounds[$row->ground_id] = $ground;
     }
     return $grounds;
 }