1(function ($) { 2 var init = function () { 3 var searchBoxIdFields = $('[data-sf-role="searchTextBoxId"]'); 4 5 for (var i = 0; i < searchBoxIdFields.length; i++) { 6 var searchBoxIdField = $(searchBoxIdFields[i]); 7 var controlServerData = { 8 resultsUrl: searchBoxIdField.siblings('[data-sf-role="resultsUrl"]').first().val(), 9 indexCatalogue: searchBoxIdField.siblings('[data-sf-role="indexCatalogue"]').first().val(), 10 disableSuggestions: $.parseJSON(searchBoxIdField.siblings('[data-sf-role="disableSuggestions"]').first().val()), 11 minSuggestionLength: searchBoxIdField.siblings('[data-sf-role="minSuggestionLength"]').first().val(), 12 suggestionFields: searchBoxIdField.siblings('[data-sf-role="suggestionFields"]').first().val(), 13 language: searchBoxIdField.siblings('[data-sf-role="language"]').first().val(), 14 siteId: searchBoxIdField.siblings('[data-sf-role="siteId"]').first().val(), 15 suggestionsRoute: searchBoxIdField.siblings('[data-sf-role="suggestionsRoute"]').first().val(), 16 searchTextBoxSelector: searchBoxIdField.val(), 17 searchButtonSelector: searchBoxIdField.siblings('[data-sf-role="searchButtonId"]').first().val(), 18 scoringSettingsSelector: searchBoxIdField.siblings('[data-sf-role="scoringSettings"]').first().val(), 19 resultsForAllSites: searchBoxIdField.siblings('[data-sf-role="searchInAllSitesInTheIndex"]').first().val(), 20 }; 21 featherSearchBoxWidget(controlServerData); 22 } 23 24 function featherSearchBoxWidget(serverData) { 25 var searchTextBox = $(serverData.searchTextBoxSelector), 26 searchButton = $(serverData.searchButtonSelector); 27 28 searchButton.click(navigateToResults); 29 searchTextBox.keypress(keypressHandler); 30 31 /* Initialization */ 32 if (!serverData.disableSuggestions) { 33 searchTextBox.keyup(keyupHandler); 34 35 try { 36 searchTextBox.autocomplete({ 37 source: [], 38 messages: 39 { 40 noResults: '', 41 results: function () { } 42 }, 43 select: function (event, ui) { 44 searchTextBox.val(ui.item.value); 45 navigateToResults(event); 46 }, 47 }).autocomplete("widget").addClass("sf-autocomplete"); 48 } catch (e) { 49 // Fixes jQuery bug, causing IE7 to throw error "script3 member not found". 50 // The try/catch can be removed when the bug is fixed. 51 } 52 } 53 54 /* Event handlers */ 55 function keypressHandler(e) { 56 if (!e) 57 e = window.event; 58 59 var keyCode = null; 60 if (e.keyCode) { 61 keyCode = e.keyCode; 62 } 63 else { 64 keyCode = e.charCode; 65 } 66 67 if (keyCode == 13) { 68 navigateToResults(e); 69 } 70 } 71 72 function toAscii(str) { 73 return str.normalize("NFD").replace(/[\u0300-\u036f]/g, ""); 74 } 75 76 function suggestionsSuccessHandler(result) { 77 var dataSource = result.Suggestions; 78 79 searchTextBox.autocomplete({ 80 minLength: 0, 81 source: function (request, response) { 82 var term = toAscii(request.term.toLowerCase()); 83 response(dataSource.filter(function (item) { 84 return toAscii(item.toLowerCase()).indexOf(term) !== -1; 85 })); 86 } 87 }); 88 89 searchTextBox.autocomplete("search", searchTextBox.val().trim()); 90 } 91 92 function keyupHandler(e) { 93 if (e.keyCode != 38 && // up arrow 94 e.keyCode != 40 && // down arrow 95 e.keyCode != 27) { // esc 96 97 var request = {}; 98 var searchText = searchTextBox.val().trim(); 99 if (searchText.length >= serverData.minSuggestionLength) { 100 request.IndexName = serverData.indexCatalogue; 101 request.SuggestionFields = serverData.suggestionFields; 102 request.Text = searchText; 103 request.Language = serverData.language; 104 request.SiteId = serverData.siteId; 105 if (serverData.resultsForAllSites) { 106 request.ResultsForAllSites = serverData.resultsForAllSites; 107 } 108 109 if (serverData.scoringSettingsSelector) { 110 111 request.ScoringInfo = serverData.scoringSettingsSelector; 112 } 113 114 $.ajax({
115 type: "GET", 116 url: serverData.suggestionsRoute, 117 dataType: 'json', 118 data: request, 119 success: suggestionsSuccessHandler 120 }); 121 } 122 } 123 } 124 125 /* Helper methods */ 126 function navigateToResults(e) { 127 if (!e) 128 e = window.event; 129 130 if (e.stopPropagation) { 131 e.stopPropagation(); 132 } 133 else { 134 e.cancelBubble = true; 135 } 136 if (e.preventDefault) { 137 e.preventDefault(); 138 } 139 else { 140 e.returnValue = false; 141 } 142 143 var query = searchTextBox.val(); 144 145 if (query && query.trim() && serverData.indexCatalogue) { 146 sendSentence(); 147 window.location = getLocation(); 148 } 149 } 150 151 function getLocation() { 152 var query = searchTextBox.val().trim(); 153 154 var separator = (serverData.resultsUrl.indexOf("?") == -1) ? "?" : "&"; 155 156 var catalogueParam = separator + "indexCatalogue=" + encodeURIComponent(serverData.indexCatalogue); 157 var searchQueryParam = "&searchQuery=" + encodeURIComponent(query); 158 159 var url = serverData.resultsUrl + catalogueParam + searchQueryParam; 160 161 if (serverData.scoringSettingsSelector) { 162 url = url + "&scoringInfo=" + serverData.scoringSettingsSelector; 163 } 164 165 if (serverData.resultsForAllSites) { 166 url = url + "&resultsForAllSites=" + serverData.resultsForAllSites; 167 } 168 169 return url; 170 } 171 172 function sendSentence() { 173 if (window.DataIntelligenceSubmitScript) { 174 DataIntelligenceSubmitScript._client.fetchClient.sendInteraction({ 175 P: "Search for", 176 O: searchTextBox.val(), 177 OM: { 178 PageUrl: location.href 179 } 180 }); 181 } 182 } 183 } 184 }; 185 186 if (window.personalizationManager) { 187 window.personalizationManager.addPersonalizedContentLoaded(function () { 188 init(); 189 }); 190 } else { 191 document.addEventListener('DOMContentLoaded', function () { 192 init(); 193 }); 194 } 195}(jQuery));
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.