/// <summary>
 /// Alloweds to add.
 /// </summary>
 /// <param name="toCompare">To compare.</param>
 /// <returns></returns>
 public bool AllowedToAdd(AppointmentObj toCompare)
 {
     if (Start <= toCompare.End && End >= toCompare.Start)
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
        /// <summary>
        ///     Splits the avaiable date from overlapping reservations.
        /// </summary>
        /// <param name = "avail">The avail.</param>
        /// <param name = "overlappingDates">The overlapping dates.</param>
        /// <returns></returns>
        private static IEnumerable<AppointmentObj> SplitAvaiableDateFromOverlappingReservations(
            AppointmentObj avail, IEnumerable<AppointmentObj> overlappingDates)
        {
            var aList = new List<AppointmentObj>();
            //Stores current date placeholder
            DateTime? currentStart = null;
            //Stores how many hours are valid
            var currentHours = 1;
            //Iterates over times incrementing by 1 hour checking for overlap
            for (var date = avail.Start; date.Date < avail.End; date = date.AddHours(1))
            {
                //if date is >= the end date then break;
                if (date >= avail.End)
                    break;

                var dateForQuery = date;
                //Check current hour range 12-13 and detect any overlaps with reserved dates
                if (overlappingDates.Any(t => AppointmentObj.OverlapsWith(t, 
                    new AppointmentObj("Available", dateForQuery, dateForQuery.AddHours(1), "", "", "", avail.UserId, false, avail.DbId))))
                {
                    //Found Overlap
                    //Current date is set but now out of range
                    //Need to create appointment object);
                    if (currentStart != null)
                    {
                        aList.Add(new AppointmentObj("Available", ((DateTime) currentStart), 
                            ((DateTime) currentStart).AddHours(currentHours), "", "", "", avail.UserId, false, avail.DbId));
                        currentStart = null; //Reset
                        currentHours = 1; //Reset
                    }
                }
                else
                {
                    if (currentStart == null)
                        //New valid date range found
                        currentStart = date;
                    else
                        //Still current date range extend
                        currentHours++;
                }
            }
            //Finished looping valid date still stored
            if (currentStart != null)
            {
                aList.Add(new AppointmentObj("Available", ((DateTime) currentStart), 
                    ((DateTime) currentStart).AddHours(currentHours), "", "", "", avail.UserId, false, avail.DbId));
            }
            return aList;
        }
 /// <summary>
 /// Overlapses the with.
 /// </summary>
 /// <param name="b">The b.</param>
 /// <returns></returns>
 public bool OverlapsWith(AppointmentObj b)
 {
     return(!(b.End <= Start || End <= b.Start));
 }
 /// <summary>
 ///     Overlapses the with.
 /// </summary>
 /// <param name = "a">A.</param>
 /// <param name = "b">The b.</param>
 /// <returns></returns>
 public static bool OverlapsWith(AppointmentObj a, AppointmentObj b)
 {
     return(!(b.End <= a.Start || a.End <= b.Start));
 }
 /// <summary>
 /// Alloweds to add.
 /// </summary>
 /// <param name="toCompare">To compare.</param>
 /// <returns></returns>
 public bool AllowedToAdd(AppointmentObj toCompare)
 {
     if (Start <= toCompare.End && End >= toCompare.Start)
         return true;
     else return false;
 }
 /// <summary>
 /// Overlapses the with.
 /// </summary>
 /// <param name="b">The b.</param>
 /// <returns></returns>
 public bool OverlapsWith(AppointmentObj b)
 {
     return !(b.End <= Start || End <= b.Start);
 }
 /// <summary>
 ///     Overlapses the with.
 /// </summary>
 /// <param name = "a">A.</param>
 /// <param name = "b">The b.</param>
 /// <returns></returns>
 public static bool OverlapsWith(AppointmentObj a, AppointmentObj b)
 {
     return !(b.End <= a.Start || a.End <= b.Start);
 }
        /// <summary>
        /// Handles the Click event of the _btnAddDates 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 _btnAddDates_Click(object sender, EventArgs e)
        {
            var date = (DateTime)_rdpDate.DbSelectedDate;

            var startTime = ((DateTime)_rtpStartTime.DbSelectedDate).TimeOfDay;
            var endTime = ((DateTime)_rtpEndTime.DbSelectedDate).TimeOfDay;

            var appt = new AppointmentObj
                           {
                               Busy = true,
                               
                               Days = String.Empty,
                               End = date.Add(endTime),
                               Start = date.Add(startTime),
                           };

            var isVald = GetIsValdAddDates(startTime, endTime);

            if (isVald == false)
                return;

            foreach(var d in ReservedAppt)
            {
                if((d.ToAppointmentObj().Start == appt.Start && d.ToAppointmentObj().End == appt.End) || (d.ToAppointmentObj().Start.Date == date && !appt.AllowedToAdd(d.ToAppointmentObj())))
                {
                    WriteToBothFeedback(FeedbackType.Error, "Date conflicts with existing reserved date");
                    return;
                }
            }

            var db = new UrbanDataContext();
            var currentAvailabilityDates = RoomAvailabilityUtilities.GetAppointmentObjsWithRecurring(ref db, DateTime.MinValue, DateTime.MaxValue, RoomId).Where(t => t.Start.Date == date && t.End.Date == date).ToList();
            var validToAdd = false;
           foreach(var c in currentAvailabilityDates)
           {
               if(c.Busy == false && appt.AllowedToAdd(c))
               {
                   validToAdd = true;
               }
               else if(c.Busy == true && appt.OverlapsWith(c))
               {
                   validToAdd = false;
                   break;
               }
           }

            if (validToAdd)
            {
                WriteToBothFeedback(FeedbackType.Success, "Date Added");
                ReservedAppt.Add(new ReserveRoomTempObject{Date = date,End = endTime,Start = startTime});
            }
            else
            {
                WriteFeedBackMaster(FeedbackType.Error,"Date is not valid or overlaps with another date");
            }


            _rgAvailableTimes.Rebind();
        }