private SearchResultConnection GiveDirectConnectionWitMaxWaitingTime(List<LineForSpecifiedDayType> allSpecifiedLines, SoughtConnection soughtConnection, TimeOfArrival maxWaitingTime)
        {
            SearchResultConnection foundConnection = null;
            TimeOfArrival soughConnectionTimeOfArrival = new TimeOfArrival(soughtConnection.DateAndTime.Hour, soughtConnection.DateAndTime.Minute);
            foreach (LineForSpecifiedDayType line in allSpecifiedLines)
            {
                foreach (Track track in line.TracksForSpecifiedDayType)
                {
                    try
                    {
                        if (track.TimeOfArrivalOnBusStops.Count < 2)
                        {
                            continue;
                        }
                        if (soughtConnection.IsDeparture)
                        {
                            if (track.TimeOfArrivalOnBusStops.Last().Value - soughConnectionTimeOfArrival > MAX_LENGTH_OF_TRACK
                                || (track.TimeOfArrivalOnBusStops.First().Value - soughConnectionTimeOfArrival > MAX_WAITING_TIME_FOR_START_BUS_FOR_DEPARTUE_OR_FOR_END_BUS_FOR_ARRIVAL
                                    && soughConnectionTimeOfArrival - track.TimeOfArrivalOnBusStops.First().Value > MAX_LENGTH_OF_TRACK))
                            {
                                continue;
                            }
                        }
                        else
                        {
                            if (soughConnectionTimeOfArrival - track.TimeOfArrivalOnBusStops.First().Value > MAX_LENGTH_OF_TRACK
                                || (soughConnectionTimeOfArrival - track.TimeOfArrivalOnBusStops.Last().Value > MAX_WAITING_TIME_FOR_START_BUS_FOR_DEPARTUE_OR_FOR_END_BUS_FOR_ARRIVAL
                                    && track.TimeOfArrivalOnBusStops.Last().Value - soughConnectionTimeOfArrival > MAX_LENGTH_OF_TRACK))

                            {
                                continue;
                            }
                        }

                        TimeOfArrival startBusStopTimeOfArrival = track.TimeOfArrivalOnBusStops[soughtConnection.StartBusStop];
                        TimeOfArrival endBusStopTimeOfArrival = track.TimeOfArrivalOnBusStops[soughtConnection.EndBusStop];

                        if (soughtConnection.IsDeparture)
                        {
                            if (startBusStopTimeOfArrival - soughConnectionTimeOfArrival > maxWaitingTime)
                            {
                                continue;
                            }
                        }
                        else
                        {
                            if (soughConnectionTimeOfArrival - endBusStopTimeOfArrival > maxWaitingTime)
                            {
                                continue;
                            }
                        }

                        TimeOfArrival timeDistanceBetweenStartAndEndBusStop = endBusStopTimeOfArrival - startBusStopTimeOfArrival;
                        if (timeDistanceBetweenStartAndEndBusStop > new TimeOfArrival(4, 0))
                        {
                            continue;
                        }

                        DateTime startBusStopDateTime = new DateTime();
                        DateTime endBusStopDateTime = new DateTime();
                        if (endBusStopTimeOfArrival >= startBusStopTimeOfArrival)
                        {
                            // the same dates
                            startBusStopDateTime = new DateTime(soughtConnection.DateAndTime.Year, soughtConnection.DateAndTime.Month, soughtConnection.DateAndTime.Day,
                                startBusStopTimeOfArrival.Hour, startBusStopTimeOfArrival.Minutes, 0);
                            endBusStopDateTime = new DateTime(soughtConnection.DateAndTime.Year, soughtConnection.DateAndTime.Month, soughtConnection.DateAndTime.Day,
                                endBusStopTimeOfArrival.Hour, endBusStopTimeOfArrival.Minutes, 0);
                        }
                        else
                        {
                            // end date is one day after start date
                            startBusStopDateTime = new DateTime(soughtConnection.DateAndTime.Year, soughtConnection.DateAndTime.Month, soughtConnection.DateAndTime.Day,
                                startBusStopTimeOfArrival.Hour, startBusStopTimeOfArrival.Minutes, 0);
                            DateTime dayAfterDayInSoughtConnection = soughtConnection.DateAndTime.AddDays(1);
                            endBusStopDateTime = new DateTime(dayAfterDayInSoughtConnection.Year, dayAfterDayInSoughtConnection.Month, dayAfterDayInSoughtConnection.Day,
                                endBusStopTimeOfArrival.Hour, endBusStopTimeOfArrival.Minutes, 0);
                        }

                        TimeOfArrival timeSpecifiedByUser = new TimeOfArrival(soughtConnection.DateAndTime.Hour, soughtConnection.DateAndTime.Minute);
                        if (soughtConnection.IsDeparture)
                        {
                            if (startBusStopTimeOfArrival >= timeSpecifiedByUser)
                            {
                                if (foundConnection == null)
                                {

                                    foundConnection = new SearchResultConnection(true, line.Number, startBusStopDateTime,
                                        endBusStopDateTime, timeDistanceBetweenStartAndEndBusStop, soughtConnection.StartBusStop, soughtConnection.EndBusStop);
                                }
                                else
                                {
                                    TimeOfArrival foundConnectionArrivalTime = new TimeOfArrival(foundConnection.ArrivalDateTime.Hour, foundConnection.ArrivalDateTime.Minute);
                                    if (foundConnectionArrivalTime > endBusStopTimeOfArrival)
                                    {
                                        foundConnection = new SearchResultConnection(true, line.Number, startBusStopDateTime,
                                            endBusStopDateTime, timeDistanceBetweenStartAndEndBusStop, soughtConnection.StartBusStop, soughtConnection.EndBusStop);
                                    }
                                }
                            }

                        }
                        else
                        {
                            if (endBusStopTimeOfArrival <= timeSpecifiedByUser)
                            {
                                if (foundConnection == null)
                                {
                                    foundConnection = new SearchResultConnection(true, line.Number, startBusStopDateTime,
                                        endBusStopDateTime, timeDistanceBetweenStartAndEndBusStop, soughtConnection.StartBusStop, soughtConnection.EndBusStop);
                                }
                                else
                                {
                                    TimeOfArrival foundConnectionArrivalTime = new TimeOfArrival(foundConnection.ArrivalDateTime.Hour, foundConnection.ArrivalDateTime.Minute);
                                    if (foundConnectionArrivalTime < startBusStopTimeOfArrival)
                                    {
                                        foundConnection = new SearchResultConnection(true, line.Number, startBusStopDateTime,
                                            endBusStopDateTime, timeDistanceBetweenStartAndEndBusStop, soughtConnection.StartBusStop, soughtConnection.EndBusStop);
                                    }
                                }
                            }
                        }
                    }
                    catch (Exception)
                    {
                    }
                }
            }

            return foundConnection;
        }
        private SearchResultConnection GiveDirectConnection(List<LineForSpecifiedDayType> allSpecifiedLines, SoughtConnection soughtConnection)
        {
            SearchResultConnection foundConnection = null;
            foreach (LineForSpecifiedDayType line in allSpecifiedLines)
            {
                foreach (Track track in line.TracksForSpecifiedDayType)
                {
                    try
                    {
                        TimeOfArrival startBusStopTimeOfArrival = track.TimeOfArrivalOnBusStops[soughtConnection.StartBusStop];
                        TimeOfArrival endBusStopTimeOfArrival = track.TimeOfArrivalOnBusStops[soughtConnection.EndBusStop];
                        TimeOfArrival timeDistanceBetweenStartAndEndBusStop = endBusStopTimeOfArrival - startBusStopTimeOfArrival;
                        if (timeDistanceBetweenStartAndEndBusStop > new TimeOfArrival(8, 0))
                        {
                            continue;
                        }

                        DateTime startBusStopDateTime = new DateTime();
                        DateTime endBusStopDateTime = new DateTime();
                        if (endBusStopTimeOfArrival >= startBusStopTimeOfArrival)
                        {
                            // the same dates
                            startBusStopDateTime = new DateTime(soughtConnection.DateAndTime.Year, soughtConnection.DateAndTime.Month, soughtConnection.DateAndTime.Day,
                                startBusStopTimeOfArrival.Hour, startBusStopTimeOfArrival.Minutes, 0);
                            endBusStopDateTime = new DateTime(soughtConnection.DateAndTime.Year, soughtConnection.DateAndTime.Month, soughtConnection.DateAndTime.Day,
                                endBusStopTimeOfArrival.Hour, endBusStopTimeOfArrival.Minutes, 0);
                        }
                        else
                        {
                            // end date is one day after start date
                            startBusStopDateTime = new DateTime(soughtConnection.DateAndTime.Year, soughtConnection.DateAndTime.Month, soughtConnection.DateAndTime.Day,
                                startBusStopTimeOfArrival.Hour, startBusStopTimeOfArrival.Minutes, 0);
                            DateTime dayAfterDayInSoughtConnection = soughtConnection.DateAndTime.AddDays(1);
                            endBusStopDateTime = new DateTime(dayAfterDayInSoughtConnection.Year, dayAfterDayInSoughtConnection.Month, dayAfterDayInSoughtConnection.Day,
                                endBusStopTimeOfArrival.Hour, endBusStopTimeOfArrival.Minutes, 0);
                        }

                        TimeOfArrival timeSpecifiedByUser = new TimeOfArrival(soughtConnection.DateAndTime.Hour, soughtConnection.DateAndTime.Minute);
                        if (soughtConnection.IsDeparture)
                        {
                            if (startBusStopTimeOfArrival >= timeSpecifiedByUser)
                            {
                                if (foundConnection == null)
                                {

                                    foundConnection = new SearchResultConnection(true, line.Number, startBusStopDateTime,
                                        endBusStopDateTime, timeDistanceBetweenStartAndEndBusStop, soughtConnection.StartBusStop, soughtConnection.EndBusStop);
                                }
                                else
                                {
                                    TimeOfArrival foundConnectionArrivalTime = new TimeOfArrival(foundConnection.ArrivalDateTime.Hour, foundConnection.ArrivalDateTime.Minute);
                                    if (foundConnectionArrivalTime > endBusStopTimeOfArrival)
                                    {
                                        foundConnection = new SearchResultConnection(true, line.Number, startBusStopDateTime,
                                            endBusStopDateTime, timeDistanceBetweenStartAndEndBusStop, soughtConnection.StartBusStop, soughtConnection.EndBusStop);
                                    }
                                }
                            }

                        }
                        else
                        {
                            if (endBusStopTimeOfArrival <= timeSpecifiedByUser)
                            {
                                if (foundConnection == null)
                                {
                                    foundConnection = new SearchResultConnection(true, line.Number, startBusStopDateTime,
                                        endBusStopDateTime, timeDistanceBetweenStartAndEndBusStop, soughtConnection.StartBusStop, soughtConnection.EndBusStop);
                                }
                                else
                                {
                                    TimeOfArrival foundConnectionArrivalTime = new TimeOfArrival(foundConnection.ArrivalDateTime.Hour, foundConnection.ArrivalDateTime.Minute);
                                    if (foundConnectionArrivalTime < startBusStopTimeOfArrival)
                                    {
                                        foundConnection = new SearchResultConnection(true, line.Number, startBusStopDateTime,
                                            endBusStopDateTime, timeDistanceBetweenStartAndEndBusStop, soughtConnection.StartBusStop, soughtConnection.EndBusStop);
                                    }
                                }
                            }
                        }
                    }
                    catch (Exception)
                    {
                    }
                }
            }

            return foundConnection;
        }