public FullCalendarEvent(EventCalendarDb.EventCalendarDetailsData c, List <EventCalendarDb.EventCalendarCategoryData> categoryHaystack)
            {
                CmsPage page = CmsContext.getPageById(c.PageId);

                id    = c.PageId.ToString();
                title = page.getTitle(c.Lang);
                start = c.StartDateTime;
                end   = c.EndDateTime;
                url   = page.getUrl(c.Lang);

                EventCalendarDb.EventCalendarCategoryData category = EventCalendarDb.EventCalendarCategoryData.GetFromHaystack(categoryHaystack, c.CategoryId);
                backgroundColor = category.ColorHex;
                borderColor     = "black";
                textColor       = "white";
            }
        /// <summary>
        /// Generate HTML SELECT and OPTION tags for events selection
        /// (count limited by the config)
        /// </summary>
        /// <param name="lang"></param>
        /// <param name="controlId"></param>
        /// <param name="selectedId"></param>
        /// <param name="eventRequired"></param>
        /// <returns></returns>
        protected string getEventOption(CmsLanguage lang, string controlId, int selectedId, bool eventRequired)
        {
            EventCalendarDb eventDb       = new EventCalendarDb();
            int             dropdownCount = CmsConfig.getConfigValue("FileLibrary.NumEventsInList", 10);
            List <EventCalendarDb.EventCalendarDetailsData> eventList = eventDb.fetchAllDetailsData(lang, selectedId, dropdownCount);
            List <CmsPage>      pageList            = new List <CmsPage>(eventList.Count);
            NameValueCollection eventPageCollection = new NameValueCollection(eventList.Count);

            for (int x = 0; x < eventList.Count; x++)
            {
                EventCalendarDb.EventCalendarDetailsData e = eventList[x];
                CmsPage p = CmsContext.getPageById(e.PageId);
                pageList.Add(p);
                eventPageCollection.Add(e.PageId.ToString(), p.getTitle(lang));
            }

            StringBuilder html      = new StringBuilder();
            string        htmlName  = controlId + "eventPageId";
            string        selectTag = "<select name=\"{0}\" id=\"{1}\" onchange=\"$('.{2}table').css('display','none'); $('#{3}table_' + this.value).fadeIn();\">" + EOL;

            html.Append(String.Format(selectTag, new string[] { htmlName, htmlName, controlId, controlId }));

            string optionTag      = "<option value=\"{0}\" {1}>{2}</option>" + EOL;
            string optionSelected = (selectedId == -1) ? "selected=\"selected\"" : "";

            if (eventRequired == false) // if event not required, provide an option to select n/a
            {
                html.Append(String.Format(optionTag, new string[] { "-1", optionSelected, "(n/a)" }));
            }

            for (int x = 0; x < eventList.Count; x++)
            {
                EventCalendarDb.EventCalendarDetailsData e = eventList[x];
                optionSelected = (selectedId == e.PageId) ? "selected=\"selected\"" : "";
                html.Append(String.Format(optionTag, new string[] { e.PageId.ToString(), optionSelected, pageList[x].getTitle(lang) }));
            }

            html.Append("</select>" + EOL);

            List <EventCalendarDb.EventCalendarCategoryData> eventCategoryList = eventDb.fetchCategoryList(lang);

            for (int x = 0; x < eventList.Count; x++)
            {
                html.Append(getEventHiddenLayer(lang, eventCategoryList, pageList[x], eventList[x], controlId, selectedId));
            }

            return(html.ToString());
        }
            /// <summary>
            /// Create the jQuery FullCalendar event object for an event with a file attached.
            /// </summary>
            /// <param name="c"></param>
            /// <param name="f"></param>
            public FullCalendarEvent(EventCalendarDb.EventCalendarDetailsData c, FileLibraryDetailsData attachedFile, List <EventCalendarDb.EventCalendarCategoryData> categoryHaystack)
            {
                CmsPage page = CmsContext.getPageById(attachedFile.DetailsPageId);

                id     = "EventFile_" + attachedFile.DetailsPageId.ToString();
                title  = attachedFile.FileName;
                start  = c.StartDateTime.AddSeconds(1); // show below the event
                end    = c.EndDateTime.AddSeconds(1);   // show below the event
                allDay = true;
                url    = page.getUrl(attachedFile.Lang);

                EventCalendarDb.EventCalendarCategoryData category = EventCalendarDb.EventCalendarCategoryData.GetFromHaystack(categoryHaystack, c.CategoryId);
                backgroundColor = category.ColorHex;
                borderColor     = "black";
                textColor       = "white";
            }
        /// <summary>
        /// Generate hidden layer to store the event details
        /// </summary>
        /// <param name="lang"></param>
        /// <param name="eventCategoryList"></param>
        /// <param name="eventPage"></param>
        /// <param name="eventData"></param>
        /// <param name="controlId"></param>
        /// <param name="selectedId"></param>
        /// <returns></returns>
        protected string getEventHiddenLayer(CmsLanguage lang, List <EventCalendarDb.EventCalendarCategoryData> eventCategoryList, CmsPage eventPage, EventCalendarDb.EventCalendarDetailsData eventData, string controlId, int selectedId)
        {
            StringBuilder html         = new StringBuilder();
            string        domId        = controlId + "table_" + eventData.PageId;
            string        cssClass     = controlId + "table";
            string        tableTag     = "<table cellspacing=\"0\" cellpadding=\"3\" id=\"{0}\" class=\"{1}\" {2}>" + EOL;
            string        displayStyle = (eventData.PageId == selectedId) ? "style=\"display: block;\"" : "style=\"display: none;\"";

            html.Append(String.Format(tableTag, new string[] { domId, cssClass, displayStyle }));

            html.Append("<tr valign=\"top\">");
            html.Append("<td style=\"font-size: smaller;\">" + getDateTimeText(lang) + ":</td>");
            html.Append("<td style=\"font-size: smaller;\">");
            string endDateTime = (String.Format("{0:yyyy/MM/dd}", eventData.StartDateTime) == String.Format("{0:yyyy/MM/dd}", eventData.EndDateTime))? String.Format("{0:HH:mm}", eventData.EndDateTime) : "<br />" + String.Format("{0:yyyy/MM/dd HH:mm}", eventData.EndDateTime);

            html.Append(String.Format("{0:yyyy/MM/dd HH:mm}", eventData.StartDateTime) + " to " + endDateTime);
            html.Append("</td>");
            html.Append("</tr>" + EOL);

            html.Append("<tr valign=\"top\">");
            html.Append("<td style=\"font-size: smaller;\">" + getEventCategoryText(lang) + ":</td>");
            html.Append("<td style=\"font-size: smaller;\">");
            html.Append(eventData.getCategoryTitle(eventCategoryList));
            html.Append("</td>");
            html.Append("</tr>" + EOL);

            html.Append("<tr valign=\"top\">");
            html.Append("<td style=\"font-size: smaller;\">" + getDescriptionText(lang) + ":</td>");
            html.Append("<td style=\"font-size: smaller;\">");
            html.Append(StringUtils.nl2br(eventData.Description));
            html.Append("</td>");
            html.Append("</tr>" + EOL);

            html.Append("</table>" + EOL);
            return(html.ToString());
        }