private SubstitutionDetails ParsePitchingSub(string desc, string[] words, SubstitutionDetails subDetails)
        {
            bool didReplaceSecondaryPlayer = false;
            string secondaryPlayer = "";

            for (int i = 1; i < words.Length; i++)
            {
                if (words[i] == "replaces")
                {
                    subDetails.PlayerOutS = FindName( words, i + 1 );
                    subDetails.PlayerOut = _players[subDetails.PlayerOutS].ID;
                }

                if ((words[i - 1] == "Pitching" && words[i] == "Change:") || words[i].Contains("Pinch"))
                {
                    subDetails.PlayerInS = FindName( words, i + 1 );
                    subDetails.PlayerIn = _players[subDetails.PlayerInS].ID;
                }
                if (words[i] == "replacing")
                {
                    subDetails.PlayerOutS = FindName( words, i + 1 );
                    subDetails.PlayerOut = _players[subDetails.PlayerOutS].ID;
                }
            }
                subDetails.PlayerOutPos = _players[subDetails.PlayerOutS].CurrentPosition;
                subDetails.PlayerInPos = subDetails.PlayerOutPos;
                _players[subDetails.PlayerOutS].CurrentPosition = "";
                _players[subDetails.PlayerInS].CurrentPosition = subDetails.PlayerInPos;

            return subDetails;
        }
        public SubstitutionDetails ParseSubstitutionDescription(string ev, string desc)
        {
            SubstitutionDetails subDetails = new SubstitutionDetails();
            string[] words = CleanDescription( desc );

            string tempev = ev.ToLower();

            if (tempev == "pitching substitution" || tempev == "offensive sub")
                subDetails = ParsePitchingSub( desc, words, subDetails );
            else if (tempev == "defensive switch" || tempev == "defensive sub")
                subDetails = ParseDefensiveSub( desc, words, subDetails );

            return subDetails;
        }
        private SubstitutionDetails ParseDefensiveSub(string desc, string[] words, SubstitutionDetails subDetails)
        {
            bool changedPositions = false;
            bool isSpecialDefSwitch = false;

            for (int i = 1; i < words.Length; i++)
            {
                if (desc.Contains( "remains in the game as" ))
                {
                    // event: Defensive Switch, description: James Jones remains in the game as the center fielder.
                    // PlayerOut: ,  PlayerIn: ,  ( -1.-1 )
                    isSpecialDefSwitch = true;

                    subDetails.PlayerInS = FindName( words, i - 1);
                    subDetails.PlayerIn = _players[subDetails.PlayerInS].ID;

                    for(int j = i; j < words.Length; j++)
                    {
                        if (IsPosition( words[j] ))
                        {
                            subDetails.PlayerInPos = _conversion.FindPosition( words[j] );
                            break;
                        }
                        else if (IsPosition( words[j] + " " + words[j + 1] ))
                        {
                            subDetails.PlayerInPos = _conversion.FindPosition( words[j] + " " + words[j + 1] );
                            break;
                        }
                    }
                    break;
                }

                if (words[i - 1] == "Defensive" && words[i] == "Substitution:")
                {
                    subDetails.PlayerInS = FindName( words, i + 1 );
                    subDetails.PlayerIn = _players[subDetails.PlayerInS].ID;
                }

                if (words[i] == "replaces")
                {
                    try
                    {
                        if (IsPosition( words[i + 1] ))
                        {
                            subDetails.PlayerOutS = FindName( words, i + 2 );
                            subDetails.PlayerOut = _players[subDetails.PlayerOutS].ID;
                        }
                        else if (IsPosition( words[i + 1] + " " + words[i + 2] ))
                        {
                            subDetails.PlayerOutS = FindName( words, i + 3 );
                            subDetails.PlayerOut = _players[subDetails.PlayerOutS].ID;
                        }
                    }
                    catch (Exception) { }

                    if (!IsPosition( words[i + 1] ) && !IsPosition( words[i + 1] + " " + words[i + 2] ))
                    {
                        subDetails.PlayerOutS = FindName( words, i + 1 );
                        subDetails.PlayerOut = _players[subDetails.PlayerOutS].ID;
                    }
                }

                if (words[i] == "playing")
                {
                    // 	event: Defensive Sub, description: Defensive Substitution: Efren Navarro replaces first baseman C.  J.   Cron, batting 5th, playing first base.
                    //  PlayerOut: C.J. Cron, 1B PlayerIn: Efren Navarro,  ( -1.-1 )

                    changedPositions = true;
                    subDetails.PlayerInPos = _conversion.FindPosition( words[i] );
                }

                if (words[i - 1] == "Defensive" && words[i] == "switch")
                {
                    isSpecialDefSwitch = true;
                    for (int j = i; j < words.Length; j++)
                    {
                        if (words[j] == "from")
                        {
                            subDetails.PlayerOutPos = _conversion.FindPosition( words[j + 1] );
                        }
                        else if (words[j] == "to")
                        {
                            subDetails.PlayerInPos = _conversion.FindPosition( words[j + 1] );
                        }
                        else if (words[j] == "for")
                        {
                            subDetails.PlayerOutS = FindName( words, j + 1 );
                            subDetails.PlayerInS = subDetails.PlayerOutS;

                            subDetails.PlayerOut = _players[subDetails.PlayerOutS].ID;
                            subDetails.PlayerIn = _players[subDetails.PlayerOutS].ID;
                        }
                    }
                }
            }
            if (!isSpecialDefSwitch)
            {
                subDetails.PlayerOutPos = _players[subDetails.PlayerOutS].CurrentPosition;
                //if (!changedPositions)
                subDetails.PlayerInPos = subDetails.PlayerOutPos;
                _players[subDetails.PlayerOutS].CurrentPosition = "";
                _players[subDetails.PlayerInS].CurrentPosition = subDetails.PlayerInPos;
            }
            else
                _players[subDetails.PlayerInS].CurrentPosition = subDetails.PlayerInPos;

            return subDetails;
        }