Add support to query books on specified lists (of award winners).
[quanweb.git] / js / src / SearchController.js
1 // ================
2 // SearchController
3
4 var SearchController = (function () {
5     var my = {},
6         booksModel = undefined;
7
8     const terms = ['aut', 'lan', 'lst', 'ser', 'tit'];
9
10     // ==============
11     // Public methods
12     
13     my.init = function(linkedBooksModel) {
14         booksModel = linkedBooksModel;
15         
16         for (var idx in terms) {
17             addEnterListener(terms[idx]);
18         }
19     };
20     
21     my.onSearch = function() {
22         var url = constructSearchUrl();
23
24         fetch(url, {method:'GET', cache:'default'})
25             .then(function(response) {return response.json();})
26             .then(function(jsonValue) {
27                 // console.log('JSON response:  ', jsonValue);
28                 booksModel.ids = jsonValue;
29                 booksModel.count = booksModel.ids.length;
30                 booksModel.first = (-1);
31         
32                 var elem = Browser.getElementById('slider');
33                 elem.max = booksModel.count;
34                 elem = Browser.getElementById('bottom_slider');
35                 elem.max = booksModel.count;
36         
37                 PagingController.adjustPos(0);
38             })
39             .catch(function(err) { 
40                 var msg = 'Error fetching JSON from URL:  ' + url + ': ' + err + ':' + err.stack;
41                 console.log(msg);
42                 report(msg);
43             });
44     };
45
46     // ===============
47     // Private methods
48     
49     // KeyUp listener.  If the key is [Enter], then trigger a click on the [Search] button.
50     function addEnterListener(ctrlId) {
51         Browser.getElementById(ctrlId).addEventListener('keyup', function(event) {
52             event.preventDefault();
53             if (event.keyCode === 13) {
54                 Browser.getElementById('search').click();
55             }
56         });
57     }
58     
59     function constructSearchUrl() {
60         var url = window.location.protocol + '//' + window.location.host + '/search/';
61
62         var firstTime = true;
63
64         for (var idx in terms) {
65             var term = terms[idx];
66             var elem = Browser.getElementById(term);
67             if (null === elem) {
68                 console.log('Error:  could not find form element for search term "' + term + '".');
69                 continue;
70             }
71
72             var value = elem.value;
73             if (value.length > 0) {
74                 if (firstTime) {
75                     url += '?';
76                     firstTime = false;
77                 }
78                 else {
79                     url += '&';
80                 }
81                 if (term === 'lst') {
82                   url += term + '=' + encodeURIComponent('' + value);
83                 }
84                 else {
85                   url += term + '=' + encodeURIComponent('%' + value + '%');
86                 }
87             }
88         }
89         return url;
90     }
91
92     return my;
93 })();