private void DisplayDecisionsForArea(RouteSetDecision latestDecision, List <RouteSetDecision> decisionsForArea)
        {
            if (latestDecision.RouteSet.RouteTypeToGrit == GrittingRouteType.All)
            {
                AddDecisionToTable(latestDecision);
            }
            else
            {
                RouteSetDecision latestPrimaryDecision   = null;
                RouteSetDecision latestSecondaryDecision = null;

                foreach (var decision in decisionsForArea)
                {
                    if (decision.RouteSet.RouteTypeToGrit == GrittingRouteType.Primary && (latestPrimaryDecision == null || decision.DecisionTime > latestPrimaryDecision.DecisionTime))
                    {
                        latestPrimaryDecision = decision;
                    }
                    else if (decision.RouteSet.RouteTypeToGrit == GrittingRouteType.Secondary && (latestSecondaryDecision == null || decision.DecisionTime > latestSecondaryDecision.DecisionTime))
                    {
                        latestSecondaryDecision = decision;
                    }
                }

                if (latestPrimaryDecision != null)
                {
                    AddDecisionToTable(latestPrimaryDecision);
                }
                if (latestSecondaryDecision != null)
                {
                    AddDecisionToTable(latestSecondaryDecision);
                }
            }
        }
        private void AddDecisionToTable(RouteSetDecision decision)
        {
            var routeRow = new StringBuilder("<tr><td>");

            routeRow.Append(Server.HtmlEncode(decision.DecisionTime.ToShortBritishDateNoYear() + ", " + decision.DecisionTime.ToBritishTime()));
            routeRow.Append("</td><td>");
            routeRow.Append(Server.HtmlEncode(decision.RouteSet.RouteSetName));
            routeRow.Append("</td><td class=\"action ");
            routeRow.Append(Regex.Replace(decision.Action, "[^a-zA-Z]*", String.Empty).ToLower(CultureInfo.CurrentCulture));
            routeRow.Append("\">");
            routeRow.Append(Server.HtmlEncode(decision.Action));
            routeRow.Append("</td><td class=\"actiontime\">");
            if (decision.ActionTime.HasValue)
            {
                routeRow.Append(Server.HtmlEncode(decision.ActionTime.Value.ToBritishTime()));
            }
            routeRow.Append("</td></tr>\n");
            this.table.Controls.Add(new LiteralControl(routeRow.ToString()));
        }
        /// <summary>
        /// Handles the Load event of the Page control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            var decisions = DecisionManager.ReadLatestRouteSetDecisions();

            if (decisions.Count == 0)
            {
                this.table.Controls.Add(new LiteralControl("<tr><td colspan=\"4\">There are no gritting decisions at the moment.</td></tr>\n"));
                return;
            }


            var routeSets = DecisionManager.ReadRouteSets();

            // Is there a whole county decision that's more recent than anything else?
            RouteSetDecision        latestDomainDecision = null;
            RouteSetDecision        latestCountyDecision = null;
            List <RouteSetDecision> countyDecisions      = new List <RouteSetDecision>();

            foreach (RouteSetDecision decision in decisions)
            {
                if (decision.RouteSet.IsWholeCounty)
                {
                    if (latestCountyDecision == null || decision.DecisionTime > latestCountyDecision.DecisionTime)
                    {
                        latestCountyDecision = decision;
                    }
                    countyDecisions.Add(decision);
                }
                else
                {
                    if (latestDomainDecision == null || decision.DecisionTime > latestDomainDecision.DecisionTime)
                    {
                        latestDomainDecision = decision;
                    }
                }
            }

            if (latestCountyDecision != null && (latestDomainDecision == null || latestCountyDecision.DecisionTime > latestDomainDecision.DecisionTime))
            {
                // Show latest decisions for whole county
                DisplayDecisionsForArea(latestCountyDecision, countyDecisions);
            }
            else
            {
                // Otherwise show the latest update for each route set. Could have primary/secondary decision superceding whole county, or vice versa.
                var decisionsByDomain = GroupDecisionsByDomainName(decisions);

                foreach (var decisionsForDomain in decisionsByDomain.Values)
                {
                    RouteSetDecision latest = null;
                    foreach (var decision in decisionsForDomain)
                    {
                        if (latest == null || decision.DecisionTime > latest.DecisionTime)
                        {
                            latest = decision;
                        }
                    }

                    DisplayDecisionsForArea(latest, decisionsForDomain);
                }
            }
        }
        private void DisplayDecisionsForArea(RouteSetDecision latestDecision, List<RouteSetDecision> decisionsForArea)
        {
            if (latestDecision.RouteSet.RouteTypeToGrit == GrittingRouteType.All)
            {
                AddDecisionToTable(latestDecision);
            }
            else
            {
                RouteSetDecision latestPrimaryDecision = null;
                RouteSetDecision latestSecondaryDecision = null;

                foreach (var decision in decisionsForArea)
                {
                    if (decision.RouteSet.RouteTypeToGrit == GrittingRouteType.Primary && (latestPrimaryDecision == null || decision.DecisionTime > latestPrimaryDecision.DecisionTime)) latestPrimaryDecision = decision;
                    else if (decision.RouteSet.RouteTypeToGrit == GrittingRouteType.Secondary && (latestSecondaryDecision == null || decision.DecisionTime > latestSecondaryDecision.DecisionTime)) latestSecondaryDecision = decision;
                }

                if (latestPrimaryDecision != null) AddDecisionToTable(latestPrimaryDecision);
                if (latestSecondaryDecision != null) AddDecisionToTable(latestSecondaryDecision);
            }
        }
 private void AddDecisionToTable(RouteSetDecision decision)
 {
     var routeRow = new StringBuilder("<tr><td>");
     routeRow.Append(Server.HtmlEncode(decision.DecisionTime.ToShortBritishDateNoYear() + ", " + decision.DecisionTime.ToBritishTime()));
     routeRow.Append("</td><td>");
     routeRow.Append(Server.HtmlEncode(decision.RouteSet.RouteSetName));
     routeRow.Append("</td><td class=\"action ");
     routeRow.Append(Regex.Replace(decision.Action, "[^a-zA-Z]*", String.Empty).ToLower(CultureInfo.CurrentCulture));
     routeRow.Append("\">");
     routeRow.Append(Server.HtmlEncode(decision.Action));
     routeRow.Append("</td><td class=\"actiontime\">");
     if (decision.ActionTime.HasValue)
     {
         routeRow.Append(Server.HtmlEncode(decision.ActionTime.Value.ToBritishTime()));
     }
     routeRow.Append("</td></tr>\n");
     this.table.Controls.Add(new LiteralControl(routeRow.ToString()));
 }