2 * This file is part of WolneLektury-Mobile, licensed under GNU Affero GPLv3 or later.
3 * Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
6 var View = new function() {
8 //self.minOffset = 1000;
23 self.init = function(success, error) {
24 console.log('View.init');
26 self._searchbox = document.getElementById("searchbox");
27 self._searchinput = document.getElementById("search");
28 self._content = document.getElementById("content");
31 self.currentView = '';
33 self.currentTitle = '';
35 document.getElementById("cover").style.display = 'none';
42 this.sanitize = function(text) {
43 return text.replace(/&/g, "&").replace(/</g, "<");
46 this.showSearch = function() {
47 self._searchbox.style.display = "block";
50 this.hideSearch = function() {
51 self._searchbox.style.display = "none";
54 this.spinner = function(text) {
57 self._content.innerHTML = "<div class='spinner'><img src='img/spinner.gif' /><div id='spinnertext'>" + text +"</div></div>";
61 this.content = function(text, offset) {
62 console.log('content');
64 self._content.innerHTML = '';
65 self._content.innerHTML = text;
69 this.enter = function(url, offset) {
70 console.log('View.enter: ' + url);
76 var slash_index = url.indexOf('/');
77 if (slash_index != -1) {
78 view = url.substr(0, slash_index);
79 arg = url.substr(slash_index + 1);
85 console.log('View.enter: ' + view + ' ' + arg);
87 self.currentView = view;
88 self.currentPar = arg;
89 self['enter' + view](arg, offset);
92 this.enterIndex = function(arg, offset) {
93 console.log('enterIndex');
94 Menu.setInfoButton("ProjectInfo", "Informacje o projekcie", true);
96 self.currentTitle = "Początek";
99 html += "<div class='buttons'>";
100 html += Links.button('Last', '', 'Ostatnio czytane');
101 html += Links.button('Bookmarks', '', 'Zakładki');
103 for (category in self.categories)
104 html += Links.button('Category', category, self.categories[category], 0);
107 html += "</div>" +"";
108 /*"<p id='logo'><img src='img/logo-wl-nq8.png' alt='Wolne Lektury' /><br/>\n" +
109 "szkolna biblioteka internetowa" +
111 self.content(html, offset);
114 this.enterBook = function(id, offset) {
116 console.log('enterBook: ' + id);
117 Menu.setInfoButton("BookInfo", "Informacje o utworze", true);
120 Catalogue.withBook(id, function(book) {
121 self.currentTitle = book.authors + ', ' + book.title;
123 Catalogue.withChildren(id, function(children) {
124 var html = "<h1><span class='subheader'>";
125 html += book.authors;
126 html += "</span>" + book.title + "</h1>\n";
127 if (book.html_file) {
128 html += "<div class='buttons'>" + Links.button('BookText', id, "Czytaj tekst") + "</div>";
130 if (children.length) {
131 html += "<div class='buttons'>";
132 for (c in children) {
134 html += Links.bookLink(child);
138 self.content(html, offset);
145 this.enterBookText = function(id, offset) {
147 self.spinner("Otwieranie utworu");
148 console.log('enterBookText: ' + id);
149 Menu.setInfoButton("BookInfo", "Informacje o utworze", true);
152 setTimeout("History.addRead("+id+");", 0);
154 FileRepo.withHtml(id, function(data) {
155 self.content(data, offset);
157 alert("Błąd pobierania: nie udało się pobrać treści utworu.");
160 Catalogue.withBook(id, function(book) {
161 self.currentTitle = book.authors + ', ' + book.title;
166 this.enterLast = function(ignored, offset) {
167 console.log("enterLast");
169 Menu.setInfoButton("ProjectInfo", "Informacje o projekcie", true);
170 self.currentTitle = 'Ostatnio czytane';
171 var html = "<h1><span class='subheader'>Ostatnio czytane</h1>\n";
173 var last_read = History.lastRead();
174 var some_books = false;
176 html += "<div class='buttons'>";
177 var add_books = function() {
178 if (last_read.length) {
179 var id = last_read.shift();
180 Catalogue.withBook(id, function(book) {
181 html += Links.bookLink(book);
190 html += "<p>Nie przeczytano żadnych utworów.</p>";
193 self.content(html, offset);
200 this.enterBookmarks = function(ignored, offset) {
201 console.log("enterBookmarks");
203 Menu.setInfoButton("ProjectInfo", "Informacje o projekcie", true);
204 self.currentTitle = 'Zakładki';
205 var html = "<h1><span class='subheader'>Zakładki</h1>\n";
207 var bookmarks = History.bookmarks();
208 if (!bookmarks.length) {
209 html += "<p>Nie utworzono żadnych zakładek.</p>";
210 self.content(html, offset);
214 html += "<div class='buttons bookmarks'>";
215 for (i in bookmarks) {
216 var bm = bookmarks[i];
219 text += "<div class='sub'>" + bm.title + "</div>";
220 html += Links.deleteButton(bm.id);
221 html += Links.button(bm.view, bm.par, text, bm.offset);
224 self.content(html, offset);
227 this.onBookmarkChange = function() {
228 // TODO: preserve offset
229 if (self.currentView == 'Bookmarks') {
230 self.enterBookmarks();
234 this.enterTag = function(id, offset) {
236 console.log('enterTag: ' + id);
237 Menu.setInfoButton("TagInfo", "Informacje o...", true);
240 self.spinner("Otwieranie listy utworów");
242 Catalogue.withTag(id, function(tag) {
243 Menu.setInfoButton("TagInfo", "Informacje o " + self.category_msc[tag.category], true);
244 self.currentTitle = tag.category + ': ' + tag.name;
245 var html = "<h1><span class='subheader upper'>" + tag.category + ': </span>' + tag.name + "</h1>\n";
246 html += "<div class='buttons'>";
248 Catalogue.withBooks(tag.books, function(books) {
249 for (var i in books) {
251 html += Links.bookLink(book);
254 self.content(html, offset);
263 this.enterCategory = function(category, offset) {
264 console.log('enterCategory: ' + category);
265 Menu.setInfoButton("ProjectInfo", "Informacje o projekcie", true);
266 self.spinner("Otwieranie katalogu");
268 self.currentTitle = self.categories[category];
270 Catalogue.withCategory(category, function(tags) {
271 var html = "<h1>" + self.categories[category] + "</h1>\n";
272 html += "<div class='buttons'>";
275 html += Links.button('Tag', tag.id, tag.name);
278 self.content(html, offset);
283 this.enterSearch = function(query, offset) {
284 console.log('enterSearch: ' + query);
285 Menu.setInfoButton("ProjectInfo", "Informacje o projekcie", true);
286 self.currentTitle = 'Szukaj: ' + query;
289 var html = "<h1><span class='subheader'>Szukana fraza:</span>" + View.sanitize(query) + "</h1>\n";
291 if (query.length < 2) {
292 html += "<p>Szukana fraza musi mieć co najmniej dwa znaki</p>";
293 self.content(html, offset);
297 Catalogue.withSearch(query, function(results) {
298 if (results.length == 1) {
299 var result = results[0];
300 if (result.view == 'Book' && result.item.html_file) {
301 self.enter(Links.href('BookText', result.item.id));
304 self.enter(Links.href(result.view, result.item.id));
308 if (results.length == 0) {
309 html += "<p>Brak wyników wyszukiwania</p>";
312 html += "<div class='buttons'>";
313 for (var i in results) {
314 var result = results[i];
315 if (result.view == 'Book')
316 html += Links.bookLink(result.item)
318 html += Links.button(result.view, result.item.id, result.item.name+"<div class='sub'>"+result.item.category+"</div>");
322 self.content(html, offset);
329 this.enterProjectInfo = function(arg, offset) {
330 console.log('enterProjectInfo');
331 Menu.setInfoButton("ProjectInfo", "Informacje o projekcie", false);
333 self.currentTitle = "Informacje o projekcie";
337 html += '<div class="info">';
340 html += "<p style='text-align:center'><img src='img/logo-wl.png' /></p>";
341 html += "<p>Biblioteka internetowa Wolne Lektury "+
342 " udostępnia w swoich zbiorach lektury szkolne zalecane do użytku przez" +
343 " Ministerstwo Edukacji Narodowej i inne dzieła literatury.</p>";
345 html += "<p style='text-align:center'><img src='img/logo-fnp.png' /></p>";
347 html += "<img style='float:left;' src='img/procent.png' />" +
348 "<p style='margin-left: 50px'>" +
349 "Przekaż 1% podatku na rozwój Wolnych Lektur.<br/>" +
350 "Fundacja Nowoczesna Polska<br/>" +
351 "KRS 0000070056</p>";
353 html += "<p>Większość pozycji w bibliotece należy do domeny publicznej "+
354 "co oznacza, że nie są już chronione majatkowym prawem autorskim, "+
355 "a więc można je swobodnie wykorzystywać, publikować i rozpowszechniać. "+
356 "Publikujemy również kilka utworów, które autorzy udostępnili na wolnej licencji "+
357 "<a href='http://creativecommons.org/licenses/by-sa/3.0/deed.pl'>"+
358 "Creative Commons Uznanie Autorstwa - Na Tych Samych Warunkach 3.0.PL</a>.</p>";
360 html += "<p style='text-align:center'><img src='img/cc-by-sa.png' /></p>";
362 html += "<p>Copyright © 2011 Fundacja Nowoczesna Polska. Aplikacja jest wolnym oprogramowaniem "+
363 "dostępnym na licencji GNU Affero GPL w wersji 3 lub późniejszej.</p>";
365 html += "<p>Więcej informacji o projekcie znajduje sie na stronie <a href='http://www.wolnelektury.pl'>http://www.wolnelektury.pl</a>.</p>";
370 self.content(html, offset);
374 this.enterBookInfo = function(id, offset) {
376 console.log('enterBookInfo: ' + id);
377 Menu.setInfoButton("ProjectInfo", "Informacje o projekcie", true);
380 Catalogue.withBook(id, function(book) {
381 self.currentTitle = "Informacje o: " + book.title;
383 var html = '<h2>' + book.authors + ', ' + book.title + '</h2>';
385 var url = WL + '/api/book/' + id + '/info.html';
387 var xhr = new XMLHttpRequest();
388 xhr.open("GET", url);
389 xhr.onload = function() {
390 console.log('BookInfo: fetched by ajax: ' + url);
392 html += '<div class="info">';
393 html += xhr.responseText;
396 self.content(html, offset);
398 xhr.onerror = function(e) {
399 self.content("Brak informacji.", offset);
408 this.enterTagInfo = function(id, offset) {
410 console.log('enterTagInfo: ' + id);
411 Menu.setInfoButton("ProjectInfo", "Informacje o projekcie", true);
414 Catalogue.withTag(id, function(tag) {
415 self.currentTitle = "Informacje o " + tag.name;
416 var html = '<h2>' + tag.name + '</h2>';
418 var url = WL + '/api/tag/' + id + '/info.html';
420 var xhr = new XMLHttpRequest();
421 xhr.open("GET", url);
422 xhr.onload = function() {
423 console.log('TagInfo: fetched by ajax: ' + url);
425 html += '<div class="info">';
426 html += xhr.responseText;
429 self.content(html, offset);
431 xhr.onerror = function(e) {
432 self.content("Brak informacji.", offset);
441 /* search form submit callback */
442 this.search = function() {
443 History.visit('Search/' + self._searchinput.value);