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

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

            viewSettings.EnsureStandardSettings();

            if (isConfigView)
                viewSettings = BuildAdminSettingsView(parent, viewSettings);
            else
            {
                if (parameters.ContainsKey("Command"))
                {
                    if (parameters["Command"] == "LoadDropdown")
                        return LoadDropdownValues(parent, viewSettings, parameters);
                }
                viewSettings = BuildPublicSettingsView(parent, viewSettings, parameters);
                viewSettings.AvailableFields.Clear();
            }

            return CommonUtils.JsonSerializeMinimum(viewSettings);
        }
        public string GetModelData(ModuleInstanceView parent, string settingsData, IDictionary<string,string> parameters, bool isConfigView)
        {
            // Create Or Deserialize View Data
            if (string.IsNullOrEmpty(settingsData))
                _viewSettings = new SearchView();
            else
                _viewSettings = CommonUtils.JsonDeserialize<SearchView>(settingsData);

            // Load settings
            _viewSettings.EnsureStandardSettings();

            // Handle specific commands
            if (parameters.ContainsKey("Command"))
            {
                if (parameters["Command"] == "LoadDropdown")
                    return LoadDropdownValues(parent, parameters);
            }

            // Build Admin or Public View
            if (isConfigView)
                _viewSettings = BuildAdminSettingsView(parent, _viewSettings);
            else
            {
                _viewSettings = BuildPublicSettingsView(parent, _viewSettings, parameters);
                _viewSettings.AvailableFields.Clear();
            }

            return CommonUtils.JsonSerializeMinimum(_viewSettings);
        }
        private SearchView BuildAdminSettingsView(ModuleInstanceView parent, SearchView settingsData)
        {
            settingsData.AvailableFields.Clear();

            settingsData.AvailableFields.Add(new Field("Provider", "Provider Name", FieldTypes.LazyLoadDropdown, null) { HintText = "Select Provider" });
            settingsData.AvailableFields.Add(new Field("Keyword", "Keyword", FieldTypes.TextBox, null) { HintText = "Enter Keyword" });
            settingsData.AvailableFields.Add(new Field("Gender", "Gender", FieldTypes.Dropdown, null) { HintText = "Select Gender" });
            settingsData.AvailableFields.Add(new Field("Specialty", "Specialty", FieldTypes.LazyLoadDropdown, null) { HintText = "Select Specialty" });
            settingsData.AvailableFields.Add(new Field("Condition", "Condition", FieldTypes.LazyLoadDropdown, null) { HintText = "Select Condition" });
            settingsData.AvailableFields.Add(new Field("Insurance", "Insurance", FieldTypes.LazyLoadDropdown, null) { HintText = "Select Insurance" });
            settingsData.AvailableFields.Add(new Field("Language", "Language", FieldTypes.LazyLoadDropdown, null) { HintText = "Select Language" });
            settingsData.AvailableFields.Add(new Field("Location", "Location", FieldTypes.LazyLoadDropdown, null) { HintText = "Select Location" });
            settingsData.AvailableFields.Add(new Field("OnlyAcceptingNewPatients", "Accepting New Patients", FieldTypes.Checkbox, null));
            settingsData.AvailableFields.Add(new Field("City", "City", FieldTypes.LazyLoadDropdown, null) { HintText = "Select City" });
            settingsData.AvailableFields.Add(new Field("State", "State", FieldTypes.LazyLoadDropdown, null) { HintText = "Select State" });
            settingsData.AvailableFields.Add(new Field("ClinicalInterest", "Clinical Interest", FieldTypes.LazyLoadDropdown, null) { HintText = "Select Interest" });
            settingsData.AvailableFields.Add(new Field("ProviderType", "Provider Type", FieldTypes.LazyLoadDropdown, null) { HintText = "Select Type" });
            settingsData.AvailableFields.Add(new Field("PostalCode", "ZIP Code", FieldTypes.TextBox, null) { HintText = "Enter ZIP Code" });

            var radiusDistanceField = new Field("RadiusDistance", "Search Within", FieldTypes.Dropdown, "");
            radiusDistanceField.Options.Add(new KeyValuePair<object, object>(null, "Any"));
            radiusDistanceField.Options.AddRange(parent.SearchSettings.SearchRadiusOptions.Select(s => new KeyValuePair<object, object>(s, s)).ToList());
            settingsData.AvailableFields.Add(radiusDistanceField);

            settingsData.AvailableFields = settingsData.AvailableFields.OrderBy(f => f.DisplayName).ToList();

            // Add admin-only settings
            LocationContextHelper.AddLocationSettingsGroup(parent, settingsData);

            return settingsData;
        }
        private SearchView BuildAdminSettingsView(ModuleInstanceView parent, SearchView settingsData)
        {
            settingsData.AvailableFields.Clear();

            settingsData.AvailableFields.Add(new Field("Keyword", "Keyword", FieldTypes.TextBox, null) { HintText = "Enter Keyword" });
            settingsData.AvailableFields.Add(new Field("Event", "Event Title", FieldTypes.LazyLoadDropdown, null) { HintText = "Select Event" });
            settingsData.AvailableFields.Add(new Field("Location", "Location", FieldTypes.LazyLoadDropdown, null) { HintText = "Select Location" });
            settingsData.AvailableFields.Add(new Field("EventType", "Type", FieldTypes.LazyLoadDropdown, null) { HintText = "Select Type" });
            settingsData.AvailableFields.Add(new Field("EventTopic", "Topic", FieldTypes.LazyLoadDropdown, null) { HintText = "Select Topic" });
            settingsData.AvailableFields.Add(new Field("StartDate", "Start Date", FieldTypes.DatePicker, null) { HintText = "Select Start Date" });
            settingsData.AvailableFields.Add(new Field("EndDate", "End Date", FieldTypes.DatePicker, null) { HintText = "Select End Date" });
            settingsData.AvailableFields.Add(new Field("PostalCode", "ZIP Code", FieldTypes.TextBox, null) { HintText = "Enter ZIP Code" });

            var radiusDistanceField = new Field("RadiusDistance", "Search Within", FieldTypes.Dropdown, "");
            radiusDistanceField.Options.Add(new KeyValuePair<object, object>(null, "Any"));
            radiusDistanceField.Options.AddRange(_searchSettings.SearchRadiusOptions.Select(s => new KeyValuePair<object, object>(s, s)).ToList());
            settingsData.AvailableFields.Add(radiusDistanceField);

            settingsData.AvailableFields = settingsData.AvailableFields.OrderBy(f => f.DisplayName).ToList();

            // Add admin-only settings
            LocationContextHelper.AddLocationSettingsGroup(parent, settingsData);

            return settingsData;
        }
        private SearchView BuildAdminSettingsView(ModuleInstanceView parent, SearchView settingsData)
        {
            settingsData.AvailableFields.Clear();

            settingsData.AvailableFields.Add(new Field("Keyword", "Keyword", FieldTypes.TextBox, null) { HintText = "Enter Keyword" });
            settingsData.AvailableFields.Add(new Field("City", "City", FieldTypes.LazyLoadDropdown, null) { HintText = "Enter/Select a City", PublicLabel = "City with available services" });
            settingsData.AvailableFields.Add(new Field("State", "State", FieldTypes.LazyLoadDropdown, null) { HintText = "Enter/Select a State", PublicLabel = "State with available services" });
            settingsData.AvailableFields.Add(new Field("PostalCode", "ZIP Code", FieldTypes.TextBox, null) { HintText = "Enter ZIP Code" });

            settingsData.AvailableFields = settingsData.AvailableFields.OrderBy(f => f.DisplayName).ToList();

            // Add admin-only settings
            LocationContextHelper.AddLocationSettingsGroup(parent, settingsData);

            return settingsData;
        }
        private SearchView BuildPublicSettingsView(ModuleInstanceView parent, SearchView settingsData, IDictionary<string, string> parameters)
        {
            // Establish correct search results page URL
            settingsData.UpdateSettingValue("SearchResultsPageUrl", LocationUtils.CalculateSearchResultsUrl(settingsData, parent.SearchSettings.SearchResultsPageUrl));

            foreach (var zone in settingsData.StaticPageZones.Select(z => z.Value).Union(settingsData.DynamicPageZones))
            {
                foreach (var column in zone.FieldColumns)
                {
                    foreach (var field in column.Fields)
                    {
                        if (field.FieldName == "RadiusDistance")
                        {
                            field.Value = "";
                            field.Options.Clear();
                            field.Options.Add(new KeyValuePair<object, object>("", "Any"));
                            field.Options.AddRange(parent.SearchSettings.SearchRadiusOptions.Select(s => new KeyValuePair<object, object>(s, s)).ToList());
                        }
                    }
                }
            }
            return settingsData;
        }
        private string LoadDropdownValues(ModuleInstanceView parent, SearchView viewSettings, IDictionary<string, string> parameters)
        {
            List<DropdownOption> records = new List<DropdownOption>();

            // Get location context settings
            var locationId = LocationContextHelper.ResolveLocationContext(parent, viewSettings, parameters).Id;
            var descendantOption = LocationContextHelper.ResolveLocationDescendantOption(viewSettings, parameters);

            switch (parameters["FieldName"])
            {
                case "Location":
                    var locationNameRequest = new SearchOrgUnitNamesRequest() { OrgUnitId = locationId, DescendantOption = descendantOption, OrgUnitNameCriteria = parameters["Search"] };
                    var locationNameResponse = parent.ProcessRequest<SearchOrgUnitNamesResponse>(locationNameRequest);

                    foreach (var location in locationNameResponse.Results)
                    {
                        records.Add(new DropdownOption
                        {
                            DisplayName = location.Name,
                            Id = location.Id,
                        });
                    }
                    break;

                case "LocationType":
                    var typeNameRequest = new SearchOrgUnitNamesRequest() { OnlyRetrieveOrgUnitTypes = true, OrgUnitId = locationId, DescendantOption = descendantOption, SpecificOrgUnitTypeName = parameters["Search"], AllowedOrgUnitTypeIds = new List<int>() };
                    var typeNameResponse = parent.ProcessRequest<SearchOrgUnitNamesResponse>(typeNameRequest);
                    foreach (var type in typeNameResponse.OrgUnitTypes)
                    {
                        records.Add(new DropdownOption
                        {
                            DisplayName = type.Name,
                            Id = type.Id
                        });
                    }
                    break;
            }

            return CommonUtils.JsonSerialize(records);
        }
        private SearchView BuildPublicSettingsView(ModuleInstanceView parent, SearchView settingsData, IDictionary<string, string> parameters)
        {
            // Establish correct search results page URL
            settingsData.UpdateSettingValue("SearchResultsPageUrl", ProviderUtils.CalculateSearchResultsUrl(settingsData, parent.SearchSettings.SearchResultsPageUrl));

            // Handle pre-filled drop-down controls
            foreach (var zone in settingsData.StaticPageZones.Select(z => z.Value).Union(settingsData.DynamicPageZones))
            {
                foreach (var column in zone.FieldColumns)
                {
                    foreach (var field in column.Fields)
                    {
                        if (field.FieldName == "RadiusDistance")
                        {
                            field.Value = "";
                            field.Options.Clear();
                            field.Options.Add(new KeyValuePair<object, object>("", "Any"));
                            field.Options.AddRange(parent.SearchSettings.SearchRadiusOptions.Select(s => new KeyValuePair<object, object>(s, s)).ToList());
                        }
                        if (field.FieldName == "Gender")
                        {
                            field.Value = "";
                            field.Options.Clear();
                            field.Options.Add(new KeyValuePair<object, object>("", "Any"));
                            var genderNameRequest = new ListGendersRequest() { IsEnabled = true };
                            var genderNameResponse = parent.ProcessRequest<ListGendersResponse>(genderNameRequest);
                            foreach (var gender in genderNameResponse.Genders)
                                field.Options.Add(new KeyValuePair<object, object>(gender.Id, gender.Name));
                        }

                        PreloadQueryValuesFromQueryString(field, parameters);
                    }
                }
            }
            return settingsData;
        }
        private string LoadDropdownValues(ModuleInstanceView parent, SearchView viewSettings, IDictionary<string, string> parameters)
        {
            var records = new List<DropdownOption>();

            // Get location context settings
            var locationId = LocationContextHelper.ResolveLocationContext(parent, viewSettings, parameters).Id;
            var descendantOption = LocationContextHelper.ResolveLocationDescendantOption(viewSettings, parameters);

            var isSearchStringPresent = parameters.ContainsKey("Search");
            var searchString = isSearchStringPresent ? parameters["Search"] : string.Empty;

            switch (parameters["FieldName"])
            {
                case "City":
                    GetCityDropdownValues(parent, records, locationId, descendantOption, searchString);
                    break;
                case "State":
                    GetStateDropdownValues(parent, records, locationId, descendantOption, searchString);
                    break;
            }

            return CommonUtils.JsonSerialize(records);
        }
 private SearchView BuildPublicSettingsView(ModuleInstanceView parent, SearchView settingsData, IDictionary<string, string> parameters)
 {
     // Establish correct search results page URL
     settingsData.UpdateSettingValue("SearchResultsPageUrl", LocationUtils.CalculateSearchResultsUrl(settingsData, parent.SearchSettings.SearchResultsPageUrl));
     return settingsData;
 }
        private string LoadDropdownValues(ModuleInstanceView parent, SearchView viewSettings, IDictionary<string, string> parameters)
        {
            List<DropdownOption> records = new List<DropdownOption>();

            // Get location context settings
            var locationId = LocationContextHelper.ResolveLocationContext(parent, viewSettings, parameters).Id;
            var descendantOption = LocationContextHelper.ResolveLocationDescendantOption(viewSettings, parameters);

            switch (parameters["FieldName"])
            {
                case "Event":
                    var eventTitleRequest = new SearchEventsUniqueTitleRequest() { Title = parameters["Search"], OrganizationalUnitId = locationId, DescendantOption = descendantOption };
                    var eventTitleResponse = parent.ProcessRequest<SearchEventsUniqueTitleResponse>(eventTitleRequest);
                    foreach (var eventTitle in eventTitleResponse.Results)
                    {
                        records.Add(new DropdownOption
                        {
                            DisplayName = eventTitle,
                            Id = eventTitle
                        });
                    }
                    break;
                case "Location":
                    var locationRequest = new SearchEventLocationsRequest() { OrganizationalUnitName = parameters["Search"], OrganizationalUnitId = locationId, DescendantOption = descendantOption };
                    var locationResponse = parent.ProcessRequest<SearchEventLocationsResponse>(locationRequest);
                    foreach (var location in locationResponse.OrgUnitInfo)
                    {
                        records.Add(new DropdownOption
                        {
                            DisplayName = location.Value,
                            Id = location.Key
                        });
                    }
                    break;
                case "EventType":
                    var eventTypeRequest = new ListFilteredEventTypesRequest() { EnabledOnly = true, OrganizationalUnitId = locationId, DescendantOption = descendantOption };
                    var eventTypeResponse = parent.ProcessRequest<ListFilteredEventTypesResponse>(eventTypeRequest);
                    foreach (var type in eventTypeResponse.EventTypes.Where(t => t.Name.ToLowerInvariant().StartsWith(parameters["Search"].ToLowerInvariant())))
                    {
                        records.Add(new DropdownOption
                        {
                            DisplayName = type.Name,
                            Id = type.Id
                        });
                    }
                    break;
                case "EventTopic":
                    var eventTopicsRequest = new ListFilteredEventTopicsRequest() { EnabledOnly = true, OrganizationalUnitId = locationId, DescendantOption = descendantOption };
                    var eventTopicsResponse = parent.ProcessRequest<ListFilteredEventTopicsResponse>(eventTopicsRequest);
                    foreach (var topic in eventTopicsResponse.EventTopics.Where(t => t.Name.ToLowerInvariant().StartsWith(parameters["Search"].ToLowerInvariant())))
                    {
                        records.Add(new DropdownOption
                        {
                            DisplayName = topic.Name,
                            Id = topic.Id
                        });
                    }
                    break;
            }

            return CommonUtils.JsonSerialize(records);
        }