private static TimeLine AddRepeatingPattern(TimeLine timeLineIn, List<TimeLinePattern> patterns, TimeLineMinute defaultMinute, TimeSpan startTime, TimeSpan endTime)
        {
            TimeLine timeLine = timeLineIn;
            if (patterns.Count == 0)
                return timeLine;
            timeLine.IsDefault = false;
            TimeLine pattern = BuildTimeLine(patterns, defaultMinute);

            int pos = (int)startTime.TotalMinutes;
            int endPos = (int)endTime.TotalMinutes;
            int patPos = 0;

            while (pos < endPos)
            {
                // do not overwrite mandatory state
                // do not use an Unspecified state
                if (!timeLine.Minute[pos].Mandatory && pattern.Minute[patPos].State != TimeLineState.Unspecified)
                    timeLine.Minute[pos++] = pattern.Minute[patPos++];
                else
                {
                    pos++;
                    patPos++;
                }
                if (patPos >= pattern.Minute.Length)
                    patPos = 0;
            }

            return timeLine;
        }
        private static TimeLine BuildTimeLine(List<TimeLinePattern> patterns, TimeLineMinute defaultMinute)
        {
            TimeLine timeLine;

            timeLine.IsDefault = false;

            if (patterns.Count == 0)
            {
                timeLine.StartTime = TimeSpan.FromMinutes(0);
                timeLine.EndTime = TimeSpan.FromMinutes(0);
                timeLine.Duration = 0;
                timeLine.Minute = null;
                return timeLine;
            }

            timeLine.StartTime = patterns[0].StartTime;
            timeLine.EndTime = patterns[patterns.Count - 1].EndTime;
            timeLine.Duration = ((int)(timeLine.EndTime - timeLine.StartTime).TotalMinutes) + 1;
            timeLine.Minute = new TimeLineMinute[timeLine.Duration];

            int curPos = 0;

            foreach (TimeLinePattern pattern in patterns)
            {
                int index = (int)(pattern.StartTime - timeLine.StartTime).TotalMinutes;
                int count = ((int)(pattern.EndTime - pattern.StartTime).TotalMinutes) + 1;

                while (curPos < index)
                    timeLine.Minute[curPos++] = defaultMinute;

                while (curPos < (index + count))
                    timeLine.Minute[curPos++] = pattern.Minute;
            }

            return timeLine;
        }