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 suggestionsSuccessHandler(result, args) { 73 var dataSource = result.Suggestions; 74 searchTextBox.autocomplete('option', 'source', dataSource); 75 76 searchTextBox.autocomplete("search", searchTextBox.val().trim()); 77 } 78 79 function keyupHandler(e) { 80 if (e.keyCode != 38 && // up arrow 81 e.keyCode != 40 && // down arrow 82 e.keyCode != 27) { // esc 83 // When the auto complete menu is shown, only this event is detected 84 if (e.keyCode == 13) { 85 // when enter is pressed 86 navigateToResults(e); 87 } 88 89 var request = {}; 90 var searchText = searchTextBox.val().trim(); 91 if (searchText.length >= serverData.minSuggestionLength) { 92 request.IndexName = serverData.indexCatalogue; 93 request.SuggestionFields = serverData.suggestionFields; 94 request.Text = searchText; 95 request.Language = serverData.language; 96 request.SiteId = serverData.siteId; 97 if (serverData.resultsForAllSites) { 98 request.ResultsForAllSites = serverData.resultsForAllSites; 99 } 100 101 if (serverData.scoringSettingsSelector) { 102 103 request.ScoringInfo = serverData.scoringSettingsSelector; 104 } 105 106 $.ajax({
107 type: "GET", 108 url: serverData.suggestionsRoute, 109 dataType: 'json', 110 data: request, 111 success: suggestionsSuccessHandler 112 }); 113 } 114 } 115 } 116 117 /* Helper methods */ 118 function navigateToResults(e) { 119 if (!e) 120 e = window.event; 121 122 if (e.stopPropagation) { 123 e.stopPropagation(); 124 } 125 else { 126 e.cancelBubble = true; 127 } 128 if (e.preventDefault) { 129 e.preventDefault(); 130 } 131 else { 132 e.returnValue = false; 133 } 134 135 var query = searchTextBox.val(); 136 137 if (query && query.trim() && serverData.indexCatalogue) { 138 sendSentence(); 139 window.location = getLocation(); 140 } 141 } 142 143 function getLocation() { 144 var query = searchTextBox.val().trim(); 145 146 var separator = (serverData.resultsUrl.indexOf("?") == -1) ? "?" : "&"; 147 148 var catalogueParam = separator + "indexCatalogue=" + encodeURIComponent(serverData.indexCatalogue); 149 var searchQueryParam = "&searchQuery=" + encodeURIComponent(query); 150 151 var url = serverData.resultsUrl + catalogueParam + searchQueryParam; 152 153 if (serverData.scoringSettingsSelector) { 154 url = url + "&scoringInfo=" + serverData.scoringSettingsSelector; 155 } 156 157 if (serverData.resultsForAllSites) { 158 url = url + "&resultsForAllSites=" + serverData.resultsForAllSites; 159 } 160 161 return url; 162 } 163 164 function sendSentence() { 165 if (window.DataIntelligenceSubmitScript) { 166 DataIntelligenceSubmitScript._client.sentenceClient.writeSentence({ 167 predicate: "Search for", 168 object: searchTextBox.val(), 169 objectMetadata: [{ 170 'K': 'PageUrl', 171 'V': location.href 172 }] 173 }); 174 } 175 } 176 } 177 }; 178 179 if (window.personalizationManager) { 180 window.personalizationManager.addPersonalizedContentLoaded(function () { 181 init(); 182 }); 183 } else { 184 document.addEventListener('DOMContentLoaded', function () { 185 init(); 186 }); 187 } 188}(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.