PageSourceSearch

https://www.thehewittfertilitycentre.org.uk/_frontend/js/main/functions/site-search.js

js thehewittfertilitycentre.org.uk collected 2026-10-04 13:27:17 UTC 8,718 bytes, 240 lines download raw bytes

1var initSiteSearch = function () {
2    // element variables
3
4    var $siteSearchWrapper = $('#site_search__wrapper'),
5        $siteSearchToggleButtons = $('.launch_site_search'),
6        $body = $('body'),
7        $siteSearchForm = $siteSearchWrapper.find('form'),
8        $siteSearchSearchTermInput = $siteSearchWrapper.find('#site_search_search_term'),
9        $siteSearchSectionFilterInput = $siteSearchWrapper.find('#site_search_section_filter'),
10        $siteSearchUpdatedFilterInput = $siteSearchWrapper.find('#site_search_updated_filter'),
11        $siteSearchPageNumberInput = $siteSearchWrapper.find('#site_search_page_number'),
12        $siteSearchResultsWrapper = $siteSearchWrapper.find('#site_search_results'),
13        $currentResultsCount = $siteSearchWrapper.find('#current_search_results_count'),
14        $totalResultsCount = $siteSearchWrapper.find('#total_search_results_count'),
15        $loadMoreResultsButton = $siteSearchWrapper.find('#load_more_search_results'),
16        $initiallyHiddenElements = $siteSearchWrapper.find('.initially_hidden');
17
18    // constant variables
19
20    var activeClass = "active",
21        visibleClass = "visible",
22        currentSearchTerm = "",
23        currentSectionFilterValue = "",
24        currentUpdatedFilterValue = "",
25        resultsPerPage = 9,
26        totalResults = 0,
27        currentResultsShowing = 0,
28        currentResultsPage = 1;
29
30    // functions
31
32    // display functions
33
34    var showSiteSearch = function () {
35        $siteSearchWrapper.addClass(activeClass);
36        $siteSearchToggleButtons.addClass(activeClass);
37        $body.css('overflow', 'hidden');
38
39        setTimeout(function(){
40            $siteSearchSearchTermInput.focus();
41            $siteSearchSearchTermInput.trigger('click');
42         }, 100);
43
44    };
45
46    var hideSiteSearch = function () {
47        $siteSearchWrapper.removeClass(activeClass);
48        $siteSearchToggleButtons.removeClass(activeClass);
49        $body.css('overflow', 'auto');
50        $siteSearchSearchTermInput.blur();
51    };
52
53    var toggleElementVisibility = function () {
54        var elementsToShowSelector = ".show_on_search"
55
56        // show elements thats only appear when there are results
57        if (totalResults > 0) {
58            elementsToShowSelector += ", .show_with_results";
59        }
60
61        // show elements thats only appear when there are paged results
62        if (totalResults > resultsPerPage && totalResults != currentResultsShowing) {
63            elementsToShowSelector += ", .show_with_paged_results";
64        }
65
66        var $elementsToShow = $initiallyHiddenElements.filter(elementsToShowSelector);
67        var $elementsToHide = $initiallyHiddenElements.not($elementsToShow);
68
69        $elementsToShow.addClass(visibleClass);
70        $elementsToHide.removeClass(visibleClass);
71    };
72
73    // search functions
74
75    var resetCounters = function () {
76        currentResultsPage = 1;
77        $siteSearchPageNumberInput.val(currentResultsPage);
78        totalResults = 0;
79        currentResultsShowing = 0;
80        $currentResultsCount.text(currentResultsShowing);
81        $totalResultsCount.text(totalResults);
82    }
83
84    var populateCounters = function ($parsedResultsHtml) {
85        totalResults = $parsedResultsHtml.find('#total_results_count').text();
86        currentResultsShowing = currentResultsShowing + parseInt($parsedResultsHtml.find('#current_results_count').text());
87
88        $currentResultsCount.text(currentResultsShowing);
89        $totalResultsCount.text(totalResults);
90    }
91
92    var populateSearchResults = function ($parsedResultsHtml) {
93        $siteSearchResultsWrapper.html($parsedResultsHtml.find('.site_search_result__wrapper'));
94
95        initCustomEqualizerzs();
96
97        $siteSearchResultsWrapper.find('.site_search_result__wrapper').each(function (index) {
98            var $result = $(this);
99
100            setTimeout(function () { $result.addClass(visibleClass); }, (100 * index));
101        });
102    };
103
104    var appendSearchResults = function ($parsedResultsHtml) {
105        $siteSearchResultsWrapper.append($parsedResultsHtml.find('.site_search_result__wrapper'));
106
107        initCustomEqualizerzs();
108
109        $siteSearchResultsWrapper.find('.site_search_result__wrapper:not(.' + visibleClass + ')').each(function (index) {
110            var $result = $(this);
111
112            setTimeout(function () { $result.addClass(visibleClass); }, (100 * index));
113        });
114    };
115
116    var populateNoResultsFound = function () {
117        $siteSearchResultsWrapper.html('<h3 class="initially_hidden site_search__no_results_text">Sorry, no results were found matching your search term</h3>');
118        setTimeout(function () { $siteSearchResultsWrapper.find('h3').addClass(visibleClass); }, (150));
119    };
120
121    var getSearchResultsAjax = function (successFunction) {
122        var postData = $siteSearchForm.serializeArray();
123        var formURL = $siteSearchForm.attr("action");
124        var $returnresultsHtml = null;
125
126        $.ajax({
127            url: formURL,
128            type: "POST",
129            data: postData,
130            success: function (resultsHtml) {
131                $returnresultsHtml = parseHtmlToJqueryObject(resultsHtml);
132                successFunction($returnresultsHtml);
133            },
134            error: function () {
135            }
136        });
137    }
138
139    // helper functions
140
141    var blurFormInputs = function () {
142        if ($(window).width() <= largeBreakpoint) {
143            var $field = $('<input type="text"/>')
144            $('body').prepend($field);
145            // stops ios zooming
146            $field.attr('style', 'font-size:1.875rem;');
147
148            setTimeout(function () {
149                $field.focus();
150                setTimeout(function () {
151                    $field.attr('style', 'display:none;');
152                    document.activeElement.blur();
153                    $("input").blur();
154                }, 50);
155            }, 50);
156        }
157    }
158
159    var parseHtmlToJqueryObject = function (rawHtmlString) {
160        return $('<div/>').html(rawHtmlString);;
161    }
162
163    var searchHasChanged = function () {
164        var searchTermHasChanged = currentSearchTerm != $siteSearchSearchTermInput.val();
165        var sectionFilterHasChanged = currentSectionFilterValue != $siteSearchSectionFilterInput.val();
166        var updatedFilterHasChanged = currentUpdatedFilterValue != $siteSearchUpdatedFilterInput.val();
167
168        return searchTermHasChanged || sectionFilterHasChanged || updatedFilterHasChanged;
169    };
170
171    var updateCurrentSearchValues = function () {
172        currentSearchTerm = $siteSearchSearchTermInput.val();
173
174        currentSectionFilterValue = $siteSearchSectionFilterInput.val();
175        currentUpdatedFilterValue = $siteSearchUpdatedFilterInput.val();
176    };
177
178    var runSearch = function ($parsedResultsHtml) {
179        resetCounters();
180
181        if ($parsedResultsHtml == null) {
182            // error
183            populateNoResultsFound();
184        } else {
185            populateCounters($parsedResultsHtml);
186
187            if (totalResults > 0) {
188                populateSearchResults($parsedResultsHtml);
189            } else {
190                populateNoResultsFound();
191            }
192
193            toggleElementVisibility();
194        }
195
196        updateCurrentSearchValues();
197        blurFormInputs();
198    };
199
200    var runSearchPaging = function ($parsedResultsHtml) {
201        if ($parsedResultsHtml != null) {
202            populateCounters($parsedResultsHtml);
203
204            if (totalResults > 0) {
205                // if the button was shown then there should be results - just a check
206
207                appendSearchResults($parsedResultsHtml);
208            }
209
210            toggleElementVisibility();
211        }
212    };
213
214    // UI bindings
215
216    $siteSearchToggleButtons.on('click', function () {
217        if ($(this).hasClass(activeClass)) {
218            hideSiteSearch();
219        } else {
220            showSiteSearch();
221        }
222    });
223
224    $siteSearchForm.on('submit', function (e) {
225        //guard
226
227        if (searchHasChanged() && $siteSearchSearchTermInput.val().length > 2) {
228            resetCounters();
229            getSearchResultsAjax(runSearch);
230        }
231        e.preventDefault();
232    });
233
234    $loadMoreResultsButton.on('click', function () {
235        currentResultsPage++;
236        $siteSearchPageNumberInput.val(currentResultsPage);
237        getSearchResultsAjax(runSearchPaging);
238        $siteSearchResultsWrapper.find('.site_search_result:first-child .site_search_result__heading').focus();
239    })
240};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.