/*        private void CheckSuperUser()
        {
            LayoutName = null;
            if ((!(bool)Session["isAdmin"]) && (!(bool)Session["isRoot"]))
                throw new Unauthorized("");
        }
*/
        private void CheckPermissions(Schedule schedule)
        {
/*            LayoutName = null;
            if (schedule != null)
            {          
                User user = (Session.Contains("User")) ? (User) Session["User"] : null;
                if (user != null)
                {
                    if ((user.Id != schedule.Owner.Id) ||
                        (((bool)Session["isAdmin"]) || ((bool)Session["isRoot"])))
                    {
                        bool shared = false;
/*                        foreach (Schedule s in user.Schedule.SharedSchedules)
                            if (s.Id == schedule.Id)
                            {
                                shared = true;
                                 break;
                            }*
                        if ((!shared) &&
                            ((!(bool)Session["isAdmin"]) && (!(bool)Session["isRoot"])))
                            throw new Unauthorized();

                    }
                }
                else
                    throw new Unauthorized();
            }
            else
                throw new Unauthorized();
*/
        }
        /// <summary>
        /// Return all events in a day 
        /// </summary>
        /// <param name="sdel">Schedule where search</param>
        /// <param name="dt">DateTime with the day</param>
        public static ScheduledEvent[] GetEventsInDay(Schedule sdle, DateTime dt)
        {
            DateTime dtNextDay = dt.AddDays(1);
            DateTime dtBeforeDay = dt.AddSeconds(-1);
            
            SimpleQuery q = new SimpleQuery(typeof(ScheduledEvent), @"
                FROM ScheduledEvent S
                WHERE
                    S.Schedule = ? AND
                    ((S.StartDate >= ?) AND (S.EndDate < ?) OR
                    (S.StartDate > ?) AND (S.StartDate < ?) AND (S.EndDate > ?) OR
                    (S.StartDate < ?) AND (S.EndDate < ?) AND (S.EndDate > ?) OR
                    (S.StartDate < ?) AND (S.EndDate > ?))
                ", sdle, dt, dtNextDay, dtBeforeDay, dtNextDay, dt, dt, dtNextDay, dtBeforeDay, dt, dt);

            return (ScheduledEvent[]) ExecuteQuery(q);
        }
        /// <summary>
        /// Return all events in year and month
        /// </summary>
        /// <param name="sdel">Schedule where search</param>
        /// <param name="year">Year where search</param>
        /// <param name="month">Month to get the events</param>
        public static ScheduledEvent[] GetEventsInMonth(Schedule sdle, int year, int month)
        {
//            DateTime sd = new DateTime(year, month, System.DateTime.DaysInMonth(year, month), 23, 59, 59);
//            DateTime ed = new DateTime(year, month, 1, 0, 0, 0);

            DateTime beginMonth = new DateTime(year, month, 1, 0, 0, 0);
            DateTime endMonth = new DateTime(year, month, System.DateTime.DaysInMonth(year, month), 23, 59, 59);

            SimpleQuery q = new SimpleQuery(typeof(ScheduledEvent), @"
                FROM ScheduledEvent S
                WHERE
                    S.Schedule = ? AND
                    S.StartDate < ? AND
                      S.EndDate > ?
                ", sdle, endMonth, beginMonth);

            return (ScheduledEvent[]) ExecuteQuery(q);
        }
 public static ScheduledEvent[] GetNextOrderedEvents(Schedule sdle, DateTime d)
 {
     //string dt = Shidix.PublicAPI.Date2Postgres(d);
     //Shidix.PublicAPI.Logger("Schedule id= " + sdle.Id);
     //Shidix.PublicAPI.Logger("datetime = " + dt);
     SimpleQuery q = new SimpleQuery(typeof(ScheduledEvent), @"
         from ScheduledEvent S
         where S.Schedule = ?
         and S.StartDate > ?
         order by S.StartDate", sdle, d);
     return (ScheduledEvent[]) ExecuteQuery(q);
 }
 //                and S.StartDate <= ?
 //               and S.EndDate >= ?
       
        public static ScheduledEvent[] GetOrderedEvents(Schedule sdle)
        {
            SimpleQuery q = new SimpleQuery(typeof(ScheduledEvent), @"
                from ScheduledEvent S
                where S.Schedule = ?
                order by S.StartDate", sdle.Id);

            return (ScheduledEvent[]) ExecuteQuery(q);
        }
        public static ScheduledEvent[] GetEventsOverlap(Schedule s, ScheduledEvent sdle)
        {
            SimpleQuery q = new SimpleQuery(typeof(ScheduledEvent), @"
                from ScheduledEvent S
                where S.Schedule = ?
                and ((S.StartDate <= ? and S.EndDate >= ?)
                or (S.StartDate <= ? and S.EndDate >= ?)
                or (S.StartDate >= ? and S.EndDate <= ?))
                and S.Id != ?
                order by S.StartDate", s, sdle.StartDate, sdle.StartDate, sdle.EndDate, sdle.EndDate, sdle.StartDate, sdle.EndDate, sdle.Id);
//                order by S.StartDate", s, sdle.StartDate, sdle.StartDate, sdle.Id);

            return (ScheduledEvent[]) ExecuteQuery(q);
        }
        public void ShareSchedules(Schedule sche1, Schedule sche2)
        {
            bool exist = false;
    
            foreach (Schedule s in sche1.SharedSchedules)
                if (s.Id == sche2.Id)
                    exist = true;

            if (exist == false)
            {
                sche1.SharedSchedules.Add(sche2);
                sche1.Save();
            }
            else
                System.Console.WriteLine("Ya estaba compartida");
        }
        public void SaveSchedule([ARFetch ("Id", Create = false)] User user)
        {
            if (user != null)
            {
                if (Schedule.FindByUser(user) == null)
                {
                    Schedule schedule = new Schedule();
                    schedule.Owner = user;
                    schedule.Save();
                }
            }

            PropertyBag["user"] = user;
            Hashtable parameters = new Hashtable();
            parameters["id"] = user.Id;
            RedirectToAction("showschedule", parameters);
        }
        private void Calendar(int year, int month, Schedule s)
        {
            ScheduledEvent[] sdles = ScheduledEvent.GetEventsInMonth(s, year, month);
            int[] dayEvents = CountDayEvents(sdles, year, month);

/*            foreach (Schedule s in user.Schedule.SharedSchedules)
            {
                ScheduledEvent[] sdlesTemp = ScheduledEvent.GetEventsInMonth(s, year, month);
                int[] dayEventsTemp = CountDayEvents(sdlesTemp, year, month);

                for (int i = 1; i <= daysInMonth; i++)
                    dayEvents[i] += dayEventsTemp[i];

                sdles = AddScheduledEvent(sdles, sdlesTemp);
            }
*/
            IList monthMatrix = BuildMonth(year,month);
            PropertyBag["selectedMonth"] = month;
            PropertyBag["selectedYear"] = year;
            PropertyBag["monthMatrix"] = monthMatrix;
            PropertyBag["dayEvents"] = dayEvents;
            ScheduledEvent[] events = ScheduledEvent.GetNextOrderedEvents(s, DateTime.Now);
//          foreach (Schedule s in user.Schedule.SharedSchedules)
//               events = AddScheduledEvent(events, ScheduledEvent.GetNextOrderedEvents(s, DateTime.Now));

            if (events.Length > 5)
            {
                 ScheduledEvent[] sdlesTemp = new ScheduledEvent[5];
                 Array.Copy(events, sdlesTemp, 5);
                 events = sdlesTemp;
            }

            PropertyBag["events"] = events;
            PropertyBag["today"] = DateTime.Now.ToShortDateString();
        }