function OnPageLoad()
    {
        echo "<h1>Statistics for " . htmlentities($this->season->GetCompetitionName(), ENT_QUOTES, "UTF-8", false) . "</h1>";
        require_once "_summary-data-found.php";
        require_once 'xhtml/navigation/tabs.class.php';
        $tabs = array('Summary' => $this->season->GetNavigateUrl());
        if ($this->season->MatchTypes()->Contains(MatchType::LEAGUE)) {
            $tabs['Table'] = $this->season->GetTableUrl();
        }
        if (count($this->season->GetTeams())) {
            $tabs['Map'] = $this->season->GetMapUrl();
        }
        $tabs['Statistics'] = '';
        echo new Tabs($tabs);
        ?>

        <div class="box tab-box">
            <div class="dataFilter"></div>
            <div class="box-content">
        <?php 
        if (!$has_player_stats) {
            echo "<p>There aren't any statistics for the " . htmlentities($this->season->GetCompetitionName(), ENT_QUOTES, "UTF-8", false) . ' yet.</p>
			<p>To find out how to add them, see <a href="/play/manage/website/matches-and-results-why-you-should-add-yours/">Matches and results - why you should add yours</a>.</p>' . "<p>You can also view the <a href=\"" . htmlentities($this->season->GetNavigateUrl(), ENT_QUOTES, "UTF-8", false) . "\">" . htmlentities($this->season->GetCompetitionName(), ENT_QUOTES, "UTF-8", false) . " page</a>.</p>";
        } else {
            require_once "_summary-controls.php";
        }
        # Check for other seasons. Check is >2 becuase current season is there twice - added above
        if (count($this->competition->GetSeasons()) > 2) {
            require_once "stoolball/season-list-control.class.php";
            echo new XhtmlElement('h2', htmlentities('More statistics for the ' . $this->competition->GetName(), ENT_QUOTES, "UTF-8", false));
            $season_list = new SeasonListControl($this->competition->GetSeasons());
            $season_list->SetExcludedSeasons(array($this->season));
            $season_list->SetUrlMethod('GetStatisticsUrl');
            # Override XHTML to add link to competition stats
            $season_list_xhtml = $season_list->__toString();
            $season_list_xhtml = str_replace("<ul>", "<ul><li><a href=\"" . htmlentities($this->competition->GetStatisticsUrl(), ENT_QUOTES, "UTF-8", false) . "\">All seasons</a></li>", (string) $season_list_xhtml);
            echo $season_list_xhtml;
        }
        ?>
        </div>
        </div>
        <?php 
    }
 /**
  * @return void
  * @desc Re-build from data posted by this control the data object this control is editing
  */
 function BuildPostedDataObject()
 {
     /* @var $o_season Season */
     $o_season = new Season($this->GetSettings());
     if (isset($_POST['start']) and is_numeric($_POST['start'])) {
         $o_season->SetStartYear($_POST['start']);
     }
     $i_year_span = isset($_POST['when']) ? (int) $_POST['when'] : 0;
     $o_season->SetEndYear($o_season->GetStartYear() + $i_year_span);
     $o_season->SetName($o_season->GetYears());
     if (isset($_POST['item'])) {
         $o_season->SetId($_POST['item']);
     } else {
         $this->b_saving_new = true;
         $this->match_types_editor->SetMinimumItems(0);
         # because will be populated from previous season (if there is one)
     }
     $o_season->SetIntro(ucfirst(trim($_POST['intro'])));
     $o_season->SetShortUrl($_POST[$this->GetNamingPrefix() . 'ShortUrl']);
     # Get the competition short URL and generate a season URL, rather than providing
     # a direct interface for season URLs.
     $o_comp = new Competition($this->GetSettings());
     $o_comp->SetId($_POST['competition']);
     $o_season->SetCompetition($o_comp);
     # Match types - get from aggregated editor
     $selected_match_types = $this->match_types_editor->DataObjects()->GetItems();
     foreach ($selected_match_types as $id_value) {
         $o_season->MatchTypes()->Add($id_value->GetId());
     }
     # Results and rules
     if (isset($_POST['results'])) {
         $o_season->SetResults($_POST['results']);
     }
     foreach ($this->result_types as $o_result) {
         /*@var $o_result MatchResult */
         $s_key = $this->GetNamingPrefix() . 'Result' . $o_result->GetResultType() . 'Home';
         if (isset($_POST[$s_key]) and strlen($_POST[$s_key]) and is_numeric($_POST[$s_key])) {
             $o_result->SetHomePoints($_POST[$s_key]);
         }
         $s_key = $this->GetNamingPrefix() . 'Result' . $o_result->GetResultType() . 'Away';
         if (isset($_POST[$s_key]) and strlen($_POST[$s_key]) and is_numeric($_POST[$s_key])) {
             $o_result->SetAwayPoints($_POST[$s_key]);
         }
         if (!is_null($o_result->GetHomePoints()) or !is_null($o_result->GetAwayPoints())) {
             $o_season->PossibleResults()->Add($o_result);
         }
     }
     # Points adjustments - get from aggregated editor
     $o_season->PointsAdjustments()->SetItems($this->adjustments_editor->DataObjects()->GetItems());
     # Show league table?
     $o_season->SetShowTable(isset($_POST['showTable']));
     $o_season->SetShowTableRunsScored(isset($_POST['runsScored']));
     $o_season->SetShowTableRunsConceded(isset($_POST['runsConceded']));
     # Teams - get from aggregated editor
     $a_teams_in_season = $this->teams_editor->DataObjects()->GetItems();
     foreach ($a_teams_in_season as $team_in_season) {
         /* @var $team_in_season TeamInSeason */
         $o_season->AddTeam($team_in_season->GetTeam());
         if ($team_in_season->GetWithdrawnFromLeague()) {
             $o_season->TeamsWithdrawnFromLeague()->Add($team_in_season->GetTeam());
         }
     }
     $this->SetDataObject($o_season);
 }
    function OnPageLoad()
    {
        require_once 'xhtml/navigation/tabs.class.php';
        require_once 'stoolball/match-list-control.class.php';
        require_once 'stoolball/season-list-control.class.php';
        /* @var $season Season */
        $season = $this->competition->GetWorkingSeason();
        echo new XhtmlElement('h1', Html::Encode($this->season->GetCompetitionName()));
        $tabs = array('Summary' => '');
        if ($season->MatchTypes()->Contains(MatchType::LEAGUE)) {
            $tabs['Table'] = $season->GetTableUrl();
        }
        if (count($season->GetTeams())) {
            $tabs['Map'] = $season->GetMapUrl();
        }
        $tabs['Statistics'] = $season->GetStatisticsUrl();
        echo new Tabs($tabs);
        ?>

        <div class="box tab-box">
            <div class="dataFilter"></div>
            <div class="box-content">
  
        <?php 
        # Add intro
        if ($this->competition->GetIntro()) {
            $intro = htmlentities($this->competition->GetIntro(), ENT_QUOTES, "UTF-8", false);
            $intro = XhtmlMarkup::ApplyParagraphs($intro);
            $intro = XhtmlMarkup::ApplyLists($intro);
            $intro = XhtmlMarkup::ApplySimpleXhtmlTags($intro, false);
            $intro = XhtmlMarkup::ApplyLinks($intro);
            echo $intro;
        }
        # Add season intro
        if ($season->GetIntro()) {
            $intro = htmlentities($season->GetIntro(), ENT_QUOTES, "UTF-8", false);
            $intro = XhtmlMarkup::ApplyCharacterEntities($intro);
            $intro = XhtmlMarkup::ApplyParagraphs($intro);
            $intro = XhtmlMarkup::ApplyLinks($intro);
            $intro = XhtmlMarkup::ApplyLists($intro);
            $intro = XhtmlMarkup::ApplySimpleTags($intro);
            $intro = XhtmlMarkup::ApplyTables($intro);
            echo $intro;
        }
        # Add not active, if relevant
        if (!$this->competition->GetIsActive()) {
            echo new XhtmlElement('p', new XhtmlElement('strong', 'This competition isn\'t played any more.'));
        }
        # Add matches
        $a_matches = $season->GetMatches();
        $i_matches = count($a_matches);
        if ($i_matches > 0) {
            echo new XhtmlElement('h2', 'Matches in ' . htmlentities($season->GetName(), ENT_QUOTES, "UTF-8", false) . ' season');
            $o_matches = new MatchListControl($a_matches);
            if ($season->MatchTypes()->Contains(MatchType::LEAGUE)) {
                $o_matches->SetMatchTypesToLabel(array(MatchType::FRIENDLY, MatchType::CUP, MatchType::PRACTICE));
            } else {
                if ($season->MatchTypes()->Contains(MatchType::CUP)) {
                    $o_matches->SetMatchTypesToLabel(array(MatchType::FRIENDLY, MatchType::PRACTICE));
                } else {
                    $o_matches->SetMatchTypesToLabel(array(MatchType::PRACTICE));
                }
            }
            echo $o_matches;
        }
        # Add teams
        $a_teams = $season->GetTeams();
        if (count($a_teams) > 0) {
            require_once 'stoolball/team-list-control.class.php';
            echo new XhtmlElement('h2', 'Teams playing in ' . htmlentities($season->GetName(), ENT_QUOTES, "UTF-8", false) . ' season');
            echo new TeamListControl($a_teams);
        }
        # Add results
        if ($season->GetResults()) {
            $s_results = htmlentities($season->GetResults(), ENT_QUOTES, "UTF-8", false);
            $s_results = XhtmlMarkup::ApplyCharacterEntities($s_results);
            $s_results = XhtmlMarkup::ApplyParagraphs($s_results);
            $s_results = XhtmlMarkup::ApplyLinks($s_results);
            $s_results = XhtmlMarkup::ApplyLists($s_results);
            $s_results = XhtmlMarkup::ApplySimpleTags($s_results);
            $s_results = XhtmlMarkup::ApplyTables($s_results);
            echo $s_results;
        }
        # Add contact details
        $s_contact = $this->competition->GetContact();
        $s_website = $this->competition->GetWebsiteUrl();
        if ($s_contact or $s_website) {
            echo new XhtmlElement('h2', 'Contact details');
        }
        if ($s_contact) {
            $s_contact = htmlentities($s_contact, ENT_QUOTES, "UTF-8", false);
            $s_contact = XhtmlMarkup::ApplyCharacterEntities($s_contact);
            require_once 'email/email-address-protector.class.php';
            $protector = new EmailAddressProtector($this->GetSettings());
            $s_contact = $protector->ApplyEmailProtection($s_contact, AuthenticationManager::GetUser()->IsSignedIn());
            $s_contact = XhtmlMarkup::ApplyParagraphs($s_contact);
            $s_contact = XhtmlMarkup::ApplyLists($s_contact);
            $s_contact = XhtmlMarkup::ApplySimpleXhtmlTags($s_contact, false);
            $s_contact = XhtmlMarkup::ApplyLinks($s_contact);
            echo $s_contact;
        }
        if ($s_website) {
            echo new XhtmlAnchor("Visit the " . htmlentities($this->competition->GetName(), ENT_QUOTES, "UTF-8", false) . ' website', $s_website);
        }
        # Check for other seasons. Check is >2 becuase current season is there twice - added above
        if (count($this->competition->GetSeasons()) > 2) {
            require_once "stoolball/season-list-control.class.php";
            echo new XhtmlElement('h2', 'Other seasons in the ' . htmlentities($this->competition->GetName(), ENT_QUOTES, "UTF-8", false), "screen");
            $season_list = new SeasonListControl($this->competition->GetSeasons());
            $season_list->SetExcludedSeasons(array($this->season));
            $season_list->AddCssClass("screen");
            echo $season_list;
        }
        ?>
        </div>
        </div>
        <?php 
        $this->ShowSocial();
        $this->AddSeparator();
        # Panel for updates
        $you_can = new UserEditPanel($this->GetSettings(), 'this season');
        $you_can->AddCssClass("with-tabs");
        if (AuthenticationManager::GetUser()->Permissions()->HasPermission(PermissionType::MANAGE_COMPETITIONS)) {
            $you_can->AddLink('edit this competition', $this->competition->GetEditCompetitionUrl());
            $you_can->AddLink('delete this competition', $this->competition->GetDeleteCompetitionUrl());
            $you_can->AddLink('edit this season', $this->season->GetEditSeasonUrl());
            # Only offer delete option if there's more than one season. Don't want to delete last season because
            # that leaves an empty competition which won't display. Instead, must delete whole competition with its one remaining season.
            if (count($this->competition->GetSeasons()) > 1) {
                $you_can->AddLink('delete this season', $this->season->GetDeleteSeasonUrl());
            }
        }
        foreach ($this->season->MatchTypes() as $i_type) {
            if ($i_type != MatchType::PRACTICE and $i_type != MatchType::TOURNAMENT_MATCH) {
                $you_can->AddLink('add a ' . MatchType::Text($i_type), $this->season->GetNewMatchNavigateUrl($i_type));
            }
        }
        if (count($this->season->GetMatches())) {
            # Make sure there's at least one match which is not a tournament or a practice
            foreach ($this->season->GetMatches() as $o_match) {
                /* @var $o_match Match */
                if ($o_match->GetMatchType() == MatchType::PRACTICE or $o_match->GetMatchType() == MatchType::TOURNAMENT or $o_match->GetMatchType() == MatchType::TOURNAMENT_MATCH) {
                    continue;
                } else {
                    $you_can->AddLink('update results', $this->season->GetResultsNavigateUrl());
                    break;
                }
            }
            $you_can->AddLink('add matches to your calendar', $this->season->GetCalendarNavigateUrl());
        }
        echo $you_can;
        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, $this->season->GetName() . " season");
        }
    }
 /**
  * Populates the collection of business objects from raw data
  *
  * @return bool
  * @param MySqlRawData $o_result
  */
 protected function BuildItems(MySqlRawData $o_result)
 {
     /* @var $o_competition Competition */
     # use CollectionBuilder to handle duplicates
     $o_comp_builder = new CollectionBuilder();
     $o_season_builder = new CollectionBuilder();
     $o_team_builder = new CollectionBuilder();
     $o_points_builder = new CollectionBuilder();
     $o_matchtype_builder = new CollectionBuilder();
     $o_competition = null;
     $o_season = null;
     while ($o_row = $o_result->fetch()) {
         # check whether this is a new competition
         if (!$o_comp_builder->IsDone($o_row->competition_id)) {
             # store any exisiting competition and reset
             if ($o_competition != null) {
                 if ($o_season != null) {
                     $o_competition->AddSeason($o_season, true);
                 }
                 $o_season = null;
                 $o_matchtype_builder->Reset();
                 $this->Add($o_competition);
                 $o_season_builder->Reset();
             }
             # create the new competition
             $o_competition = new Competition($this->o_settings);
             $o_competition->SetId($o_row->competition_id);
             $o_competition->SetName($o_row->competition_name);
             if (isset($o_row->intro)) {
                 $o_competition->SetIntro($o_row->intro);
             }
             if (isset($o_row->contact)) {
                 $o_competition->SetContact($o_row->contact);
             }
             if (isset($o_row->notification_email)) {
                 $o_competition->SetNotificationEmail($o_row->notification_email);
             }
             if (isset($o_row->website)) {
                 $o_competition->SetWebsiteUrl($o_row->website);
             }
             if (isset($o_row->short_url)) {
                 $o_competition->SetShortUrl($o_row->short_url);
             }
             if (isset($o_row->active)) {
                 $o_competition->SetIsActive($o_row->active);
             }
             if (isset($o_row->players_per_team)) {
                 $o_competition->SetMaximumPlayersPerTeam($o_row->players_per_team);
             }
             if (isset($o_row->overs)) {
                 $o_competition->SetOvers($o_row->overs);
             }
             $o_competition->SetPlayerType($o_row->player_type_id);
             if (isset($o_row->update_search) and $o_row->update_search == 1) {
                 $o_competition->SetSearchUpdateRequired();
             }
             if (isset($o_row->category_id) && !is_null($o_row->category_id)) {
                 $cat = new Category();
                 $cat->SetId($o_row->category_id);
                 if (isset($o_row->category_name)) {
                     $cat->SetName($o_row->category_name);
                 }
                 if (isset($o_row->code)) {
                     $cat->SetUrl($o_row->code);
                 }
                 $o_competition->SetCategory($cat);
             }
         }
         # Seasons are the first cause of multiple rows (first in sort order after competition)
         if (isset($o_row->season_id)) {
             if (!$o_season_builder->IsDone($o_row->season_id)) {
                 if ($o_season != null) {
                     $o_competition->AddSeason($o_season, true);
                 }
                 $o_season = new Season($this->o_settings);
                 $o_season->SetId($o_row->season_id);
                 $o_season->SetName($o_row->season_name);
                 $o_season->SetIsLatest($o_row->is_latest);
                 $o_season->SetStartYear($o_row->start_year);
                 $o_season->SetEndYear($o_row->end_year);
                 if (isset($o_row->season_intro)) {
                     $o_season->SetIntro($o_row->season_intro);
                 }
                 if (isset($o_row->results)) {
                     $o_season->SetResults($o_row->results);
                 }
                 if (isset($o_row->show_table)) {
                     $o_season->SetShowTable($o_row->show_table);
                 }
                 if (isset($o_row->show_runs_scored)) {
                     $o_season->SetShowTableRunsScored($o_row->show_runs_scored);
                 }
                 if (isset($o_row->show_runs_conceded)) {
                     $o_season->SetShowTableRunsConceded($o_row->show_runs_conceded);
                 }
                 if (isset($o_row->season_short_url)) {
                     $o_season->SetShortUrl($o_row->season_short_url);
                 }
             }
             # Team only present if there is a season
             if (isset($o_row->team_id)) {
                 if (!$o_team_builder->IsDone($o_row->team_id)) {
                     if (isset($o_team)) {
                         unset($o_team);
                     }
                     $o_team = new Team($this->GetSettings());
                     $o_team->SetId($o_row->team_id);
                     $o_team->SetName($o_row->team_name);
                     $o_team->GetGround()->SetId($o_row->ground_id);
                     if (isset($o_row->team_short_url)) {
                         $o_team->SetShortUrl($o_row->team_short_url);
                     }
                     $o_season->AddTeam($o_team);
                     if (isset($o_row->withdrawn_league) and (bool) $o_row->withdrawn_league) {
                         $o_season->TeamsWithdrawnFromLeague()->Add($o_team);
                     }
                 }
                 # Points adjustments - should come with team and in order of team
                 if (isset($o_row->point_id) and !$o_points_builder->IsDone($o_row->point_id)) {
                     $o_point = new PointsAdjustment($o_row->point_id, $o_row->points, $o_team, $o_row->reason, $o_row->points_date);
                     $o_season->PointsAdjustments()->Add($o_point);
                 }
             }
             # Match types come with a season
             if (isset($o_row->match_type) and !$o_matchtype_builder->IsDone($o_row->match_type)) {
                 $o_season->MatchTypes()->Add((int) $o_row->match_type);
             }
         }
     }
     # store final competition
     if ($o_competition != null) {
         if ($o_season != null) {
             $o_competition->AddSeason($o_season, true);
         }
         $this->Add($o_competition);
     }
 }