function OnSiteInit()
 {
     parent::OnSiteInit();
     # check parameter
     if (isset($_GET['season']) and is_numeric($_GET['season'])) {
         $this->i_season_id = (int) $_GET['season'];
     } else {
         if (isset($_POST['Season']) and is_numeric($_POST['Season'])) {
             $this->i_season_id = (int) $_POST['Season'];
         }
     }
     if (isset($_GET['type']) and is_numeric($_GET['type'])) {
         $this->i_match_type = (int) $_GET['type'];
     } else {
         if (isset($_POST['MatchType']) and is_numeric($_POST['MatchType'])) {
             $this->i_match_type = (int) $_POST['MatchType'];
         } else {
             $this->i_match_type = MatchType::FRIENDLY;
         }
     }
     if (isset($_GET['team']) and is_numeric($_GET['team'])) {
         $this->team = new Team($this->GetSettings());
         $this->team->SetId($_GET['team']);
     } else {
         if (isset($_POST['team']) and is_numeric($_POST['team'])) {
             $this->team = new Team($this->GetSettings());
             $this->team->SetId($_POST['team']);
         }
     }
     if (!isset($this->i_season_id) and !$this->team instanceof Team) {
         $this->Abort();
     }
 }
 public function OnPageInit()
 {
     # Get team to display players for
     if (!isset($_GET['team']) or !is_numeric($_GET['team'])) {
         $this->Redirect();
     }
     $this->team = new Team($this->GetSettings());
     $this->team->SetId($_GET['team']);
 }
 function OnSiteInit()
 {
     parent::OnSiteInit();
     # check parameter
     if (isset($_GET['season']) and is_numeric($_GET['season'])) {
         $this->season = new Season($this->GetSettings());
         $this->season->SetId((int) $_GET['season']);
     }
     if (isset($_GET['team']) and is_numeric($_GET['team'])) {
         $this->team = new Team($this->GetSettings());
         $this->team->SetId($_GET['team']);
     }
 }
 /**
  * Re-build from data posted by this control a single data object which this control is editing
  *
  * @param int $i_counter
  * @param int $i_id
  */
 protected function BuildPostedItem($i_counter = null, $i_id = null)
 {
     $s_key = $this->GetNamingPrefix() . 'Team' . $i_counter;
     $team = new Team($this->GetSettings());
     if (isset($_POST[$s_key]) and is_numeric($_POST[$s_key])) {
         $team->SetId($_POST[$s_key]);
     }
     $s_key = $this->GetNamingPrefix() . 'TeamValue' . $i_counter;
     if (isset($_POST[$s_key])) {
         $team->SetName($_POST[$s_key]);
     }
     # Infer player type from name
     if (stristr($team->GetName(), "ladies")) {
         $team->SetPlayerType(PlayerType::LADIES);
     } else {
         if (stristr($team->GetName(), "mixed")) {
             $team->SetPlayerType(PlayerType::MIXED);
         } else {
             if (stristr($team->GetName(), "Junior mixed")) {
                 $team->SetPlayerType(PlayerType::JUNIOR_MIXED);
             } else {
                 if (stristr($team->GetName(), "junior") or stristr($team->GetName(), "girls")) {
                     $team->SetPlayerType(PlayerType::GIRLS);
                 }
             }
         }
     }
     if ($team->GetId() or $team->GetName()) {
         $this->DataObjects()->Add($team);
     } else {
         $this->IgnorePostedItem($i_counter);
     }
 }
 /**
  * Re-build from data posted by this control a single data object which this control is editing
  *
  * @param int $i_counter
  * @param int $i_id
  */
 protected function BuildPostedItem($i_counter = null, $i_id = null)
 {
     $match = new Match($this->GetSettings());
     $match->SetMatchType(MatchType::TOURNAMENT_MATCH);
     $key = $this->GetNamingPrefix() . 'MatchId' . $i_counter;
     if (isset($_POST[$key]) and is_numeric($_POST[$key])) {
         $match->SetId($_POST[$key]);
     }
     $key = $this->GetNamingPrefix() . 'MatchOrder' . $i_counter;
     if (isset($_POST[$key]) and is_numeric($_POST[$key])) {
         $match->SetOrderInTournament($_POST[$key]);
     }
     $key = $this->GetNamingPrefix() . 'MatchIdValue' . $i_counter;
     if (isset($_POST[$key])) {
         $match->SetTitle($_POST[$key]);
     }
     $key = $this->GetNamingPrefix() . 'HomeTeamId' . $i_counter;
     if (isset($_POST[$key]) and $_POST[$key]) {
         $team = new Team($this->GetSettings());
         $team->SetId($_POST[$key]);
         $match->SetHomeTeam($team);
     }
     $key = $this->GetNamingPrefix() . 'AwayTeamId' . $i_counter;
     if (isset($_POST[$key]) and $_POST[$key]) {
         $team = new Team($this->GetSettings());
         $team->SetId($_POST[$key]);
         $match->SetAwayTeam($team);
     }
     if ($match->GetId() or $match->GetHomeTeamId() and $match->GetAwayTeamId()) {
         $this->DataObjects()->Add($match);
     } else {
         $this->IgnorePostedItem($i_counter);
     }
 }
 /**
  * Re-build from data posted by this control a single data object which this control is editing
  *
  * @param int $i_counter
  * @param int $i_id
  */
 protected function BuildPostedItem($i_counter = null, $i_id = null)
 {
     $s_key = $this->GetNamingPrefix() . 'Points' . $i_counter;
     $s_award_key = $this->GetNamingPrefix() . 'Awarded' . $i_counter;
     $i_points = (int) (isset($_POST[$s_key]) and is_numeric($_POST[$s_key])) ? $_POST[$s_key] : 0;
     if (isset($_POST[$s_award_key]) and $_POST[$s_award_key] == '2') {
         $i_points = $i_points - $i_points * 2;
     }
     $s_key = $this->GetNamingPrefix() . 'PointsTeam' . $i_counter;
     $o_team = null;
     $o_team = new Team($this->GetSettings());
     if (isset($_POST[$s_key]) and is_numeric($_POST[$s_key])) {
         $o_team->SetId($_POST[$s_key]);
     }
     $s_key = $this->GetNamingPrefix() . 'Reason' . $i_counter;
     $s_reason = (isset($_POST[$s_key]) and strlen($_POST[$s_key]) <= 200) ? $_POST[$s_key] : '';
     if ($i_points != 0 or $o_team->GetId() or $s_reason) {
         $o_adjust = new PointsAdjustment($i_id, $i_points, $o_team, $s_reason);
         $i_date = $this->BuildPostedItemModifiedDate($i_counter, $o_adjust);
         $o_adjust->SetDate($i_date);
         $this->DataObjects()->Add($o_adjust);
     } else {
         $this->IgnorePostedItem($i_counter);
     }
 }
 function OnPostback()
 {
     # get object
     $this->team = $this->edit->GetDataObject();
     # Check user has permission to edit this team. Authentication for team owners is based on the URI
     # so make sure we get that from the database, not untrusted user input.
     if ($this->team->GetId() and !AuthenticationManager::GetUser()->Permissions()->HasPermission(PermissionType::MANAGE_TEAMS)) {
         $this->team_manager->ReadById(array($this->team->GetId()));
         $check_team = $this->team_manager->GetFirst();
         $this->team->SetShortUrl($check_team->GetShortUrl());
     }
     if ($this->team->GetId() and !AuthenticationManager::GetUser()->Permissions()->HasPermission(PermissionType::MANAGE_TEAMS, $this->team->GetLinkedDataUri()) or !$this->team->GetId() and !AuthenticationManager::GetUser()->Permissions()->HasPermission(PermissionType::MANAGE_TEAMS)) {
         $this->GetAuthenticationManager()->GetPermission();
     }
     # save data if valid
     if ($this->IsValid()) {
         $i_id = $this->team_manager->SaveTeam($this->team);
         $this->team->SetId($i_id);
         $this->Redirect($this->team->GetNavigateUrl());
     }
 }
 /**
  * Re-build from data posted by this control a single data object which this control is editing
  *
  * @param int $i_counter
  * @param int $i_id
  */
 protected function BuildPostedItem($i_counter = null, $i_id = null)
 {
     $s_key = $this->GetNamingPrefix() . 'Team' . $i_counter;
     $o_team = null;
     $o_team = new Team($this->GetSettings());
     if (isset($_POST[$s_key]) and is_numeric($_POST[$s_key])) {
         $o_team->SetId($_POST[$s_key]);
     }
     $s_key = $this->GetNamingPrefix() . 'TeamValue' . $i_counter;
     if (isset($_POST[$s_key])) {
         $o_team->SetName($_POST[$s_key]);
     }
     $s_key = $this->GetNamingPrefix() . 'WithdrawnLeague' . $i_counter;
     $b_withdrawn_league = (isset($_POST[$s_key]) and $_POST[$s_key] == '1');
     if ($o_team->GetId() or $b_withdrawn_league) {
         $team_in_season = new TeamInSeason($o_team, null, $b_withdrawn_league);
         $this->DataObjects()->Add($team_in_season);
     } else {
         $this->IgnorePostedItem($i_counter);
     }
 }
 /**
  * @return void
  * @desc Re-build from data posted by this control the data object this control is editing
  */
 function BuildPostedDataObject()
 {
     $team = new Team($this->GetSettings());
     if (isset($_POST['item'])) {
         $team->SetId($_POST['item']);
     }
     if (isset($_POST['name'])) {
         $team->SetName($_POST['name']);
     }
     $team->SetWebsiteUrl($_POST['websiteUrl']);
     $team->SetIsActive(isset($_POST['playing']));
     $team->SetIntro(ucfirst(trim($_POST['intro'])));
     $team->SetPlayingTimes($_POST['times']);
     $team->SetCost($_POST['yearCost']);
     $team->SetContact($_POST['contact']);
     $team->SetPrivateContact($_POST['private']);
     $ground = new Ground($this->GetSettings());
     $ground->SetId($_POST['ground']);
     $team->SetGround($ground);
     if (isset($_POST['team_type'])) {
         $team->SetTeamType($_POST['team_type']);
         if ($team->GetTeamType() == Team::SCHOOL_YEARS) {
             $team->SetSchoolYears(array(1 => isset($_POST['year1']), 2 => isset($_POST['year2']), 3 => isset($_POST['year3']), 4 => isset($_POST['year4']), 5 => isset($_POST['year5']), 6 => isset($_POST['year6']), 7 => isset($_POST['year7']), 8 => isset($_POST['year8']), 9 => isset($_POST['year9']), 10 => isset($_POST['year10']), 11 => isset($_POST['year11']), 12 => isset($_POST['year12'])));
         }
     }
     if ($this->is_admin) {
         $team->SetShortUrl($_POST[$this->GetNamingPrefix() . 'ShortUrl']);
         $team->SetPlayerType($_POST['playerType']);
         if (isset($_POST['club']) and is_numeric($_POST['club'])) {
             $club = new Club($this->GetSettings());
             $club->SetId($_POST['club']);
             $team->SetClub($club);
         }
     }
     $this->SetDataObject($team);
 }
 /**
  * @access public
  * @return void
  * @param int[] $a_ids
  * @desc Delete from the db the Teams matching the supplied ids
  */
 public function Delete($a_ids)
 {
     # check parameter
     $this->ValidateNumericArray($a_ids);
     if (!count($a_ids)) {
         throw new Exception('No teams to delete');
     }
     $s_ids = join(', ', $a_ids);
     # Get more information on the teams
     $teams = array();
     $s_sql = "SELECT team_id, short_url, owner_role_id FROM nsa_team WHERE team_id IN ({$s_ids})";
     $result = $this->GetDataConnection()->query($s_sql);
     while ($row = $result->fetch()) {
         $team = new Team($this->GetSettings());
         $team->SetId($row->team_id);
         $team->SetShortUrl($row->short_url);
         $team->SetOwnerRoleId($row->owner_role_id);
         $teams[] = $team;
     }
     $result->closeCursor();
     # Check that current user is an admin or a team owner
     require_once "authentication/authentication-manager.class.php";
     $user = AuthenticationManager::GetUser();
     foreach ($teams as $team) {
         /* @var $team Team */
         if (!$user->Permissions()->HasPermission(PermissionType::MANAGE_TEAMS, $team->GetLinkedDataUri())) {
             throw new Exception("Unauthorised");
         }
     }
     # delete owner role
     $authentication_manager = new AuthenticationManager($this->GetSettings(), $this->GetDataConnection(), null);
     foreach ($teams as $team) {
         /* @var $team Team */
         if ($team->GetOwnerRoleId()) {
             $authentication_manager->DeleteRole($team->GetOwnerRoleId());
         }
     }
     unset($authentication_manager);
     # delete from short URL cache
     require_once 'http/short-url-manager.class.php';
     $o_url_manager = new ShortUrlManager($this->GetSettings(), $this->GetDataConnection());
     foreach ($teams as $team) {
         /* @var $team Team */
         $o_url_manager->Delete($team->GetShortUrl());
     }
     unset($o_url_manager);
     # Delete relationships to matches
     $s_match_link = $this->GetSettings()->GetTable('MatchTeam');
     $s_sql = 'DELETE FROM ' . $s_match_link . ' WHERE team_id IN (' . $s_ids . ') ';
     $this->GetDataConnection()->query($s_sql);
     # Delete relationships to competitions
     $s_season_link = $this->GetSettings()->GetTable('TeamSeason');
     $s_sql = 'DELETE FROM ' . $s_season_link . ' WHERE team_id IN (' . $s_ids . ') ';
     $this->GetDataConnection()->query($s_sql);
     # Delete players
     require_once "player-manager.class.php";
     $player_manager = new PlayerManager($this->GetSettings(), $this->GetDataConnection());
     $player_manager->ReadPlayersInTeam($a_ids);
     $players = $player_manager->GetItems();
     if (count($players)) {
         $player_ids = array();
         foreach ($players as $player) {
             $player_ids[] = $player->GetId();
         }
         $player_manager->Delete($player_ids);
     }
     unset($player_manager);
     # delete team(s)
     $s_sql = 'DELETE FROM nsa_team WHERE team_id IN (' . $s_ids . ') ';
     $this->GetDataConnection()->query($s_sql);
     return $this->GetDataConnection()->GetAffectedRows();
 }
 /**
  * @return void
  * @desc Re-build from data posted by this control the data object this control is editing
  */
 function BuildPostedDataObject()
 {
     $match = new Match($this->GetSettings());
     $match->SetId($this->GetDataObjectId());
     # Get match date
     $s_key = $this->GetNamingPrefix() . 'Date';
     if (isset($_POST[$s_key]) and strlen($_POST[$s_key]) and is_numeric($_POST[$s_key])) {
         $match->SetStartTime($_POST[$s_key]);
     }
     # Get team names
     $s_key = $this->GetNamingPrefix() . 'Home';
     if (isset($_POST[$s_key])) {
         $team_data = explode(MatchHighlightsEditControl::DATA_SEPARATOR, $_POST[$s_key], 2);
         if (count($team_data) == 2) {
             $o_home = new Team($this->GetSettings());
             $o_home->SetId($team_data[0]);
             $o_home->SetName($team_data[1]);
             $match->SetHomeTeam($o_home);
         }
     }
     $s_key = $this->GetNamingPrefix() . 'Away';
     if (isset($_POST[$s_key])) {
         $team_data = explode(MatchHighlightsEditControl::DATA_SEPARATOR, $_POST[$s_key], 2);
         if (count($team_data) == 2) {
             $o_away = new Team($this->GetSettings());
             $o_away->SetId($team_data[0]);
             $o_away->SetName($team_data[1]);
             $match->SetAwayTeam($o_away);
         }
     }
     # Get the result
     $s_key = $this->GetNamingPrefix() . 'Result';
     if (isset($_POST[$s_key])) {
         $s_result = $_POST[$s_key];
         if (strlen($s_result)) {
             $match->Result()->SetResultType($s_result);
         }
     }
     # Get players of the match. Fields to use depend on which radio button was selected.
     $s_key = $this->GetNamingPrefix() . 'POM';
     if (isset($_POST[$s_key])) {
         $pom_type = (int) $_POST[$s_key];
         if ($pom_type == MatchHighlightsEditControl::PLAYER_OF_THE_MATCH_OVERALL) {
             $s_key = $this->GetNamingPrefix() . 'Player';
             if (isset($_POST[$s_key]) and $_POST[$s_key]) {
                 $player = new Player($this->GetSettings());
                 $player->SetName($_POST[$s_key]);
                 $s_key = $this->GetNamingPrefix() . 'PlayerTeam';
                 if (isset($_POST[$s_key])) {
                     $player->Team()->SetId($_POST[$s_key]);
                 }
                 $match->Result()->SetPlayerOfTheMatch($player);
             }
         } else {
             if ($pom_type == MatchHighlightsEditControl::PLAYER_OF_THE_MATCH_HOME_AND_AWAY) {
                 $s_key = $this->GetNamingPrefix() . 'PlayerHome';
                 if (isset($_POST[$s_key]) and $_POST[$s_key]) {
                     $player = new Player($this->GetSettings());
                     $player->SetName($_POST[$s_key]);
                     $player->Team()->SetId($match->GetHomeTeamId());
                     $match->Result()->SetPlayerOfTheMatchHome($player);
                 }
                 $s_key = $this->GetNamingPrefix() . 'PlayerAway';
                 if (isset($_POST[$s_key]) and $_POST[$s_key]) {
                     $player = new Player($this->GetSettings());
                     $player->SetName($_POST[$s_key]);
                     $player->Team()->SetId($match->GetAwayTeamId());
                     $match->Result()->SetPlayerOfTheMatchAway($player);
                 }
             }
         }
     }
     $s_key = $this->GetNamingPrefix() . 'Comments';
     if (isset($_POST[$s_key])) {
         $match->SetNewComment($_POST[$s_key]);
     }
     $this->SetDataObject($match);
 }
 /**
  * Populates the collection of business objects from raw data
  *
  * @return bool
  * @param MySqlRawData $result
  */
 protected function BuildItems(MySqlRawData $result)
 {
     # use CollectionBuilder to handle duplicates
     $club_builder = new CollectionBuilder();
     $club = null;
     while ($row = $result->fetch()) {
         # check whether this is a new club
         if (!$club_builder->IsDone($row->club_id)) {
             # store any exisiting club
             if ($club != null) {
                 $this->Add($club);
             }
             # create the new club
             $club = new Club($this->GetSettings());
             $club->SetId($row->club_id);
             $club->SetName($row->club_name);
             $club->SetTypeOfClub($row->club_type);
             $club->SetHowManyPlayers($row->how_many_players);
             $club->SetAgeRangeLower($row->age_range_lower);
             $club->SetAgeRangeUpper($row->age_range_upper);
             $club->SetPlaysOutdoors($row->plays_outdoors);
             $club->SetPlaysIndoors($row->plays_indoors);
             $club->SetShortUrl($row->short_url);
             $club->SetTwitterAccount($row->twitter);
             $club->SetFacebookUrl($row->facebook);
             $club->SetInstagramAccount($row->instagram);
             $club->SetClubmarkAccredited($row->clubmark);
         }
         # team the only cause of multiple rows (so far) so add to current club
         if ($row->team_id) {
             $team = new Team($this->GetSettings());
             $team->SetId($row->team_id);
             $team->SetName($row->team_name);
             $team->SetShortUrl($row->team_short_url);
             $club->Add($team);
         }
     }
     # store final club
     if ($club != null) {
         $this->Add($club);
     }
 }
 /**
  * Builds data posted on pages 2/3 back into a match object
  * @return Match
  */
 private function BuildPostedScorecard()
 {
     $match = new Match($this->GetSettings());
     $match->SetId($this->GetDataObjectId());
     # Must have data on which team is which, otherwise none of the rest makes sense
     # Team ids are essential for saving data, while team names and match title are
     # purely so they can be redisplayed if the page is invalid
     $key = "teams";
     if (!isset($_POST[$key]) or strpos($_POST[$key], ScorecardEditControl::DATA_SEPARATOR) === false) {
         return $match;
     }
     $teams = explode(ScorecardEditControl::DATA_SEPARATOR, $_POST[$key], 6);
     if (count($teams) != 6) {
         return $match;
     }
     switch ($teams[0]) {
         case "0":
             $match->Result()->SetHomeBattedFirst(false);
             $home_batting = $this->GetCurrentPage() == 3;
             break;
         case "1":
             $match->Result()->SetHomeBattedFirst(true);
             $home_batting = $this->GetCurrentPage() == 2;
             break;
         default:
             $home_batting = $this->GetCurrentPage() == 2;
     }
     $home_team = new Team($this->GetSettings());
     $home_team->SetId($teams[1]);
     $home_team->SetName($teams[2]);
     $match->SetHomeTeam($home_team);
     $away_team = new Team($this->GetSettings());
     $away_team->SetId($teams[3]);
     $away_team->SetName($teams[4]);
     $match->SetAwayTeam($away_team);
     $match->SetTitle($teams[5]);
     # Read posted batting data
     $key = "batRows";
     if (isset($_POST[$key])) {
         # This controls not only which fields are read, but also which are redisplayed on an invalid postback or for the next innings.
         $match->SetMaximumPlayersPerTeam(intval($_POST[$key]));
     }
     for ($i = 1; $i <= $match->GetMaximumPlayersPerTeam(); $i++) {
         $key = "batName{$i}";
         if (isset($_POST[$key])) {
             # The row exists - has it been filled in?
             if (trim($_POST[$key])) {
                 # Read the batter data in this row
                 $player = new Player($this->GetSettings());
                 $player->SetName($_POST[$key]);
                 $player->Team()->SetId($home_batting ? $home_team->GetId() : $away_team->GetId());
                 $key = "batHowOut{$i}";
                 $how_out = (isset($_POST[$key]) and is_numeric($_POST[$key])) ? (int) $_POST[$key] : null;
                 $key = "batOutBy{$i}";
                 $dismissed_by = null;
                 if (isset($_POST[$key]) and trim($_POST[$key])) {
                     $dismissed_by = new Player($this->GetSettings());
                     $dismissed_by->SetName($_POST[$key]);
                     $dismissed_by->Team()->SetId($home_batting ? $away_team->GetId() : $home_team->GetId());
                 }
                 $key = "batBowledBy{$i}";
                 $bowler = null;
                 if (isset($_POST[$key]) and trim($_POST[$key])) {
                     $bowler = new Player($this->GetSettings());
                     $bowler->SetName($_POST[$key]);
                     $bowler->Team()->SetId($home_batting ? $away_team->GetId() : $home_team->GetId());
                 }
                 # Correct caught and bowled if marked as caught
                 if ($how_out == Batting::CAUGHT and !is_null($dismissed_by) and !is_null($bowler) and trim($dismissed_by->GetName()) == trim($bowler->GetName())) {
                     $how_out = Batting::CAUGHT_AND_BOWLED;
                     $dismissed_by = null;
                 }
                 $key = "batRuns{$i}";
                 $runs = (isset($_POST[$key]) and is_numeric($_POST[$key])) ? (int) $_POST[$key] : null;
                 $key = "batBalls{$i}";
                 $balls = (isset($_POST[$key]) and is_numeric($_POST[$key])) ? (int) $_POST[$key] : null;
                 # Add that batting performance to the match result
                 $batting = new Batting($player, $how_out, $dismissed_by, $bowler, $runs, $balls);
                 if ($home_batting) {
                     $match->Result()->HomeBatting()->Add($batting);
                 } else {
                     $match->Result()->AwayBatting()->Add($batting);
                 }
             }
         }
     }
     $key = "batByes";
     if (isset($_POST[$key]) and is_numeric($_POST[$key])) {
         $player = new Player($this->GetSettings());
         $player->SetPlayerRole(Player::BYES);
         $player->Team()->SetId($home_batting ? $home_team->GetId() : $away_team->GetId());
         $batting = new Batting($player, null, null, null, (int) $_POST[$key]);
         if ($home_batting) {
             $match->Result()->HomeBatting()->Add($batting);
         } else {
             $match->Result()->AwayBatting()->Add($batting);
         }
     }
     $key = "batWides";
     if (isset($_POST[$key]) and is_numeric($_POST[$key])) {
         $player = new Player($this->GetSettings());
         $player->SetPlayerRole(Player::WIDES);
         $player->Team()->SetId($home_batting ? $home_team->GetId() : $away_team->GetId());
         $batting = new Batting($player, null, null, null, (int) $_POST[$key]);
         if ($home_batting) {
             $match->Result()->HomeBatting()->Add($batting);
         } else {
             $match->Result()->AwayBatting()->Add($batting);
         }
     }
     $key = "batNoBalls";
     if (isset($_POST[$key]) and is_numeric($_POST[$key])) {
         $player = new Player($this->GetSettings());
         $player->SetPlayerRole(Player::NO_BALLS);
         $player->Team()->SetId($home_batting ? $home_team->GetId() : $away_team->GetId());
         $batting = new Batting($player, null, null, null, (int) $_POST[$key]);
         if ($home_batting) {
             $match->Result()->HomeBatting()->Add($batting);
         } else {
             $match->Result()->AwayBatting()->Add($batting);
         }
     }
     $key = "batBonus";
     if (isset($_POST[$key]) and is_numeric($_POST[$key])) {
         $player = new Player($this->GetSettings());
         $player->SetPlayerRole(Player::BONUS_RUNS);
         $player->Team()->SetId($home_batting ? $home_team->GetId() : $away_team->GetId());
         $batting = new Batting($player, null, null, null, (int) $_POST[$key]);
         if ($home_batting) {
             $match->Result()->HomeBatting()->Add($batting);
         } else {
             $match->Result()->AwayBatting()->Add($batting);
         }
     }
     $key = "batTotal";
     if (isset($_POST[$key]) and is_numeric($_POST[$key])) {
         if ($home_batting) {
             $match->Result()->SetHomeRuns($_POST[$key]);
         } else {
             $match->Result()->SetAwayRuns($_POST[$key]);
         }
     }
     $key = "batWickets";
     if (isset($_POST[$key]) and is_numeric($_POST[$key])) {
         if ($home_batting) {
             $match->Result()->SetHomeWickets($_POST[$key]);
         } else {
             $match->Result()->SetAwayWickets($_POST[$key]);
         }
     }
     # Read posted bowling data
     $key = "bowlerRows";
     if (isset($_POST[$key])) {
         # This controls not only which fields are read, but also which are redisplayed on an invalid postback or for the next innings.
         $match->SetOvers(intval($_POST[$key]));
     }
     for ($i = 1; $i <= $match->GetOvers(); $i++) {
         $key = "bowlerName{$i}";
         if (isset($_POST[$key])) {
             # The row exists - has it been filled in?
             if (trim($_POST[$key])) {
                 # Read the bowler data in this row
                 # strlen test allows 0 but not empty string, because is_numeric allows empty string
                 $player = new Player($this->GetSettings());
                 $player->SetName($_POST[$key]);
                 $player->Team()->SetId($home_batting ? $away_team->GetId() : $home_team->GetId());
                 $key = "bowlerBalls{$i}";
                 $balls = (isset($_POST[$key]) and is_numeric($_POST[$key]) and strlen(trim($_POST[$key]))) ? (int) $_POST[$key] : null;
                 $key = "bowlerNoBalls{$i}";
                 $no_balls = (isset($_POST[$key]) and is_numeric($_POST[$key]) and strlen(trim($_POST[$key]))) ? (int) $_POST[$key] : null;
                 $key = "bowlerWides{$i}";
                 $wides = (isset($_POST[$key]) and is_numeric($_POST[$key]) and strlen(trim($_POST[$key]))) ? (int) $_POST[$key] : null;
                 $key = "bowlerRuns{$i}";
                 $runs = (isset($_POST[$key]) and is_numeric($_POST[$key]) and strlen(trim($_POST[$key]))) ? (int) $_POST[$key] : null;
                 # Add that over to the match result
                 $bowling = new Over($player);
                 $bowling->SetBalls($balls);
                 $bowling->SetNoBalls($no_balls);
                 $bowling->SetWides($wides);
                 $bowling->SetRunsInOver($runs);
                 if ($home_batting) {
                     $match->Result()->AwayOvers()->Add($bowling);
                 } else {
                     $match->Result()->HomeOvers()->Add($bowling);
                 }
             }
         }
     }
     return $match;
 }
 /**
  * Builds a match object containing the result information posted by the control
  *
  */
 public function BuildPostedDataObject()
 {
     $match = new Match($this->GetSettings());
     $match->SetMatchType(MatchType::TOURNAMENT);
     # Get match id
     $s_key = $this->GetNamingPrefix() . 'item';
     if (isset($_POST[$s_key])) {
         $s_id = $_POST[$s_key];
         if (strlen($s_id)) {
             $match->SetId($s_id);
         }
     }
     # Get the title
     $s_key = $this->GetNamingPrefix() . 'Title';
     if (isset($_POST[$s_key])) {
         $match->SetTitle(strip_tags($_POST[$s_key]));
     }
     # Get the qualification type
     $s_key = $this->GetNamingPrefix() . 'Qualify';
     if (isset($_POST[$s_key])) {
         $match->SetQualificationType($_POST[$s_key]);
     }
     # Get the player type
     $s_key = $this->GetNamingPrefix() . 'PlayerType';
     if (isset($_POST[$s_key])) {
         $match->SetPlayerType($_POST[$s_key]);
     }
     $s_key = $this->GetNamingPrefix() . "Players";
     if (isset($_POST[$s_key]) and strlen($_POST[$s_key])) {
         $match->SetMaximumPlayersPerTeam($_POST[$s_key]);
     }
     # Get the number of overs
     $s_key = $this->GetNamingPrefix() . "Overs";
     if (isset($_POST[$s_key]) and strlen($_POST[$s_key])) {
         $match->SetOvers($_POST[$s_key]);
     }
     # Get the short URL
     $s_key = $this->GetNamingPrefix() . 'ShortUrl';
     if (isset($_POST[$s_key])) {
         $match->SetShortUrl($_POST[$s_key]);
     }
     # Get the start date
     $s_key = $this->GetNamingPrefix() . 'Start';
     $match->SetStartTime(DateControl::GetPostedTimestampUtc($s_key));
     $match->SetIsStartTimeKnown(DateControl::GetIsTimePosted($s_key));
     # Get the initial team
     $team = new Team($this->GetSettings());
     $s_key = $this->GetNamingPrefix() . 'ContextTeam';
     if (isset($_POST[$s_key]) and strlen($_POST[$s_key])) {
         $team->SetId($_POST[$s_key]);
         $match->AddAwayTeam($team);
     }
     # Get the ground
     $s_key = $this->GetNamingPrefix() . 'Ground';
     if (isset($_POST[$s_key]) and strlen($_POST[$s_key])) {
         $o_ground = new Ground($this->GetSettings());
         $o_ground->SetId($_POST[$s_key]);
         $match->SetGround($o_ground);
     }
     # Get the notes
     $s_key = $this->GetNamingPrefix() . 'Notes';
     if (isset($_POST[$s_key])) {
         $match->SetNotes($_POST[$s_key]);
     }
     $this->SetDataObject($match);
 }
 /**
  * Builds a match object containing the result information posted by the control
  *
  */
 public function BuildPostedDataObject()
 {
     $o_match = new Match($this->GetSettings());
     $o_match->SetId($this->GetDataObjectId());
     # Get match date
     $s_key = $this->GetNamingPrefix() . 'Date';
     if (isset($_POST[$s_key]) and strlen($_POST[$s_key]) and is_numeric($_POST[$s_key])) {
         $o_match->SetStartTime($_POST[$s_key]);
     }
     # Get team names
     $s_key = $this->GetNamingPrefix() . 'Home';
     if (isset($_POST[$s_key])) {
         $team_data = explode(";", $_POST[$s_key], 2);
         if (count($team_data) == 2) {
             $o_home = new Team($this->GetSettings());
             $o_home->SetId($team_data[0]);
             $o_home->SetName($team_data[1]);
             $o_match->SetHomeTeam($o_home);
         }
     }
     $s_key = $this->GetNamingPrefix() . 'Away';
     if (isset($_POST[$s_key])) {
         $team_data = explode(";", $_POST[$s_key], 2);
         if (count($team_data) == 2) {
             $o_away = new Team($this->GetSettings());
             $o_away->SetId($team_data[0]);
             $o_away->SetName($team_data[1]);
             $o_match->SetAwayTeam($o_away);
         }
     }
     # Get who batted first
     $s_key = $this->GetNamingPrefix() . 'BatFirst';
     if (isset($_POST[$s_key])) {
         $s_batted = $_POST[$s_key];
         if ($s_batted == 'home') {
             $o_match->Result()->SetHomeBattedFirst(true);
         } else {
             if ($s_batted == 'away') {
                 $o_match->Result()->SetHomeBattedFirst(false);
             }
         }
     }
     # Get the result
     $s_key = $this->GetNamingPrefix() . 'Result';
     if (isset($_POST[$s_key])) {
         $s_result = $_POST[$s_key];
         if (strlen($s_result)) {
             $o_match->Result()->SetResultType($s_result);
         }
     }
     # Get the home score
     $s_key = $this->GetNamingPrefix() . 'HomeRuns';
     if (isset($_POST[$s_key])) {
         $s_home_runs = $_POST[$s_key];
         if (strlen($s_home_runs)) {
             $o_match->Result()->SetHomeRuns($s_home_runs);
         }
     }
     $s_key = $this->GetNamingPrefix() . 'HomeWickets';
     if (isset($_POST[$s_key])) {
         $s_home_wickets = $_POST[$s_key];
         if (strlen($s_home_wickets)) {
             $o_match->Result()->SetHomeWickets($s_home_wickets);
         }
     }
     # Get the away score
     $s_key = $this->GetNamingPrefix() . 'AwayRuns';
     if (isset($_POST[$s_key])) {
         $s_away_runs = $_POST[$s_key];
         if (strlen($s_away_runs)) {
             $o_match->Result()->SetAwayRuns($s_away_runs);
         }
     }
     $s_key = $this->GetNamingPrefix() . 'AwayWickets';
     if (isset($_POST[$s_key])) {
         $s_away_wickets = $_POST[$s_key];
         if (strlen($s_away_wickets)) {
             $o_match->Result()->SetAwayWickets($s_away_wickets);
         }
     }
     $s_key = $this->GetNamingPrefix() . 'Comments';
     if (isset($_POST[$s_key])) {
         $o_match->SetNewComment($_POST[$s_key]);
     }
     $this->SetDataObject($o_match);
 }
 /**
  * Populates the collection of business objects from raw data
  *
  * @return bool
  * @param MySqlRawData $o_result
  */
 protected function BuildItems(MySqlRawData $o_result)
 {
     $this->Clear();
     $o_match_builder = new CollectionBuilder();
     $o_team_builder = new CollectionBuilder();
     $o_tournament_match_builder = new CollectionBuilder();
     $season_builder = new CollectionBuilder();
     while ($o_row = $o_result->fetch()) {
         if (!$o_match_builder->IsDone($o_row->match_id)) {
             if (isset($o_match)) {
                 $this->Add($o_match);
                 $o_team_builder->Reset();
                 $o_tournament_match_builder->Reset();
                 $season_builder->Reset();
             }
             # create new
             $o_match = new Match($this->GetSettings());
             $this->BuildMatchSummary($o_match, $o_row);
             if ($o_match->GetMatchType() == MatchType::TOURNAMENT_MATCH and isset($o_row->tournament_match_id)) {
                 $o_tourn = new Match($this->o_settings);
                 $o_tourn->SetMatchType(MatchType::TOURNAMENT);
                 $o_tourn->SetId($o_row->tournament_match_id);
                 if (isset($o_row->tournament_title)) {
                     $o_tourn->SetTitle($o_row->tournament_title);
                 }
                 if (isset($o_row->tournament_url)) {
                     $o_tourn->SetShortUrl($o_row->tournament_url);
                 }
                 $o_match->SetTournament($o_tourn);
                 unset($o_tourn);
             }
             if (isset($o_row->home_team_id) and !is_null($o_row->home_team_id)) {
                 $o_home = new Team($this->o_settings);
                 $o_home->SetId($o_row->home_team_id);
                 if (isset($o_row->home_team_name)) {
                     $o_home->SetName($o_row->home_team_name);
                 }
                 if (isset($o_row->home_short_url)) {
                     $o_home->SetShortUrl($o_row->home_short_url);
                 }
                 $o_match->SetHomeTeam($o_home);
                 unset($o_home);
             }
             $this->BuildGround($o_match, $o_row);
         }
         # Add away teams
         if (isset($o_row->away_team_id) && !$o_team_builder->IsDone($o_row->away_team_id)) {
             $o_away = new Team($this->o_settings);
             $o_away->SetId($o_row->away_team_id);
             if (isset($o_row->away_team_name)) {
                 $o_away->SetName($o_row->away_team_name);
             }
             if (isset($o_row->away_short_url)) {
                 $o_away->SetShortUrl($o_row->away_short_url);
             }
             $o_match->AddAwayTeam($o_away);
             unset($o_away);
         }
         # Add matches in tournament
         if (isset($o_row->match_id_in_tournament) and is_numeric($o_row->match_id_in_tournament) and !$o_tournament_match_builder->IsDone($o_row->match_id_in_tournament)) {
             $o_tmatch = new Match($this->o_settings);
             $o_tmatch->SetMatchType(MatchType::TOURNAMENT_MATCH);
             $o_tmatch->SetId($o_row->match_id_in_tournament);
             $o_tmatch->SetTitle($o_row->tournament_match_title);
             $o_tmatch->SetShortUrl($o_row->tournament_match_url);
             $o_tmatch->SetStartTime($o_row->tournament_match_time);
             $o_tmatch->SetIsStartTimeKnown($o_row->tournament_match_start_time_known);
             $o_tmatch->SetOrderInTournament($o_row->order_in_tournament);
             $o_match->AddMatchInTournament($o_tmatch);
             unset($o_tmatch);
         }
         # Add seasons
         $this->BuildSeason($o_match, $o_row, $season_builder);
     }
     # Add final match
     if (isset($o_match)) {
         $this->Add($o_match);
     }
     return true;
 }
 /**
  * Populates the collection of business objects from raw data
  *
  * @return bool
  * @param MySqlRawData $o_result
  */
 protected function BuildItems(MySqlRawData $o_result)
 {
     $this->Clear();
     $o_match_builder = new CollectionBuilder();
     $o_team_builder = new CollectionBuilder();
     while ($o_row = $o_result->fetch()) {
         if (!$o_match_builder->IsDone($o_row->match_id)) {
             if (isset($o_match)) {
                 $this->Add($o_match);
                 $o_team_builder->Reset();
             }
             # create new
             $o_match = new Match($this->GetSettings());
             $o_match->SetId($o_row->match_id);
             if (isset($o_row->start_time)) {
                 $o_match->SetStartTime($o_row->start_time);
             }
             if (isset($o_row->home_runs)) {
                 $o_match->Result()->SetHomeRuns($o_row->home_runs);
             }
             if (isset($o_row->away_runs)) {
                 $o_match->Result()->SetAwayRuns($o_row->away_runs);
             }
             if (isset($o_row->match_result_id)) {
                 $o_match->Result()->SetResultType($o_row->match_result_id);
             }
             if (isset($o_row->home_team_id) and !is_null($o_row->home_team_id)) {
                 $o_home = new Team($this->o_settings);
                 $o_home->SetId($o_row->home_team_id);
                 if (isset($o_row->home_team_name)) {
                     $o_home->SetName($o_row->home_team_name);
                 }
                 if (isset($o_row->home_short_url)) {
                     $o_home->SetShortUrl($o_row->home_short_url);
                 }
                 $o_match->SetHomeTeam($o_home);
                 unset($o_home);
             }
             if (isset($o_row->ground_id)) {
                 $o_ground = new Ground($this->GetSettings());
                 $o_ground->SetId($o_row->ground_id);
                 $o_match->SetGround($o_ground);
                 unset($o_ground);
             }
         }
         # Add away teams
         if (isset($o_row->away_team_id) && !$o_team_builder->IsDone($o_row->away_team_id)) {
             $o_away = new Team($this->o_settings);
             $o_away->SetId($o_row->away_team_id);
             if (isset($o_row->away_team_name)) {
                 $o_away->SetName($o_row->away_team_name);
             }
             if (isset($o_row->away_short_url)) {
                 $o_away->SetShortUrl($o_row->away_short_url);
             }
             $o_match->AddAwayTeam($o_away);
             unset($o_away);
         }
     }
     # Add final match
     if (isset($o_match)) {
         $this->Add($o_match);
     }
     return true;
 }
 /**
  * Builds a match object containing the result information posted by the control
  *
  */
 public function BuildPostedDataObject()
 {
     $o_match = new Match($this->GetSettings());
     # Get match id
     $s_key = $this->GetNamingPrefix() . 'item';
     if (isset($_POST[$s_key])) {
         $s_id = $_POST[$s_key];
         if (strlen($s_id)) {
             $o_match->SetId($s_id);
         }
     }
     # Get the short URL
     $s_key = $this->GetNamingPrefix() . 'ShortUrl';
     if (isset($_POST[$s_key])) {
         $o_match->SetShortUrl($_POST[$s_key]);
     }
     # Get the start date
     $s_key = $this->GetNamingPrefix() . 'Start';
     $o_match->SetStartTime(DateControl::GetPostedTimestampUtc($s_key));
     $o_match->SetIsStartTimeKnown(DateControl::GetIsTimePosted($s_key));
     # Get the home team
     # Test for (int)$_POST[$s_key] deliberately excludes "Not known" value, which is 0
     $o_home = new Team($this->GetSettings());
     $s_key = $this->GetNamingPrefix() . 'Home';
     if (isset($_POST[$s_key]) and strlen($_POST[$s_key]) and (int) $_POST[$s_key]) {
         $o_home->SetId($_POST[$s_key]);
         $o_match->SetHomeTeam($o_home);
     }
     # Get the away team
     # Test for (int)$_POST[$s_key] deliberately excludes "Not known" value, which is 0
     $o_away = new Team($this->GetSettings());
     $s_key = $this->GetNamingPrefix() . 'Away';
     if (isset($_POST[$s_key]) and strlen($_POST[$s_key]) and (int) $_POST[$s_key]) {
         $o_away->SetId($_POST[$s_key]);
         $o_match->SetAwayTeam($o_away);
     }
     # Get the ground
     $s_key = $this->GetNamingPrefix() . 'Ground';
     if (isset($_POST[$s_key]) and strlen($_POST[$s_key])) {
         $o_ground = new Ground($this->GetSettings());
         $o_ground->SetId($_POST[$s_key]);
         $o_match->SetGround($o_ground);
     }
     # Get the notes
     $s_key = $this->GetNamingPrefix() . 'Notes';
     if (isset($_POST[$s_key])) {
         $o_match->SetNotes($_POST[$s_key]);
     }
     # Get the match type
     $s_key = $this->GetNamingPrefix() . 'MatchType';
     if (isset($_POST[$s_key]) and is_numeric($_POST[$s_key])) {
         $o_match->SetMatchType($_POST[$s_key]);
     }
     # Get the tournament
     if ($o_match->GetMatchType() == MatchType::TOURNAMENT_MATCH) {
         $s_key = $this->GetNamingPrefix() . 'Tournament';
         if (isset($_POST[$s_key]) and is_numeric($_POST[$s_key])) {
             $tournament = new Match($this->GetSettings());
             $tournament->SetMatchType(MatchType::TOURNAMENT);
             $tournament->SetId($_POST[$s_key]);
             $o_match->SetTournament($tournament);
         }
     }
     # Get the season
     $s_key = $this->GetNamingPrefix() . 'Season';
     if (isset($_POST[$s_key]) and strlen($_POST[$s_key])) {
         $o_season = new Season($this->GetSettings());
         $o_season->SetId($_POST[$s_key]);
         $o_match->Seasons()->Add($o_season);
     }
     $this->SetDataObject($o_match);
 }
 /**
  * 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);
     }
 }
 /**
  * Populates the collection of business objects from raw data
  *
  * @return bool
  * @param MySqlRawData $result
  */
 protected function BuildItems(MySqlRawData $result)
 {
     # use CollectionBuilder to handle duplicates
     $school_builder = new CollectionBuilder();
     $school = null;
     while ($row = $result->fetch()) {
         # check whether this is a new school
         if (!$school_builder->IsDone($row->club_id)) {
             # store any exisiting school
             if ($school != null) {
                 $this->Add($school);
             }
             # create the new school
             $school = new School($this->GetSettings());
             $school->SetId($row->club_id);
             $school->SetName($row->club_name);
             $school->SetTypeOfClub($row->club_type);
             $school->SetHowManyPlayers($row->how_many_players);
             $school->SetAgeRangeLower($row->age_range_lower);
             $school->SetAgeRangeUpper($row->age_range_upper);
             $school->SetPlaysOutdoors($row->plays_outdoors);
             $school->SetPlaysIndoors($row->plays_indoors);
             $school->SetShortUrl($row->short_url);
             $school->SetTwitterAccount($row->twitter);
             $school->SetFacebookUrl($row->facebook);
             $school->SetInstagramAccount($row->instagram);
             $school->SetClubmarkAccredited($row->clubmark);
             # Infer partial address from school name
             $school_name = $school->GetName();
             $comma = strrpos($school_name, ",");
             if ($comma !== false) {
                 $school->Ground()->GetAddress()->SetTown(trim(substr($school_name, $comma + 1)));
                 $school->Ground()->GetAddress()->SetPaon(substr($school_name, 0, $comma));
             }
         }
         # team the only cause of multiple rows (so far) so add to current school
         if ($row->team_id) {
             $team = new Team($this->GetSettings());
             $team->SetId($row->team_id);
             $team->SetName($row->team_name);
             $team->SetShortUrl($row->team_short_url);
             $school->Add($team);
         }
     }
     # store final club
     if ($school != null) {
         $this->Add($school);
     }
 }
 /**
  * Populates the collection of business objects from raw data
  *
  * @return bool
  * @param MySqlRawData $o_result
  */
 protected function BuildItems(MySqlRawData $o_result)
 {
     /* @var $o_season Season */
     $this->Clear();
     # use CollectionBuilder to handle duplicates
     $o_season_builder = new CollectionBuilder();
     $o_team_builder = new CollectionBuilder();
     $o_rule_builder = new CollectionBuilder();
     $o_points_builder = new CollectionBuilder();
     $o_type_builder = new CollectionBuilder();
     $o_season = null;
     while ($o_row = $o_result->fetch()) {
         # check whether this is a new season
         if (!$o_season_builder->IsDone($o_row->season_id)) {
             # store any exisiting season and reset
             if ($o_season != null) {
                 $this->Add($o_season);
                 $o_team_builder->Reset();
                 $o_rule_builder->Reset();
                 $o_points_builder->Reset();
                 $o_type_builder->Reset();
             }
             # create the new season
             $o_season = new Season($this->GetSettings());
             $this->BuildSeason($o_season, $o_row);
         }
         # Teams the first cause of multiple rows
         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);
                 $ground = new Ground($this->GetSettings());
                 $ground->SetId($o_row->team_ground_id);
                 $o_team->SetGround($ground);
                 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);
             }
         }
         # Season rules
         if (isset($o_row->season_rule_id) and !$o_rule_builder->IsDone($o_row->season_rule_id)) {
             $o_mr = new MatchResult($o_row->match_result_id);
             $o_mr->SetHomePoints($o_row->home_points);
             $o_mr->SetAwayPoints($o_row->away_points);
             $o_season->PossibleResults()->Add($o_mr);
             unset($o_mr);
         }
         # Match types
         if (isset($o_row->season_match_type) and !$o_type_builder->IsDone($o_row->season_match_type)) {
             $o_season->MatchTypes()->Add((int) $o_row->season_match_type);
         }
     }
     # store final season
     if ($o_season != null) {
         $this->Add($o_season);
     }
     return true;
 }