public void Send(string name, string message, string recipientName)
        {
            ChatRoomMessageService messageService = new ChatRoomMessageService();
            UsersService userService = new UsersService();
            ChatRoomsService roomService = new ChatRoomsService();

            if (recipientName != null)
            {
                ChatRoomMessage chatRoomMessage = new ChatRoomMessage();
                User sender = userService.FindUserByUsername(name);
                User recipient = userService.FindUserByUsername(recipientName);
                if (sender != null && recipient != null)
                {
                    chatRoomMessage.CreatedBy = sender.UserId;
                    chatRoomMessage.DateCreated = DateTime.Now;
                    chatRoomMessage.Message = message;
                    chatRoomMessage.SentTo = recipient.UserId;
                    int roomId = roomService.FindRoomIdForPrivateChat(chatRoomMessage);
                    if (roomId != -1)
                    {
                        chatRoomMessage.RoomId = roomId;
                    }
                    else
                    {
                        ChatRoom chatRoom = new ChatRoom();
                        chatRoom.CreatedBy = sender.UserId;
                        chatRoom.DateCreated = DateTime.Now;
                        chatRoom.IsDeleted = false;
                        chatRoom.RoomDescription = "Private chat";
                        chatRoom.RoomName = "Private_Chat";
                        chatRoom.IsPrivate = true;
                        int currentRoomId = roomService.CreateWithId(chatRoom);
                        chatRoomMessage.RoomId = currentRoomId;
                    }
                    messageService.Create(chatRoomMessage);
                    previousMessages = messageService.FindAllMessagesForCurrentRoom(chatRoomMessage.RoomId);
                    Clients.User(recipientName).addNewMessageToPage(name, message, recipientName, previousMessages);
                }
            }
            else
            {
                ChatRoomMessage chatRoomMessage = new ChatRoomMessage();
                User sender = userService.FindUserByUsername(name);
                if (sender != null)
                {
                    chatRoomMessage.CreatedBy = sender.UserId;
                    chatRoomMessage.DateCreated = DateTime.Now;
                    chatRoomMessage.Message = message;
                    chatRoomMessage.SentTo = null;
                    chatRoomMessage.RoomId = 1; // MASTER ROOM

                    messageService.Create(chatRoomMessage);
                    previousMessages = messageService.FindAllMessagesForCurrentRoom(chatRoomMessage.RoomId);
                    Clients.All.addNewMessageToPage(name, message, recipientName, previousMessages);
                }
            }
        }
        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");
        }
        ///<summary>
        ///Show account details.
        ///</summary>
        public ActionResult AccountDetails(String id)
        {
            UsersService users = new UsersService();
            User user = (User)users.FindUserByUsername(id);
            String currentUsername = User.Identity.Name;

            if (user != null)
            {
                if (!currentUsername.Equals(user.Username))
                {
                    return RedirectToAction("Index", "Home");
                }
                UserViewModel model = new UserViewModel();
                model.Email = user.Email;
                model.FirstName = user.FirstName;
                model.LastName = user.LastName;
                model.DateCreated = (DateTime)user.DateCreated;
                model.IsUserRegistered = user.IsUserRegistered;
                model.ProfilePicture = user.ProfilePicture;
                model.Username = user.Username;
                model.VacationDays = user.VacationDays;
                return View(model);
            }
            else
            {
                return View();
            }
        }
        /// <summary>
        /// Send notification to all online users when admin change/edit/delete holiday.
        /// </summary>
        /// <param name="type">add, edit, delete</param>
        /// <param name="message">Holiday description.</param>
        /// <param name="sender">Who change/edit/delete holiday.</param>
        public void SendNotification(string type, string message, string sender)
        {
            NotificationService notificationService = new NotificationService();
            UsersService userService = new UsersService();

            User createdBy = (User)userService.FindUserByUsername(sender);
            int userCount = 0;
            foreach (User user in userService.FindAll())
            {
                if (!user.IsUserAdmin && user.IsUserRegistered)
                {
                    Notification notification = new Notification();
                    notification.CreatedBy = createdBy.UserId;
                    notification.DateCreated = DateTime.Now;
                    notification.IsRead = false;
                    notification.SentTo = user.UserId;
                    notification.Description = ChoseDescription(type, message, sender);
                    notificationService.Create(notification);
                    userCount++;
                }
            }
            int maxNotificationId = notificationService.FindLastNotificationId();
            int minNotificationId = maxNotificationId - userCount;

            Clients.All.broadcastNotification(type, message, minNotificationId, maxNotificationId);
        }
        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>
 /// Go to change password page for current loged in user.
 /// </summary>
 public ActionResult ChangePassPage(String id)
 {
     UsersService users = new UsersService();
     User user = (User)users.FindUserByUsername(id);
     String currentUsername = User.Identity.Name;
     if (!currentUsername.Equals(user.Username))
     {
         return RedirectToAction("Index", "Home");
     }
     ChangePasswordViewModel model = new ChangePasswordViewModel();
     return View(model);
 }
        ///<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 EditVacation(int vacationId)
        {
            UsersService users = new UsersService();
            User u = users.FindUserByUsername(HttpContext.User.Identity.Name);
            ViewBag.BrDana = u.VacationDays;
            ViewBag.Flag = flag;

            TestService ser = new TestService();
            if (ser.FindVacationByUserId(u.UserId, vacationId) == true)
            {
                Vacation vac = (Vacation)db.FindById(vacationId);
                if (vac == null)
                {
                    //...
                    return RedirectToAction("SeeVacations");
                }
                Double numDays = (vac.DateTo - vac.DateFrom).TotalDays;
                daniZaVracanje = Convert.ToInt32(numDays);
                String datum = DateTime.Now.ToString("yyyy-MM-dd");
                ViewBag.Datum = datum;
                ViewBag.Bolestan = vac.IsSickLeave;
                datumProveraZaEdit = vac.DateTo;
                datumProveraZaEditPocetak = vac.DateFrom;
                ViewBag.editDateFrom = vac.DateFrom.ToString("yyyy-MM-dd");
                ViewBag.editDateTo = vac.DateTo.ToString("yyyy-MM-dd");
                flag = 0;
                ViewBag.ProveraDaniZaEdit = daniZaProveruZaEdit;
                ViewBag.FlagZaPozivEdita = flagZaPozivEdita;
                flagZaPozivEdita = 0;
                return View(vac);
            }
            else
            {

                return RedirectToAction("SeeVacations");
            }
        }
        public ActionResult RegisterPage(RegisterViewModel model, HttpPostedFileBase file)
        {
            if (ModelState.IsValid)
            {
                UsersService userService = new UsersService();
                User currentUser = userService.FindUserByUsername(model.Username);

                if (currentUser != null)
                {
                    ViewBag.Error = "Username already exist!";
                    return View();
                }
                if (!model.Password.Equals(model.repeatPassword))
                {
                    ViewBag.Error = "Password doesn't match!";
                    return View();
                }
                currentUser = userService.FindUserByEmail(model.Email);
                if (currentUser != null)
                {
                    ViewBag.Error = "Email address already exist!!";
                    return View();
                }

                User user = new User();
                user.Email = model.Email;
                user.FirstName = model.FirstName;
                user.LastName = model.LastName;
                user.Password = model.Password;
                user.Username = model.Username;
                user.DateCreated = DateTime.Now;
                user.IsUserAdmin = false;
                user.IsUserRegistered = false;
                user.LastLoginDate = DateTime.Now;
                user.VacationDays = 20;

                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();
                        }
                        user.ProfilePicture = array;
                    }

                }
                userService.Create(user);
                return RedirectToAction("RegisterOK", "Home");
            }
            return View();
        }
        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>
        /// Go to edit page for current Loged in user.
        /// </summary>
        public ActionResult EditPage(String id)
        {
            UsersService users = new UsersService();
            User user = (User)users.FindUserByUsername(id);
            String currentUsername = User.Identity.Name;
            if (user != null)
            {
                if (!currentUsername.Equals(user.Username))
                {
                    return RedirectToAction("Index", "Home");
                }

                EditAccountViewModel model = new EditAccountViewModel();
                model.Email = user.Email;
                model.FirstName = user.FirstName;
                model.LastName = user.LastName;
                model.removeImage = false;
                return View(model);
            }
            else
            {
                return View();
            }
        }
 public ActionResult SeeVacationsDelete(int? page)
 {
     UsersService users = new UsersService();
     int userId = users.FindUserByUsername(HttpContext.User.Identity.Name).UserId;
     List<Vacation> currentUserVacations = db.GetVacationsForCurrentUser(userId);
     double tempPaginationValue = currentUserVacations.Count() / 6;
     if (currentUserVacations.Count() % 6 != 0) tempPaginationValue++;
     if (tempPaginationValue < page) page--;
     //if (page != 1 && page != tempPaginationValue && 6 * tempPaginationValue == currentUserVacations.Count()) page--;
     String datum = DateTime.Now.ToString("yyyy-MM-dd");
     ViewBag.Datum = datum;
     return View("SeeVacations", currentUserVacations.ToList().ToPagedList(page ?? 1, 6));
 }
        public IList<ChatMessageModel> LoadPrivateMessagesHistory(string userFrom, string userTo)
        {
            UsersService userService = new UsersService();
            ChatRoomMessageService msgService = new ChatRoomMessageService();
            User sender = userService.FindUserByUsername(userFrom);
            User recipient = userService.FindUserByUsername(userTo);

            ChatRoomMessage messageTemp = new ChatRoomMessage();
            messageTemp.CreatedBy = sender.UserId;
            messageTemp.SentTo = recipient.UserId;

            int roomId = FindRoomIdForPrivateChat(messageTemp);

            if (roomId != -1)
            {
                return msgService.FindAllMessagesForCurrentRoom(roomId).ToList();
            }

            return null;
        }
        public void SendMessageNotification(string name, string message, string recipientName)
        {
            NotificationService notificationService = new NotificationService();
            UsersService userService = new UsersService();

            User createdBy = (User)userService.FindUserByUsername(name);
            User sentTo = (User)userService.FindUserByUsername(recipientName);

            Notification notification = new Notification();
            notification.DateCreated = DateTime.Now;
            notification.CreatedBy = createdBy.UserId;
            notification.Description = "New message from " + name;
            notification.IsRead = false;
            notification.SentTo = sentTo.UserId;
            notificationService.Create(notification);
            int notificationId = notification.NotificationId;

            Clients.User(recipientName).broadcastNotification(name, message, recipientName, notificationId);
        }
        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");
        }
 /// <summary>
 /// Find notification in range for current user.
 /// </summary>
 /// <param name="currentUsername">Username of logged user.</param>
 /// <param name="minNotificationId">Max - notifcationMessage sent count.</param>
 /// <param name="maxNotificationId">Max notification id : last</param>
 /// <returns>My notification.</returns>
 public Notification FindCurrentUserNotificationInRange(string currentUsername, int minNotificationId, int maxNotificationId)
 {
     Notification notification = null;
     UsersService userService = new UsersService();
     while (minNotificationId <= maxNotificationId)
     {
         notification = context.Notifications.Find(minNotificationId);
         User user = userService.FindUserByUsername(currentUsername);
         if (user != null)
         {
             if (user.UserId == notification.SentTo)
             {
                 return notification;
             }
         }
         minNotificationId++;
     }
     return notification;
 }
        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 RegistracijaOdmora(String parameterdatum1, String parameterdatum2)
        {
            UsersService users = new UsersService();
            User u = users.FindUserByUsername(HttpContext.User.Identity.Name);
            String datum = DateTime.Now.ToString("yyyy-MM-dd");
            ViewBag.Datum = datum;
            s1 = parameterdatum1;
            s2 = parameterdatum2;
            ViewBag.Parameterdatum1 = parameterdatum1;
            ViewBag.Parameterdatum2 = parameterdatum2;
            ViewBag.UserId = u.UserId;
            ViewBag.BrDana = u.VacationDays;
            var vac = new Vacation();
            vac.UserId = Int32.Parse(u.UserId.ToString());
            vac.DateFrom = Convert.ToDateTime(parameterdatum1);
            vac.DateTo = Convert.ToDateTime(parameterdatum2);
            daniZaProveru = GetWorkDays(vac.DateFrom, vac.DateTo);
            ViewBag.DaniZaProveru = daniZaProveru;
            ViewBag.Flag = flag;
            flag = 0;

            return View(vac);
        }