forked from codeforamerica/ohana-web-search
-
Notifications
You must be signed in to change notification settings - Fork 2
/
ajax-search.js
127 lines (103 loc) · 3.66 KB
/
ajax-search.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// handles ajax search functionality
define(['app/loading-manager',
'util/ajax','util/util',
'result/result-init',
'detail/detail-init',
'search/header-manager'],
function(splash,ajax,util,result,detail,header) {
'use strict';
var _resultsContainer; // area of HTML to refresh with ajax
var _callback; // callback object for handling ajax success/failure
var _ajaxCalled = false; // boolean for when the ajax has been call the first time
var _requestType = {'RESULT':'index','DETAIL':'show'}
function init()
{
_resultsContainer = document.getElementById('results-container');
header.init(); // initialize the header manager
detail.init(this); // initializes detail scripts
result.init(this); // initializes results scripts
// init callback hooks for ajax search
_callback = {
'done' : _success,
'fail' : _failure
}
window.addEventListener("popstate", _updateURL);
}
function _updateURL(evt)
{
// TODO prevent ajax request when user follows
// a named anchor link to the same page they are currently on.
if ( _ajaxCalled || (evt.state && evt.state.ajax) )
{
var params = util.getQueryParams(document.location.search);
// set search field values
var keyword = params.keyword || "";
var location = params.location || "";
var language = params.language || "";
splash.show({"fullscreen":false});
ajax.request(window.location.href, _callback);
}
}
// performs an ajax search with passed parameters
function performSearch(params)
{
splash.show({"fullscreen":false});
var id = params.id;
var keyword = params.keyword
var location = params.location
var radius = params.radius;
var kind = params.kind || []
var language = params.language;
var page = params.page;
inputs.setKeyword(keyword);
inputs.setLocation(location);
inputs.setKind(kind)
inputs.setLanguage(language);
var query = '/organizations';
if (id) query += '/'+id;
// if parameters are present add them
if (!util.isEmpty(params)) query += "?"
if (keyword) query += "&keyword="+encodeURIComponent(keyword);
if (location) query += "&location="+encodeURIComponent(location);
if (radius) query += "&radius="+radius;
for (var k=0;k<kind.length;k++)
{
if (kind[k] != null) query += "&kind[]="+kind[k]
}
if (language) query += "&language="+language;
if (page) query += "&page="+page;
query = query.replace('?&','?'); // only runs on first occurance, which is what we want
ajax.request(query, _callback);
window.history.pushState({'ajax':true}, null, query);
}
function _updateTitle()
{
var suffix = document.title.substring(document.title.lastIndexOf("|"),document.title.length);
var summary = document.getElementById("search-summary");
if (!summary) summary = document.querySelector("#detail-info h1.name");
summary = summary.getAttribute("title")+" "+suffix;
document.title = summary;
}
function _success(evt)
{
window.scrollTo(0,0); // scrolls page to the top of the page when ajax finishes
_ajaxCalled = true; // set ajax first-run flag
_resultsContainer.innerHTML = evt.content; // update search results list
if (evt.action == _requestType.DETAIL)
detail.refresh(); // re-initializes details scripts
else if (evt.action == _requestType.RESULT)
result.refresh(); // re-initializes results scripts
header.init(); // re-initialize header manager
_updateTitle(); // update page title
splash.hide(); // hide loading manager
}
function _failure(evt)
{
// TODO - Show error alert HTML
console.log('ajaxsearch failure',location.href,evt);
}
return {
init:init,
performSearch:performSearch
};
});