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);
        }
        /// <summary>
        /// Chain two arrays of ScheduledEvent
        /// </summary>
        /// <param name=s1>First array</param>
        /// <param name=s2>Second array</param>
        /// <returns>Array with s1 + s2</returns>
/*        private ScheduledEvent[] AddScheduledEvent(ScheduledEvent[] s1, ScheduledEvent[] s2)
        {
            int i;
            ScheduledEvent[] sdle = new ScheduledEvent[s1.Length + s2.Length];

            for (i = 0; i < s1.Length; i++)
                sdle[i] = s1[i];

            for (int j = i; j < s1.Length + s2.Length; j++)
                sdle[j] = s2[j - s1.Length];
            
            return sdle;
        }
*/
        /// <summary>
        /// Returns events in interval between dt and dt + 15 minutes
        /// </summary>
        /// <param name=sdles>Array of events where we search</param>
        /// <param name=dt>Start of the interval</param>
        /// <returns>Events in interval</returns>
        private ScheduledEvent[] GetEventsByDateTimeInArray(ScheduledEvent[] sdles, DateTime dt)
        {
            int j = 0;
            ScheduledEvent[] sdlesTemp = new ScheduledEvent[sdles.Length];

            for (int i = 0; i < sdles.Length; i++)
            {
                if (((sdles[i].StartDate <= dt) && (sdles[i].EndDate >= dt)) ||
                 ((sdles[i].StartDate >= dt) && (sdles[i].EndDate < dt.AddMinutes(15)))) // Short events
                {
                    sdlesTemp[j] = sdles[i];
                    j++;
                }
            }

            ScheduledEvent[] sdlesReturn = new ScheduledEvent[j];
            for (int i = 0; i < j; i++)
                sdlesReturn[i] = sdlesTemp[i];

            return sdlesReturn;
        }
 private void SaveEvent(ScheduledEvent ev)
 {
     User user = (User)Context.Session["User"];
     ev.Schedule = Schedule.FindByUser(user);
     DateTime dt = ev.StartDate;
     if (dt.Day < 13)
         ev.StartDate = new DateTime(dt.Year, dt.Day, dt.Month, dt.Hour, dt.Minute, dt.Second);
     dt = ev.EndDate;
     if (dt.Day < 13)
         ev.EndDate = new DateTime(dt.Year, dt.Day, dt.Month, dt.Hour, dt.Minute, dt.Second);
     if (ev.StartDate > ev.EndDate) // EndDate can't be before StartDate
         ev.EndDate = ev.StartDate;
     Schedule.FindByUser(user).Events.Add(ev);
     if (ev.Id != 0)
         ev.Save();
     else
         ev.Create();
     user.Update();
 }
        /// <summary>
        /// Return array with the number events in each day
        /// </summary>
        /// <param name=sdles>Array with events</param>
        private int[] CountDayEvents(ScheduledEvent[] sdles, int year, int month)
        {
            int daysInMonth = System.DateTime.DaysInMonth(year, month);
            Int32[] events = new Int32[daysInMonth + 1];
            DateTime beginDay, endDay;

            for (int i = 1; i <= daysInMonth; i++)
            {
                events[i] = 0;
                beginDay = new DateTime(year, month, i, 0, 0, 0);
                endDay = new DateTime(year, month, i, 23, 59, 59);

                foreach (ScheduledEvent sdle in sdles)
                {
                    if ((endDay >= sdle.StartDate) && (beginDay <= sdle.EndDate))
                        events[i]++;
                }
            }

            return events;
        }
        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();
        }