//public static void CheckReservations20150310(this Controller controller, IList<TableAvailability> availList, IList<FloorTableBlock> blockList,
        //    FloorTable table, string duration, DateTime? startTime, DateTime? endTime, int? shiftId, out int coverCount)
        //{
        //    coverCount = 0;
        //    var design = table.TableDesign;
        //    var TableName = GetMatchedTagsFromHtml(design, String.Format("<h3(.*?)>(.*?)</h3>")).FirstOrDefault();
        //    if (!string.IsNullOrEmpty(TableName))
        //    {
        //        IQueryable<Reservation> reservation = table.Reservations.Where(r => !r.IsDeleted).AsQueryable();
        //        IQueryable<Reservation> mergedreservation = table.MergedTables.Select(m => m.MergedFloorTable).SelectMany(mt => mt.Reservations)
        //            .Where(r => !r.IsDeleted).AsQueryable();
        //        IQueryable<Reservation> upcomingReservation = reservation.AsQueryable();
        //        IQueryable<Reservation> upcomingMergedreservation = mergedreservation.AsQueryable();
        //        if (!shiftId.HasValue)
        //        {
        //            if (startTime.HasValue)
        //            {
        //                if (startTime.HasValue && endTime.HasValue)
        //                {
        //                    var preStart = startTime.Value.AddMinutes(90);
        //                    reservation = reservation.Where(r => r.TimeForm <= startTime.Value && r.TimeTo >= endTime.Value);
        //                    mergedreservation = mergedreservation.Where(r => r.TimeForm <= startTime.Value && r.TimeForm.AddMinutes(r.Duration.GetMinutesFromDuration()) >= endTime.Value);
        //                    upcomingReservation = upcomingReservation.Where(r => r.TimeForm <= preStart && r.TimeForm >= startTime.Value);
        //                    upcomingMergedreservation = upcomingMergedreservation.Where(r => r.TimeForm <= preStart && r.TimeForm >= startTime.Value);
        //                }
        //                else
        //                {
        //                    var start = startTime.Value.Date.AddTicks(DateTime.UtcNow.ToClientTime().TimeOfDay.Ticks);
        //                    var preStart = start.AddMinutes(90);
        //                    reservation = reservation.Where(r => r.TimeForm <= start && r.TimeTo >= start);
        //                    mergedreservation = mergedreservation.Where(r => r.TimeForm <= start && r.TimeTo >= start);
        //                    upcomingReservation = upcomingReservation.Where(r => r.TimeForm <= preStart && r.TimeForm >= start);
        //                    upcomingMergedreservation = upcomingMergedreservation.Where(r => r.TimeForm <= preStart && r.TimeForm >= start);
        //                }
        //            }
        //            else
        //            {
        //                var now = DateTime.UtcNow.ToClientTime();
        //                var preStart = now.AddMinutes(90);
        //                reservation = reservation.Where(r => r.TimeForm <= now && r.TimeTo >= now);
        //                mergedreservation = mergedreservation.Where(r => r.TimeForm <= now && r.TimeTo >= now);
        //                upcomingReservation = upcomingReservation.Where(r => r.TimeForm <= preStart && r.TimeForm >= now);
        //                upcomingMergedreservation = upcomingMergedreservation.Where(r => r.TimeForm <= preStart && r.TimeForm >= now);
        //            }
        //        }
        //        else
        //        {
        //            if (startTime.HasValue)
        //            {
        //                var preStart = startTime.Value.AddMinutes(90);
        //                reservation = reservation.Where(r => r.ReservationDate == startTime.Value.Date);
        //                mergedreservation = mergedreservation.Where(r => r.ReservationDate == startTime.Value.Date);
        //                upcomingReservation = upcomingReservation.Where(r => r.TimeForm <= preStart && r.TimeForm >= startTime.Value);
        //                upcomingMergedreservation = upcomingMergedreservation.Where(r => r.TimeForm <= preStart && r.TimeForm >= startTime.Value);
        //            }
        //            else
        //            {
        //                var now = DateTime.UtcNow.ToClientTime();
        //                var preStart = now.AddMinutes(90);
        //                reservation = reservation.Where(r => r.ReservationDate == DateTime.UtcNow.ToClientTime().Date);
        //                mergedreservation = mergedreservation.Where(r => r.ReservationDate == DateTime.UtcNow.ToClientTime().Date);
        //                upcomingReservation = upcomingReservation.Where(r => r.TimeForm <= preStart && r.TimeForm >= now);
        //                upcomingMergedreservation = upcomingMergedreservation.Where(r => r.TimeForm <= preStart && r.TimeForm >= now);
        //            }
        //            if (shiftId.Value != 0)
        //            {
        //                reservation = reservation.Where(r => r.FoodMenuShiftId == shiftId.Value);
        //                mergedreservation = mergedreservation.Where(r => r.FoodMenuShiftId == shiftId.Value);
        //            }
        //        }
        //        // check if status is FINISHED, CANCELLED, CANCELLED2
        //        var rejectedStatus = new List<long?>()
        //                             {
        //                                 ReservationStatus.Finished,
        //                                 ReservationStatus.Cancelled
        //                                 //ReservationStatus.Cancelled_2
        //                             };
        //        var reservationList = reservation.Where(r => !rejectedStatus.Contains(r.StatusId)).ToList();
        //        var mergedreservationList = mergedreservation.Where(r => !rejectedStatus.Contains(r.StatusId)).ToList();
        //        var upcomingReservationList = upcomingReservation.Where(r => !rejectedStatus.Contains(r.StatusId)).ToList();
        //        var upcomingMergedReservationList = upcomingMergedreservation.Where(r => !rejectedStatus.Contains(r.StatusId)).ToList();
        //        upcomingReservationList.AddRange(upcomingMergedReservationList);
        //        // Ends here
        //        if (reservationList.Count > 0 || mergedreservationList.Count > 0)
        //        {
        //            var allRes = new List<Reservation>();
        //            if (reservationList.Count() > 0)
        //                allRes.AddRange(reservationList);
        //            if (mergedreservationList.Count() > 0)
        //                allRes.AddRange(mergedreservationList);
        //            allRes = allRes.OrderBy(r => r.TimeForm).ToList();
        //            //table.TableDesign = design.Replace(TableName, TableName + "<img alt=\"\" src=\"/images/red-s.png\" class=\"table-img\">");
        //            design = design.Replace(TableName, TableName + "<img alt=\"\" src=\"/images/red-s.png\" class=\"table-img\">");
        //            if (allRes.First().FloorTableId > 0)
        //            {
        //                var regex = new Regex(@"([\w-]+)\s*:\s*([^;]+)");
        //                var match = regex.Match(GetMatchedTagsFromHtml(design, String.Format("<div[^>]*?class=([\"'])[^>]*{0}[^>]*\\1[^>]*>", "table-main")).FirstOrDefault());
        //                while (match.Success)
        //                {
        //                    var key = match.Groups[1].Value;
        //                    var value = match.Groups[2].Value;
        //                    if (key == "top")
        //                    {
        //                        design = design.Replace(value, allRes.First().TablePositionTop);
        //                    }
        //                    if (key == "left")
        //                    {
        //                        design = design.Replace(value, allRes.First().TablePositionLeft);
        //                    }
        //                    match = match.NextMatch();
        //                }
        //            }
        //            var popup = controller.RenderPartialViewToString("~/Views/Floor/ReservationListPartial.cshtml", allRes);
        //            StringBuilder designer = new StringBuilder();
        //            designer.Append(design.Substring(0, design.LastIndexOf("</div>")));
        //            designer.Append(popup + "</div>");
        //            table.TableDesign = designer.ToString();
        //            coverCount = allRes.Sum(r => r.Covers);
        //        }
        //        else if (upcomingReservationList.Count > 0)
        //        {
        //            design = design.Replace(TableName, TableName + "<img alt=\"\" src=\"/images/upcom-s.png\" class=\"table-img\">");
        //            var popup = controller.RenderPartialViewToString("~/Views/Floor/ReservationListPartial.cshtml", upcomingReservationList);
        //            StringBuilder designer = new StringBuilder();
        //            designer.Append(design.Substring(0, design.LastIndexOf("</div>")));
        //            designer.Append(popup + "</div>");
        //            table.TableDesign = designer.ToString();
        //        }
        //        else
        //        {
        //            if (endTime.HasValue && !string.IsNullOrWhiteSpace(duration))
        //                endTime = startTime.Value.AddMinutes(duration.GetMinutesFromDuration());
        //            if (startTime.HasValue && endTime.HasValue && (availList.CheckAvailStatus(startTime.Value.Date, startTime.Value, endTime.Value, table, 2)
        //                    || blockList.IsTableBlocked(table.FloorTableId, startTime.Value, endTime.Value)))
        //                table.TableDesign = design.Replace(TableName, TableName + "<img alt=\"\" src=\"/images/free-s.png\" class=\"table-img\">");
        //            else
        //                table.TableDesign = design.Replace(TableName, TableName + "<img alt=\"\" src=\"/images/green-a.png\" class=\"table-img\">");
        //        }
        //    }
        //}
        public static void CheckReservations20150622(this Controller controller, IList<Reservation> todayReservations, IList<TableAvailability> availList, IList<FloorTableBlock> blockList,
            FloorTable table, string duration, DateTime? startTime, DateTime? endTime, int? shiftId, out int coverCount)
        {
            coverCount = 0;
            var deafultTimeZoneTime = DateTime.UtcNow.ToDefaultTimeZone(controller.User.Identity.GetDatabaseName());
            var design = table.TableDesign;

            var TableName = GetMatchedTagsFromHtml(design, String.Format("<h3(.*?)>(.*?)</h3>")).FirstOrDefault();

            if (!string.IsNullOrEmpty(TableName))
            {
                IList<Reservation> reservation = todayReservations.Where(r => r.FloorTableId == table.FloorTableId).ToList();
                IList<Reservation> mergedreservation = todayReservations.Where(r => r.FloorTableId == 0
                    && r.MergedFloorTable.OrigionalTables.Any(t => t.FloorTableId == table.FloorTableId)).ToList();
                IList<Reservation> upcomingReservation = reservation.ToList();
                IList<Reservation> upcomingMergedreservation = mergedreservation.ToList();

                if (!shiftId.HasValue)
                {
                    if (startTime.HasValue)
                    {
                        if (startTime.HasValue && endTime.HasValue)
                        {
                            var preStart = startTime.Value.AddMinutes(90);
                            reservation = reservation.Where(r => r.TimeForm <= startTime.Value && r.TimeTo >= endTime.Value).ToList();
                            mergedreservation = mergedreservation.Where(r => r.TimeForm <= startTime.Value && r.TimeForm.AddMinutes(r.Duration.GetMinutesFromDuration()) >= endTime.Value).ToList();
                            upcomingReservation = upcomingReservation.Where(r => r.TimeForm <= preStart && r.TimeForm >= startTime.Value).ToList();
                            upcomingMergedreservation = upcomingMergedreservation.Where(r => r.TimeForm <= preStart && r.TimeForm >= startTime.Value).ToList();
                        }
                        else
                        {
                            var start = startTime.Value.Date.AddTicks(deafultTimeZoneTime.TimeOfDay.Ticks);
                            var preStart = start.AddMinutes(90);
                            reservation = reservation.Where(r => r.TimeForm <= start && r.TimeTo >= start).ToList();
                            mergedreservation = mergedreservation.Where(r => r.TimeForm <= start && r.TimeTo >= start).ToList();
                            upcomingReservation = upcomingReservation.Where(r => r.TimeForm <= preStart && r.TimeForm >= start).ToList();
                            upcomingMergedreservation = upcomingMergedreservation.Where(r => r.TimeForm <= preStart && r.TimeForm >= start).ToList();
                        }
                    }
                    else
                    {
                        var now = deafultTimeZoneTime;
                        var preStart = now.AddMinutes(90);
                        reservation = reservation.Where(r => r.TimeForm <= now && r.TimeTo >= now).ToList();
                        mergedreservation = mergedreservation.Where(r => r.TimeForm <= now && r.TimeTo >= now).ToList();
                        upcomingReservation = upcomingReservation.Where(r => r.TimeForm <= preStart && r.TimeForm >= now).ToList();
                        upcomingMergedreservation = upcomingMergedreservation.Where(r => r.TimeForm <= preStart && r.TimeForm >= now).ToList();
                    }
                }
                else
                {
                    if (startTime.HasValue)
                    {
                        var preStart = startTime.Value.AddMinutes(90);
                        reservation = reservation.Where(r => r.ReservationDate == startTime.Value.Date).ToList();
                        mergedreservation = mergedreservation.Where(r => r.ReservationDate == startTime.Value.Date).ToList();
                        upcomingReservation = upcomingReservation.Where(r => r.TimeForm <= preStart && r.TimeForm >= startTime.Value).ToList();
                        upcomingMergedreservation = upcomingMergedreservation.Where(r => r.TimeForm <= preStart && r.TimeForm >= startTime.Value).ToList();
                    }
                    else
                    {
                        var now = deafultTimeZoneTime;
                        var preStart = now.AddMinutes(90);
                        reservation = reservation.Where(r => r.ReservationDate == now.Date).ToList();
                        mergedreservation = mergedreservation.Where(r => r.ReservationDate == now.Date).ToList();
                        upcomingReservation = upcomingReservation.Where(r => r.TimeForm <= preStart && r.TimeForm >= now).ToList();
                        upcomingMergedreservation = upcomingMergedreservation.Where(r => r.TimeForm <= preStart && r.TimeForm >= now).ToList();
                    }

                    if (shiftId.Value != 0)
                    {
                        reservation = reservation.Where(r => r.FoodMenuShiftId == shiftId.Value).ToList();
                        mergedreservation = mergedreservation.Where(r => r.FoodMenuShiftId == shiftId.Value).ToList();
                    }
                }

                // check if status is FINISHED, CANCELLED, CANCELLED2

                var rejectedStatus = new List<long?>()
                                     {
                                         ReservationStatus.Finished,
                                         ReservationStatus.Cancelled
                                         //ReservationStatus.Cancelled_2
                                     };

                var reservationList = reservation.Where(r => !rejectedStatus.Contains(r.StatusId)).ToList();
                var mergedreservationList = mergedreservation.Where(r => !rejectedStatus.Contains(r.StatusId)).ToList();
                var upcomingReservationList = upcomingReservation.Where(r => !rejectedStatus.Contains(r.StatusId)).ToList();
                var upcomingMergedReservationList = upcomingMergedreservation.Where(r => !rejectedStatus.Contains(r.StatusId)).ToList();
                upcomingReservationList.AddRange(upcomingMergedReservationList);

                // Ends here

                if (reservationList.Count > 0 || mergedreservationList.Count > 0)
                {
                    var allRes = new List<Reservation>();

                    if (reservationList.Count() > 0)
                        allRes.AddRange(reservationList);

                    if (mergedreservationList.Count() > 0)
                        allRes.AddRange(mergedreservationList);

                    allRes = allRes.OrderBy(r => r.TimeForm).ToList();

                    //table.TableDesign = design.Replace(TableName, TableName + "<img alt=\"\" src=\"/images/red-s.png\" class=\"table-img\">");

                    design = design.Replace(TableName, TableName + "<img alt=\"\" src=\"/images/red-s.png\" class=\"table-img\">");

                    if (allRes.First().FloorTableId > 0)
                    {
                        var regex = new Regex(@"([\w-]+)\s*:\s*([^;]+)");
                        var match = regex.Match(GetMatchedTagsFromHtml(design, String.Format("<div[^>]*?class=([\"'])[^>]*{0}[^>]*\\1[^>]*>", "table-main")).FirstOrDefault());
                        while (match.Success)
                        {
                            var key = match.Groups[1].Value;
                            var value = match.Groups[2].Value;
                            if (key == "top")
                            {
                                design = design.Replace(value, allRes.First().TablePositionTop);
                            }

                            if (key == "left")
                            {
                                design = design.Replace(value, allRes.First().TablePositionLeft);
                            }

                            match = match.NextMatch();
                        }
                    }

                    var popup = controller.RenderPartialViewToString("~/Views/Floor/ReservationListPartial.cshtml", allRes);

                    StringBuilder designer = new StringBuilder();
                    designer.Append(design.Substring(0, design.LastIndexOf("</div>")));
                    designer.Append(popup + "</div>");

                    table.TableDesign = designer.ToString();

                    coverCount = allRes.Sum(r => r.Covers);
                }
                else if (upcomingReservationList.Count > 0)
                {
                    design = design.Replace(TableName, TableName + "<img alt=\"\" src=\"/images/upcom-s.png\" class=\"table-img\">");

                    var popup = controller.RenderPartialViewToString("~/Views/Floor/ReservationListPartial.cshtml", upcomingReservationList);

                    StringBuilder designer = new StringBuilder();
                    designer.Append(design.Substring(0, design.LastIndexOf("</div>")));
                    designer.Append(popup + "</div>");

                    table.TableDesign = designer.ToString();
                }
                else
                {
                    if (endTime.HasValue && !string.IsNullOrWhiteSpace(duration))
                        endTime = startTime.Value.AddMinutes(duration.GetMinutesFromDuration());

                    if (startTime.HasValue && endTime.HasValue && (availList.CheckAvailStatus(startTime.Value.Date, startTime.Value, endTime.Value, table, 2)
                            || blockList.IsTableBlocked(table.FloorTableId, startTime.Value, endTime.Value)))
                        table.TableDesign = design.Replace(TableName, TableName + "<img alt=\"\" src=\"/images/free-s.png\" class=\"table-img\">");
                    else
                        table.TableDesign = design.Replace(TableName, TableName + "<img alt=\"\" src=\"/images/green-a.png\" class=\"table-img\">");
                }
            }
        }