Refactor search into its own controller.
[quanweb.git] / js / SearchController.js
1 // ================
2 // SearchController
3
4 var SearchController = (function () {
5     var my = {},
6         booksModel = undefined;
7
8     const terms = ['aut', 'tit', 'ser'];
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(response => response.json())
26             .then((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 = document.getElementById('slider');
33                 elem.max = booksModel.count;
34         
35                 PagingController.adjustPos(0);
36             })
37             .catch(err => { 
38                 var msg = 'Error fetching JSON from URL:  ' + url + ': ' + err + ':' + err.stack;
39                 console.log(msg);
40                 report(msg);
41             });
42     };
43
44     // ===============
45     // Private methods
46     
47     // KeyUp listener.  If the key is [Enter], then trigger a click on the [Search] button.
48     function addEnterListener(ctrlId) {
49         document.getElementById(ctrlId).addEventListener('keyup', function(event) {
50             event.preventDefault();
51             if (event.keyCode === 13) {
52                 document.getElementById('search').click();
53             }
54         });
55     }
56     
57     function constructSearchUrl() {
58         var url = window.location.protocol + '//' + window.location.host + '/search/';
59
60         var firstTime = true;
61
62         for (var idx in terms) {
63             var term = terms[idx];
64             var elem = document.getElementById(term);
65             if (null === elem) {
66                 console.log('Error:  could not find form element for search term "' + term + '".');
67                 continue;
68             }
69
70             var value = elem.value;
71             if (value.length > 0) {
72                 if (firstTime) {
73                     url += '?';
74                     firstTime = false;
75                 }
76                 else {
77                     url += '&';
78                 }
79                 url += term + '=' + encodeURIComponent('%' + value + '%');
80             }
81         }
82
83         return url;
84     }
85
86     return my;
87 })();