/// <summary>
        /// Processes a game.
        /// </summary>
        /// <param name="operation"></param>
        private static void ProcessGame(Game currentGame, Operation operation)
        {
            try
            {
                _gameType = currentGame.GetGameType();

                if ( _gameType == GameType.ForfeitForRulesViolation )
                {
                    // In a forfeit for a rules violation, the team originally declared the winner is required to
                    // have their win exchanged for a loss, with the win going to their opponent. With this in mind,
                    // the next few steps make the winner the loser and the loser the winner.
                    string temp = currentGame.Loser;
                    currentGame.Loser = currentGame.Winner;
                    currentGame.Winner = temp;

                    decimal tempScore = currentGame.LoserScore;
                    currentGame.LoserScore = currentGame.WinnerScore;
                    currentGame.WinnerScore = tempScore;

                    decimal tempAdjustedScore = currentGame.LoserAdjustedScore;
                    currentGame.LoserAdjustedScore = currentGame.WinnerAdjustedScore;
                    currentGame.WinnerAdjustedScore = tempAdjustedScore;
                }

                // Now it's time to find the winner's and loser's rows in the Teams table so I can update them.
                SortedList<string, Team> winnerAndLoser = currentGame.GetWinnerAndLoser();
                Team winner = winnerAndLoser["Winner"];
                Team loser = winnerAndLoser["Loser"];

                ProcessTeams(winner, loser, operation, currentGame);
            }
            catch ( Exception ex )
            {
                Globals.ShowExceptionMessage(ex);
            }
        }
        /// <summary>
        /// Processes the two teams involved in the specified game.
        /// </summary>
        /// <param name="winner"></param>
        /// <param name="loser"></param>
        /// <param name="operation"></param>
        /// <param name="currentGame"></param>
        private static void ProcessTeams(Team winner, Team loser, Operation operation, Game currentGame)
        {
            try
            {
                if ( (winner == null) && (loser == null) )
                {
                    throw new Exception("Neither team could be found in the database.");
                }

                EditDataFromAllGames(winner, loser, operation, currentGame);

                if ( IsGameOutOfClass(winner, loser) )
                {
                    // One of the two teams is out of state, or the two teams are in different classifications,
                    // or one of the teams is an independent.
                    EditDataFromGamesOutOfClassification(winner, loser, operation, currentGame);
                }
                else
                {
                    // Both teams are in state and in the same classification.
                    EditDataFromGamesInClassification(winner, loser, operation, currentGame);

                    if ( currentGame.IsDistrictGame )
                    {
                        EditDataFromDistrictGames(winner, loser, operation, currentGame);
                    }
                    else if ( currentGame.IsPlayoffGame )
                    {
                        EditDataFromPlayoffGames(winner, loser, operation, currentGame);
                    }
                }
            }
            catch ( Exception ex )
            {
                Globals.ShowExceptionMessage(ex);
            }
        }
 /// <summary>
 /// Edits each team's data (wins, losses) from district games.
 /// </summary>
 /// <param name="winner"></param>
 /// <param name="loser"></param>
 /// <param name="operation"></param>
 /// <param name="currentGame"></param>
 private static void EditWinLossDataFromDistrictGames(Team winner, Team loser, Operation operation, Game currentGame)
 {
     try
     {
         winner.DistrictWins = operation(winner.DistrictWins, 1);
         loser.DistrictLosses = operation(loser.DistrictLosses, 1);
     }
     catch ( Exception ex )
     {
         Globals.ShowExceptionMessage(ex);
     }
 }
 /// <summary>
 /// Edits each team's data (wins, losses) from playoff games.
 /// </summary>
 /// <param name="winner"></param>
 /// <param name="loser"></param>
 /// <param name="operation"></param>
 /// <param name="currentGame"></param>
 private static void EditWinLossDataFromPlayoffGames(Team winner, Team loser, Operation operation, Game currentGame)
 {
     try
     {
         if ( _gameType != GameType.ForfeitForRulesViolation )
         {
             winner.PlayoffWins = operation(winner.PlayoffWins, 1);
             loser.PlayoffLosses = operation(loser.PlayoffLosses, 1);
         }
     }
     catch ( Exception ex )
     {
         Globals.ShowExceptionMessage(ex);
     }
 }
        /// <summary>
        /// Edits the DataModel's Teams table with data from the specified game.
        /// </summary>
        /// <param name="direction"></param>
        private static void EditTeams(Game currentGame, Direction direction)
        {
            try
            {
                Operation operation;

                // Decide whether the teams need to be edited up or down.
                // Up for new game, down then up for edited game, down for deleted game.
                switch ( direction )
                {
                    case Direction.Up:
                        operation = new Operation(Arithmetic.Add);
                        break;

                    case Direction.Down:
                        operation = new Operation(Arithmetic.Subtract);
                        break;

                    default:
                        throw new ArgumentException("direction");
                }

                ProcessGame(currentGame, operation);
            }
            catch ( Exception ex )
            {
                Globals.ShowExceptionMessage(ex);
            }
        }
        /// <summary>
        /// Edits each team's data (wins, losses, and first level rating points) from all games.
        /// </summary>
        /// <param name="winner"></param>
        /// <param name="loser"></param>
        /// <param name="operation"></param>
        /// <param name="currentGame"></param>
        private static void EditWinLossDataFromAllGames(Team winner, Team loser, Operation operation, Game currentGame)
        {
            try
            {
                if ( winner != null )
                {
                    winner.Wins = operation(winner.Wins, 1);

                    if ( _gameType == GameType.NonForfeit )
                    {
                        winner.RatingPointGames = operation(winner.RatingPointGames, 1);
                        winner.RatingPointsFirstLevel = operation(winner.RatingPointsFirstLevel, currentGame.WinnerRatingPoints);
                        winner.RatingPointsFirstLevelAverage = Arithmetic.Divide(winner.RatingPointsFirstLevel, winner.RatingPointGames);
                    }
                }

                if ( loser != null )
                {
                    loser.Losses = operation(loser.Losses, 1);

                    loser.RatingPointGames = operation(loser.RatingPointGames, 1);
                    // No need to increment/decrement loser.RatingPointsFirstLevel,
                    // for the operation will always be y = x + 0 or y = x - 0.
                    loser.RatingPointsFirstLevelAverage = Arithmetic.Divide(loser.RatingPointsFirstLevel, loser.RatingPointGames);
                }
            }
            catch ( Exception ex )
            {
                Globals.ShowExceptionMessage(ex);
            }
        }
        /// <summary>
        /// Edits each team's data (games, points for, points against) from playoff games.
        /// </summary>
        /// <param name="winner"></param>
        /// <param name="loser"></param>
        /// <param name="operation"></param>
        /// <param name="currentGame"></param>
        /// <param name="winnerScore"></param>
        /// <param name="loserScore"></param>
        private static void EditDataFromPlayoffGames(Team winner, Team loser, Operation operation, Game currentGame)
        {
            try
            {
                EditWinLossDataFromPlayoffGames(winner, loser, operation, currentGame);

                if ( _gameType == GameType.NonForfeit )
                {
                    winner.PlayoffGames = operation(winner.PlayoffGames, 1);
                    winner.PlayoffPointsFor = operation(winner.PlayoffPointsFor, currentGame.WinnerScore);
                    winner.PlayoffPointsAgainst = operation(winner.PlayoffPointsAgainst, currentGame.LoserScore);

                    loser.PlayoffGames = operation(loser.PlayoffGames, 1);
                    loser.PlayoffPointsFor = operation(loser.PlayoffPointsFor, currentGame.LoserScore);
                    loser.PlayoffPointsAgainst = operation(loser.PlayoffPointsAgainst, currentGame.WinnerScore);
                }
            }
            catch ( Exception ex )
            {
                Globals.ShowExceptionMessage(ex);
            }
        }
        /// <summary>
        /// Edits each team's data (games, adjusted points for, adjusted point against) from all games
        /// against teams outside the state or outside their classification
        /// </summary>
        /// <param name="winner"></param>
        /// <param name="loser"></param>
        /// <param name="operation"></param>
        /// <param name="winnerAdjustedScore"></param>
        /// <param name="loserAdjustedScore"></param>
        private static void EditDataFromGamesOutOfClassification(Team winner, Team loser, Operation operation, Game currentGame)
        {
            try
            {
                if ( _gameType != GameType.ForfeitForFailureToAppear )
                {
                    if ( winner != null )
                    {
                        winner.OutOfClassificationGames = operation(winner.OutOfClassificationGames, 1);
                        winner.OutOfClassificationAdjustedPointsFor
                            = operation(winner.OutOfClassificationAdjustedPointsFor, currentGame.WinnerAdjustedScore);
                        winner.OutOfClassificationAdjustedPointsAgainst
                            = operation(winner.OutOfClassificationAdjustedPointsAgainst, currentGame.LoserAdjustedScore);
                    }

                    if ( loser != null )
                    {
                        loser.OutOfClassificationGames = operation(loser.OutOfClassificationGames, 1);
                        loser.OutOfClassificationAdjustedPointsFor
                            = operation(loser.OutOfClassificationAdjustedPointsFor, currentGame.LoserAdjustedScore);
                        loser.OutOfClassificationAdjustedPointsAgainst
                            = operation(loser.OutOfClassificationAdjustedPointsAgainst, currentGame.WinnerAdjustedScore);
                    }
                }
            }
            catch ( Exception ex )
            {
                Globals.ShowExceptionMessage(ex);
            }
        }
        /// <summary>
        /// Edits each team's data (games, points for, points against) from district games.
        /// </summary>
        /// <param name="winner"></param>
        /// <param name="loser"></param>
        /// <param name="operation"></param>
        /// <param name="currentGame"></param>
        /// <param name="winnerScore"></param>
        /// <param name="loserScore"></param>
        private static void EditDataFromDistrictGames(Team winner, Team loser, Operation operation, Game currentGame)
        {
            try
            {
                EditWinLossDataFromDistrictGames(winner, loser, operation, currentGame);

                if ( _gameType != GameType.ForfeitForFailureToAppear )
                {
                    winner.DistrictGames = operation(winner.DistrictGames, 1);
                    winner.DistrictPointsFor = operation(winner.DistrictPointsFor, currentGame.WinnerScore);
                    winner.DistrictPointsAgainst = operation(winner.DistrictPointsAgainst, currentGame.LoserScore);

                    loser.DistrictGames = operation(loser.DistrictGames, 1);
                    loser.DistrictPointsFor = operation(loser.DistrictPointsFor, currentGame.LoserScore);
                    loser.DistrictPointsAgainst = operation(loser.DistrictPointsAgainst, currentGame.WinnerScore);
                }
            }
            catch ( Exception ex )
            {
                Globals.ShowExceptionMessage(ex);
            }
        }
        /// <summary>
        /// Stores values from the selected game into a Game instance.
        /// </summary>
        private Game StoreOldGameValues()
        {
            Game oldGame = null;

            try
            {
                oldGame = new Game
                {
                    ID = 0,
                    Week = SelectedGame.Week,
                    Guest = SelectedGame.Guest,
                    GuestScore = SelectedGame.GuestScore,
                    GuestAdjustedScore = SelectedGame.GuestAdjustedScore,
                    Host = SelectedGame.Host,
                    HostScore = SelectedGame.HostScore,
                    HostAdjustedScore = SelectedGame.HostAdjustedScore,
                    IsDistrictGame = SelectedGame.IsDistrictGame,
                    IsPlayoffGame = SelectedGame.IsPlayoffGame,
                    IsForfeit = SelectedGame.IsForfeit,
                    Notes = SelectedGame.Notes
                };

                oldGame.DecideWinnerAndLoser();
            }
            catch ( Exception ex )
            {
                Globals.ShowExceptionMessage(ex);
            }

            return oldGame;
        }
        /// <summary>
        /// Stores values from the data entry controls into a Game instance.
        /// </summary>
        /// <returns></returns>
        private Game StoreNewGameValues()
        {
            Game newGame = null;

            try
            {
                newGame = new Game
                {
                    ID = 0,
                    Week = this.Week,
                    Guest = this.Guest,
                    GuestScore = this.GuestScore,
                    GuestAdjustedScore = this.GuestAdjustedScore,
                    Host = this.Host,
                    HostScore = this.HostScore,
                    HostAdjustedScore = this.HostAdjustedScore,
                    IsDistrictGame = this.IsDistrictGame,
                    IsPlayoffGame = this.IsPlayoffGame,
                    IsForfeit = this.IsForfeit,
                    Notes = this.Notes
                };

                newGame.DecideWinnerAndLoser();
            }
            catch ( Exception ex )
            {
                Globals.ShowExceptionMessage(ex);
            }

            return newGame;
        }