public ActionResult DeleteVacation(Vacation vacation, int? page,String calendar)
        {
            Vacation vac = (Vacation)db.FindById(vacation.VacationPeriodId);
            double numDays = (vac.DateTo - vac.DateFrom).TotalDays;
            radniDaniZaBrisanje = GetWorkDays(vac.DateFrom, vac.DateTo);
            UsersService users = new UsersService();
            User u = (User)users.FindUserByUsername(HttpContext.User.Identity.Name);
            if (!vac.IsSickLeave)
            {
                int days = u.VacationDays + radniDaniZaBrisanje;
                u.VacationDays = days;
            }

            users.Edit(u);
            db.DeleteVacation(vac.VacationPeriodId);

            if (calendar != null && calendar.Equals("true"))
            {
                return RedirectToAction("initHolidays", "LoadHolidays");
            }
            else
            {
                return SeeVacationsDelete(page);
            }
        }
        ///<summary>
        ///For Admin, to confirm user registration. Also, sending mail to user.
        ///</summary>
        public ActionResult ConfirmRegistration(String id, int? page)
        {
            UsersService users = new UsersService();
            User user = (User)users.FindUserByUsername(id);

            if (user != null)
            {
                if (user.IsUserRegistered)
                {
                    user.IsUserRegistered = false;
                    Contact(user, false);
                }
                else
                {
                    user.IsUserRegistered = true;
                    Contact(user, true);
                }
                users.Edit(user);
            }

            return ShowAllUsers(page);
        }
        public ActionResult LoginPage(LoginViewModel user)
        {
            if (user.Password == null || user.UserName == null)
            {
                return View();
            }

            UsersService userService = new UsersService();
            User currentUser = userService.FindUserByUsername(user.UserName);
            currentUserOffline = currentUser.Username;

            if (currentUser == null)
            {
                ViewBag.Error = "Wrong username..!";
                return View();
            }
            else
            {
                if (!currentUser.Password.Equals(user.Password))
                {
                    ViewBag.Error = "Wrong password combination!";
                    return View();
                }

                if (!currentUser.IsUserRegistered)
                {
                    if (!currentUser.IsUserAdmin)
                    {
                        ViewBag.Error = "Your account isn't approved yet.Check your email.";
                        return View();
                    }
                }

                byte[] tempPicture = currentUser.ProfilePicture;
                currentUser.ProfilePicture = null; // set picture to null, for JsonConverter.
                ICollection<Vacation> tempVacation = currentUser.Vacations;
                ICollection<Holiday> tempHolidays = currentUser.Holidays;
                ICollection<ChatRoom> tempChatRoom = currentUser.ChatRooms;
                ICollection<ChatRoomMessage> tempChatRoomMessage = currentUser.ChatRoomMessages;
                ICollection<Notification> tempNotification = currentUser.Notifications;

                currentUser.Vacations = null;
                currentUser.Holidays = null;
                currentUser.ChatRooms = null;
                currentUser.ChatRoomMessages = null;
                currentUser.Notifications = null;
                FormsAuthenticationTicket fat = new FormsAuthenticationTicket(1, user.UserName, DateTime.Now, DateTime.Now.AddMinutes(15), false,
                    JsonConvert.SerializeObject(currentUser, Formatting.None,
                        new JsonSerializerSettings()
                        {
                            ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                        })
                    );
                HttpCookie ck = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(fat));
                ck.Expires = DateTime.Now.AddMinutes(15);

                Response.Cookies.Add(ck);
               // currentUser.LastLoginDate = DateTime.Now;
                currentUser.ProfilePicture = tempPicture;
                currentUser.Holidays = tempHolidays;
                currentUser.Vacations = tempVacation;
                currentUser.ChatRooms = tempChatRoom;
                currentUser.ChatRoomMessages = tempChatRoomMessage;
                currentUser.Notifications = tempNotification;
                userService.Edit(currentUser);
                ViewBag.Error = "";
                return RedirectToRoute("home");
            }
        }
        public ActionResult Logout()
        {
            UsersService userService = new UsersService();
            User currentUser = userService.FindUserByUsername(currentUserOffline);
            if (ChatController.usersOnline != null)
            {
                foreach (UsersLite us in ChatController.usersOnline)
                {
                    if (us.username == currentUserOffline)
                    {
                        us.activity = true;
                        ChatController.usersOnline.First(d => d.username == currentUserOffline).activity = false;
                        DateTime dateNow=DateTime.Now;
                        ChatController.usersOnline.First(d => d.username == currentUserOffline).lastSeenOn = dateNow.ToString("yyyy-MM-dd");
                        currentUser.LastLoginDate = dateNow;
                        userService.Edit(currentUser);
                    }

                    ViewBag.users = ChatController.usersOnline;
                }
            }
            FormsAuthentication.SignOut();
            HttpCookie ck = Request.Cookies[FormsAuthentication.FormsCookieName];
            ck.Expires = DateTime.Now;
            return RedirectToRoute("home");
        }
        private void revertOldVacationDays(Holiday h)
        {
            TestService vacationService = new TestService();
            UsersService users = new UsersService();
            List<Vacation> vacations = vacationService.GetVacations().ToList();
            double addMoreDaysToVacation = 0;
            foreach (Vacation v in vacations)
            {
                if (v.IsSickLeave) continue;

                //ako se praznik nalazi ceo izmedju, povecaj dane za sve.
                if (h.DateFrom >= v.DateFrom && h.DateFrom <= v.DateTo)
                {
                    if (h.DateTo <= v.DateTo)
                    {
                        addMoreDaysToVacation = (h.DateTo - h.DateFrom).TotalDays;
                    }
                    else
                    {
                        addMoreDaysToVacation = (v.DateTo - h.DateFrom).TotalDays;
                    }
                }
                else if (h.DateFrom <= v.DateFrom && h.DateTo >= v.DateTo)
                {
                    addMoreDaysToVacation = (v.DateTo - v.DateFrom).TotalDays;
                }
                else if (h.DateFrom <= v.DateFrom && h.DateTo <= v.DateTo && h.DateTo >= v.DateFrom)
                {

                    addMoreDaysToVacation = (h.DateTo - v.DateFrom).TotalDays;
                }

                if (addMoreDaysToVacation > 0)
                {
                    User u = (User)users.FindById(v.UserId);
                    u.VacationDays -= Convert.ToInt32(addMoreDaysToVacation);
                    users.Edit(u);
                }
            }
        }
        public ActionResult ChangePassPage(ChangePasswordViewModel model)
        {
            UsersService users = new UsersService();
            String currentUsername = User.Identity.Name;
            User user = (User)users.FindUserByUsername(currentUsername);

            if (user.Password.Equals(model.currentPassword))
            {
                if (model.newPassword.Equals(model.confirmNewPass))
                {
                    user.Password = model.confirmNewPass;
                    users.Edit(user);
                }
                else
                {
                    ViewBag.Error = "Password didn't match!!!";
                    return View(model);
                }
            }
            else
            {
                ViewBag.Error = "Password incorect!!";
                return View(model);
            }

            return RedirectToAction("Index", "Home");
        }
        public ActionResult EditPage(EditAccountViewModel model, HttpPostedFileBase file)
        {
            UsersService users = new UsersService();
            String currentUsername = User.Identity.Name;
            User user = (User)users.FindUserByUsername(currentUsername);

            if (user != null)
            {
                if (!currentUsername.Equals(user.Username))
                {
                    return RedirectToAction("Index", "Home");
                }
            }

            User checkForMail = (User)users.FindUserByEmail(model.Email);
            if (checkForMail == null || checkForMail.Email.Equals(user.Email))
            {
                user.FirstName = model.FirstName;
                user.LastName = model.LastName;
                user.Email = model.Email;
                if (!model.removeImage)
                {
                    if (file != null)
                    {
                        using (MemoryStream ms = new MemoryStream())
                        {
                            file.InputStream.CopyTo(ms);
                            byte[] array = ms.GetBuffer();
                            if (array.Length > 55000)
                            {
                                ViewBag.Error = "Image size can't be more than ~50Kb!!";
                                return View(model);
                            }
                            user.ProfilePicture = array;
                        }
                    }
                }
                else
                {
                    user.ProfilePicture = null;
                }

                users.Edit(user);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                ViewBag.Error = "Email address already exist!!";
                return View(model);
            }
        }
        /// <summary>
        /// Reset all vacation days for registered users to 20.
        /// </summary>
        public ActionResult ResetVacationDays()
        {
            UsersService userService = new UsersService();
            List<User> users = userService.FindAll();

            foreach (User user in users)
            {
                user.VacationDays = 20;
                userService.Edit(user);
            }

            return RedirectToAction("ShowAllUsers");
        }
        public ActionResult RegistracijaOdmora(Vacation vacation)
        {
            int vikend = 0;
            flag = 0;
            UsersService users = new UsersService();
            User u = (User)users.FindById(vacation.UserId);
            String datum = DateTime.Now.ToString("yyyy-MM-dd");
            ViewBag.Datum = datum;
            Double numDays = (vacation.DateTo - vacation.DateFrom).TotalDays;
            List<Vacation> vacations = db.GetVacationsForCurrentUser(u.UserId);
            numDays -= DaysIsntCountHoliday(vacation);

                brojacRadnihDanaBezVikenda = GetWorkDays(vacation.DateFrom, vacation.DateTo);
                vikend = Convert.ToInt32(numDays) - brojacRadnihDanaBezVikenda;
                numDays -= vikend;

            if (vacation.IsSickLeave && (DateTime.Parse(vacation.DateTo.ToString("yyyy-MM-dd")) > (DateTime.Parse(datum))) && (DateTime.Parse(vacation.DateTo.ToString("yyyy-MM-dd")) > (DateTime.Parse(vacation.DateFrom.ToString("yyyy-MM-dd")))))
            {
                int brojac = 0;
                if (ModelState.IsValid)
                {

                    foreach (Vacation v in vacations)
                    {
                        if ((vacation.DateFrom >= v.DateFrom && vacation.DateFrom < v.DateTo) || (vacation.DateTo >= v.DateFrom && vacation.DateTo <= v.DateTo) || (vacation.DateFrom <= v.DateFrom && vacation.DateTo >= v.DateTo))
                        {
                            flag = 1;

                        }
                        else
                        {
                            brojac++;
                        }
                    }
                    if (brojac == vacations.Count)
                    {
                        flag = 0;
                        vacation.DateFrom = vacation.DateFrom;
                        vacation.DateTo = vacation.DateTo;
                        db.AddVacation(vacation);
                        return RedirectToAction("initHolidays", "LoadHolidays");
                    }
                    else
                    {
                        flag = 1;
                        return RedirectToAction("RegistracijaOdmora", new { parameterdatum1 = vacation.DateFrom.ToString("yyyy-MM-dd"), parameterdatum2 = vacation.DateTo.ToString("yyyy-MM-dd") });
                    }

                }
                return View();
            }
            else
            {
                if (Convert.ToInt32(numDays) <= u.VacationDays && (DateTime.Parse(vacation.DateTo.ToString("yyyy-MM-dd")) > (DateTime.Parse(datum))) && (DateTime.Parse(vacation.DateTo.ToString("yyyy-MM-dd")) > (DateTime.Parse(vacation.DateFrom.ToString("yyyy-MM-dd")))))
                {
                    int brojac = 0;
                    if (ModelState.IsValid)
                    {
                        foreach (Vacation v in vacations)
                        {
                            if ((vacation.DateFrom >= v.DateFrom && vacation.DateFrom < v.DateTo) || (vacation.DateTo >= v.DateFrom && vacation.DateTo <= v.DateTo) || (vacation.DateFrom <= v.DateFrom && vacation.DateTo >= v.DateTo))
                            {
                                flag = 1;

                            }
                            else
                            {

                                brojac++;
                            }
                        }

                        if (brojac == vacations.Count)
                        {
                            flag = 0;
                            vacation.DateFrom = vacation.DateFrom;
                            vacation.DateTo = vacation.DateTo;
                            db.AddVacation(vacation);
                            int days = u.VacationDays - Convert.ToInt32(numDays);
                            u.VacationDays = days;
                            users.Edit(u);
                            return RedirectToAction("initHolidays", "LoadHolidays");
                        }
                        else
                        {
                            flag = 1;
                            return RedirectToAction("RegistracijaOdmora", new { parameterdatum1 = vacation.DateFrom.ToString("yyyy-MM-dd"), parameterdatum2 = vacation.DateTo.ToString("yyyy-MM-dd") });
                        }

                    }
                    return View();
                }
                else
                {

                    return RedirectToAction("RegistracijaOdmora", new { parameterdatum1 = vacation.DateFrom.ToString("yyyy-MM-dd"), parameterdatum2 = vacation.DateTo.ToString("yyyy-MM-dd") });
                }
                //provera
            }
        }
        public ActionResult EditVacation(Vacation vacation, int? page,String calendar)
        {
            int vikend1 = 0;
            int vikend2 = 0;
            int vikend3 = 0;
            int vikend4 = 0;
            int razlikaZaVikendDane = 0;
            int razlikaZaVikendDanePocetak = 0;
            brojacRadnihDanaZaEditBezVikenda = 0;
            brojacRadnihDanaZaEditBezVikendaFrom = 0;
            String datum = DateTime.Now.ToString("yyyy-MM-dd");
            ViewBag.Datum = datum;
            UsersService users = new UsersService();
            User u = (User)users.FindById(vacation.UserId);
            Double numDays = (vacation.DateTo - vacation.DateFrom).TotalDays;
            Double povecavanjeOdmora = (vacation.DateTo - datumProveraZaEdit).TotalDays;
            Double povecavanjeOdmoraZaPocetak = (vacation.DateFrom - datumProveraZaEditPocetak).TotalDays;
            Vacation oldVacation = (Vacation)db.FindById(vacation.VacationPeriodId);
            List<Vacation> vacations = db.GetVacationsForCurrentUser(u.UserId);
            double oldHolidayVacationCount = DaysIsntCountHoliday(oldVacation);
            double totalHolidayDays = oldHolidayVacationCount - DaysIsntCountHoliday(vacation);
            numDays += totalHolidayDays;
            if (vacation.DateTo > datumProveraZaEdit)
            {
                brojacRadnihDanaZaEditBezVikenda = GetWorkDays(datumProveraZaEdit, vacation.DateTo);
                vikend1 = Convert.ToInt32(povecavanjeOdmora) - brojacRadnihDanaZaEditBezVikenda;
                razlikaZaVikendDane += vikend1;

            }
            else if (vacation.DateTo <= datumProveraZaEdit)
            {
                brojacRadnihDanaZaEditBezVikenda = -(GetWorkDays(vacation.DateTo, datumProveraZaEdit));
                vikend2 = -(Convert.ToInt32(povecavanjeOdmora)) + brojacRadnihDanaZaEditBezVikenda;
                razlikaZaVikendDane -= vikend2;

            }

            if (vacation.DateFrom > datumProveraZaEditPocetak)
            {
                brojacRadnihDanaZaEditBezVikendaFrom = GetWorkDays(datumProveraZaEditPocetak, vacation.DateFrom);
                vikend3 = (Convert.ToInt32(povecavanjeOdmoraZaPocetak)) - brojacRadnihDanaZaEditBezVikendaFrom;
                razlikaZaVikendDanePocetak -= vikend3;

            }
            else
            {
                brojacRadnihDanaZaEditBezVikendaFrom = -(GetWorkDays(vacation.DateFrom, datumProveraZaEditPocetak));
                vikend4 = -(Convert.ToInt32(povecavanjeOdmoraZaPocetak)) + brojacRadnihDanaZaEditBezVikendaFrom;
                razlikaZaVikendDanePocetak += vikend4;

            }

            if (vacation.IsSickLeave && (DateTime.Parse(vacation.DateTo.ToString("yyyy-MM-dd")) > (DateTime.Parse(datum))) && (DateTime.Parse(vacation.DateTo.ToString("yyyy-MM-dd")) > (DateTime.Parse(vacation.DateFrom.ToString("yyyy-MM-dd")))))
            {
                int brojac = 0;
                foreach (Vacation v in vacations)
                {
                    if (vacation.VacationPeriodId == v.VacationPeriodId)
                    {
                        brojac++;
                        continue;
                    }
                    if ((vacation.DateFrom >= v.DateFrom && vacation.DateFrom < v.DateTo) || (vacation.DateTo >= v.DateFrom && vacation.DateTo <= v.DateTo) || (vacation.DateFrom <= v.DateFrom && vacation.DateTo >= v.DateTo))
                    {

                        flag = 1;

                    }
                    else
                    {
                        brojac++;
                    }
                }
                if (brojac == vacations.Count)
                {
                    flag = 0;
                    db.EditVacation(vacation);
                    if (calendar != null && calendar.Equals("true")) {
                        return RedirectToAction("initHolidays", "LoadHolidays");
                    }
                    else
                    {
                        return SeeVacations(page);
                    }
                }
                else
                {
                    flag = 1;
                    if (calendar != null && calendar.Equals("true"))
                    {
                        return RedirectToAction("EditVacation", new { vacationId = vacation.VacationPeriodId, calendar = "true" });
                    }
                    else
                    {
                        return RedirectToAction("EditVacation", new { vacationId = vacation.VacationPeriodId });

                    }
                }

            }
            else
            {
               if (Convert.ToInt32(brojacRadnihDanaZaEditBezVikenda - brojacRadnihDanaZaEditBezVikendaFrom)> u.VacationDays)
                {
                    daniZaProveruZaEdit = brojacRadnihDanaZaEditBezVikenda - brojacRadnihDanaZaEditBezVikendaFrom;
                    flagZaPozivEdita = 1;
                }
                if (Convert.ToInt32(brojacRadnihDanaZaEditBezVikenda - brojacRadnihDanaZaEditBezVikendaFrom) <= u.VacationDays && (DateTime.Parse(vacation.DateTo.ToString("yyyy-MM-dd")) > (DateTime.Parse(datum))) && (DateTime.Parse(vacation.DateTo.ToString("yyyy-MM-dd")) > (DateTime.Parse(vacation.DateFrom.ToString("yyyy-MM-dd")))))
                {
                    int brojac = 0;

                    if (ModelState.IsValid)
                    {
                        foreach (Vacation v in vacations)
                        {
                            if (vacation.VacationPeriodId == v.VacationPeriodId)
                            {
                                brojac++;
                                continue;
                            }
                            if ((vacation.DateFrom >= v.DateFrom && vacation.DateFrom < v.DateTo) || (vacation.DateTo >= v.DateFrom && vacation.DateTo <= v.DateTo) || (vacation.DateFrom <= v.DateFrom && vacation.DateTo >= v.DateTo))
                            {
                                flag = 1;
                            }
                            else
                            {
                                brojac++;
                            }
                        }
                        if (brojac == vacations.Count)
                        {
                            flag = 0;
                            int days = u.VacationDays - Convert.ToInt32(numDays) + daniZaVracanje + razlikaZaVikendDane + razlikaZaVikendDanePocetak;
                            u.VacationDays = days;
                            users.Edit(u);
                            db.EditVacation(vacation);
                            daniZaVracanje = Convert.ToInt32(numDays);
                            if (calendar != null && calendar.Equals("true"))
                            {
                                return RedirectToAction("initHolidays", "LoadHolidays");
                            }
                            else
                            {
                                return SeeVacations(page);
                            }
                        }
                        else
                        {
                            flag = 1;
                            if (calendar != null && calendar.Equals("true"))
                            {
                                return RedirectToAction("EditVacation", new { vacationId = vacation.VacationPeriodId, calendar = "true" });
                            }
                            else
                            {
                                return RedirectToAction("EditVacation", new { vacationId = vacation.VacationPeriodId });

                            }
                        }

                    }
                    return View();
                }
                else
                {
                    if (calendar != null && calendar.Equals("true"))
                    {
                        return RedirectToAction("initHolidays", "LoadHolidays");
                    }
                    else
                    {
                        flagZaPozivEdita = 1;
                        return RedirectToAction("EditVacation", new { vacationId = vacation.VacationPeriodId, calendar = "true" });
                    }
                }
            }
        }