/// <summary>
        /// Creates the ui friendly class from the results.
        /// </summary>
        /// <param name="output">The results of the search.</param>
        /// <returns>A class containing the results</returns>
        private ProviderSearchResults CreateProviderSearchResults(ProviderSearchOutput output)
        {
            ProviderSearchResults results = new ProviderSearchResults();

            if (output != null &&
                output.ProviderSearchResponse != null &&
                output.ProviderSearchResponse.ProviderDetails != null)
            {
                foreach (ProviderStructure course in output.ProviderSearchResponse.ProviderDetails)
                {
                    results.Add(CreateResult(course));
                }
            }

            return(results);
        }
        /// <summary>
        /// On clicking ProviderSearch button, calls CourseSearchService ProviderSearch() method wtih test data.
        /// </summary>
        private void btnProviderSearch_Click(object sender, EventArgs e)
        {
            txtResult.Text = "Processing ...";

            ServiceInterface client = new ServiceInterfaceClient("CourseSearch");

            ProviderSearchInput request = new ProviderSearchInput(new ProviderSearchRequestStructure());

            request.ProviderSearchRequest.ProviderKeyword = "Cardiff";

            try
            {
                ProviderSearchOutput response = client.ProviderSearch(request);
                StringBuilder        sb       = new StringBuilder();
                sb.Append("Request details:");
                sb.Append("\nProvider Keyword = " +
                          response.ProviderSearchResponse.RequestDetails.ProviderSearch.ProviderKeyword);

                sb.Append("\n\n");

                if (response.ProviderSearchResponse != null && response.ProviderSearchResponse.ProviderDetails != null)
                {
                    sb.Append("Provider details:");
                    foreach (ProviderStructure providerDetail in response.ProviderSearchResponse.ProviderDetails)
                    {
                        sb.Append("\n" + providerDetail.Provider.ProviderID);
                        sb.Append("\n" + providerDetail.Provider.ProviderName);
                        sb.Append("\n");
                    }
                }

                txtResult.Text = sb.ToString();
            }
            catch (Exception ex)
            {
                txtResult.Text = ex.Message;
            }
        }
        /// <summary>
        /// Executes a search for Providers matching the search keyword.
        /// </summary>
        /// <param name="request">ProviderSearchInput request object.</param>
        /// <returns>A ProviderSearchOuput object.</returns>
        public ProviderSearchOutput GetProviders(ProviderSearchInput request)
        {
            ProviderSearchOutput providerSearchOutput = new ProviderSearchOutput(new ProviderSearchResponseStructure());

            providerSearchOutput.ProviderSearchResponse.RequestDetails = new ProviderSearchResponseStructureRequestDetails();
            providerSearchOutput.ProviderSearchResponse.RequestDetails.ProviderSearch = request.ProviderSearchRequest;

            List <Provider> providers =
                _providerQuery.GetProviders(request.ProviderSearchRequest.ProviderKeyword, request.ProviderSearchRequest.APIKey);

            List <ProviderStructure> providerStructures = new List <ProviderStructure>();

            foreach (Provider provider in providers)
            {
                ProviderStructure providerStructure = new ProviderStructure();
                providerStructure.Provider = BuildProviderDetail(provider);

                providerStructures.Add(providerStructure);
            }

            providerSearchOutput.ProviderSearchResponse.ProviderDetails = providerStructures.ToArray();

            return(providerSearchOutput);
        }
        /// <summary>
        /// Gets the data and displays on screen if we have any.
        /// </summary>
        /// <param name="criteria"></param>
        private void PopulateData(SearchCriteriaStructure criteria)
        {
            try
            {
                // fire the web service to get some results
                ProviderSearchOutput  output  = GetResults(criteria);
                ProviderSearchResults results = CreateProviderSearchResults(output);

                if (results.Count() > 0)
                {
                    ResultsOverviewLabel.Text    = "No of records: " + results.Count;
                    RepeaterContainer.DataSource = results; // pagedDS;
                    RepeaterContainer.DataBind();
                }
                else
                {
                    ResultsOverviewLabel.Text = "There are no results to display.";
                }
            }
            catch (Exception ex)
            {
                ResultsOverviewLabel.Text = ex.Message + "/n/n" + ex.StackTrace;
            }
        }
        /// <summary>
        /// Gets the results from the web service.
        /// </summary>
        /// <param name="criteria">The course search criteria.</param>
        /// <returns>A list of found courses.</returns>
        private ProviderSearchOutput GetResults(SearchCriteriaStructure criteria)
        {
            ProviderSearchOutput output = new ProviderSearchOutput();
            ServiceInterface     client = new ServiceInterfaceClient("CourseSearchService");

            ProviderSearchRequestStructure listRequestStructure = new ProviderSearchRequestStructure
            {
                APIKey          = criteria.APIKey,
                ProviderKeyword = criteria.ProviderKeyword
            };

            ProviderSearchInput request = new ProviderSearchInput(listRequestStructure);

            try
            {
                output = client.ProviderSearch(request);
            }
            catch (Exception ex)
            {
                ResultsOverviewLabel.Text = ex.Message + "\n" + ex.StackTrace;
            }

            return(output);
        }