1+ // Init the search box
2+ $ ( function ( config ) {
3+ 'use strict' ;
4+
5+ var applicationId = config . applicationId ;
6+ var apiKey = config . apiKey ;
7+ var indexName = config . indexName ;
8+
9+ var algolia = algoliasearch ( applicationId , apiKey ) ;
10+ var helper = algoliasearchHelper ( algolia , indexName ) ;
11+ helper . setQueryParameter ( 'distinct' , true ) ;
12+ helper . on ( 'result' , onResult ) ;
13+
14+ // Input listening for queries
15+ var $searchInput = $ ( '.js-algolia__input' ) ;
16+ $searchInput . on ( 'keyup' , onQueryChange ) ;
17+
18+ // Content to hide/show when searching
19+ var $initialContent = $ ( '.js-algolia__initial-content' ) ;
20+ var $searchContent = $ ( '.js-algolia__search-content' ) ;
21+ var $searchContentResults = $searchContent . find ( '.algolia__results' ) ;
22+ $searchContentResults . on ( 'click' , 'a' , onLinkClick ) ;
23+ // Rendering templates
24+ var templateResult = Hogan . compile ( $ ( '#algolia__template' ) . html ( ) ) ;
25+ var templateNoResults = $ ( '#algolia__template--no-results' ) . html ( ) ;
26+
27+ var lastQuery ;
28+
29+ // Toggle result page
30+ function showResults ( ) {
31+ window . scroll ( 0 , 0 ) ;
32+ $initialContent . addClass ( 'algolia__initial-content--hidden' ) ;
33+ $searchContent . addClass ( 'algolia__search-content--active' ) ;
34+
35+ }
36+ function hideResults ( ) {
37+ $initialContent . removeClass ( 'algolia__initial-content--hidden' ) ;
38+ $searchContent . removeClass ( 'algolia__search-content--active' ) ;
39+ }
40+
41+ // Handle typing query
42+ function onQueryChange ( ) {
43+ lastQuery = $ ( this ) . val ( ) ;
44+ if ( lastQuery . length === 0 ) {
45+ hideResults ( ) ;
46+ return false ;
47+ }
48+ helper . setQuery ( lastQuery ) . search ( ) ;
49+ showResults ( ) ;
50+ }
51+
52+ function onResult ( data ) {
53+ // Avoid race conditions, discard results that do not match the latest query
54+ if ( data . query !== lastQuery ) {
55+ return false ;
56+ }
57+ var content = data . nbHits ? renderResults ( data ) : templateNoResults ;
58+ $searchContentResults . html ( content ) ;
59+ }
60+
61+ function renderResults ( data ) {
62+ return $ . map ( data . hits , function ( hit ) {
63+ if ( hit . posted_at ) {
64+ hit . posted_at_readable = moment . unix ( hit . posted_at ) . fromNow ( ) ;
65+ }
66+ hit . css_selector = encodeURI ( hit . css_selector ) ;
67+ hit . full_url = config . baseurl + hit . url ;
68+
69+ return templateResult . render ( hit ) ;
70+ } ) . join ( '' ) ;
71+ }
72+
73+ // Scroll page to correct element
74+ function getAnchorSelector ( hash ) {
75+ var anchor = hash . substring ( 1 ) ;
76+ if ( ! anchor . match ( / ^ a l g o l i a : / ) ) {
77+ return false ;
78+ }
79+ return decodeURI ( anchor . replace ( / ^ a l g o l i a : / , '' ) ) ;
80+ }
81+
82+ function scrollPageToSelector ( selector ) {
83+ var target = $ ( '.page,.post' ) . find ( selector ) ;
84+ var targetOffset = target [ 0 ] . getBoundingClientRect ( ) . top + window . pageYOffset - 20 ;
85+ window . setTimeout ( function ( ) {
86+ window . scroll ( 0 , targetOffset ) ;
87+ } , 100 ) ;
88+ }
89+
90+ function onLinkClick ( event ) {
91+ var selector = getAnchorSelector ( event . target . hash ) ;
92+ // Normal link, going to another page
93+ if ( event . target . pathname !== window . location . pathname || ! selector ) {
94+ return true ;
95+ }
96+ // Scrolling to a result on the same page
97+ hideResults ( ) ;
98+ scrollPageToSelector ( selector ) ;
99+ event . preventDefault ( ) ;
100+ return false ;
101+ }
102+
103+ window . setTimeout ( function ( ) {
104+ var selector = getAnchorSelector ( window . location . hash ) ;
105+ if ( selector ) {
106+ scrollPageToSelector ( selector ) ;
107+ }
108+ } , 100 ) ;
109+
110+
111+ } ( window . ALGOLIA_CONFIG ) ) ;
0 commit comments