Esempio n. 1
0
        public static string RemoveAllWhitespace(string text)
        {
            string result = text;

            result = result.Replace(" ", String.Empty);
            result = NhlBaseClass.RemoveWhitespaceCharacters(text);

            return(result);
        }
Esempio n. 2
0
        /// <summary>
        /// Finds the number of pages stat category
        /// </summary>
        protected static int GetPageCount(HtmlNode tableNode)
        {
            int resultsCount = NhlBaseClass.GetResultsCount(tableNode);

            // There are 30 results per page, so divide number of results by 30
            double numPages = Math.Ceiling(Convert.ToDouble(resultsCount) / 30);

            return(Convert.ToInt32(numPages));
        }
Esempio n. 3
0
        /// <summary>
        /// Gets a list of all the results in a stat category on fromDate and later
        /// </summary>
        /// <remarks>
        /// This method assumes that rows are sorted in descending order by date (newest to oldest).
        ///
        /// year defaults to the current year
        /// fromDate defaults to DateTime.MinValue
        ///
        /// </remarks>
        protected virtual List <HtmlNode> GetResultsForSeasonType([Optional] int year, NhlSeasonType nhlSeasonType, [Optional] DateTime fromDate)
        {
            year = NhlModelHelper.SetDefaultYear(year);

            List <HtmlNode> results = new List <HtmlNode>();

            HtmlNode firstPageTableNode = this.ParseHtmlTableFromPage(year, nhlSeasonType, 1);

            int numberOfResults = NhlBaseClass.GetResultsCount(firstPageTableNode);

            if (numberOfResults <= 0)
            {
                return(results);
            }

            int numberOfPages = NhlBaseClass.GetPageCount(firstPageTableNode);

            // Handle the first page. Go through each row and add it to the list of results. When we encounter a result with a date earlier than fromDate then we stop.
            List <HtmlNode> firstPageRows = NhlBaseClass.ParseRowsFromTable(firstPageTableNode);

            foreach (HtmlNode row in firstPageRows)
            {
                DateTime resultDate = this.ParseDateFromHtmlRow(row);
                if (resultDate < fromDate)
                {
                    return(results);
                }
                else
                {
                    results.Add(row);
                }
            }

            // Now similar code to handle the rest of the pages. Go through each row, add it to the list, stop when we hit a date prior to fromDate.
            for (int i = 2; i < numberOfPages + 1; i++)
            {
                HtmlNode tableNode = this.ParseHtmlTableFromPage(year, nhlSeasonType, i);

                List <HtmlNode> rows = NhlBaseClass.ParseRowsFromTable(tableNode);
                foreach (HtmlNode row in rows)
                {
                    DateTime resultDate = this.ParseDateFromHtmlRow(row);
                    if (resultDate < fromDate)
                    {
                        return(results);
                    }
                    else
                    {
                        results.Add(row);
                    }
                }
            }

            return(results);
        }
Esempio n. 4
0
 public static int ConvertStringToPeriod(string s)
 {
     s = NhlBaseClass.RemoveAllWhitespace(s);
     if (s.Equals("OT", StringComparison.InvariantCultureIgnoreCase))
     {
         return(4);
     }
     else
     {
         return(NhlBaseClass.ConvertStringToInt(s));
     }
 }
Esempio n. 5
0
        /// <summary>
        /// The nameText should be the officials number and name. Eg. #40 Steve Kozari
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
        private static Nhl_Games_Rtss_Summary_Officials_Item ParseOfficialsItem(string nameText)
        {
            Nhl_Games_Rtss_Summary_Officials_Item officialsItem = new Nhl_Games_Rtss_Summary_Officials_Item();

            officialsItem.OfficialType = Designation.None;

            int    officialsNumber = 0;
            string officialsName   = String.Empty;

            NhlBaseClass.ParseNameText(nameText, out officialsNumber, out officialsName);
            officialsItem.Number = officialsNumber;
            officialsItem.Name   = officialsName;

            return(officialsItem);
        }
Esempio n. 6
0
        private static Nhl_Games_Rtss_RosterParticipantItem ParseOfficial(HtmlNode row)
        {
            HtmlNode columnNode = row.SelectSingleNode(@"./td");
            string   nameText   = columnNode.InnerText.Trim();

            Nhl_Games_Rtss_RosterParticipantItem official = new Nhl_Games_Rtss_RosterParticipantItem();

            official.ParticipantType = ParticipantType.Official;

            int    officialsNumber = 0;
            string officialsName   = String.Empty;

            NhlBaseClass.ParseNameText(nameText, out officialsNumber, out officialsName);

            official.Number = officialsNumber;
            official.Name   = officialsName;

            return(official);
        }
