// Protected Methods (1) 

        /// <summary>
        ///     Sends the tool part content to the specified HtmlTextWriter object, which writes the content to be rendered on the client.
        /// </summary>
        /// <param name="output">The HtmlTextWriter object that receives the tool part content.</param>
        protected override void RenderToolPart(HtmlTextWriter output)
        {
            var myWorkWebPart = (MyWorkWebPart)ParentToolPane.SelectedWebPart;

            string myWorkWebPartHtmlCode = Resources.MyWorkToolPart.Replace("_ID__", UniqueID.Md5());

            #region Get Settings

            string selectedLists = string.Empty;

            if (myWorkWebPart.SelectedLists != null)
            {
                IOrderedEnumerable <string> selLists = (myWorkWebPart.SelectedLists.Where(
                                                            selectedList => !string.IsNullOrEmpty(selectedList))
                                                        .Select(
                                                            selectedList =>
                                                            string.Format(@"'{0}'", selectedList))).ToList()
                                                       .OrderBy(
                    l =>
                    l);

                selectedLists = string.Join(",", selLists.ToArray());
            }

            string selectedFields = string.Empty;

            if (myWorkWebPart.SelectedFields != null)
            {
                IOrderedEnumerable <string> selFields = (myWorkWebPart.SelectedFields.Where(
                                                             selectedField => !string.IsNullOrEmpty(selectedField))
                                                         .Select(
                                                             selectedField =>
                                                             string.Format(
                                                                 @"{{InternalName:'{0}',PrettyName:'{1}'}}",
                                                                 selectedField,
                                                                 selectedField.ToPrettierName()))).ToList().
                                                        OrderBy(
                    f =>
                    f);

                selectedFields = string.Join(",", selFields.ToArray());
            }

            List <myworksettings.MWList> myWorkLists = myworksettings.GetMyWorkListsFromDb(_web,
                                                                                           MyWork.GetArchivedWebs(
                                                                                               _web.Site.ID));

            var includedMWLists = new List <string>();
            List <myworksettings.MWList> excludedMWLists = myWorkLists.ToList();

            if (myWorkWebPart.MyWorkSelectedLists.Count() > 0)
            {
                foreach (
                    myworksettings.MWList myWorkList in
                    myWorkLists.Where(myWorkList => myWorkWebPart.MyWorkSelectedLists.Contains(myWorkList.Name)))
                {
                    includedMWLists.Add(string.Format(@"{{Id:'{0}',Name:'{1}'}}", myWorkList.Id, myWorkList.Name));
                    excludedMWLists.Remove(myWorkList);
                }
            }
            else
            {
                includedMWLists = excludedMWLists.Select(excludedMWList => string.Format(@"{{Id:'{0}',Name:'{1}'}}",
                                                                                         excludedMWList.Id,
                                                                                         excludedMWList.Name)).ToList();

                excludedMWLists = new List <myworksettings.MWList>();
            }

            string includedMyWorkLists = string.Join(",", includedMWLists.ToArray());

            IEnumerable <string> excludedLists =
                excludedMWLists.Select(
                    excludedMWList =>
                    string.Format(@"{{Id:'{0}',Name:'{1}'}}", excludedMWList.Id,
                                  SPHttpUtility.HtmlEncode(excludedMWList.Name)));
            string excludedMyWorkLists = string.Join(",", excludedLists.ToArray());

            string crossSiteUrls = string.Empty;

            if (myWorkWebPart.CrossSiteUrls != null)
            {
                IOrderedEnumerable <string> crossSites = myWorkWebPart.CrossSiteUrls.Where(
                    crossSiteUrl => !string.IsNullOrEmpty(crossSiteUrl))
                                                         .Select(
                    crossSiteUrl =>
                    string.Format(@"'{0}'", crossSiteUrl))
                                                         .OrderBy(s => s);
                crossSiteUrls = string.Join(",", crossSites.ToArray());
            }

            var defaultGlobalViews = new List <string>();

            bool defaultViewFound = false;

            List <MyWorkGridView> myWorkGridViews =
                MyWork.GetGlobalViews(Utils.GetConfigWeb()).OrderBy(v => v.Name).ToList();

            foreach (MyWorkGridView myWorkGridView in myWorkGridViews)
            {
                bool defaultView = myWorkWebPart.DefaultGlobalView.Equals(myWorkGridView.Id);
                if (defaultView)
                {
                    defaultViewFound = true;
                }

                defaultGlobalViews.Add(string.Format(@"{{Id:'{0}',Name:'{1}',Default:{2}}}", myWorkGridView.Id,
                                                     myWorkGridView.Name, defaultView.Lc()));
            }

            defaultGlobalViews.Insert(0,
                                      string.Format(@"{{Id:'',Name:'Do Not Set View',Default:{0}}}",
                                                    (!defaultViewFound).Lc()));

            string objDefaultGlobalViews = string.Join(",", defaultGlobalViews.ToArray());

            bool agoFilterEnabled   = false;
            int  agoFilterDays      = 0;
            bool afterFilterEnabled = false;
            int  afterFilterDays    = 0;

            bool indicatorActive = true;
            int  indicatorDays   = 2;

            if (!string.IsNullOrEmpty(myWorkWebPart.DueDayFilter))
            {
                string[] filters = myWorkWebPart.DueDayFilter.Split('|');

                bool.TryParse(filters[0], out agoFilterEnabled);
                int.TryParse(filters[1], out agoFilterDays);
                bool.TryParse(filters[2], out afterFilterEnabled);
                int.TryParse(filters[3], out afterFilterDays);
            }

            if (!string.IsNullOrEmpty(myWorkWebPart.NewItemIndicator))
            {
                string[] settings = myWorkWebPart.NewItemIndicator.Split('|');

                bool.TryParse(settings[0], out indicatorActive);
                int.TryParse(settings[1], out indicatorDays);
            }

            string myWorkObjString =
                string.Format(
                    @"useCentralizedSettings:{0}, selectedLists:[{1}], selectedFields:[{2}], crossSiteUrls:[{3}], performanceMode:{4}, hideNewButton:{5}, allowEditToggle:{6}, defaultToEditMode:{7}, defaultGlobalViews:[{8}], includedMyWorkLists:[{9}], excludedMyWorkLists:[{10}], daysAgoEnabled:{11}, daysAfterEnabled:{12}, newItemIndicatorEnabled:{13}, daysAgo:'{14}', daysAfter:'{15}', newItemIndicator:'{16}', showToolbar:{17}",
                    myWorkWebPart.UseCentralizedSettings.Lc(), selectedLists, selectedFields, crossSiteUrls,
                    myWorkWebPart.PerformanceMode.Lc(), myWorkWebPart.HideNewButton.Lc(),
                    myWorkWebPart.AllowEditToggle.Lc(), myWorkWebPart.DefaultToEditMode.Lc(), objDefaultGlobalViews,
                    includedMyWorkLists, excludedMyWorkLists, agoFilterEnabled.Lc(),
                    afterFilterEnabled.Lc(), indicatorActive.Lc(),
                    agoFilterDays, afterFilterDays, indicatorDays, myWorkWebPart.ShowToolbar.Lc());

            myWorkWebPartHtmlCode = myWorkWebPartHtmlCode.Replace("objMyWork__VAL__", myWorkObjString);

            #endregion

            #region Get All Lists and Fields

            var listsAndFields = new Dictionary <string, List <string> >();
            foreach (SPList list in _web.Lists)
            {
                try
                {
                    listsAndFields.Add(list.Title,
                                       (list.Fields.Cast <SPField>()
                                        .Where(spField => !spField.Hidden && spField.Reorderable)
                                        .Select(spField => spField.InternalName)).ToList());
                }
                catch { }
            }

            string allListsAndFieldsString =
                string.Format(@"{0}",
                              string.Join(",", listsAndFields.Select(listAndFields =>
                                                                     string.Format(@"{{List:'{0}',Fields:[{1}]}}",
                                                                                   listAndFields.Key,
                                                                                   string.Join(",",
                                                                                               listAndFields.Value.
                                                                                               Select(
                                                                                                   field
                                                                                                   =>
                                                                                                   string
                                                                                                   .Format
                                                                                                   (
                                                                                                       @"{{InternalName:'{0}',PrettyName:'{1}'}}",
                                                                                                       field,
                                                                                                       field
                                                                                                       .
                                                                                                       ToPrettierName
                                                                                                           ()))
                                                                                               .
                                                                                               ToArray())))
                                          .ToArray()));

            myWorkWebPartHtmlCode = myWorkWebPartHtmlCode.Replace("allListsAndFields__VAL__", allListsAndFieldsString);

            #endregion

            #region Get Field Lists

            var fieldLists = new Dictionary <string, List <string> >();

            foreach (var listAndFields in listsAndFields)
            {
                foreach (string field in listAndFields.Value)
                {
                    if (!fieldLists.ContainsKey(field))
                    {
                        fieldLists.Add(field, new List <string>());
                    }
                    fieldLists[field].Add(listAndFields.Key);
                }
            }

            List <string> fields = fieldLists.Select(fieldList => string.Format(@"{0}:[{1}]", fieldList.Key,
                                                                                string.Join(",",
                                                                                            fieldList.Value.Select(
                                                                                                list =>
                                                                                                string.Format(@"'{0}'",
                                                                                                              list)).
                                                                                            ToArray())))
                                   .ToList();

            string fieldListsString = string.Join(",", fields.ToArray());

            myWorkWebPartHtmlCode = myWorkWebPartHtmlCode.Replace("fieldLists__VAL__", fieldListsString);

            string listWebsString = string.Join(",", (from myWorkList in myWorkLists
                                                      let webs =
                                                          myWorkList.Webs.Select(web => string.Format(@"'{0}'", web))
                                                          select
                                                          string.Format(@"{0}:[{1}]", myWorkList.Id,
                                                                        string.Join(",", webs.ToArray()))).ToArray());

            myWorkWebPartHtmlCode = myWorkWebPartHtmlCode.Replace("listWebs__VAL__", listWebsString);

            #endregion

            output.Write(myWorkWebPartHtmlCode);
        }
        /// <summary>
        ///     Loads the general settings.
        /// </summary>
        private void LoadGeneralSettings()
        {
            #region All Lists and Fields

            Dictionary <string, List <string> > listsAndFields       = GetListsAndFields();
            Dictionary <string, List <string> > myWorkListsAndFields = GetMyWorkListsAndFields();

            #endregion

            #region Selected Lists

            MyWorkLists = GetMyWorkListsFromDb(_web, MyWork.GetArchivedWebs(_web.Site.ID));

            if (!NewSetup())
            {
                if (!IncludeFixApplied())
                {
                    List <string> selectedMyWorkLists =
                        CoreFunctions.getConfigSetting(_web, GeneralSettingsSelectedMyWorkLists).Split(new[] { ',' }).
                        ToList();

                    var excludedLists = new List <string>();
                    var includedLists = new List <string>();

                    foreach (MWList myWorkList in MyWorkLists)
                    {
                        if (DoesListExist(myWorkList.Name))
                        {
                            if (!selectedMyWorkLists.Contains(myWorkList.Name))
                            {
                                excludedLists.Add(myWorkList.Name);
                            }
                            else
                            {
                                includedLists.Add(myWorkList.Name);
                            }
                        }
                    }

                    CoreFunctions.setConfigSetting(_web, GeneralSettingsExcludedMyWorkLists,
                                                   excludedLists.Count > 0
                                                       ? string.Join(",", excludedLists.ToArray())
                                                       : string.Empty);

                    CoreFunctions.setConfigSetting(_web, GeneralSettingsSelectedMyWorkLists,
                                                   includedLists.Count > 0
                                                       ? string.Join(",", includedLists.ToArray())
                                                       : string.Empty);

                    CoreFunctions.setConfigSetting(_web, GeneralSettingsMyWorkIncludeFixApplied,
                                                   true.ToString(CultureInfo.InvariantCulture));
                }
            }

            List <string> excludedMyWorkLists =
                CoreFunctions.getConfigSetting(_web, GeneralSettingsExcludedMyWorkLists).Split(new[] { ',' }).ToList();

            foreach (MWList myWorkList in MyWorkLists)
            {
                if (DoesListExist(myWorkList.Name))
                {
                    var listItem = new ListItem(myWorkList.Name, myWorkList.Id);

                    if (excludedMyWorkLists.Contains(myWorkList.Name))
                    {
                        lstExcludedMyWorkLists.Items.Add(listItem);
                    }
                    else
                    {
                        lstIncludedMyWorkLists.Items.Add(listItem);
                    }
                }
            }

            List <string> selectedLists =
                CoreFunctions.getConfigSetting(_web, GeneralSettingsSelectedLists).Split(new[] { ',' }).ToList();
            List <string> listSelected = new List <string>();
            selectedLists.RemoveAll(string.IsNullOrEmpty);

            foreach (string selectedList in selectedLists)
            {
                if (DoesListExist(selectedList))
                {
                    listSelected.Add(selectedList);
                    tbSelectedLists.Text += selectedList + Environment.NewLine;
                }
            }
            CoreFunctions.setConfigSetting(_web, GeneralSettingsSelectedLists,
                                           listSelected.Count > 0
                                               ? string.Join(",", listSelected.ToArray())
                                               : string.Empty);
            #endregion

            #region Selected Fields

            List <string> selectedFields =
                CoreFunctions.getConfigSetting(_web, GeneralSettingsSelectedFields).Split(new[] { ',' }).ToList();

            var sFields = new List <ListItem>();

            sFields.AddRange((selectedLists.Count > 0
                                          ? (from selectedList in selectedLists
                                             where listsAndFields.ContainsKey(selectedList)
                                             from field in listsAndFields[selectedList]
                                             where selectedFields.Exists(f => f.Equals(field))
                                             let theField = field
                                                            select new ListItem(theField.ToPrettierName(selectedList, _web), field))
                                          : (from listAndFields in listsAndFields
                                             from field in listAndFields.Value
                                             where selectedFields.Exists(f => f.Equals(field))
                                             let theField = field
                                                            select new ListItem(theField.ToPrettierName(listAndFields.Key, _web), field))));

            sFields.AddRange(from myWorkListsAndField in myWorkListsAndFields
                             from field in myWorkListsAndField.Value
                             where selectedFields.Contains(field)
                             select new ListItem(field.ToPrettierName(myWorkListsAndField.Key, _web), field));

            lstSelectedFields.DataSource = sFields.Distinct().ToList();

            lstSelectedFields.DataTextField  = "Text";
            lstSelectedFields.DataValueField = "Value";
            lstSelectedFields.DataBind();
            lstSelectedFields.Sort();

            #endregion

            #region Available Fields

            var availableFields = new List <ListItem>();

            availableFields.AddRange((selectedLists.Count > 0
                                          ? (from selectedList in selectedLists
                                             where listsAndFields.ContainsKey(selectedList)
                                             from field in listsAndFields[selectedList]
                                             where !selectedFields.Exists(f => f.Equals(field))
                                             let theField = field
                                                            select new ListItem(theField.ToPrettierName(selectedList, _web), field))
                                          : (from listAndFields in listsAndFields
                                             from field in listAndFields.Value
                                             where !selectedFields.Exists(f => f.Equals(field))
                                             let theField = field
                                                            select new ListItem(theField.ToPrettierName(listAndFields.Key, _web), field))));

            availableFields.AddRange(from myWorkListsAndField in myWorkListsAndFields
                                     from field in myWorkListsAndField.Value
                                     where !selectedFields.Contains(field)
                                     select new ListItem(field.ToPrettierName(myWorkListsAndField.Key, _web), field));

            lstAllFields.DataTextField  = "Text";
            lstAllFields.DataValueField = "Value";
            lstAllFields.DataSource     = availableFields.Distinct().OrderBy(f => f.Text);
            lstAllFields.DataBind();

            #endregion

            #region Cross Site Urls

            string crossSiteUrls = CoreFunctions.getConfigSetting(_web, GeneralSettingsCrossSiteUrls);

            if (!string.IsNullOrEmpty(crossSiteUrls))
            {
                tbCrossSiteUrls.Text = crossSiteUrls.Replace("|", Environment.NewLine);
            }

            #endregion

            #region Performance Mode

            string performanceMode = CoreFunctions.getConfigSetting(_web, GeneralSettingsPerformanceMode);
            cbPerformanceMode.Checked = string.IsNullOrEmpty(performanceMode) || performanceMode.Equals("on");

            #endregion

            #region My Work Grid Settings

            bool agoFilterEnabled   = false;
            int  agoFilterDays      = 0;
            bool afterFilterEnabled = false;
            int  afterFilterDays    = 0;

            var dayFilters = CoreFunctions.getConfigSetting(_web, GENERAL_SETTINGS_WORK_DAY_FILTERS);

            if (!string.IsNullOrEmpty(dayFilters))
            {
                string[] filters = dayFilters.Split('|');

                bool.TryParse(filters[0], out agoFilterEnabled);
                int.TryParse(filters[1], out agoFilterDays);
                bool.TryParse(filters[2], out afterFilterEnabled);
                int.TryParse(filters[3], out afterFilterDays);
            }

            cbDaysAgo.Checked   = agoFilterEnabled;
            cbDaysAfter.Checked = afterFilterEnabled;

            if (agoFilterDays > 0)
            {
                tbDaysAgo.Text = agoFilterDays.ToString(CultureInfo.InvariantCulture);
            }
            if (afterFilterDays > 0)
            {
                tbDaysAfter.Text = afterFilterDays.ToString(CultureInfo.InvariantCulture);
            }

            tbDaysAgo.Enabled   = agoFilterEnabled;
            tbDaysAfter.Enabled = afterFilterEnabled;

            hfDaysAgo.Value   = tbDaysAgo.Text;
            hfDaysAfter.Value = tbDaysAfter.Text;

            bool indicatorActive = true;
            int  indicatorDays   = 2;

            var newItemIndicator = CoreFunctions.getConfigSetting(_web, GENERAL_SETTINGS_NEW_ITEM_INDICATOR);

            if (!string.IsNullOrEmpty(newItemIndicator))
            {
                var settings = newItemIndicator.Split('|');

                bool.TryParse(settings[0], out indicatorActive);
                int.TryParse(settings[1], out indicatorDays);
            }

            cbNewItemIndicator.Checked = indicatorActive;
            if (indicatorDays > 0)
            {
                tbNewItemIndicator.Text = indicatorDays.ToString(CultureInfo.InvariantCulture);
            }
            tbNewItemIndicator.Enabled = indicatorActive;
            hfNewItemIndicator.Value   = tbNewItemIndicator.Text;

            #endregion
        }