(function($) { 'use strict'; window.SCROLL_WEBHELP = window.SCROLL_WEBHELP || {}; window.SCROLL_WEBHELP.search = window.SCROLL_WEBHELP.search || {}; var workerIsActive = false; var worker; var idx; var queryCallbacks = {}; window.SCROLL_WEBHELP.search.performSearch = function(query, onResultsAvailableCallback) { search(query, onResultsAvailableCallback); }; var search = function(query, onResultsAvailableCallback) { if (typeof idx !== 'undefined'){ onResultsAvailableCallback(searchInMainThread(query), query); } else if(workerIsActive) { searchWithWorker(query, onResultsAvailableCallback); } }; var searchInMainThread = function(query) { var results = idx.search(query).map(function(result) { return lunrData.filter(function (d) { return d.id === parseInt(result.ref, 10) })[0]; }); return results; }; var searchWithWorker = function(query, callback) { var queryId = new Date().getTime(); queryCallbacks[queryId] = callback; worker.postMessage({type: 'search-request', query: query, queryId: queryId}); }; window.SCROLL_WEBHELP.search.navigateToSearchPage = function(query) { search(query, displaySearchResultsPage); }; var displaySearchResultsPage = function(searchResults, query) { var container = $('#html-search-results'); //Prevent display too long text var displayQuery = query; if(displayQuery.length > 75) { displayQuery = "\"" + escapeHtml(displayQuery.substring(0,74))+"..." + "\""; } else { displayQuery = "\"" + escapeHtml(displayQuery)+ "\""; } container.find('.ht-content-header h1').html('Search for ' + displayQuery + ' returned ' + searchResults.length + ' result' + (searchResults.length != 1 ? 's.' : '.')); var list = $("#search-results"); list.empty(); var baseUrl = window.location.href.substr(0, window.location.href.lastIndexOf('/') + 1); $.each(searchResults, function(index, searchResult) { var displayUrl = baseUrl + searchResult.link; list.append('
' +'

' + searchResult.title + '

' +'
' +'
' +'
'); }); $('#ht-content, #ht-post-nav').hide(); container.show(); }; var searchSetup = function() { var locationOrigin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port : ''); var pageLocation = locationOrigin + window.location.pathname; var url = pageLocation.substr(0, pageLocation.lastIndexOf('/') + 1); var onIndexLoaded = function() { $('.ht-search-index-loader').fadeOut(300, function() { $('.ht-search-input').fadeIn(); }); }; try { // Creates the Web Worker, to overcome the Same-Origin policy the URL is passed to the worker. var blob = new Blob([document.querySelector('#worker').textContent]); worker = new Worker(window.URL.createObjectURL(blob)); worker.onmessage = function (event) { var message = event.data; if (message.type === 'setup-complete') { onIndexLoaded(); workerIsActive = true; } if (message.type === 'search-results') { var callback = queryCallbacks[message.queryId]; if (callback) { delete queryCallbacks[message.queryId]; callback(message.results, message.query); } } }; // what the worker does in case of an error worker.onerror = function(error) { error.preventDefault(); throw(error); }; // send page url to the worker, for script loading worker.postMessage({type: "setup", baseUrl: url}); } catch (error) { setTimeout(function () { if(!workerIsActive){ $.ajax({ url:'js/lunr-data.js', cache:true, crossDomain: true, dataType: 'script' }); $.ajax({ url:'js/lunr-index.js', cache:true, crossDomain: true, dataType:'script' }).done(function() { idx = lunr.Index.load(lunrIndex); idx.pipeline.remove(lunr.stopWordFilter); onIndexLoaded(); } ); } }, 3000); } }; var entityMap = { "&": "&", "<": "<", ">": ">", '"': '"', "'": ''', "/": '/' }; function escapeHtml(string) { return String(string).replace(/[&<>"'\/]/g, function (s) { return entityMap[s]; }); } $(document).ready(function () { searchSetup(); }); })($);