protected override void CreateChildControls()
        {
            base.CreateChildControls();

            try
            {
                SPWeb web = SPContext.Current.Web;

                spCalendarHolidayView = new SPCalendarView();
                spCalendarHolidayView.EnableViewState    = true;
                spCalendarHolidayView.EnableV4Rendering  = web.UIVersion >= 4;
                spCalendarHolidayView.NewItemFormUrl     = web.ServerRelativeUrl.TrimEnd('/') + Constants.Pages.HOLIDAY_FORM_PAGE_URL + "?Mode=3";
                spCalendarHolidayView.EditItemFormUrl    = web.ServerRelativeUrl.TrimEnd('/') + Constants.Pages.HOLIDAY_FORM_PAGE_URL + "?Mode=2";
                spCalendarHolidayView.DisplayItemFormUrl = web.ServerRelativeUrl.TrimEnd('/') + Constants.Pages.HOLIDAY_FORM_PAGE_URL + "?Mode=1";

                string viewType     = this.CalendarPeriod;
                string selectedDate = SPUtility.GetSelectedDate(Request, web);

                Tuple <DateTime, DateTime> calendarPeriod = Utils.GetCalendarViewPeriod(SPContext.Current.Web.GetDateOptions(Request), viewType);
                spCalendarHolidayView.ViewType     = viewType;
                spCalendarHolidayView.SelectedDate = selectedDate;

                // Bind the datasource to the SPCalendarView
                var   ds           = new SPCalendarItemCollection();
                short calendarType = web.RegionalSettings.CalendarType;
                var   holidays     = new RosterDataService().ListHolidayEvents().OrderBy(item => item.HolidayDate).ToList();
                ds.AddRange(holidays.Select(item => new SPCalendarItem()
                {
                    DisplayFormUrl = web.ServerRelativeUrl.TrimEnd('/') + Constants.Pages.HOLIDAY_FORM_PAGE_URL + "?Mode=1",
                    CalendarType   = calendarType,
                    ItemID         = item.Id.ToString(),
                    StartDate      = item.HolidayDate.Date,
                    EndDate        = item.HolidayDate.Date.AddSeconds(86400),
                    hasEndDate     = true,
                    Title          = item.Holiday.Name,
                    Location       = item.Holiday.HolidayType.Name,
                    IsAllDayEvent  = true,
                    IsRecurrence   = false
                }).ToList());

                // data bind
                spCalendarHolidayView.DataSource = ds;
                spCalendarHolidayView.DataBind();

                // add Calendar to page
                this.Controls.Add(spCalendarHolidayView);
            }
            catch (Exception ex)
            {
                Controls.Add(new Label()
                {
                    Text = ex.Message, ForeColor = System.Drawing.Color.Red
                });
                Controls.Add(new Label()
                {
                    Text = " StackTrace: " + ex.StackTrace, ForeColor = System.Drawing.Color.Red
                });
            }
        }
        public ListResult List(ListQuery query)
        {
            DisableCaching();
            var result = new ListResult
            {
                Page  = query.Page,
                Items = new List <ListResultItem>()
            };

            try
            {
                var view  = new RosterConfigService().GetView(query.ViewId);
                var field = view.ListMetadata.ListMetadataFields.FirstOrDefault(item => item.Id == query.FieldId);
                if (field == null)
                {
                    throw  new Exception(string.Format("Field {0} not found", query.FieldId));
                }
                if (field.FieldType() == SPFieldType.Choice)
                {
                    result.Items.AddRange(field.FieldValues().Where(
                                              item => item.Contains(query.Query)).Select(item => new ListResultItem {
                        id = item, text = item
                    }).ToList());
                }
                else
                {
                    result.Page = query.Page;
                    var queryParams = new QueryParams {
                        SkipRows = 0, TakeRows = 1, Dictinct = true
                    };
                    queryParams.SelectCriteria.Add(field);
                    queryParams.OrderCriteria.Add(new Tuple <ListMetadataField, SortDirection, string>
                                                      (field, SortDirection.Ascending, query.DisplayField.ExtractField()));
                    queryParams.WhereCriteria.Add(new Tuple <ListMetadataField, CompareType, ConcateOperator, object, string>
                                                      (field, CompareType.Contains, ConcateOperator.And, query.Query, query.DisplayField.ExtractField()));
                    var content = new RosterDataService().ListRosterEventProperties(view.ListMetadataId, queryParams);
                    foreach (var value in content.Select(properties => properties.First(item => item.Key == query.DisplayField).Value))
                    {
                        result.Items.Add(new ListResultItem {
                            id = value.ToSafeString(), text = value.ToSafeString()
                        });
                    }
                }
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
            return(result);
        }