public static Calendar GetCalendarEvents(Guid memId, Guid uid, Guid calendarId, CalendarOwnerEntityEnum ownerType, int year, int month)
 {
     Random r = new Random();
     var response = Network.SendPackage(Network.ConvertObjectToStream(new CalendarSendParams() { CurrentMemberId = memId, UserId = uid, Year = year, Month = month, CalendarId = calendarId, CalendarType = ownerType }), MobileConfig.LEAGUE_CALENDAR_LIST_URL + "?r=" + r.Next());
     var stream = response.GetResponseStream();
     StreamReader read = new StreamReader(stream);
     string json = read.ReadToEnd();
     return Json.DeserializeObject<Calendar>(json);
 }
        /// <summary>
        /// any changes made here need to be mirrored in getcalendarscheduleForView
        /// </summary>
        /// <param name="id"></param>
        /// <param name="ownerEntity"></param>
        /// <param name="startDate"></param>
        /// <param name="endDate"></param>
        /// <returns></returns>
        public static RDN.Portable.Classes.Controls.Calendar.Calendar GetCalendarSchedule(Guid id, CalendarOwnerEntityEnum ownerEntity, DateTime startDate, DateTime endDate, Guid memberId, bool isAttendanceManagerOrBetter)
        {
            RDN.Portable.Classes.Controls.Calendar.Calendar newCal = new RDN.Portable.Classes.Controls.Calendar.Calendar();
            try
            {
                var dc = new ManagementContext();
                var calDb = (from xx in dc.Calendar.Include("CalendarEventsReocurring").Include("CalendarEvents").Include("CalendarEvents.ReocurringEvent").Include("CalendarEvents.PointsForEvent")
                             where xx.CalendarId == id
                             select new
                             {
                                 xx.IsCalendarInUTC,
                                 xx.TimeZone,
                                 Events = xx.CalendarEvents.Where(x => x.StartDate >= startDate && x.EndDate <= endDate && x.IsRemovedFromCalendar == false),
                                 FedOwners = xx.FederationOwners,
                                 LeagueOwners = xx.LeagueOwners,
                                 AllowSelfCheckIn = xx.AllowSelfCheckIn,
                                 xx.DisableBirthdaysFromShowing,
                                 xx.DisableStartSkatingDays,
                                 EventsReocurring = xx.CalendarEventsReocurring.Where(x => (x.EndReocurring >= startDate || x.EndReocurring == null) && x.StartReocurring <= endDate && x.IsRemovedFromCalendar == false),
                             }).FirstOrDefault();
                newCal.IsCalendarInUTC = calDb.IsCalendarInUTC;
                newCal.TimeZone = calDb.TimeZone;
                newCal.CalendarId = id;
                newCal.OwnerEntity = ownerEntity;
                newCal.AllowSelfCheckIn = calDb.AllowSelfCheckIn;
                newCal.DisableBirthdays = calDb.DisableBirthdaysFromShowing;
                newCal.DisableSkatingStartDates = calDb.DisableStartSkatingDays;
                if (ownerEntity == CalendarOwnerEntityEnum.federation)
                {
                    foreach (var own in calDb.FedOwners)
                    {
                        CalendarOwner owner = new CalendarOwner();
                        owner.OwnerId = own.Federation.FederationId;
                        owner.OwnerName = own.Federation.Name;
                        newCal.EntityName = own.Federation.Name;

                        newCal.Owners.Add(owner);
                    }
                }
                else if (ownerEntity == CalendarOwnerEntityEnum.league)
                {
                    foreach (var own in calDb.LeagueOwners)
                    {
                        CalendarOwner owner = new CalendarOwner();
                        owner.OwnerId = own.League.LeagueId;
                        owner.OwnerName = own.League.Name;
                        newCal.EntityName = own.League.Name;
                        newCal.Owners.Add(owner);
                    }
                }

                foreach (var ev in calDb.Events)
                {
                    newCal.Events.Add(CalendarEventFactory.DisplayEvent(ev, memberId, isAttendanceManagerOrBetter));
                }
                foreach (var ev in calDb.EventsReocurring)
                {
                    //used so we can refresh the last day events were created..

                    // ev.LastDateEventsWereCreated = endDate.AddMonths(-1);
                    if (ev.LastDateEventsWereCreated.GetValueOrDefault() < endDate)
                    {
                        var eventRe = dc.CalendarEventsReocurring.Where(x => x.CalendarItemId == ev.CalendarItemId && x.IsRemovedFromCalendar == false).FirstOrDefault();
                        eventRe.LastDateEventsWereCreated = endDate;
                        eventRe.Calendar = eventRe.Calendar;
                        dc.SaveChanges();

                        var aEvent = new CalendarViewEventJson()
                        {
                            id = ev.CalendarItemId,
                            Title = ev.Name,
                            Frequency = ev.FrequencyReocurring,
                            DaysOfWeek = ev.DaysOfWeekReocurring,
                            MonthlyInterval = ev.MonthlyIntervalReocurring
                        };
                        var schedule = new Schedule(aEvent);

                        var range = new DateRange()
                        {
                            StartDateTime = ev.StartReocurring
                        };
                        //date is null if the event is never ending.
                        if (ev.EndReocurring.HasValue)
                            range.EndDateTime = ev.EndReocurring.Value;
                        else
                            range.EndDateTime = endDate.AddMonths(1);

                        foreach (var date in schedule.Occurrences(range))
                        {
                            CalendarEvent calEvent = new CalendarEvent();
                            Guid locationId = new Guid();
                            if (ev.Location != null)
                            {
                                calEvent.Location.LocationName = ev.Location.LocationName;
                                locationId = ev.Location.LocationId;
                            }
                            calEvent.Name = ev.Name;
                            calEvent.CalendarItemId = ev.CalendarItemId;
                            if (eventRe.Color != null)
                            {
                                var c = Color.FromArgb(eventRe.Color.ColorIdCSharp);
                                calEvent.ColorTempSelected = ColorTranslator.ToHtml(c);
                            }

                            if (!ev.IsInUTCTime)
                            {
                                calEvent.StartDate = new DateTime(date.Year, date.Month, date.Day, ev.StartDate.Hour, ev.StartDate.Minute, ev.StartDate.Second);
                                calEvent.EndDate = new DateTime(date.Year, date.Month, date.Day, ev.EndDate.Hour, ev.EndDate.Minute, ev.EndDate.Second);
                            }
                            else
                            {
                                //we have to create a temp dates so we can add the timezone information without going back a day
                                //if the time being used is on the border.
                                //without the tempdates 1/4/2013 7pm turned into 1/3/2013 7pm because the timezones didn't account for the 
                                //fact the dates were already in utc.
                                var startTempDate = new DateTime(date.Year, date.Month, date.Day, ev.StartDate.Hour, ev.StartDate.Minute, ev.StartDate.Second) + new TimeSpan(ev.Calendar.TimeZone, 0, 0);
                                var endTempDate = new DateTime(date.Year, date.Month, date.Day, ev.EndDate.Hour, ev.EndDate.Minute, ev.EndDate.Second) + new TimeSpan(ev.Calendar.TimeZone, 0, 0);
                                calEvent.StartDate = new DateTime(date.Year, date.Month, date.Day, startTempDate.Hour, startTempDate.Minute, startTempDate.Second);
                                calEvent.EndDate = new DateTime(date.Year, date.Month, date.Day, endTempDate.Hour, endTempDate.Minute, endTempDate.Second);
                            }

                            calEvent.Notes = ev.Notes;
                            calEvent.AllowSelfCheckIn = ev.AllowSelfCheckIn;

                            //var evs = (from xx in newCal.Events
                            //           where xx.CalendarReoccurringId == ev.CalendarItemId
                            //           where xx.StartDate == calEvent.StartDate
                            //           where xx.EndDate == calEvent.EndDate
                            //           select xx).FirstOrDefault();
                            ////dirty bit to check if event was already in list.  If it is, we don't add it.
                            ////the date check here is to only create events within the calendar selected dates
                            //if (evs == null && calEvent.StartDate >= startDate && calEvent.EndDate <= endDate)
                            //{
                            //    string colorHex = String.Empty;
                            //    if (ev.Color != null)
                            //    {
                            //        var c = Color.FromArgb(ev.Color.ColorIdCSharp);
                            //        colorHex = ColorTranslator.ToHtml(c);
                            //    }
                            //    Guid calItemId = CalendarEventFactory.CreateNewEvent(ev.Calendar.CalendarId, calEvent.StartDate, calEvent.EndDate, locationId, ev.Name, ev.Link, ev.Notes, ev.AllowSelfCheckIn, ev.IsPublic, true, calEvent.CalendarItemId, ev.EventType.CalendarEventTypeId, false, ev.TicketUrl, colorHex, new List<long>(), memberId);
                            //    calEvent.CalendarItemId = calItemId;
                            //    newCal.Events.Add(calEvent);
                            //}
                        }

                    }
                }
            }
            catch (Exception exception)
            {
                ErrorDatabaseManager.AddException(exception, exception.GetType());
            }
            return newCal;
        }
        public static RDN.Portable.Classes.Controls.Calendar.Calendar GetCalendar(Guid id, CalendarOwnerEntityEnum ownerEntity)
        {
            RDN.Portable.Classes.Controls.Calendar.Calendar newCal = new RDN.Portable.Classes.Controls.Calendar.Calendar();
            try
            {
                var dc = new ManagementContext();
                var calDb = (from xx in dc.Calendar
                             where xx.CalendarId == id
                             select new
                             {
                                 xx.CalendarId,
                                 xx.AllowSelfCheckIn,
                                 xx.NotPresentCheckIn,
                                 xx.DisableBirthdaysFromShowing,
                                 xx.DisableStartSkatingDays,
                                 xx.ImportFeedUrl,
                                 xx.CalendarImportTypeEnum,
                                 xx.TimeZone,
                                 xx.TimeZoneSelection,
                                 xx.IsCalendarInUTC
                             }).FirstOrDefault();

                if (calDb == null)
                    return null;

                newCal.CalendarId = id;
                newCal.OwnerEntity = ownerEntity;
                newCal.AllowSelfCheckIn = calDb.AllowSelfCheckIn;
                newCal.NotPresentCheckIn = calDb.NotPresentCheckIn;
                newCal.DisableSkatingStartDates = calDb.DisableStartSkatingDays;
                newCal.DisableBirthdays = calDb.DisableBirthdaysFromShowing;
                newCal.ImportFeedType = (CalendarImportTypeEnum)calDb.CalendarImportTypeEnum;
                newCal.ImportFeedUrl = calDb.ImportFeedUrl;
                if (calDb.TimeZoneSelection != null)
                    newCal.TimeZoneId = calDb.TimeZoneSelection.ZoneId;
                newCal.TimeZone = (int)calDb.TimeZone;

                newCal.TimeZones = Classes.Location.TimeZoneFactory.GetTimeZones();

                newCal.IsCalendarInUTC = calDb.IsCalendarInUTC;

                var types = dc.CalendarEventTypes.Where(x => x.CalendarOwner.CalendarId == id);
                foreach (var type in types)
                {
                    CalendarEventType t = new CalendarEventType();
                    t.CalendarEventTypeId = type.CalendarEventTypeId;
                    t.EventTypeName = type.EventTypeName;
                    t.PointsForExcused = type.PointsForExcused;
                    t.PointsForNotPresent = type.PointsForNotPresent;
                    t.PointsForPartial = type.PointsForPartial;
                    t.PointsForPresent = type.PointsForPresent;
                    t.PointsForTardy = type.PointsForTardy;
                    if (type.DefaultColor != null)
                    {
                        var c = Color.FromArgb(type.DefaultColor.ColorIdCSharp);
                        t.ColorTempSelected = ColorTranslator.ToHtml(c);
                        t.ColorName = type.DefaultColor.ColorName;
                    }
                    newCal.EventTypes.Add(t);
                }
            }
            catch (Exception exception)
            {
                ErrorDatabaseManager.AddException(exception, exception.GetType());
            }
            return newCal;
        }
        /// <summary>
        /// gets the owner entity id of the league or the federation
        /// </summary>
        /// <param name="calendarId"></param>
        /// <param name="owner"></param>
        /// <returns></returns>
        public static Guid GetEntityOwnerId(Guid calendarId, CalendarOwnerEntityEnum owner)
        {
            try
            {
                var dc = new ManagementContext();
                var calDb = (from xx in dc.Calendar
                             where xx.CalendarId == calendarId
                             select new
                             {
                                 xx.FederationOwners,
                                 xx.LeagueOwners
                             }).FirstOrDefault();

                if (calDb == null)
                    return new Guid();

                if (calDb.FederationOwners.FirstOrDefault() != null)
                    return calDb.FederationOwners.FirstOrDefault().Federation.FederationId;
                if (calDb.LeagueOwners.FirstOrDefault() != null)
                    return calDb.LeagueOwners.FirstOrDefault().League.LeagueId;
            }
            catch (Exception exception)
            {
                ErrorDatabaseManager.AddException(exception, exception.GetType());
            }
            return new Guid();
        }
        public static RDN.Portable.Classes.Controls.Calendar.Calendar CreateCalendar(Guid ownerId, CalendarOwnerEntityEnum ownerType)
        {
            RDN.Portable.Classes.Controls.Calendar.Calendar calNew = new RDN.Portable.Classes.Controls.Calendar.Calendar();
            try
            {
                var dc = new ManagementContext();
                DataModels.Calendar.Calendar cal = new DataModels.Calendar.Calendar();
                cal.AllowSelfCheckIn = false;
                cal.IsCalendarInUTC = true;
                if (ownerType == CalendarOwnerEntityEnum.federation)
                {
                    DataModels.Calendar.CalendarFederationOwnership owner = new DataModels.Calendar.CalendarFederationOwnership();
                    owner.Calendar = cal;
                    owner.Federation = dc.Federations.Where(x => x.FederationId == ownerId).FirstOrDefault();
                    owner.OwnerType = Convert.ToInt32(CalendarOwnerTypeEnum.Owner);
                    cal.FederationOwners.Add(owner);
                }
                else if (ownerType == CalendarOwnerEntityEnum.league)
                {
                    DataModels.Calendar.CalendarLeagueOwnership owner = new DataModels.Calendar.CalendarLeagueOwnership();
                    owner.Calendar = cal;
                    owner.League = dc.Leagues.Where(x => x.LeagueId == ownerId).FirstOrDefault();
                    owner.OwnerType = Convert.ToInt32(CalendarOwnerTypeEnum.Owner);
                    cal.LeagueOwners.Add(owner);
                }
                else if (ownerType == CalendarOwnerEntityEnum.member)
                {
                    DataModels.Calendar.CalendarMemberOwnership owner = new DataModels.Calendar.CalendarMemberOwnership();
                    owner.Calendar = cal;
                    owner.Member = dc.Members.Where(x => x.MemberId == ownerId).FirstOrDefault();
                    owner.OwnerType = Convert.ToInt32(CalendarOwnerTypeEnum.Owner);
                    cal.MemberOwners.Add(owner);
                }
                dc.Calendar.Add(cal);
                dc.SaveChanges();

                calNew.CalendarId = cal.CalendarId;
                calNew.OwnerEntity = ownerType;
                calNew.AllowSelfCheckIn = false;
            }
            catch (Exception exception)
            {
                ErrorDatabaseManager.AddException(exception, exception.GetType());
            }
            return calNew;
        }
        /// <summary>
        /// any changes made here need to be mirrored in getcalendarschedule
        /// </summary>
        /// <param name="id"></param>
        /// <param name="ownerEntity"></param>
        /// <param name="startDate"></param>
        /// <param name="endDate"></param>
        /// <returns></returns>
        public static RDN.Portable.Classes.Controls.Calendar.Calendar GetCalendarScheduleForView(Guid id, CalendarOwnerEntityEnum ownerEntity, DateTime startDate, DateTime endDate, Guid memberId)
        {
            RDN.Portable.Classes.Controls.Calendar.Calendar cal = new RDN.Portable.Classes.Controls.Calendar.Calendar();

            try
            {
                var dc = new ManagementContext();
                var calDb = (from xx in dc.Calendar.Include("CalendarEventsReocurring").Include("CalendarEvents").Include("CalendarEvents.ReocurringEvent").Include("CalendarEvents.PointsForEvent")
                             where xx.CalendarId == id
                             select new
                             {
                                 xx.IsCalendarInUTC,
                                 xx.TimeZone,
                                 xx.TimeZoneSelection,
                                 xx.DisableStartSkatingDays,
                                 xx.DisableBirthdaysFromShowing,
                                 Events = xx.CalendarEvents.Where(x => x.StartDate >= startDate && x.EndDate <= endDate && x.IsRemovedFromCalendar == false),
                                 EventsReocurring = xx.CalendarEventsReocurring.Where(x => (x.EndReocurring >= startDate || x.EndReocurring == null) && x.StartReocurring <= endDate && x.IsRemovedFromCalendar == false),
                             }).FirstOrDefault();

                string baseUrl = VirtualPathUtility.ToAbsolute("~/calendar/event/" + ownerEntity.ToString() + "/" + id.ToString().Replace("-", "") + "/");
                cal.DisableSkatingStartDates = calDb.DisableStartSkatingDays;
                cal.DisableBirthdays = calDb.DisableBirthdaysFromShowing;
                //adds all the events from the database that were in the date range selected.
                foreach (var ev in calDb.Events)
                {
                    try
                    {
                        CalendarEventJson calEvent = new CalendarEventJson();
                        if (ev.Color != null)
                        {
                            var c = Color.FromArgb(ev.Color.ColorIdCSharp);
                            calEvent.backColor = ColorTranslator.ToHtml(c);
                        }
                        calEvent.title = ev.Name;
                        //removes length less than 14 chars 
                        //because the title is too long for the calendar display.
                        if (ev.Name.Length > 14)
                            calEvent.title = calEvent.title.Remove(14);
                        calEvent.id = ev.CalendarItemId;
                        if (ev.ReocurringEvent != null)
                            calEvent.ReocurringId = ev.ReocurringEvent.CalendarItemId;
                        calEvent.url = baseUrl + ev.CalendarItemId.ToString().Replace("-", "");
                        if (!ev.IsInUTCTime)
                        {
                            calEvent.start = ev.StartDate.ToString("o");
                            calEvent.end = ev.EndDate.ToString("o");
                            calEvent.StartDate = ev.StartDate;
                            calEvent.EndDate = ev.EndDate;
                        }
                        else
                        {
                            calEvent.StartDate = ev.StartDate + new TimeSpan(calDb.TimeZone, 0, 0);
                            calEvent.EndDate = ev.EndDate + new TimeSpan(calDb.TimeZone, 0, 0);
                            if (calEvent.StartDate != null)
                                calEvent.start = calEvent.StartDate.ToString("o");
                            if (calEvent.EndDate != null)
                                calEvent.end = calEvent.EndDate.ToString("o");
                        }
                        cal.EventsJson.Add(calEvent);
                    }
                    catch (Exception exception)
                    {
                        ErrorDatabaseManager.AddException(exception, exception.GetType(), additionalInformation: calDb.TimeZone + ":" + ev.StartDate + ":" + ev.EndDate);
                    }
                }
                
                int amount = dc.SaveChanges();
            }
            catch (Exception exception)
            {
                ErrorDatabaseManager.AddException(exception, exception.GetType());
            }
            return cal;
        }