Esempio n. 7
0
        /// <summary>
        /// Parse a csv line and return it as a NhlDraftBookModel
        /// </summary>
        private static Nhl_Draftbook ParseLine(string line)
        {
            string[] fields = line.Split(',');

            int expectedNumFields = 12;

            if (fields.Length != expectedNumFields)
            {
                Console.WriteLine("Expected {0} columns in line {1}", expectedNumFields, line);
                return(null);
            }

            Nhl_Draftbook model = new Nhl_Draftbook();

            model.Year     = NhlBaseClass.ConvertStringToInt(fields[0]);
            model.Round    = NhlBaseClass.ConvertStringToInt(fields[1]);
            model.Pick     = NhlBaseClass.ConvertStringToInt(fields[2]);
            model.Overall  = NhlBaseClass.ConvertStringToInt(fields[3]);
            model.Team     = fields[4];
            model.Name     = fields[5];
            model.Position = fields[6];
            model.POB      = fields[7];

            string height = fields[8];

            height = height.Replace(@"""", String.Empty).Replace(" ", String.Empty);
            string[] heightParts = height.Split('\'');
            if (heightParts.Length != 2)
            {
                model.HeightInches = 0;
            }
            else
            {
                model.HeightInches = NhlBaseClass.ConvertStringToInt(heightParts[0]) * 12 + NhlBaseClass.ConvertStringToInt(heightParts[1]);
            }

            model.WeightLbs     = NhlBaseClass.ConvertStringToInt(fields[9]);
            model.AmateurLeague = fields[10];
            model.AmateurTeam   = fields[11];

            return(model);
        }
Esempio n. 8
0
        public static void ParseNameText(string nameText, out int number, out string name)
        {
            nameText = NhlBaseClass.RemoveWhitespaceCharacters(nameText);
            nameText = nameText.Trim();

            Regex regex = new Regex(@"(?<number>\d+)(?<name>.*)");

            string numberString = regex.Match(nameText).Groups["number"].Value;

            if (String.IsNullOrWhiteSpace(numberString))
            {
                number = 0;
                name   = nameText.Trim();
            }
            else
            {
                number = Convert.ToInt32(numberString);
                name   = regex.Match(nameText).Groups["name"].Value.Trim();
            }
        }
Esempio n. 9
0
        /// <summary>
        /// Convert minutes in mm:ss format to seconds
        /// </summary>
        public static int ConvertMinutesToSeconds(string text)
        {
            string[] parts = text.Split(':');

            if (null == parts || parts.Length == 0)
            {
                return(0);
            }
            else if (parts.Length == 1)
            {
                return(NhlBaseClass.ConvertStringToInt(parts[0]));
            }
            else if (parts.Length == 2)
            {
                int minutes = NhlBaseClass.ConvertStringToInt(parts[0]);
                int seconds = NhlBaseClass.ConvertStringToInt(parts[1]);
                return((minutes * 60) + seconds);
            }
            else
            {
                throw new ArgumentException(String.Format("The string {0} could not be converted to seconds", text));
            }
        }
Esempio n. 10
0
        public static Nhl_Games_Rtss_Summary ParseHtmlBlob(int rtssReportId, string html)
        {
            if (String.IsNullOrWhiteSpace(html) || html.Equals("404"))
            {
                return(null);
            }

            Nhl_Games_Rtss_Summary model = new Nhl_Games_Rtss_Summary();

            model.NhlRtssReportModelId = rtssReportId;

            HtmlDocument htmlDocument = new HtmlDocument();

            htmlDocument.LoadHtml(html);
            HtmlNode documentNode = htmlDocument.DocumentNode;

            // Special Case
            // The html for this game doesn't follow the same format as the other games
            if (null != documentNode.SelectSingleNode(@"./html/head/link[@href='RO010002_files/editdata.mso']"))
            {
                return(NhlGamesRtssSummary.BruinsRangersSpecialCase(rtssReportId));
            }

            HtmlNode mainTableNode        = documentNode.SelectSingleNode(@".//table[@id='MainTable']");
            HtmlNode gameSummaryTableNode = documentNode.SelectSingleNode(@".//table[.//table[@id='GameInfo']]");

            if (null == gameSummaryTableNode)
            {
                return(null);
            }

            #region Get team names, score, game numbers

            HtmlNode visitorTableNode = gameSummaryTableNode.SelectSingleNode(@".//table[@id='Visitor']");
            HtmlNode homeTableNode    = gameSummaryTableNode.SelectSingleNode(@".//table[@id='Home']");

            HtmlNode visitorScoreNode = visitorTableNode.SelectNodes(@".//tr").ElementAt(1).SelectNodes(@".//tr/td").ElementAt(1);
            HtmlNode homeScoreNode    = homeTableNode.SelectNodes(@".//tr").ElementAt(1).SelectNodes(@".//tr/td").ElementAt(1);

            model.VisitorScore = Convert.ToInt32(visitorScoreNode.InnerText);
            model.HomeScore    = Convert.ToInt32(homeScoreNode.InnerText);

            HtmlNode visitorNameNode = visitorTableNode.SelectNodes(String.Format(@".{0}/tr", TBODY)).ElementAt(2).SelectSingleNode(@"./td");
            HtmlNode homeNameNode    = homeTableNode.SelectNodes(String.Format(@".{0}/tr", TBODY)).ElementAt(2).SelectSingleNode(@"./td");

            string[] visitorInfo = visitorNameNode.InnerHtml.RemoveSpecialWhitespaceCharacters().Split(new string[] { "<br>" }, StringSplitOptions.None);
            model.Visitor = visitorInfo.ElementAt(0);
            MatchCollection visitorGameNumbers = Regex.Matches(visitorInfo.ElementAt(1), @"\d+");
            model.VisitorGameNumber     = Convert.ToInt32(visitorGameNumbers[0].Value);
            model.VisitorAwayGameNumber = Convert.ToInt32(visitorGameNumbers[1].Value);

            string[] homeInfo = homeNameNode.InnerHtml.RemoveSpecialWhitespaceCharacters().Split(new string[] { "<br>" }, StringSplitOptions.None);
            model.Home = homeInfo.ElementAt(0);
            MatchCollection homeGameNumbers = Regex.Matches(homeInfo.ElementAt(1), @"\d+");
            model.HomeGameNumber     = Convert.ToInt32(homeGameNumbers[0].Value);
            model.HomeHomeGameNumber = Convert.ToInt32(homeGameNumbers[1].Value);

            #endregion

            #region Date, time, attendance, league game number

            HtmlNode           gameInfoTableNode = gameSummaryTableNode.SelectSingleNode(@".//table[@id='GameInfo']");
            HtmlNodeCollection gameInfoRowNodes  = gameInfoTableNode.SelectNodes(@".//tr");

            // Special Case
            // A workaround for a bug in one of the reports which should actually be Wednesday, October 3, 2007
            string gameDateText = gameInfoRowNodes[3].InnerText.RemoveSpecialWhitespaceCharacters();
            if (gameDateText.Equals("Saturday, October 2, 2007", StringComparison.InvariantCultureIgnoreCase))
            {
                gameDateText = "Wednesday, October 3, 2007";
            }

            DateTime gameDate = DateTime.Parse(gameDateText);
            model.Date = gameDate;

            string attendanceAndArenaText = gameInfoRowNodes[4].InnerText.RemoveSpecialWhitespaceCharacters();
            attendanceAndArenaText = attendanceAndArenaText.Replace("&nbsp;", " ").Replace(",", String.Empty);

            Match  attendanceMatch    = Regex.Match(attendanceAndArenaText, @"\d+");
            string attendanceAsString = String.IsNullOrWhiteSpace(attendanceMatch.Value) ? "0" : attendanceMatch.Value;
            model.Attendance = Convert.ToInt32(attendanceAsString);

            // Find 'at' and assume the arena name follows
            string token      = " at ";
            int    tokenIndex = attendanceAndArenaText.IndexOf(token, StringComparison.InvariantCultureIgnoreCase);

            // If 'at' can't be found, try '@'
            if (tokenIndex < 0)
            {
                token      = " @ ";
                tokenIndex = attendanceAndArenaText.IndexOf(token, StringComparison.InvariantCultureIgnoreCase);
            }

            int arenaNameIndex = tokenIndex + token.Length;

            if (tokenIndex >= 0)
            {
                model.ArenaName = attendanceAndArenaText.Substring(arenaNameIndex);
            }
            else
            {
                // just take the whole string
                model.ArenaName = attendanceAndArenaText;
            }

            model.ArenaName = model.ArenaName.Replace("&amp;", "&").Trim();

            model.GameStatus = gameInfoRowNodes[7].InnerText.RemoveSpecialWhitespaceCharacters();

            if (model.GameStatus.Equals("Final", StringComparison.InvariantCultureIgnoreCase))
            {
                string[] startAndEndTimes = gameInfoRowNodes[5].InnerText.RemoveSpecialWhitespaceCharacters().Split(new string[] { ";", "&nbsp;" }, StringSplitOptions.None);
                model.StartTime = String.Concat(startAndEndTimes[1], " ", startAndEndTimes[2]);
                model.EndTime   = String.Concat(startAndEndTimes[4], " ", startAndEndTimes[5]);
            }

            Match leagueGameNumberMatch = Regex.Match(gameInfoRowNodes[6].InnerText, @"\d+");
            model.LeagueGameNumber = Convert.ToInt32(leagueGameNumberMatch.Value);

            #endregion

            #region Scoring Summary

            //model.ScoringSummary = new List<Nhl_Games_Rtss_Summary_ScoringSummary_Item>();

            HtmlNode           scoringSummaryTableNode = mainTableNode.SelectSingleNode(@".//table[.//td[text()[contains(.,'SCORING SUMMARY')]]]/../..").NextSibling.NextSibling.SelectSingleNode(@".//table");
            HtmlNodeCollection scoringSummaryTableRows = scoringSummaryTableNode.SelectNodes(@".//tr");

            if (scoringSummaryTableRows != null && scoringSummaryTableRows.Count > 0)
            {
                HtmlNode scoringSummaryTableTeam1Node = scoringSummaryTableRows[0].SelectNodes(@".//td")[8];
                HtmlNode scoringSummaryTableTeam2Node = scoringSummaryTableRows[0].SelectNodes(@".//td")[9];

                string scoringSummaryOnIceTeam1 = scoringSummaryTableTeam1Node.InnerText.Substring(0, scoringSummaryTableTeam1Node.InnerText.IndexOf(' '));
                string scoringSummaryOnIceTeam2 = scoringSummaryTableTeam2Node.InnerText.Substring(0, scoringSummaryTableTeam2Node.InnerText.IndexOf(' '));

                for (int i = 1; i < scoringSummaryTableRows.Count; i++)
                {
                    HtmlNodeCollection scoringSummaryRowFields = scoringSummaryTableRows[i].SelectNodes(@".//td");
                    Nhl_Games_Rtss_Summary_ScoringSummary_Item scoringSummaryItem = new Nhl_Games_Rtss_Summary_ScoringSummary_Item();
                    scoringSummaryItem.Date          = model.Date;
                    scoringSummaryItem.GoalNumber    = NhlBaseClass.ConvertStringToInt(scoringSummaryRowFields[0].InnerText);
                    scoringSummaryItem.Period        = scoringSummaryRowFields[1].InnerText;
                    scoringSummaryItem.TimeInSeconds = NhlBaseClass.ConvertMinutesToSeconds(scoringSummaryRowFields[2].InnerText);
                    scoringSummaryItem.Strength      = scoringSummaryRowFields[3].InnerText;
                    scoringSummaryItem.Team          = scoringSummaryRowFields[4].InnerText;

                    string goalScorerText = scoringSummaryRowFields[5].InnerText;
                    int    index1         = goalScorerText.IndexOf(' ');
                    int    index2         = goalScorerText.IndexOf('(');
                    int    index3         = goalScorerText.IndexOf(')');
                    if (index1 >= 0)
                    {
                        scoringSummaryItem.GoalScorerPlayerNumber = NhlBaseClass.ConvertStringToInt(goalScorerText.Substring(0, index1));
                    }

                    if (index2 >= index1 + 1)
                    {
                        scoringSummaryItem.GoalScorer = goalScorerText.Substring(index1 + 1, index2 - index1 - 1);
                    }
                    else
                    {
                        scoringSummaryItem.GoalScorer = goalScorerText;
                    }

                    if (index3 >= index2 + 1)
                    {
                        scoringSummaryItem.GoalScorerGoalNumber = NhlBaseClass.ConvertStringToInt(goalScorerText.Substring(index2 + 1, index3 - index2 - 1));
                    }


                    // If this was a penalty shot, there is one less column after Assist1
                    int penaltyShotOffset = 0;

                    string assist1Text = scoringSummaryRowFields[6].InnerText;

                    if (assist1Text.IndexOf("Penalty Shot", StringComparison.InvariantCultureIgnoreCase) >= 0)
                    {
                        penaltyShotOffset = -1;
                    }

                    index1 = assist1Text.IndexOf(' ');
                    index2 = assist1Text.IndexOf('(');
                    index3 = assist1Text.IndexOf(')');
                    if (index1 >= 0)
                    {
                        scoringSummaryItem.Assist1PlayerNumber = NhlBaseClass.ConvertStringToInt(assist1Text.Substring(0, index1));
                    }
                    if (index2 >= index1 + 1)
                    {
                        scoringSummaryItem.Assist1 = assist1Text.Substring(index1 + 1, index2 - index1 - 1);
                    }
                    else
                    {
                        scoringSummaryItem.Assist1 = assist1Text;
                    }

                    if (index3 >= index2 + 1)
                    {
                        scoringSummaryItem.Assist1AssistNumber = NhlBaseClass.ConvertStringToInt(assist1Text.Substring(index2 + 1, index3 - index2 - 1));
                    }

                    string assist2Text = scoringSummaryRowFields[7 + penaltyShotOffset].InnerText;
                    index1 = assist2Text.IndexOf(' ');
                    index2 = assist2Text.IndexOf('(');
                    index3 = assist2Text.IndexOf(')');
                    if (index1 >= 0)
                    {
                        scoringSummaryItem.Assist2PlayerNumber = NhlBaseClass.ConvertStringToInt(assist2Text.Substring(0, index1));
                    }

                    if (index2 >= index1 + 1)
                    {
                        scoringSummaryItem.Assist2 = assist2Text.Substring(index1 + 1, index2 - index1 - 1);
                    }
                    else
                    {
                        scoringSummaryItem.Assist2 = assist2Text;
                    }

                    if (index3 >= index2 + 1)
                    {
                        scoringSummaryItem.Assist2AssistNumber = NhlBaseClass.ConvertStringToInt(assist2Text.Substring(index2 + 1, index3 - index2 - 1));
                    }

                    scoringSummaryItem.VisitorOnIce = NhlBaseClass.RemoveAllWhitespace(scoringSummaryRowFields[8 + penaltyShotOffset].InnerText);
                    scoringSummaryItem.HomeOnIce    = NhlBaseClass.RemoveAllWhitespace(scoringSummaryRowFields[9 + penaltyShotOffset].InnerText);

                    model.ScoringSummary.Add(scoringSummaryItem);
                }
            }

            #endregion

            #region Penalty Summary

            // Get the 4 child tables that have width=50%
            HtmlNodeCollection penaltySummaryTableNodes = mainTableNode.SelectNodes(@".//table[@id='PenaltySummary']//table//table//td[@width='50%']/table");

            HtmlNodeCollection visitorPenaltySummaryNodes = penaltySummaryTableNodes[0].SelectNodes(String.Format(@".{0}/tr", TBODY));
            HtmlNodeCollection homePenaltySummaryNodes    = penaltySummaryTableNodes[1].SelectNodes(String.Format(@".{0}/tr", TBODY));

            for (int i = 1; i < visitorPenaltySummaryNodes.Count; i++)
            {
                Nhl_Games_Rtss_Summary_PenaltySummary_Item penaltySummaryItem = new Nhl_Games_Rtss_Summary_PenaltySummary_Item();
                penaltySummaryItem.Team = model.Visitor;
                penaltySummaryItem.Date = model.Date;

                HtmlNodeCollection penaltySummaryRowFields = visitorPenaltySummaryNodes[i].SelectNodes(@"./td");

                penaltySummaryItem.PenaltyNumber = NhlBaseClass.ConvertStringToInt(penaltySummaryRowFields[0].InnerText);
                penaltySummaryItem.Period        = penaltySummaryRowFields[1].InnerText;
                penaltySummaryItem.TimeInSeconds = NhlBaseClass.ConvertMinutesToSeconds(penaltySummaryRowFields[2].InnerText);

                HtmlNodeCollection penaltySummaryPlayerTableRows = penaltySummaryRowFields[3].SelectNodes(@".//td");
                penaltySummaryItem.PlayerNumber = NhlBaseClass.ConvertStringToInt(penaltySummaryPlayerTableRows[0].InnerText);
                penaltySummaryItem.Name         = penaltySummaryPlayerTableRows[3].InnerText;
                Debug.Assert(!String.IsNullOrWhiteSpace(penaltySummaryItem.Name));

                penaltySummaryItem.PIM     = NhlBaseClass.ConvertStringToInt(penaltySummaryRowFields[4].InnerText);
                penaltySummaryItem.Penalty = penaltySummaryRowFields[5].InnerText;

                model.PenaltySummary.Add(penaltySummaryItem);
            }

            for (int i = 1; i < homePenaltySummaryNodes.Count; i++)
            {
                Nhl_Games_Rtss_Summary_PenaltySummary_Item penaltySummaryItem = new Nhl_Games_Rtss_Summary_PenaltySummary_Item();

                HtmlNodeCollection penaltySummaryRowFields = homePenaltySummaryNodes[i].SelectNodes(@"./td");
                penaltySummaryItem.Team = model.Home;
                penaltySummaryItem.Date = model.Date;

                penaltySummaryItem.PenaltyNumber = NhlBaseClass.ConvertStringToInt(penaltySummaryRowFields[0].InnerText);
                penaltySummaryItem.Period        = penaltySummaryRowFields[1].InnerText;
                penaltySummaryItem.TimeInSeconds = NhlBaseClass.ConvertMinutesToSeconds(penaltySummaryRowFields[2].InnerText);

                HtmlNodeCollection penaltySummaryPlayerTableRows = penaltySummaryRowFields[3].SelectNodes(@".//td");
                penaltySummaryItem.PlayerNumber = NhlBaseClass.ConvertStringToInt(penaltySummaryPlayerTableRows[0].InnerText);
                penaltySummaryItem.Name         = penaltySummaryPlayerTableRows[3].InnerText;
                Debug.Assert(!String.IsNullOrWhiteSpace(penaltySummaryItem.Name));

                penaltySummaryItem.PIM     = NhlBaseClass.ConvertStringToInt(penaltySummaryRowFields[4].InnerText);
                penaltySummaryItem.Penalty = penaltySummaryRowFields[5].InnerText;

                model.PenaltySummary.Add(penaltySummaryItem);
            }

            // Ignore these sections. They can be calculated by Penalty Summary and Power Play sections.
            //HtmlNodeCollection visitorPenaltySummaryTotalsNodes = penaltySummaryTableNodes[2].SelectNodes(String.Format(@".{0}/tr", TBODY));
            //HtmlNodeCollection homePenaltySummaryTotalsNodes = penaltySummaryTableNodes[3].SelectNodes(String.Format(@".{0}/tr", TBODY));

            #endregion

            #region By Period Summary

            HtmlNodeCollection periodSummaryTableNodes = mainTableNode.SelectNodes(@".//td[text()[contains(.,'BY PERIOD')]]/../..//td[@width='50%']/table");

            HtmlNodeCollection periodSummaryVisitorRows = periodSummaryTableNodes[0].SelectNodes(@".//tr");
            for (int i = 1; i < periodSummaryVisitorRows.Count - 1; i++)
            {
                HtmlNodeCollection periodSummaryVisitorRowFields            = periodSummaryVisitorRows[i].SelectNodes(@".//td");
                Nhl_Games_Rtss_Summary_PeriodSummary_Item periodSummaryItem = new Nhl_Games_Rtss_Summary_PeriodSummary_Item();
                periodSummaryItem.Team = model.Visitor;
                periodSummaryItem.Date = model.Date;

                periodSummaryItem.Period    = periodSummaryVisitorRowFields[0].InnerText;
                periodSummaryItem.Goals     = NhlBaseClass.ConvertStringToInt(periodSummaryVisitorRowFields[1].InnerText);
                periodSummaryItem.Shots     = NhlBaseClass.ConvertStringToInt(periodSummaryVisitorRowFields[2].InnerText);
                periodSummaryItem.Penalties = NhlBaseClass.ConvertStringToInt(periodSummaryVisitorRowFields[3].InnerText);
                periodSummaryItem.PIM       = NhlBaseClass.ConvertStringToInt(periodSummaryVisitorRowFields[4].InnerText);
                model.PeriodSummary.Add(periodSummaryItem);
            }

            HtmlNodeCollection periodSummaryHomeRows = periodSummaryTableNodes[1].SelectNodes(@".//tr");
            for (int i = 1; i < periodSummaryHomeRows.Count - 1; i++)
            {
                HtmlNodeCollection periodSummaryHomeRowFields = periodSummaryHomeRows[i].SelectNodes(@".//td");
                Nhl_Games_Rtss_Summary_PeriodSummary_Item periodSummaryItem = new Nhl_Games_Rtss_Summary_PeriodSummary_Item();
                periodSummaryItem.Team = model.Home;
                periodSummaryItem.Date = model.Date;

                periodSummaryItem.Period    = periodSummaryHomeRowFields[0].InnerText;
                periodSummaryItem.Goals     = NhlBaseClass.ConvertStringToInt(periodSummaryHomeRowFields[1].InnerText);
                periodSummaryItem.Shots     = NhlBaseClass.ConvertStringToInt(periodSummaryHomeRowFields[2].InnerText);
                periodSummaryItem.Penalties = NhlBaseClass.ConvertStringToInt(periodSummaryHomeRowFields[3].InnerText);
                periodSummaryItem.PIM       = NhlBaseClass.ConvertStringToInt(periodSummaryHomeRowFields[4].InnerText);
                model.PeriodSummary.Add(periodSummaryItem);
            }

            #endregion

            #region Power Play and Even Strength Summary

            //model.PowerPlaySummary.Team = model.Visitor;
            //model.PowerPlaySummary.Date = model.Date;
            //model.HomePowerPlaySummary.Team = model.Home;
            //model.HomePowerPlaySummary.Date = model.Date;

            HtmlNodeCollection powerPlaySummaryTableNodes  = mainTableNode.SelectNodes(@".//td[text()[contains(.,'POWER PLAY')]]/../..//td[@width='50%']/table");
            HtmlNodeCollection powerPlaySummaryVisitorRows = powerPlaySummaryTableNodes[0].SelectNodes(@".//tr");
            HtmlNodeCollection powerPlaySummaryHomeRows    = powerPlaySummaryTableNodes[1].SelectNodes(@".//tr");

            Nhl_Games_Rtss_Summary_PowerPlaySummary_Item powerPlayVisitorItem = new Nhl_Games_Rtss_Summary_PowerPlaySummary_Item();
            powerPlayVisitorItem.Team = model.Visitor;
            powerPlayVisitorItem.Date = model.Date;

            Nhl_Games_Rtss_Summary_PowerPlaySummary_Item powerPlayHomeItem = new Nhl_Games_Rtss_Summary_PowerPlaySummary_Item();
            powerPlayHomeItem.Team = model.Home;
            powerPlayHomeItem.Date = model.Date;

            string powerPlayText = String.Empty;

            // Power Play Visitor
            if (powerPlaySummaryVisitorRows != null & powerPlaySummaryVisitorRows.Count >= 2)
            {
                HtmlNodeCollection powerPlaySummaryVisitorRowFields = powerPlaySummaryVisitorRows[1].SelectNodes(@".//td");

                powerPlayText = powerPlaySummaryVisitorRowFields[0].InnerText;
                if (powerPlayText.IndexOf('-') >= 0 && powerPlayText.IndexOf('/') >= 0)
                {
                    int dash  = powerPlayText.IndexOf('-');
                    int slash = powerPlayText.IndexOf('/');
                    powerPlayVisitorItem.PowerPlay5v4Goals       = NhlBaseClass.ConvertStringToInt(powerPlayText.Substring(0, dash));
                    powerPlayVisitorItem.PowerPlay5v4Occurrences = NhlBaseClass.ConvertStringToInt(powerPlayText.Substring(dash + 1, slash - dash - 1));
                    powerPlayVisitorItem.PowerPlay5v4ToiSeconds  = NhlBaseClass.ConvertMinutesToSeconds(powerPlayText.Substring(slash + 1, powerPlayText.Length - slash - 1));
                }
                powerPlayText = powerPlaySummaryVisitorRowFields[1].InnerText;
                if (powerPlayText.IndexOf('-') >= 0 && powerPlayText.IndexOf('/') >= 0)
                {
                    int dash  = powerPlayText.IndexOf('-');
                    int slash = powerPlayText.IndexOf('/');
                    powerPlayVisitorItem.PowerPlay5v3Goals       = NhlBaseClass.ConvertStringToInt(powerPlayText.Substring(0, dash));
                    powerPlayVisitorItem.PowerPlay5v3Occurrences = NhlBaseClass.ConvertStringToInt(powerPlayText.Substring(dash + 1, slash - dash - 1));
                    powerPlayVisitorItem.PowerPlay5v3ToiSeconds  = NhlBaseClass.ConvertMinutesToSeconds(powerPlayText.Substring(slash + 1, powerPlayText.Length - slash - 1));
                }
                powerPlayText = powerPlaySummaryVisitorRowFields[2].InnerText;
                if (powerPlayText.IndexOf('-') >= 0 && powerPlayText.IndexOf('/') >= 0)
                {
                    int dash  = powerPlayText.IndexOf('-');
                    int slash = powerPlayText.IndexOf('/');
                    powerPlayVisitorItem.PowerPlay4v3Goals       = NhlBaseClass.ConvertStringToInt(powerPlayText.Substring(0, dash));
                    powerPlayVisitorItem.PowerPlay4v3Occurrences = NhlBaseClass.ConvertStringToInt(powerPlayText.Substring(dash + 1, slash - dash - 1));
                    powerPlayVisitorItem.PowerPlay4v3ToiSeconds  = NhlBaseClass.ConvertMinutesToSeconds(powerPlayText.Substring(slash + 1, powerPlayText.Length - slash - 1));
                }
            }

            // Power Play Home
            if (powerPlaySummaryHomeRows != null & powerPlaySummaryHomeRows.Count >= 2)
            {
                HtmlNodeCollection powerPlaySummaryHomeRowFields = powerPlaySummaryHomeRows[1].SelectNodes(@".//td");

                powerPlayText = powerPlaySummaryHomeRowFields[0].InnerText;
                if (powerPlayText.IndexOf('-') >= 0 && powerPlayText.IndexOf('/') >= 0)
                {
                    int dash  = powerPlayText.IndexOf('-');
                    int slash = powerPlayText.IndexOf('/');
                    powerPlayHomeItem.PowerPlay5v4Goals       = NhlBaseClass.ConvertStringToInt(powerPlayText.Substring(0, dash));
                    powerPlayHomeItem.PowerPlay5v4Occurrences = NhlBaseClass.ConvertStringToInt(powerPlayText.Substring(dash + 1, slash - dash - 1));
                    powerPlayHomeItem.PowerPlay5v4ToiSeconds  = NhlBaseClass.ConvertMinutesToSeconds(powerPlayText.Substring(slash + 1, powerPlayText.Length - slash - 1));
                }
                powerPlayText = powerPlaySummaryHomeRowFields[1].InnerText;
                if (powerPlayText.IndexOf('-') >= 0 && powerPlayText.IndexOf('/') >= 0)
                {
                    int dash  = powerPlayText.IndexOf('-');
                    int slash = powerPlayText.IndexOf('/');
                    powerPlayHomeItem.PowerPlay5v3Goals       = NhlBaseClass.ConvertStringToInt(powerPlayText.Substring(0, dash));
                    powerPlayHomeItem.PowerPlay5v3Occurrences = NhlBaseClass.ConvertStringToInt(powerPlayText.Substring(dash + 1, slash - dash - 1));
                    powerPlayHomeItem.PowerPlay5v3ToiSeconds  = NhlBaseClass.ConvertMinutesToSeconds(powerPlayText.Substring(slash + 1, powerPlayText.Length - slash - 1));
                }
                powerPlayText = powerPlaySummaryHomeRowFields[2].InnerText;
                if (powerPlayText.IndexOf('-') >= 0 && powerPlayText.IndexOf('/') >= 0)
                {
                    int dash  = powerPlayText.IndexOf('-');
                    int slash = powerPlayText.IndexOf('/');
                    powerPlayHomeItem.PowerPlay4v3Goals       = NhlBaseClass.ConvertStringToInt(powerPlayText.Substring(0, dash));
                    powerPlayHomeItem.PowerPlay4v3Occurrences = NhlBaseClass.ConvertStringToInt(powerPlayText.Substring(dash + 1, slash - dash - 1));
                    powerPlayHomeItem.PowerPlay4v3ToiSeconds  = NhlBaseClass.ConvertMinutesToSeconds(powerPlayText.Substring(slash + 1, powerPlayText.Length - slash - 1));
                }
            }

            HtmlNodeCollection evenStrengthSummaryTableNodes = mainTableNode.SelectNodes(@".//td[text()[contains(.,'EVEN STRENGTH')]]/../..//td[@width='50%']/table");

            HtmlNodeCollection evenStrengthSummaryVisitorRows = evenStrengthSummaryTableNodes[0].SelectNodes(@".//tr");
            HtmlNodeCollection evenStrengthSummaryHomeRows    = evenStrengthSummaryTableNodes[1].SelectNodes(@".//tr");

            string evenStrengthText = String.Empty;

            // Even Strength Visitor
            if (evenStrengthSummaryVisitorRows != null & evenStrengthSummaryVisitorRows.Count >= 2)
            {
                HtmlNodeCollection evenStrengthSummaryVisitorRowFields = evenStrengthSummaryVisitorRows[1].SelectNodes(@".//td");

                evenStrengthText = evenStrengthSummaryVisitorRowFields[0].InnerText;
                if (evenStrengthText.IndexOf('-') >= 0 && evenStrengthText.IndexOf('/') >= 0)
                {
                    int dash  = evenStrengthText.IndexOf('-');
                    int slash = evenStrengthText.IndexOf('/');
                    powerPlayVisitorItem.EvenStrength5v5Goals       = NhlBaseClass.ConvertStringToInt(evenStrengthText.Substring(0, dash));
                    powerPlayVisitorItem.EvenStrength5v5Occurrences = NhlBaseClass.ConvertStringToInt(evenStrengthText.Substring(dash + 1, slash - dash - 1));
                    powerPlayVisitorItem.EvenStrength5v5ToiSeconds  = NhlBaseClass.ConvertMinutesToSeconds(evenStrengthText.Substring(slash + 1, evenStrengthText.Length - slash - 1));
                }
                evenStrengthText = evenStrengthSummaryVisitorRowFields[1].InnerText;
                if (evenStrengthText.IndexOf('-') >= 0 && evenStrengthText.IndexOf('/') >= 0)
                {
                    int dash  = evenStrengthText.IndexOf('-');
                    int slash = evenStrengthText.IndexOf('/');
                    powerPlayVisitorItem.EvenStrength4v4Goals       = NhlBaseClass.ConvertStringToInt(evenStrengthText.Substring(0, dash));
                    powerPlayVisitorItem.EvenStrength4v4Occurrences = NhlBaseClass.ConvertStringToInt(evenStrengthText.Substring(dash + 1, slash - dash - 1));
                    powerPlayVisitorItem.EvenStrength4v4ToiSeconds  = NhlBaseClass.ConvertMinutesToSeconds(evenStrengthText.Substring(slash + 1, evenStrengthText.Length - slash - 1));
                }
                evenStrengthText = evenStrengthSummaryVisitorRowFields[2].InnerText;
                if (evenStrengthText.IndexOf('-') >= 0 && evenStrengthText.IndexOf('/') >= 0)
                {
                    int dash  = evenStrengthText.IndexOf('-');
                    int slash = evenStrengthText.IndexOf('/');
                    powerPlayVisitorItem.EvenStrength3v3Goals       = NhlBaseClass.ConvertStringToInt(evenStrengthText.Substring(0, dash));
                    powerPlayVisitorItem.EvenStrength3v3Occurrences = NhlBaseClass.ConvertStringToInt(evenStrengthText.Substring(dash + 1, slash - dash - 1));
                    powerPlayVisitorItem.EvenStrength3v3ToiSeconds  = NhlBaseClass.ConvertMinutesToSeconds(evenStrengthText.Substring(slash + 1, evenStrengthText.Length - slash - 1));
                }
            }

            // Even Strength Home
            if (evenStrengthSummaryHomeRows != null & evenStrengthSummaryHomeRows.Count >= 2)
            {
                HtmlNodeCollection evenStrengthSummaryHomeRowFields = evenStrengthSummaryHomeRows[1].SelectNodes(@".//td");

                evenStrengthText = evenStrengthSummaryHomeRowFields[0].InnerText;
                if (evenStrengthText.IndexOf('-') >= 0 && evenStrengthText.IndexOf('/') >= 0)
                {
                    int dash  = evenStrengthText.IndexOf('-');
                    int slash = evenStrengthText.IndexOf('/');
                    powerPlayHomeItem.EvenStrength5v5Goals       = NhlBaseClass.ConvertStringToInt(evenStrengthText.Substring(0, dash));
                    powerPlayHomeItem.EvenStrength5v5Occurrences = NhlBaseClass.ConvertStringToInt(evenStrengthText.Substring(dash + 1, slash - dash - 1));
                    powerPlayHomeItem.EvenStrength5v5ToiSeconds  = NhlBaseClass.ConvertMinutesToSeconds(evenStrengthText.Substring(slash + 1, evenStrengthText.Length - slash - 1));
                }
                evenStrengthText = evenStrengthSummaryHomeRowFields[1].InnerText;
                if (evenStrengthText.IndexOf('-') >= 0 && evenStrengthText.IndexOf('/') >= 0)
                {
                    int dash  = evenStrengthText.IndexOf('-');
                    int slash = evenStrengthText.IndexOf('/');
                    powerPlayHomeItem.EvenStrength4v4Goals       = NhlBaseClass.ConvertStringToInt(evenStrengthText.Substring(0, dash));
                    powerPlayHomeItem.EvenStrength4v4Occurrences = NhlBaseClass.ConvertStringToInt(evenStrengthText.Substring(dash + 1, slash - dash - 1));
                    powerPlayHomeItem.EvenStrength4v4ToiSeconds  = NhlBaseClass.ConvertMinutesToSeconds(evenStrengthText.Substring(slash + 1, evenStrengthText.Length - slash - 1));
                }
                evenStrengthText = evenStrengthSummaryHomeRowFields[2].InnerText;
                if (evenStrengthText.IndexOf('-') >= 0 && evenStrengthText.IndexOf('/') >= 0)
                {
                    int dash  = evenStrengthText.IndexOf('-');
                    int slash = evenStrengthText.IndexOf('/');
                    powerPlayHomeItem.EvenStrength3v3Goals       = NhlBaseClass.ConvertStringToInt(evenStrengthText.Substring(0, dash));
                    powerPlayHomeItem.EvenStrength3v3Occurrences = NhlBaseClass.ConvertStringToInt(evenStrengthText.Substring(dash + 1, slash - dash - 1));
                    powerPlayHomeItem.EvenStrength3v3ToiSeconds  = NhlBaseClass.ConvertMinutesToSeconds(evenStrengthText.Substring(slash + 1, evenStrengthText.Length - slash - 1));
                }
            }

            model.PowerPlaySummary.Add(powerPlayVisitorItem);
            model.PowerPlaySummary.Add(powerPlayHomeItem);

            #endregion

            #region Goaltender Summary

            // First go through all visitor rows until we encounter end of visitor rows
            string team = model.Visitor;

            HtmlNodeCollection goaltenderSummaryTableNodes = mainTableNode.SelectSingleNode(@".//td[text()[contains(.,'GOALTENDER SUMMARY')]]/..").NextSibling.NextSibling.SelectNodes(@".//table//tr");

            for (int j = 2; j < goaltenderSummaryTableNodes.Count - 1; j++)
            {
                HtmlNodeCollection goaltenderSummaryRowFields = goaltenderSummaryTableNodes[j].SelectNodes(@".//td");

                if (goaltenderSummaryRowFields[0].InnerText.IndexOf("team totals", StringComparison.InvariantCultureIgnoreCase) >= 0)
                {
                    // Switch the team to the Home team and continue
                    team = model.Home;
                    j    = j + 3;
                    continue;
                }

                Nhl_Games_Rtss_Summary_GoalieSummary_Item goalieItem = new Nhl_Games_Rtss_Summary_GoalieSummary_Item();
                goalieItem.Team = team;
                goalieItem.Date = model.Date;

                // If there was an empty net, there is one fewer columns so need to change the base index
                int offset = 0;
                if (goaltenderSummaryRowFields[1].InnerText.IndexOf("empty net", StringComparison.InvariantCultureIgnoreCase) >= 0)
                {
                    offset = -1;
                }
                else
                {
                    goalieItem.Number = NhlBaseClass.ConvertStringToInt(goaltenderSummaryRowFields[0].InnerText);
                }

                string goalieName = goaltenderSummaryRowFields[2 + offset].InnerHtml;

                string[] goalieOutcomes = { "W", "L", "OT" };

                foreach (string goalieOutcome in goalieOutcomes)
                {
                    if (goalieName.IndexOf("(" + goalieOutcome + ")", StringComparison.InvariantCultureIgnoreCase) >= 0)
                    {
                        goalieItem.WinOrLoss = goalieOutcome;
                        goalieName           = goalieName.Replace("(" + goalieOutcome.ToUpper() + ")", String.Empty);
                        goalieName           = goalieName.Replace("(" + goalieOutcome.ToLower() + ")", String.Empty);
                        goalieName           = goalieName.Trim();
                    }
                }

                goalieItem.Name = goalieName;

                goalieItem.ToiInSecondsEvenStrength = NhlBaseClass.ConvertMinutesToSeconds(goaltenderSummaryRowFields[3 + offset].InnerText);
                goalieItem.ToiInSecondsPowerPlay    = NhlBaseClass.ConvertMinutesToSeconds(goaltenderSummaryRowFields[4 + offset].InnerText);
                goalieItem.ToiInSecondsShortHanded  = NhlBaseClass.ConvertMinutesToSeconds(goaltenderSummaryRowFields[5 + offset].InnerText);
                goalieItem.ToiInSecondsTotal        = NhlBaseClass.ConvertMinutesToSeconds(goaltenderSummaryRowFields[6 + offset].InnerText);

                goalieItem.GoaliePeriodSummary = new List <Nhl_Games_Rtss_Summary_GoalieSummary_Item.Nhl_Games_Rtss_Summary_GoaliePeriodSummary_Item>();

                int period = 1;
                for (int i = 7; i < goaltenderSummaryRowFields.Count - 1; i++)
                {
                    Nhl_Games_Rtss_Summary_GoalieSummary_Item.Nhl_Games_Rtss_Summary_GoaliePeriodSummary_Item goaliePeriodItem = new Nhl_Games_Rtss_Summary_GoalieSummary_Item.Nhl_Games_Rtss_Summary_GoaliePeriodSummary_Item();
                    goaliePeriodItem.Team = team;
                    goaliePeriodItem.Date = model.Date;

                    goaliePeriodItem.Period = period.ToString();
                    period++;

                    string goaliePeriodItemText = goaltenderSummaryRowFields[i + offset].InnerText;
                    if (goaliePeriodItemText.IndexOf('-') >= 0)
                    {
                        goaliePeriodItem.GoalsAgainst = NhlBaseClass.ConvertStringToInt(goaliePeriodItemText.Split('-')[0]);
                        goaliePeriodItem.ShotsAgainst = NhlBaseClass.ConvertStringToInt(goaliePeriodItemText.Split('-')[1]);
                    }

                    goalieItem.GoaliePeriodSummary.Add(goaliePeriodItem);
                }

                model.GoalieSummary.Add(goalieItem);
            }

            #endregion

            HtmlNodeCollection officialsAndStarsTableNodes = mainTableNode.SelectSingleNode(@".//td[text()[contains(.,'OFFICIALS')]]/..").NextSibling.NextSibling.SelectNodes(@"./td/table");

            #region Officials

            Nhl_Games_Rtss_Summary_Officials_Item officialsItem;

            HtmlNodeCollection officialsTableRows = officialsAndStarsTableNodes[0].SelectNodes(String.Format(@".{0}/tr", TBODY));
            HtmlNodeCollection refereesRows       = officialsTableRows[1].SelectNodes(@"./td")[0].SelectNodes(String.Format(@"./table{0}/tr", TBODY));
            HtmlNodeCollection linesmenRows       = officialsTableRows[1].SelectNodes(@"./td")[1].SelectNodes(String.Format(@"./table{0}/tr", TBODY));

            for (int i = 0; i < (refereesRows == null ? 0 : refereesRows.Count); i++)
            {
                officialsItem              = NhlGamesRtssSummary.ParseOfficialsItem(refereesRows[i].InnerText);
                officialsItem.VisitorTeam  = model.Visitor;
                officialsItem.HomeTeam     = model.Home;
                officialsItem.Date         = model.Date;
                officialsItem.OfficialType = Designation.Referee;
                model.OfficialsSummary.Add(officialsItem);
            }

            for (int i = 0; i < (linesmenRows == null ? 0 : linesmenRows.Count); i++)
            {
                officialsItem              = NhlGamesRtssSummary.ParseOfficialsItem(linesmenRows[i].InnerText);
                officialsItem.VisitorTeam  = model.Visitor;
                officialsItem.HomeTeam     = model.Home;
                officialsItem.Date         = model.Date;
                officialsItem.OfficialType = Designation.Linesman;
                model.OfficialsSummary.Add(officialsItem);
            }

            if (officialsTableRows.Count >= 4)
            {
                HtmlNodeCollection standbyRefereesRows = officialsTableRows[3].SelectNodes(@"./td")[0].SelectNodes(String.Format(@"./table{0}/tr", TBODY));
                HtmlNodeCollection standbyLinesmenRows = officialsTableRows[3].SelectNodes(@"./td")[1].SelectNodes(String.Format(@"./table{0}/tr", TBODY));

                if (null != standbyRefereesRows)
                {
                    for (int i = 0; i < standbyRefereesRows.Count; i++)
                    {
                        officialsItem              = NhlGamesRtssSummary.ParseOfficialsItem(standbyRefereesRows[i].InnerText);
                        officialsItem.VisitorTeam  = model.Visitor;
                        officialsItem.HomeTeam     = model.Home;
                        officialsItem.Date         = model.Date;
                        officialsItem.OfficialType = Designation.StandbyReferee;
                        model.OfficialsSummary.Add(officialsItem);
                    }
                }

                if (null != standbyLinesmenRows)
                {
                    for (int i = 0; i < standbyLinesmenRows.Count; i++)
                    {
                        officialsItem              = NhlGamesRtssSummary.ParseOfficialsItem(standbyLinesmenRows[i].InnerText);
                        officialsItem.VisitorTeam  = model.Visitor;
                        officialsItem.HomeTeam     = model.Home;
                        officialsItem.Date         = model.Date;
                        officialsItem.OfficialType = Designation.StandbyLinesman;
                        model.OfficialsSummary.Add(officialsItem);
                    }
                }
            }

            #endregion

            #region Stars

            HtmlNodeCollection starsRows = officialsAndStarsTableNodes[1].SelectNodes(@".//table//tr");

            if (null != starsRows)
            {
                for (int i = 0; i < (starsRows == null ? 0 : starsRows.Count); i++)
                {
                    Nhl_Games_Rtss_Summary_Stars_Item starsItem = new Nhl_Games_Rtss_Summary_Stars_Item();
                    starsItem.Date = model.Date;

                    HtmlNodeCollection starsRowFields = starsRows[i].SelectNodes(@"./td");
                    starsItem.StarNumber = i + 1;
                    starsItem.Team       = starsRowFields[1].InnerText;
                    starsItem.Position   = starsRowFields[2].InnerText;

                    int    playerNumber = 0;
                    string playerName   = String.Empty;

                    NhlBaseClass.ParseNameText(starsRowFields[3].InnerText, out playerNumber, out playerName);

                    starsItem.PlayerNumber = playerNumber;
                    starsItem.Name         = playerName;

                    model.StarsSummary.Add(starsItem);
                }
            }

            #endregion

            //if (model.StarsSummary.ElementAt(0).Date < new DateTime(1990, 1, 1))
            //{
            //    Console.WriteLine("");
            //}

            return(model);
        }