private AZSearchView BuildAdminSettingsView(ModuleInstanceView parent, AZSearchView settingsData)
        {
            // Add admin-only settings
            LocationContextHelper.AddLocationSettingsGroup(parent, settingsData);

            return settingsData;
        }
        public string GetModelData(ModuleInstanceView parent, string settingsData, IDictionary<string,string> parameters, bool isConfigView)
        {
            AZSearchView viewSettings = null;

            if (string.IsNullOrEmpty(settingsData))
                viewSettings = new AZSearchView();
            else
                viewSettings = CommonUtils.JsonDeserialize<AZSearchView>(settingsData);

            viewSettings.EnsureStandardSettings();

            if (isConfigView)
                viewSettings = BuildAdminSettingsView(parent, viewSettings);
            else
            {
                viewSettings = BuildPublicSettingsView(parent, viewSettings, parameters);
                viewSettings.AvailableFields.Clear();
            }

            return CommonUtils.JsonSerializeMinimum(viewSettings);
        }
        private AZSearchView BuildPublicSettingsView(ModuleInstanceView parent, AZSearchView settingsData, IDictionary<string, string> parameters)
        {
            var searchResultPageUrl = CommonUtils.AddQueryStringParameter(settingsData.GetSettingValue("SearchResultsPageUrl", string.Empty), "Letter", string.Empty, false);

            // Location context options
            var locationId = LocationContextHelper.ResolveLocationContext(parent, settingsData, parameters).Id;
            var descendantOption = LocationContextHelper.ResolveLocationDescendantOption(settingsData, parameters);

            var locationContextQuery = string.Empty;

            if (locationId.HasValue)
                locationContextQuery += "&LocationContext=" + locationId.Value.ToString() +"&LocationDescendants=" + (descendantOption == DescendantOption.IncludeDescendants ? "true" : "false");

            settingsData.Aurl = searchResultPageUrl + "A" + locationContextQuery;
            settingsData.Burl = searchResultPageUrl + "B" + locationContextQuery;
            settingsData.Curl = searchResultPageUrl + "C" + locationContextQuery;
            settingsData.Durl = searchResultPageUrl + "D" + locationContextQuery;
            settingsData.Eurl = searchResultPageUrl + "E" + locationContextQuery;
            settingsData.Furl = searchResultPageUrl + "F" + locationContextQuery;
            settingsData.Gurl = searchResultPageUrl + "G" + locationContextQuery;
            settingsData.Hurl = searchResultPageUrl + "H" + locationContextQuery;
            settingsData.Iurl = searchResultPageUrl + "I" + locationContextQuery;
            settingsData.Jurl = searchResultPageUrl + "J" + locationContextQuery;
            settingsData.Kurl = searchResultPageUrl + "K" + locationContextQuery;
            settingsData.Lurl = searchResultPageUrl + "L" + locationContextQuery;
            settingsData.Murl = searchResultPageUrl + "M" + locationContextQuery;
            settingsData.Nurl = searchResultPageUrl + "N" + locationContextQuery;
            settingsData.Ourl = searchResultPageUrl + "O" + locationContextQuery;
            settingsData.Purl = searchResultPageUrl + "P" + locationContextQuery;
            settingsData.Qurl = searchResultPageUrl + "Q" + locationContextQuery;
            settingsData.Rurl = searchResultPageUrl + "R" + locationContextQuery;
            settingsData.Surl = searchResultPageUrl + "S" + locationContextQuery;
            settingsData.Turl = searchResultPageUrl + "T" + locationContextQuery;
            settingsData.Uurl = searchResultPageUrl + "U" + locationContextQuery;
            settingsData.Vurl = searchResultPageUrl + "V" + locationContextQuery;
            settingsData.Wurl = searchResultPageUrl + "W" + locationContextQuery;
            settingsData.Xurl = searchResultPageUrl + "X" + locationContextQuery;
            settingsData.Yurl = searchResultPageUrl + "Y" + locationContextQuery;
            settingsData.Zurl = searchResultPageUrl + "Z" + locationContextQuery;

            var request = new SearchProviderSpecialtiesRequest() { OrgUnitId = locationId, DescendantOption = descendantOption };
            var response = parent.ProcessRequest<SearchProviderSpecialtiesResponse>(request);

            settingsData.ADisabled = !response.Specialties.Any(s => s.Name.StartsWith("A"));
            settingsData.BDisabled = !response.Specialties.Any(s => s.Name.StartsWith("B"));
            settingsData.CDisabled = !response.Specialties.Any(s => s.Name.StartsWith("C"));
            settingsData.DDisabled = !response.Specialties.Any(s => s.Name.StartsWith("D"));
            settingsData.EDisabled = !response.Specialties.Any(s => s.Name.StartsWith("E"));
            settingsData.FDisabled = !response.Specialties.Any(s => s.Name.StartsWith("F"));
            settingsData.GDisabled = !response.Specialties.Any(s => s.Name.StartsWith("G"));
            settingsData.HDisabled = !response.Specialties.Any(s => s.Name.StartsWith("H"));
            settingsData.IDisabled = !response.Specialties.Any(s => s.Name.StartsWith("I"));
            settingsData.JDisabled = !response.Specialties.Any(s => s.Name.StartsWith("J"));
            settingsData.KDisabled = !response.Specialties.Any(s => s.Name.StartsWith("K"));
            settingsData.LDisabled = !response.Specialties.Any(s => s.Name.StartsWith("L"));
            settingsData.MDisabled = !response.Specialties.Any(s => s.Name.StartsWith("M"));
            settingsData.NDisabled = !response.Specialties.Any(s => s.Name.StartsWith("N"));
            settingsData.ODisabled = !response.Specialties.Any(s => s.Name.StartsWith("O"));
            settingsData.PDisabled = !response.Specialties.Any(s => s.Name.StartsWith("P"));
            settingsData.QDisabled = !response.Specialties.Any(s => s.Name.StartsWith("Q"));
            settingsData.RDisabled = !response.Specialties.Any(s => s.Name.StartsWith("R"));
            settingsData.SDisabled = !response.Specialties.Any(s => s.Name.StartsWith("S"));
            settingsData.TDisabled = !response.Specialties.Any(s => s.Name.StartsWith("T"));
            settingsData.UDisabled = !response.Specialties.Any(s => s.Name.StartsWith("U"));
            settingsData.VDisabled = !response.Specialties.Any(s => s.Name.StartsWith("V"));
            settingsData.WDisabled = !response.Specialties.Any(s => s.Name.StartsWith("W"));
            settingsData.XDisabled = !response.Specialties.Any(s => s.Name.StartsWith("X"));
            settingsData.YDisabled = !response.Specialties.Any(s => s.Name.StartsWith("Y"));
            settingsData.ZDisabled = !response.Specialties.Any(s => s.Name.StartsWith("Z"));

            if (parameters.ContainsKey("Letter"))
                settingsData.ActiveLetter = parameters["Letter"];

            return settingsData;
        }
        private AZSearchView BuildPublicSettingsView(ModuleInstanceView parent, AZSearchView settingsData, IDictionary<string, string> parameters)
        {
            // Establish correct search results page URL
            settingsData.UpdateSettingValue("SearchResultsPageUrl", ProviderUtils.CalculateSearchResultsUrl(settingsData, parent.SearchSettings.SearchResultsPageUrl));
            var searchResultPageUrl = CommonUtils.AddQueryStringParameter(settingsData.GetSettingValue("SearchResultsPageUrl", string.Empty), "Letter", string.Empty, false);

            // Location context options
            var locationId = LocationContextHelper.ResolveLocationContext(parent, settingsData, parameters).Id;
            var descendantOption = LocationContextHelper.ResolveLocationDescendantOption(settingsData, parameters);

            var locationContextQuery = string.Empty;

            if (locationId.HasValue)
                locationContextQuery += "&LocationContext=" + locationId.Value.ToString() +"&LocationDescendants=" + (descendantOption == DescendantOption.IncludeDescendants ? "true" : "false");

            settingsData.Aurl = searchResultPageUrl + "A" + locationContextQuery;
            settingsData.Burl = searchResultPageUrl + "B" + locationContextQuery;
            settingsData.Curl = searchResultPageUrl + "C" + locationContextQuery;
            settingsData.Durl = searchResultPageUrl + "D" + locationContextQuery;
            settingsData.Eurl = searchResultPageUrl + "E" + locationContextQuery;
            settingsData.Furl = searchResultPageUrl + "F" + locationContextQuery;
            settingsData.Gurl = searchResultPageUrl + "G" + locationContextQuery;
            settingsData.Hurl = searchResultPageUrl + "H" + locationContextQuery;
            settingsData.Iurl = searchResultPageUrl + "I" + locationContextQuery;
            settingsData.Jurl = searchResultPageUrl + "J" + locationContextQuery;
            settingsData.Kurl = searchResultPageUrl + "K" + locationContextQuery;
            settingsData.Lurl = searchResultPageUrl + "L" + locationContextQuery;
            settingsData.Murl = searchResultPageUrl + "M" + locationContextQuery;
            settingsData.Nurl = searchResultPageUrl + "N" + locationContextQuery;
            settingsData.Ourl = searchResultPageUrl + "O" + locationContextQuery;
            settingsData.Purl = searchResultPageUrl + "P" + locationContextQuery;
            settingsData.Qurl = searchResultPageUrl + "Q" + locationContextQuery;
            settingsData.Rurl = searchResultPageUrl + "R" + locationContextQuery;
            settingsData.Surl = searchResultPageUrl + "S" + locationContextQuery;
            settingsData.Turl = searchResultPageUrl + "T" + locationContextQuery;
            settingsData.Uurl = searchResultPageUrl + "U" + locationContextQuery;
            settingsData.Vurl = searchResultPageUrl + "V" + locationContextQuery;
            settingsData.Wurl = searchResultPageUrl + "W" + locationContextQuery;
            settingsData.Xurl = searchResultPageUrl + "X" + locationContextQuery;
            settingsData.Yurl = searchResultPageUrl + "Y" + locationContextQuery;
            settingsData.Zurl = searchResultPageUrl + "Z" + locationContextQuery;

            var request = new ReadEnabledLettersRequest() { OrgUnitId = locationId, DescendantOption = descendantOption };
            var response = parent.ProcessRequest<ReadEnabledLettersResponse>(request);

            settingsData.ADisabled = !response.HasA;
            settingsData.BDisabled = !response.HasB;
            settingsData.CDisabled = !response.HasC;
            settingsData.DDisabled = !response.HasD;
            settingsData.EDisabled = !response.HasE;
            settingsData.FDisabled = !response.HasF;
            settingsData.GDisabled = !response.HasG;
            settingsData.HDisabled = !response.HasH;
            settingsData.IDisabled = !response.HasI;
            settingsData.JDisabled = !response.HasJ;
            settingsData.KDisabled = !response.HasK;
            settingsData.LDisabled = !response.HasL;
            settingsData.MDisabled = !response.HasM;
            settingsData.NDisabled = !response.HasN;
            settingsData.ODisabled = !response.HasO;
            settingsData.PDisabled = !response.HasP;
            settingsData.QDisabled = !response.HasQ;
            settingsData.RDisabled = !response.HasR;
            settingsData.SDisabled = !response.HasS;
            settingsData.TDisabled = !response.HasT;
            settingsData.UDisabled = !response.HasU;
            settingsData.VDisabled = !response.HasV;
            settingsData.WDisabled = !response.HasW;
            settingsData.XDisabled = !response.HasX;
            settingsData.YDisabled = !response.HasY;
            settingsData.ZDisabled = !response.HasZ;

            if (parameters.ContainsKey("Letter"))
                settingsData.ActiveLetter = parameters["Letter"];

            return settingsData;
        }