public bool AllowedToAdd(List<Rental> rentalList, Rental newRental)
 {
     bool OKToAdd = true;
     DateTime Test_period_start = newRental.CheckedOut;
     DateTime Test_period_end = newRental.DueDate;
     foreach (Rental r in rentalList)
     {
         DateTime Base_period_start = r.CheckedOut;
         DateTime Base_period_end = r.DueDate;
         if (TimePeriodOverlap(Base_period_start, Base_period_end, Test_period_start, Test_period_end))
         {
             OKToAdd = false;
         }
     }
     return OKToAdd;
 }
        public ActionResult Details(FormCollection form)
        {
            var userId = User.Identity.GetUserId();
            DateTime checkedOut = DateTime.Parse(form["txtOut"]);
            DateTime dueDate = DateTime.Parse(form["txtReturn"]);
            ViewBag.CategoryId = form["categoryId"];
            string categoryId = form["categoryId"];

            if (checkedOut == default(DateTime))
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            if (dueDate == default(DateTime))
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            int id = Convert.ToInt16(form["id"]);

            Tool tool = db.Tools.Find(id);
            if (tool == null)
            {
                return HttpNotFound();
            }

            // Check whether checked out more than seven days.
            TimeSpan difference = dueDate - checkedOut;
            if (difference.TotalDays > 7)
            {
                TempData["isError"] = true;
                TempData["Message"] = "Date range greater than 7 days.";
                return RedirectToAction("Details", "Tools", new { id = id });
            }

            // Check to see if conflicts with another rental
            List<Rental> rentalList = (from r in db.Rentals
                                       where r.Tool.Id == id
                                       select r).ToList();
            if (rentalList.Count > 0)
            {
                // determine if already rented by user
                foreach (Rental r in rentalList)
                {
                    if (r.UserID == userId)
                    {
                        TempData["isError"] = true;
                        TempData["Message"] = "Item already checked out by user.";
                        return RedirectToAction("Details", "Tools", new { id = id, categoryId = categoryId });
                    }
                }

                Rental rental = new Rental();
                rental.CheckedOut = checkedOut;
                rental.DueDate = dueDate;
                rental.Tool = tool;
                rental.UserID = userId;
                if (AllowedToAdd(rentalList, rental))
                {
                    tool.IsCheckedOut = true;
                    db.Rentals.Add(rental);
                    db.SaveChanges();
                    db.Entry(tool).State = EntityState.Modified;
                    db.SaveChanges();
                    return View("Checkout", rental);
                }
                else
                {
                    TempData["isError"] = true;
                    TempData["Message"] = "Problem with checkout dates. Please verify no conflicts.";
                    return RedirectToAction("Details", "Tools", new { id = id, categoryId = categoryId });
                }
            }
            else
            {
                List<DateTime> ReservedDates = new List<DateTime>();
                ReservedDates = GetCheckedOutDates(tool.Id);

                foreach (DateTime d in ReservedDates)
                {
                    if (dueDate >= d && checkedOut < d) //overlapping dates
                    {
                        TempData["isError"] = true;
                        TempData["Message"] = "Problem with checkout dates. Please verify no conflicts.";
                        return RedirectToAction("Details", "Tools", new { id = id, categoryId = categoryId });
                    }
                }
                Rental rental = new Rental();
                rental.CheckedOut = checkedOut;
                rental.DueDate = dueDate;
                rental.Tool = tool;
                rental.UserID = userId;
                tool.IsCheckedOut = true;
                db.Rentals.Add(rental);
                db.SaveChanges();
                db.Entry(tool).State = EntityState.Modified;
                db.SaveChanges();
                return View("Checkout", rental);
            }

            /*List<DateTime> ReservedDates = new List<DateTime>();
            ReservedDates = GetCheckedOutDates(tool.Id);

            foreach (DateTime d in ReservedDates)
            {
                if (dueDate >= d && checkedOut < d) //overlapping dates
                {
                    DetailViewModel dd = CreateDetailviewModel(tool, d);
                    dd.ReservedDates = ReservedDates;
                    dd.TriggerOnLoad = true;
                    dd.TriggerOnLoadMessage = "Conflict with another reservation. Please choose new dates.";
                    dd.RedirectUrl = "Details";
                    return View(dd);
                }
            }

            try
            { // no overlap
                rental.CheckedOut = checkedOut;
                rental.DueDate = dueDate;
                rental.UserID = userId;
                rental.Tool = tool;
                tool.IsCheckedOut = true;
                db.Rentals.Add(rental);
                db.SaveChanges();
                db.Entry(tool).State = EntityState.Modified;
                db.SaveChanges();

                //send email
            }
            catch
            {
                DateTime due = ReservedDates.FirstOrDefault();
                DetailViewModel dd = CreateDetailviewModel(tool, due);
                dd.ReservedDates = ReservedDates;
                dd.TriggerOnLoad = true;
                dd.TriggerOnLoadMessage = "There was a problem creating this request. Please contact teh administrator.";
                dd.RedirectUrl = "Details";
                return View(dd);
            };

            //return view model
            DetailViewModel dt = CreateDetailviewModel(tool, dueDate);
            for (var newCheckedOutDates = rental.CheckedOut; newCheckedOutDates <= rental.DueDate; newCheckedOutDates = newCheckedOutDates.AddDays(1))
            {
                ReservedDates.Add(newCheckedOutDates);
            }
            ViewBag.CategoryId = ViewBag.CategoryId;
            dt.ReservedDates = ReservedDates;
            dt.TriggerOnLoad = true;
            dt.TriggerOnLoadMessage = "Item checked out successfully!";
            dt.RedirectUrl = "Index";

            return View(dt);*/
        }