Tweak html layout to improve formatting.
[quanweb.git] / app / lib.js
1 // QuanLib:  eBook Library
2 // (C) 2017 by Christian Jaekl (cejaekl@yahoo.com)
3
4 g_state = {
5   cache: {},
6   count: 0,
7   first: 0,
8   ids: [],
9   last: (-1),
10   pageSize: 100
11 }
12
13 function constructSearchUrl() {
14   var url = window.location.protocol + '//' + window.location.host + '/search/';
15
16   var firstTime = true;
17   var terms = ['aut', 'tit', 'ser'];
18
19   for (idx in terms) {
20     var term = terms[idx];
21     var elem = document.getElementById(term);
22     if (null === elem) {
23       console.log('Error:  could not find form element for search term "' + term + '".');
24       continue;
25     }
26     
27     var value = elem.value;
28     if (value.length > 0) {
29       if (firstTime) {
30         url += '?';
31         firstTime = false;
32       }
33       else {
34         url += '&';
35       }
36       url += term + '=' + encodeURIComponent('%' + value + '%');
37     }
38   }
39
40   return url;
41 }
42
43 function onNext() {
44   if (g_state.last < (g_state.count - 1)) {
45     g_state.first += g_state.pageSize;
46     g_state.last += g_state.pageSize;
47     if (g_state.last >= g_state.count) {
48       g_state.last = g_state.count - 1;
49     }
50
51     refreshData();
52   }
53 }
54
55 function onPrev() {
56   if (g_state.first > 0) {
57     g_state.first -= g_state.pageSize;
58     if (g_state.first < 0) {
59       g_state.first = 0;
60     }
61     g_state.last = g_state.first + g_state.pageSize;
62     
63     refreshData();
64   }
65 }
66
67 function onSearch() {
68   console.log('onSearch()');
69
70   var url = constructSearchUrl();
71
72   report('Loading data from server, please wait...')
73   console.log('Fetching:  "' + url + '"...')
74
75   fetch(url, {method:'GET', cache:'default'})
76   .then(response => response.json())
77   .then((jsonValue) => {
78     console.log('JSON response:  ', jsonValue);
79     g_state.ids = jsonValue
80     g_state.count = g_state.ids.length;
81     g_state.first = 0
82     g_state.last = (g_state.ids.length) - 1;
83     if (g_state.last > g_state.pageSize) {
84       g_state.last = g_state.pageSize;
85     }
86     refreshData()
87   })
88   .catch(err => { 
89     var msg = 'Error fetching JSON from URL:  ' + url + ': ' + err + ':' + err.stack;
90     console.log(msg);
91     report(msg);
92   });
93 }
94
95 function refreshData() {
96   report('Loading details for books ' + g_state.first + ' through ' + g_state.last + ', please wait...');
97
98   var i;
99   var url = '/info/?ids=';
100   for (i = g_state.first; i <= g_state.last; ++i) {
101     if (i > g_state.first) {
102       url += ',';
103     }
104     url += g_state.ids[i];
105   }
106
107   fetch(url, {method:'GET', cache:'default'})
108   .then(response => response.json())
109   .then((jsonValue) => {
110     console.log('JSON response for info:  ', jsonValue);
111     report('');
112     g_state.cache = jsonValue;
113     refreshLayout();
114   })
115   .catch(err => {
116     var msg = 'Error fetching book details via URL:  ' + url + ': ' + err;
117     console.log(msg, err.stack);
118     report(msg);
119   });
120 }
121
122 function refreshLayout() {
123   var i;
124   var html = '';
125   var limit = g_state.last - g_state.first;
126   for (i = 0; i <= limit; ++i) {
127     var book = g_state.cache[i];
128     html += bookHtml(book);
129   }
130
131   document.getElementById('books').innerHTML = html;
132   document.getElementById('first').innerHTML = (g_state.first + 1);
133   document.getElementById('last').innerHTML = (g_state.last + 1);
134   document.getElementById('count').innerHTML = g_state.count;
135 }
136
137 function report(message) {
138   document.getElementById('books').innerHTML = message;
139 }
140
141 function bookHtml(book) {
142   console.log('bookHtml(): ', book);
143   var result = '<div class="book">'
144              +   '<table>'
145              +     '<tr>'
146              +       '<td><a href="/book/' + book.Id + '">';
147   if (0 == book.CoverId) {
148     result  +=          '(No cover available)'
149   } else {
150     result  +=          '<img class="cover-thumb" src="/download/' + book.CoverId + '"/>'
151   }
152   result    +=       '</a></td>'
153              +       '<td>'
154              +         '<p><b>' + book.Title + '</b></p>'
155              +         '<p>'
156              +           '<i>' + book.AuthorReading + '</i>';
157   if (typeof(book.SeriesName) !== 'undefined' && book.SeriesName.length > 0) {
158     result  +=           '<br/><i>' + book.SeriesName + ' ' + book.Volume + '</i>';
159   }
160   result    +=         '</p>'
161              +       '</td>'
162              +     '</tr>'
163              +   '</table>'
164              + '</div>';
165   return result;
166 }
167