public ActionResult CalendarEvents(int? year, int? month)
        {
            try
            {
                //we shouldn't be looking at any dates less than 2012. or greater than 2100
                if (year != null && year.Value < 2012)
                    year = null;
                else if (year != null && year.Value > 2100)
                    year = null;
                EventsOutModel mod = new EventsOutModel();
                int day = 1;
                if (DateTime.UtcNow.Day > 28)
                    day = 28;
                else if (DateTime.UtcNow.Day == 1)
                    day = 1;
                else
                    day = DateTime.UtcNow.AddDays(-1).Day;
                if (year != null && month != null)
                    mod.StartDate = new DateTime(year.Value, month.Value, day);
                else
                    mod.StartDate = DateTime.UtcNow.AddDays(-1);
                mod.EndDate = mod.StartDate.AddDays(30);

                mod.Events = SiteCache.GetCalendarEvents(mod.StartDate, mod.EndDate);

                return View(mod);
            }
            catch (Exception exception)
            {
                ErrorDatabaseManager.AddException(exception, exception.GetType());
            }
            return Redirect(Url.Content("~/?u=" + SiteMessagesEnum.sww));
        }
        public static List<CalendarEvent> GetCalendarEvents(DateTime start, int page, int take)
        {
            try
            {
                var cached = GetCache(HttpContext.Current.Cache);
                EventsOutModel mod = new EventsOutModel();
                mod.StartDate = start;
                mod.EndDate = start.AddMonths(4);
                if (cached.CalendarEventsModel.StartDate < mod.StartDate && cached.CalendarEventsModel.EndDate > mod.EndDate)
                    return cached.CalendarEventsModel.Events.Where(x => x.StartDate > mod.StartDate && x.EndDate < mod.EndDate).Where(x => x.Name != null).OrderBy(x => x.StartDate).Skip(page * take).Take(take).ToList();
                else
                {
                    if (cached.CalendarEventsModel.StartDate == new DateTime() || cached.CalendarEventsModel.StartDate > mod.StartDate)
                        cached.CalendarEventsModel.StartDate = mod.StartDate;
                    if (cached.CalendarEventsModel.EndDate == new DateTime() || cached.CalendarEventsModel.EndDate < mod.EndDate)
                        cached.CalendarEventsModel.EndDate = mod.EndDate;
                    mod.Events = CalendarEventFactory.GetPublicEvents(cached.CalendarEventsModel.StartDate, cached.CalendarEventsModel.EndDate, new Guid(), false);
                    cached.CalendarEventsModel.Events = mod.Events;
                    UpdateCache(cached);
                    return cached.CalendarEventsModel.Events.Where(x => x.StartDate > mod.StartDate && x.EndDate < mod.EndDate).Where(x => x.Name != null).OrderBy(x => x.StartDate).Skip(page * take).Take(take).ToList();
                }

            }
            catch (Exception exception)
            {
                ErrorDatabaseManager.AddException(exception, exception.GetType());
            }
            return new List<CalendarEvent>();
        }
        public static List<CalendarEvent> SearchCalendarEvents(DateTime start, double longitude, double latitude, int page, int take)
        {
            try
            {
                var cached = GetCache(HttpContext.Current.Cache);

                EventsOutModel mod = new EventsOutModel();
                mod.StartDate = start;
                mod.EndDate = start.AddMonths(4);
                if (cached.CalendarEventsModel.StartDate < mod.StartDate && cached.CalendarEventsModel.EndDate > mod.EndDate)
                {
                    var coord = new RDN.Portable.Classes.Location.GeoCoordinate(latitude, longitude);
                    var nearest = cached.CalendarEventsModel.Events.Where(x => x.Location.Contact.Addresses.Count > 0).OrderBy(x => x.Location.Contact.Addresses.FirstOrDefault().Coords.GetDistanceTo(coord)).ToList();
                }
                else
                {
                    if (cached.CalendarEventsModel.StartDate == new DateTime() || cached.CalendarEventsModel.StartDate > mod.StartDate)
                        cached.CalendarEventsModel.StartDate = mod.StartDate;
                    if (cached.CalendarEventsModel.EndDate == new DateTime() || cached.CalendarEventsModel.EndDate < mod.EndDate)
                        cached.CalendarEventsModel.EndDate = mod.EndDate;
                    mod.Events = CalendarEventFactory.GetPublicEvents(cached.CalendarEventsModel.StartDate, cached.CalendarEventsModel.EndDate, new Guid(), false);
                    cached.CalendarEventsModel.Events = mod.Events;
                    UpdateCache(cached);
                    var coord = new RDN.Portable.Classes.Location.GeoCoordinate(latitude, longitude);
                    var nearest = cached.CalendarEventsModel.Events.Where(x => x.Location.Contact.Addresses.Count > 0).OrderBy(x => x.Location.Contact.Addresses.FirstOrDefault().Coords.GetDistanceTo(coord)).Skip(page * take).Take(take).ToList();

                    return nearest;
                }

            }
            catch (Exception exception)
            {
                ErrorDatabaseManager.AddException(exception, exception.GetType());
            }
            return new List<CalendarEvent>();
        }