private async Task LoadFlightsList()
        {
            // Stop the timer if it's already running to prevent multiple server calls if the network's slow
            if (timer.IsEnabled)
            {
                timer.Stop();
            }

            HttpClient httpClient = new HttpClient();

            httpClient.DefaultRequestHeaders.IfModifiedSince = new DateTimeOffset(DateTime.UtcNow);
            httpClient.DefaultRequestHeaders.Add("Accept", "application/json");

            HttpResponseMessage response = await httpClient.GetAsync(new Uri(url));

            string jsonString = await response.Content.ReadAsStringAsync();

            if (response.StatusCode == HttpStatusCode.NotModified)
            {
                // Nothing changed, wait for 15 seconds this time
                if (!timer.IsEnabled)
                {
                    timer.Tick    += new EventHandler <object>(timerTick);
                    timer.Interval = new TimeSpan(0, 0, 15);
                    timer.Start();
                }
            }
            else
            {
                SkyscannerResponse result = JsonConvert.DeserializeObject <SkyscannerResponse>(jsonString);
                if (result.Status.Equals("UpdatesComplete"))
                {
                    if (result.Itineraries.Length == 0)
                    {
                        DisplayErrorMessage("No flights were found for your search.");
                    }
                    else
                    {
                        agents = result.Agents;
                        DisplayFlightsList(result);
                    }
                }
                else
                {
                    // Updates aren't complete yet, try again in 10 seconds
                    if (!timer.IsEnabled)
                    {
                        timer.Tick    += new EventHandler <object>(timerTick);
                        timer.Interval = new TimeSpan(0, 0, 10);
                        timer.Start();
                    }
                }
            }
        }
        private void DisplayFlightsList(SkyscannerResponse result)
        {
            sessionKey = result.SessionKey;
            query      = result.Query;

            foreach (Itinerary itinerary in result.Itineraries)
            {
                FlightsListItem item                = new FlightsListItem();
                int[]           outboundCarriers    = { };
                int[]           inboundCarriers     = { };
                int             outboundOrigin      = 0;
                int             outboundDestination = 0;
                int             inboundOrigin       = 0;
                int             inboundDestination  = 0;

                item.outboundId = itinerary.OutboundLegId;
                item.inboundId  = itinerary.InboundLegId;

                int remaining = 2;
                foreach (Leg leg in result.Legs)
                {
                    if (remaining == 0)
                    {
                        break;
                    }

                    if (leg.Id.Equals(itinerary.OutboundLegId))
                    {
                        DateTime departure = DateTime.Parse(leg.Departure);
                        DateTime arrival   = DateTime.Parse(leg.Arrival);
                        item.outboundFlightTime = departure.ToString("H:mm") + " - " + arrival.ToString("H:mm");
                        int daysDiff = (arrival - departure).Days;
                        if (daysDiff > 0)
                        {
                            if (daysDiff == 1)
                            {
                                item.outboundAddDays = "(+" + daysDiff + " day)";
                            }
                            else
                            {
                                item.outboundAddDays = "(+" + daysDiff + " days)";
                            }
                        }

                        TimeSpan duration = TimeSpan.FromMinutes(leg.Duration);
                        if (duration.Hours > 0)
                        {
                            item.outboundDuration = ((duration.Days * 24) + duration.Hours) + "h " + duration.Minutes + "m";
                        }
                        else
                        {
                            item.outboundDuration = duration.Minutes + "m";
                        }

                        int stops = leg.SegmentIds.Length - 1;
                        if (stops == 0)
                        {
                            item.outboundStops = "Direct Flight";
                        }
                        else if (stops == 1)
                        {
                            item.outboundStops = stops + " Stop";
                        }
                        else
                        {
                            item.outboundStops = stops + " Stops";
                        }

                        outboundCarriers    = leg.OperatingCarriers;
                        outboundOrigin      = leg.OriginStation;
                        outboundDestination = leg.DestinationStation;
                        remaining--;
                    }
                    else if (leg.Id.Equals(itinerary.InboundLegId))
                    {
                        DateTime departure = DateTime.Parse(leg.Departure);
                        DateTime arrival   = DateTime.Parse(leg.Arrival);
                        item.inboundFlightTime = departure.ToString("H:mm") + " - " + arrival.ToString("H:mm");
                        int daysDiff = (arrival - departure).Days;
                        if (daysDiff > 0)
                        {
                            if (daysDiff == 1)
                            {
                                item.inboundAddDays = "(+" + daysDiff + " day)";
                            }
                            else
                            {
                                item.inboundAddDays = "(+" + daysDiff + " days)";
                            }
                        }

                        TimeSpan duration = TimeSpan.FromMinutes(leg.Duration);
                        if (duration.Hours > 0)
                        {
                            item.inboundDuration = ((duration.Days * 24) + duration.Hours) + "h " + duration.Minutes + "m";
                        }
                        else
                        {
                            item.inboundDuration = duration.Minutes + "m";
                        }

                        int stops = leg.SegmentIds.Length - 1;
                        if (stops == 0)
                        {
                            item.inboundStops = "Direct Flight";
                        }
                        else if (stops == 1)
                        {
                            item.inboundStops = stops + " Stop";
                        }
                        else
                        {
                            item.inboundStops = stops + " Stops";
                        }

                        inboundCarriers    = leg.OperatingCarriers;
                        inboundOrigin      = leg.OriginStation;
                        inboundDestination = leg.DestinationStation;
                        remaining--;
                    }
                }

                remaining = 4;
                string outboundOriginName      = "";
                string outboundDestinationName = "";
                string inboundOriginName       = "";
                string inboundDestinationName  = "";
                foreach (TripPlace place in result.Places)
                {
                    if (remaining == 0)
                    {
                        break;
                    }

                    if (place.Id == outboundOrigin)
                    {
                        outboundOriginName = place.Code;
                        remaining--;
                    }
                    else if (place.Id == outboundDestination)
                    {
                        outboundDestinationName = place.Code;
                        remaining--;
                    }

                    if (place.Id == inboundOrigin)
                    {
                        inboundOriginName = place.Code;
                        remaining--;
                    }
                    else if (place.Id == inboundDestination)
                    {
                        inboundDestinationName = place.Code;
                        remaining--;
                    }
                }
                item.outboundAirports = outboundOriginName + " - " + outboundDestinationName;
                item.inboundAirports  = inboundOriginName + " - " + inboundDestinationName;

                remaining = inboundCarriers.Length + outboundCarriers.Length;
                foreach (Carrier carrier in result.Carriers)
                {
                    if (remaining == 0)
                    {
                        break;
                    }

                    for (int i = 0; i < outboundCarriers.Length; i++)
                    {
                        if (carrier.Id == outboundCarriers[i])
                        {
                            if (item.outboundAirlines.Length > 0)
                            {
                                item.outboundAirlines += ", " + carrier.Name;
                            }
                            else
                            {
                                item.outboundAirlines += "Operated by " + carrier.Name;
                            }
                            remaining--;
                        }
                    }

                    for (int i = 0; i < inboundCarriers.Length; i++)
                    {
                        if (carrier.Id == inboundCarriers[i])
                        {
                            if (item.inboundAirlines.Length > 0)
                            {
                                item.inboundAirlines += ", " + carrier.Name;
                            }
                            else
                            {
                                item.inboundAirlines += "Operated by " + carrier.Name;
                            }
                            remaining--;
                        }
                    }
                }

                item.lowestPrice = "From " + string.Format("{0:C2}", itinerary.PricingOptions[0].Price);

                collection.Add(item);
            }
            ListViewFlights.ItemsSource = collection;

            ProgressRingFlights.IsActive = false;
            StackPanelLoading.Visibility = Visibility.Collapsed;
        }