ported to Web SQL
authorMarcin Koziej <marcin@lolownia.org>
Mon, 16 Jul 2012 00:17:04 +0000 (02:17 +0200)
committerMarcin Koziej <marcin@lolownia.org>
Mon, 16 Jul 2012 00:17:04 +0000 (02:17 +0200)
26 files changed:
books.html
categories.html
css/images/ajax-loader.gif [new file with mode: 0644]
css/images/ajax-loader.png [new file with mode: 0644]
css/images/icons-18-black.png [new file with mode: 0644]
css/images/icons-18-white.png [new file with mode: 0644]
css/images/icons-36-black.png [new file with mode: 0644]
css/images/icons-36-white.png [new file with mode: 0644]
docs/notes.org [new file with mode: 0644]
favicon.png [new file with mode: 0644]
initdb.sql [new file with mode: 0644]
js/app/AjaxList.js [deleted file]
js/app/BooksList.coffee [deleted file]
js/app/BooksList.js [deleted file]
js/app/Catalogue.coffee [new file with mode: 0644]
js/app/Catalogue.js [new file with mode: 0644]
js/app/Config.coffee
js/app/Config.js
js/app/TagList.coffee [deleted file]
js/app/TagList.js [deleted file]
js/app/app.coffee
js/app/app.js
js/app/list.coffee [new file with mode: 0644]
js/app/list.js [new file with mode: 0644]
js/app/models.coffee [new file with mode: 0644]
js/app/models.js [new file with mode: 0644]

index 1e38975..06eb20c 100644 (file)
@@ -18,7 +18,8 @@
          data-filter-placeholder="Search..." 
          data-divider-theme="b"
          data-inset="false" 
-         id="list-books">
+         id="list-books"
+         data-inset="true">
       </ul>
     </div>
   </div>
index 71f638c..164bbf7 100644 (file)
@@ -22,7 +22,7 @@
        <!-- For non-Retina iPhone, iPod Touch, and Android 2.1+ devices: -->
        <link rel="apple-touch-icon-precomposed" href="apple-touch-icon-precomposed.png">
        <!-- For nokia devices and desktop browsers : -->
-       <link rel="shortcut icon" href="favicon.ico" />
+       <link rel="shortcut icon" href="favicon.png" />
        
        <!-- Mobile IE allows us to activate ClearType technology for smoothing fonts for easy reading -->
        <meta http-equiv="cleartype" content="on">
 
        <!-- app -->
        <script src="js/app/app.js"></script>
+       <script src="js/app/models.js"></script>
        <script src="js/app/Config.js"></script>
        <script src="js/app/Controller.js"></script>
-       <script src="js/app/TagList.js"></script>
-       <script src="js/app/BooksList.js"></script>
+       <script src="js/app/Catalogue.js"></script>
+       <script src="js/app/list.js"></script>
+
 <!-- /app -->
 
        <!-- Add a Bookmark Bubble for iDevices, and adds a cookie if already shown -->
diff --git a/css/images/ajax-loader.gif b/css/images/ajax-loader.gif
new file mode 100644 (file)
index 0000000..fd1a189
Binary files /dev/null and b/css/images/ajax-loader.gif differ
diff --git a/css/images/ajax-loader.png b/css/images/ajax-loader.png
new file mode 100644 (file)
index 0000000..13b208d
Binary files /dev/null and b/css/images/ajax-loader.png differ
diff --git a/css/images/icons-18-black.png b/css/images/icons-18-black.png
new file mode 100644 (file)
index 0000000..ce1b758
Binary files /dev/null and b/css/images/icons-18-black.png differ
diff --git a/css/images/icons-18-white.png b/css/images/icons-18-white.png
new file mode 100644 (file)
index 0000000..1ab0127
Binary files /dev/null and b/css/images/icons-18-white.png differ
diff --git a/css/images/icons-36-black.png b/css/images/icons-36-black.png
new file mode 100644 (file)
index 0000000..1a59d7c
Binary files /dev/null and b/css/images/icons-36-black.png differ
diff --git a/css/images/icons-36-white.png b/css/images/icons-36-white.png
new file mode 100644 (file)
index 0000000..5647bdc
Binary files /dev/null and b/css/images/icons-36-white.png differ
diff --git a/docs/notes.org b/docs/notes.org
new file mode 100644 (file)
index 0000000..aacfad2
--- /dev/null
@@ -0,0 +1,3 @@
+
+* Run chrome to enable develpment on file://
+/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files --disable-web-security
diff --git a/favicon.png b/favicon.png
new file mode 100644 (file)
index 0000000..9794f35
Binary files /dev/null and b/favicon.png differ
diff --git a/initdb.sql b/initdb.sql
new file mode 100644 (file)
index 0000000..e0dbe06
--- /dev/null
@@ -0,0 +1,406 @@
+BEGIN TRANSACTION;
+CREATE TABLE book (
+    id INTEGER PRIMARY KEY, 
+    title VARCHAR,
+    cover VARCHAR,
+    html_file VARCHAR, 
+    html_file_size INTEGER, 
+    parent INTEGER,
+    parent_number INTEGER,
+
+    sort_key VARCHAR,
+    pretty_size VARCHAR,
+    authors VARCHAR,
+    _local BOOLEAN
+);
+INSERT INTO "book" VALUES(1,'Akordy jesienne','/media/book/png/akordy-jesienne.png','/media/book/html/akordy-jesienne_1.html',63623,NULL,0,'akordy jesienne','62 KiB','Jan Kasprowicz',NULL);
+INSERT INTO "book" VALUES(2,'A cóż z tą Dzieciną...','/media/book/png/a-coz-z-ta-dziecina.png','/media/book/html/a-coz-z-ta-dziecina.html',9046,NULL,0,'a co~0z~1 z ta~0 dziecina~0 ','8.8 KiB','Autor nieznany',NULL);
+INSERT INTO "book" VALUES(3,'A jednak ja nie wątpię - bo się pora zbliża','/media/book/png/a-jednak-ja-nie-watpie-bo-sie-pora-zbliza.png','/media/book/html/a-jednak-ja-nie-watpie-bo-sie-pora-zbliza.html',2853,NULL,0,'a jednak ja nie wa~0tpie~0 bo sie~0 pora zbliz~1a','2.8 KiB','Juliusz Słowacki',NULL);
+INSERT INTO "book" VALUES(4,'A kiedy będziesz...','/media/book/png/a-kiedy-bedziesz.png','/media/book/html/a-kiedy-bedziesz.html',4481,NULL,0,'a kiedy be~0dziesz ','4.4 KiB','Kazimierz Przerwa-Tetmajer',NULL);
+INSERT INTO "book" VALUES(5,'Abuzei i Tair','/media/book/png/abuzei-i-tair.png','/media/book/html/abuzei-i-tair.html',1095,NULL,0,'abuzei i tair','1.1 KiB','Ignacy Krasicki',NULL);
+INSERT INTO "book" VALUES(6,'Akslop','/media/book/png/akslop.png','/media/book/html/akslop.html',1402,NULL,0,'akslop','1.4 KiB','Miłosz Biedrzycki',NULL);
+INSERT INTO "book" VALUES(7,'Alegoria','/media/book/png/alegoria.png','/media/book/html/alegoria.html',2666,NULL,0,'alegoria','2.6 KiB','Ignacy Krasicki',NULL);
+INSERT INTO "book" VALUES(8,'Anioł ognisty - mój anioł lewy','/media/book/png/aniol-ognisty-moj-aniol-lewy.png','/media/book/html/aniol-ognisty-moj-aniol-lewy.html',2317,NULL,0,'aniol~0 ognisty mo~0j aniol~0 lewy','2.3 KiB','Juliusz Słowacki',NULL);
+INSERT INTO "book" VALUES(9,'Anioł','/media/book/png/aniol.png','/media/book/html/aniol.html',10112,NULL,0,'aniol~0','9.9 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(10,'Anioły stoją na rodzinnych polach','/media/book/png/anioly-stoja-na-rodzinnych-polach.png','/media/book/html/anioly-stoja-na-rodzinnych-polach.html',2100,NULL,0,'aniol~0y stoja~0 na rodzinnych polach','2.1 KiB','Juliusz Słowacki',NULL);
+INSERT INTO "book" VALUES(11,'Antek','/media/book/png/antek.png','/media/book/html/antek.html',94506,NULL,0,'antek','92 KiB','Bolesław Prus',NULL);
+INSERT INTO "book" VALUES(12,'Antygona','/media/book/png/antygona.png','/media/book/html/antygona.html',145835,NULL,0,'antygona','142 KiB','Sofokles',NULL);
+INSERT INTO "book" VALUES(13,'Antymonachomachia','/media/book/png/antymonachomachia.png','/media/book/html/antymonachomachia.html',232662,NULL,0,'antymonachomachia','227 KiB','Ignacy Krasicki',NULL);
+INSERT INTO "book" VALUES(14,'Aptekarzowa','/media/book/png/aptekarzowa.png','/media/book/html/aptekarzowa.html',18187,NULL,0,'aptekarzowa','17 KiB','Anton Czechow',NULL);
+INSERT INTO "book" VALUES(15,'Asyż','/media/book/png/asyz.png','/media/book/html/asyz.html',2426,NULL,0,'asyz~1','2.4 KiB','Louis le Cardonnel',NULL);
+INSERT INTO "book" VALUES(16,'Atłas i kitaj','/media/book/png/atlas-i-kitaj.png','/media/book/html/atlas-i-kitaj.html',2046,NULL,0,'atl~0as i kitaj','2.0 KiB','Ignacy Krasicki',NULL);
+INSERT INTO "book" VALUES(17,'Bachantki','/media/book/png/bachantki.png','/media/book/html/bachantki.html',210793,NULL,0,'bachantki','205 KiB','Eurypides',NULL);
+INSERT INTO "book" VALUES(18,'Dwa żółwie','/media/book/png/dwa-zolwie.png','/media/book/html/dwa-zolwie.html',1534,NULL,0,'dwa z~1o~0l~0wie','1.5 KiB','Ignacy Krasicki',NULL);
+INSERT INTO "book" VALUES(19,'Kulawy i ślepy','/media/book/png/kulawy-i-slepy.png','/media/book/html/kulawy-i-slepy.html',2911,NULL,0,'kulawy i s~0lepy','2.8 KiB','Ignacy Krasicki',NULL);
+INSERT INTO "book" VALUES(20,'Lew i zwierzęta','/media/book/png/lew-i-zwierzeta.png','/media/book/html/lew-i-zwierzeta.html',2805,NULL,0,'lew i zwierze~0ta','2.7 KiB','Ignacy Krasicki',NULL);
+INSERT INTO "book" VALUES(21,'Bąk i piłka','/media/book/png/bak-i-pilka.png','/media/book/html/bak-i-pilka.html',9553,NULL,0,'ba~0k i pil~0ka','9.3 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(22,'Ballada z tamtej strony','/media/book/png/ballada-z-tamtej-strony.png','/media/book/html/ballada-z-tamtej-strony.html',2937,NULL,0,'ballada z tamtej strony','2.9 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(23,'Bez nut','/media/book/png/bez-nut.png','/media/book/html/bez-nut.html',2839,NULL,0,'bez nut','2.8 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(24,'Deszcz w Concarneau','/media/book/png/deszcz-w-concarneau.png','/media/book/html/deszcz-w-concarneau.html',2399,NULL,0,'deszcz w concarneau','2.3 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(25,'Elegia niemocy','/media/book/png/elegia-niemocy.png','/media/book/html/elegia-niemocy.html',4075,NULL,0,'elegia niemocy','4.0 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(26,'Elegia uśpienia','/media/book/png/elegia-uspienia.png','/media/book/html/elegia-uspienia.html',4628,NULL,0,'elegia us~0pienia','4.5 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(27,'Elegia żalu','/media/book/png/elegia-zalu.png','/media/book/html/elegia-zalu.html',4066,NULL,0,'elegia z~1alu','4.0 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(28,'Erotyk','/media/book/png/erotyk.png','/media/book/html/erotyk.html',2061,NULL,0,'erotyk','2.0 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(29,'Imieniny','/media/book/png/imieniny.png','/media/book/html/imieniny.html',1402,NULL,0,'imieniny','1.4 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(30,'Lato na Wołyniu','/media/book/png/lato-na-wolyniu.png','/media/book/html/lato-na-wolyniu.html',4026,NULL,0,'lato na wol~0yniu','3.9 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(31,'Melancholia','/media/book/png/melancholia.png','/media/book/html/melancholia.html',1995,NULL,0,'melancholia','1.9 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(32,'O matce','/media/book/png/o-matce.png','/media/book/html/o-matce.html',2899,NULL,0,'o matce','2.8 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(33,'Pamięci zniknionego','/media/book/png/pamieci-zniknionego.png','/media/book/html/pamieci-zniknionego.html',4406,NULL,0,'pamie~0ci zniknionego','4.3 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(34,'Pieśń','/media/book/png/piesn.png','/media/book/html/piesn.html',4083,NULL,0,'pies~0n~0','4.0 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(35,'Pod popiołem','/media/book/png/pod-popiolem.png','/media/book/html/pod-popiolem.html',3045,NULL,0,'pod popiol~0em','3.0 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(36,'Pontorson','/media/book/png/pontorson.png','/media/book/html/pontorson.html',3205,NULL,0,'pontorson','3.1 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(37,'Preludium','/media/book/png/preludium.png','/media/book/html/preludium.html',3077,NULL,0,'preludium','3.0 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(38,'Przeczucia','/media/book/png/przeczucia.png','/media/book/html/przeczucia.html',3706,NULL,0,'przeczucia','3.6 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(39,'Przez kresy','/media/book/png/przez-kresy.png','/media/book/html/przez-kresy.html',2449,NULL,0,'przez kresy','2.4 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(40,'Sam','/media/book/png/sam.png','/media/book/html/sam.html',3519,NULL,0,'sam','3.4 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(41,'Samobójstwo','/media/book/png/samobojstwo.png','/media/book/html/samobojstwo.html',5533,NULL,0,'samobo~0jstwo','5.4 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(42,'W pejzażu','/media/book/png/w-pejzazu.png','/media/book/html/w-pejzazu.html',2300,NULL,0,'w pejzaz~1u','2.2 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(43,'Więzienie','/media/book/png/wiezienie.png','/media/book/html/wiezienie.html',2992,NULL,0,'wie~0zienie','2.9 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(44,'Zdrada','/media/book/png/zdrada.png','/media/book/html/zdrada.html',3668,NULL,0,'zdrada','3.6 KiB','Józef Czechowicz',NULL);
+INSERT INTO "book" VALUES(45,'Lilje','/media/book/png/lilje.png','/media/book/html/lilje.html',29488,53,0,'lilje','28 KiB','Adam Mickiewicz',NULL);
+INSERT INTO "book" VALUES(46,'Pani Twardowska','/media/book/png/pani-twardowska.png','/media/book/html/pani-twardowska.html',15480,53,1,'pani twardowska','15 KiB','Adam Mickiewicz',NULL);
+INSERT INTO "book" VALUES(47,'Powrót taty','/media/book/png/powrot-taty.png','/media/book/html/powrot-taty.html',9550,53,2,'powro~0t taty','9.3 KiB','Adam Mickiewicz',NULL);
+INSERT INTO "book" VALUES(48,'Rękawiczka','/media/book/png/rekawiczka.png','/media/book/html/rekawiczka.html',6248,53,3,'re~0kawiczka','6.1 KiB','Adam Mickiewicz',NULL);
+INSERT INTO "book" VALUES(49,'Romantyczność','/media/book/png/romantycznosc.png','/media/book/html/romantycznosc.html',8266,53,4,'romantycznos~0c~0','8.1 KiB','Adam Mickiewicz',NULL);
+INSERT INTO "book" VALUES(50,'Rybka','/media/book/png/rybka.png','/media/book/html/rybka.html',14272,53,5,'rybka','13 KiB','Adam Mickiewicz',NULL);
+INSERT INTO "book" VALUES(51,'Świteź','/media/book/png/switez.png','/media/book/html/switez.html',21842,53,6,'s~0witez~0','21 KiB','Adam Mickiewicz',NULL);
+INSERT INTO "book" VALUES(52,'Świtezianka','/media/book/png/switezianka.png','/media/book/html/switezianka.html',16615,53,7,'s~0witezianka','16 KiB','Adam Mickiewicz',NULL);
+INSERT INTO "book" VALUES(53,'Ballady i romanse','/media/book/png/ballady-i-romanse.png',NULL,NULL,NULL,0,'ballady i romanse',NULL,'Adam Mickiewicz',NULL);
+INSERT INTO "book" VALUES(54,'Balladyna','/media/book/png/balladyna.png','/media/book/html/balladyna.html',572987,NULL,0,'balladyna','559 KiB','Juliusz Słowacki',NULL);
+INSERT INTO "book" VALUES(55,'Bank Nucingena','/media/book/png/bank-nucingena.png','/media/book/html/bank-nucingena.html',183503,NULL,0,'bank nucingena','179 KiB','Honoré de Balzac',NULL);
+INSERT INTO "book" VALUES(56,'Eugenia Grandet','/media/book/png/eugenia-grandet.png','/media/book/html/eugenia-grandet.html',564142,NULL,0,'eugenia grandet','550 KiB','Honoré de Balzac',NULL);
+INSERT INTO "book" VALUES(57,'Gobseck','/media/book/png/gobseck.png','/media/book/html/gobseck.html',179656,NULL,0,'gobseck','175 KiB','Honoré de Balzac',NULL);
+INSERT INTO "book" VALUES(58,'Jaszczur','/media/book/png/jaszczur.png','/media/book/html/jaszczur.html',716419,NULL,0,'jaszczur','699 KiB','Honoré de Balzac',NULL);
+INSERT INTO "book" VALUES(59,'Kobieta porzucona','/media/book/png/kobieta-porzucona.png','/media/book/html/kobieta-porzucona.html',131716,NULL,0,'kobieta porzucona','128 KiB','Honoré de Balzac',NULL);
+INSERT INTO "book" VALUES(60,'Kobieta trzydziestoletnia','/media/book/png/kobieta-trzydziestoletnia.png','/media/book/html/kobieta-trzydziestoletnia.html',503297,NULL,0,'kobieta trzydziestoletnia','491 KiB','Honoré de Balzac',NULL);
+INSERT INTO "book" VALUES(61,'Baran dany na ofiarę','/media/book/png/baran-dany-na-ofiare.png','/media/book/html/baran-dany-na-ofiare.html',1805,NULL,0,'baran dany na ofiare~0','1.8 KiB','Ignacy Krasicki',NULL);
+INSERT INTO "book" VALUES(62,'Baranki moje...','/media/book/png/baranki-moje.png','/media/book/html/baranki-moje.html',1543,NULL,0,'baranki moje ','1.5 KiB','Juliusz Słowacki',NULL);
+INSERT INTO "book" VALUES(63,'Bartek zwycięzca','/media/book/png/bartek-zwyciezca.png','/media/book/html/bartek-zwyciezca.html',175498,NULL,0,'bartek zwycie~0zca','171 KiB','Henryk Sienkiewicz',NULL);
+INSERT INTO "book" VALUES(64,'Syrena','/media/book/png/syrena.png','/media/book/html/syrena.html',72917,NULL,0,'syrena','71 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(65,'Zwierciadło','/media/book/png/zwierciadlo.png','/media/book/html/zwierciadlo.html',1798,NULL,0,'zwierciadl~0o','1.8 KiB','Charles Baudelaire',NULL);
+INSERT INTO "book" VALUES(66,'Beczka Amontillada','/media/book/png/beczka-amontillada.png','/media/book/html/beczka-amontillada.html',29058,NULL,0,'beczka amontillada','28 KiB','Edgar Allan Poe',NULL);
+INSERT INTO "book" VALUES(67,'Bema pamięci żałobny rapsod','/media/book/png/bema-pamieci-zalobny-rapsod.png','/media/book/html/bema-pamieci-zalobny-rapsod.html',5725,NULL,0,'bema pamie~0ci z~1al~0obny rapsod','5.6 KiB','Cyprian Kamil Norwid',NULL);
+INSERT INTO "book" VALUES(68,'Beniowski. Dalsze pieśni','/media/book/png/beniowski-dalsze-piesni.png','/media/book/html/beniowski-dalsze-piesni.html',674080,70,1,'beniowski dalsze pies~0ni','658 KiB','Juliusz Słowacki',NULL);
+INSERT INTO "book" VALUES(69,'Beniowski. Pięć pierwszych pieśni','/media/book/png/beniowski-piec-pierwszych-piesni.png','/media/book/html/beniowski-piec-pierwszych-piesni.html',559667,70,0,'beniowski pie~0c~0 pierwszych pies~0ni','546 KiB','Juliusz Słowacki',NULL);
+INSERT INTO "book" VALUES(70,'Beniowski','/media/book/png/beniowski.png',NULL,NULL,NULL,0,'beniowski',NULL,'Juliusz Słowacki',NULL);
+INSERT INTO "book" VALUES(71,'Berenice','/media/book/png/berenice.png','/media/book/html/berenice.html',37150,NULL,0,'berenice','36 KiB','Edgar Allan Poe',NULL);
+INSERT INTO "book" VALUES(72,'De profundis','/media/book/png/de-profundis.png','/media/book/html/de-profundis.html',4481,NULL,0,'de profundis','4.4 KiB','Jean-Marc Bernard',NULL);
+INSERT INTO "book" VALUES(73,'Bezbronna istota','/media/book/png/bezbronna-istota.png','/media/book/html/bezbronna-istota.html',16699,NULL,0,'bezbronna istota','16 KiB','Anton Czechow',NULL);
+INSERT INTO "book" VALUES(74,'Białośnieżka i Różanka','/media/book/png/bialosniezka-i-rozanka.png','/media/book/html/bialosniezka-i-rozanka.html',24791,NULL,0,'bial~0os~0niez~1ka i ro~0z~1anka','24 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(75,'Biedny młynarczyk i kotek','/media/book/png/biedny-mlynarczyk-i-kotek.png','/media/book/html/biedny-mlynarczyk-i-kotek.html',21512,NULL,0,'biedny ml~0ynarczyk i kotek','21 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(76,'Bo mię matka moja miła','/media/book/png/bo-mie-matka-moja-mila.png','/media/book/html/bo-mie-matka-moja-mila.html',971,NULL,0,'bo mie~0 matka moja mil~0a','971 B','Juliusz Słowacki',NULL);
+INSERT INTO "book" VALUES(77,'Bo to jest wieszcza najjaśniejsza chwała','/media/book/png/bo-to-jest-wieszcza-najjasniejsza-chwala.png','/media/book/html/bo-to-jest-wieszcza-najjasniejsza-chwala.html',1286,NULL,0,'bo to jest wieszcza najjas~0niejsza chwal~0a','1.3 KiB','Juliusz Słowacki',NULL);
+INSERT INTO "book" VALUES(78,'Bocian i jeleń','/media/book/png/bocian-i-jelen.png','/media/book/html/bocian-i-jelen.html',1212,NULL,0,'bocian i jelen~0','1.2 KiB','Ignacy Krasicki',NULL);
+INSERT INTO "book" VALUES(79,'Bogacz i żebrak','/media/book/png/bogacz-i-zebrak.png','/media/book/html/bogacz-i-zebrak.html',1706,NULL,0,'bogacz i z~1ebrak','1.7 KiB','Ignacy Krasicki',NULL);
+INSERT INTO "book" VALUES(80,'Bogurodzica','/media/book/png/bogurodzica.png','/media/book/html/bogurodzica.html',22166,NULL,0,'bogurodzica','21 KiB','Autor nieznany',NULL);
+INSERT INTO "book" VALUES(81,'Czyściec','/media/book/png/czysciec.png','/media/book/html/czysciec.html',690035,85,2,'czys~0ciec','673 KiB','Dante Alighieri',NULL);
+INSERT INTO "book" VALUES(82,'Piekło','/media/book/png/pieklo.png','/media/book/html/pieklo.html',672059,85,1,'piekl~0o','656 KiB','Dante Alighieri',NULL);
+INSERT INTO "book" VALUES(83,'Raj','/media/book/png/raj.png','/media/book/html/raj.html',710330,85,3,'raj','693 KiB','Dante Alighieri',NULL);
+INSERT INTO "book" VALUES(84,'Wstęp [Boska Komedia]','/media/book/png/wstep-boska-komedia.png','/media/book/html/wstep-boska-komedia.html',98308,85,0,'wste~0p boska komedia ','96 KiB','Julian Korsak',NULL);
+INSERT INTO "book" VALUES(85,'Boska Komedia','/media/book/png/boska-komedia.png',NULL,NULL,NULL,0,'boska komedia',NULL,'Dante Alighieri',NULL);
+INSERT INTO "book" VALUES(86,'Świętoszek','/media/book/png/swietoszek.png','/media/book/html/swietoszek.html',460923,NULL,0,'s~0wie~0toszek','450 KiB','Molière',NULL);
+INSERT INTO "book" VALUES(87,'Boże, coś Polskę..','/media/book/png/boze-cos-polske.png','/media/book/html/boze-cos-polske.html',17651,NULL,0,'boz~1e cos~0 polske~0 ','17 KiB','Alojzy Feliński',NULL);
+INSERT INTO "book" VALUES(88,'Bracia, patrzcie jeno...','/media/book/png/bracia-patrzcie-jeno.png','/media/book/html/bracia-patrzcie-jeno.html',5338,NULL,0,'bracia patrzcie jeno ','5.2 KiB','Autor nieznany',NULL);
+INSERT INTO "book" VALUES(89,'Brązownicy','/media/book/png/brazownicy.png','/media/book/html/brazownicy.html',574917,NULL,0,'bra~0zownicy','561 KiB','Tadeusz Boy-Żeleński',NULL);
+INSERT INTO "book" VALUES(90,'Bryła lodu i kryształ','/media/book/png/bryla-lodu-i-krysztal.png','/media/book/html/bryla-lodu-i-krysztal.html',1549,NULL,0,'bryl~0a lodu i krysztal~0','1.5 KiB','Ignacy Krasicki',NULL);
+INSERT INTO "book" VALUES(91,'Brytan w obroży','/media/book/png/brytan-w-obrozy.png','/media/book/html/brytan-w-obrozy.html',1426,NULL,0,'brytan w obroz~1y','1.4 KiB','Ignacy Krasicki',NULL);
+INSERT INTO "book" VALUES(92,'Brzydkie kaczątko','/media/book/png/brzydkie-kaczatko.png','/media/book/html/brzydkie-kaczatko.html',42711,NULL,0,'brzydkie kacza~0tko','41 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(93,'(Bursztyn, żyto dojrzałe...)','/media/book/png/bursztyn-zyto-dojrzale.png','/media/book/html/bursztyn-zyto-dojrzale.html',2632,NULL,0,' bursztyn z~1yto dojrzal~0e ','2.6 KiB','Charles Guérin',NULL);
+INSERT INTO "book" VALUES(94,'But w butonierce','/media/book/png/but-w-butonierce.png','/media/book/html/but-w-butonierce.html',2648,121,25,'but w butonierce','2.6 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(95,'Cafe','/media/book/png/cafe.png','/media/book/html/cafe.html',2656,121,5,'cafe','2.6 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(96,'[But w butonierce - Dedykacja]','/media/book/png/but-w-butonierce-dedykacja.png','/media/book/html/but-w-butonierce-dedykacja.html',669,121,0,' but w butonierce dedykacja ','669 B','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(97,'Deszcz','/media/book/png/deszcz.png','/media/book/html/deszcz.html',1818,121,10,'deszcz','1.8 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(98,'[Intermezzo (Czy widzieliście...)]','/media/book/png/intermezzo-czy-widzieliscie.png','/media/book/html/intermezzo-czy-widzieliscie.html',595,121,12,' intermezzo czy widzielis~0cie ','595 B','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(99,'[Intermezzo (Zielone są ręce moje...)]','/media/book/png/intermezzo-zielone-sa-rece-moje.png','/media/book/html/intermezzo-zielone-sa-rece-moje.html',913,121,20,' intermezzo zielone sa~0 re~0ce moje ','913 B','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(100,'Ipecacuara','/media/book/png/ipecacuara.png','/media/book/html/ipecacuara.html',4188,121,3,'ipecacuara','4.1 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(101,'[Jak introdukcja]','/media/book/png/jak-introdukcja.png','/media/book/html/jak-introdukcja.html',1179,121,1,' jak introdukcja ','1.2 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(102,'Lili nudzi się','/media/book/png/lili-nudzi-sie.png','/media/book/html/lili-nudzi-sie.html',6160,121,14,'lili nudzi sie~0','6.0 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(103,'Marsz','/media/book/png/marsz.png','/media/book/html/marsz.html',5431,121,23,'marsz','5.3 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(104,'Miasto','/media/book/png/miasto.png','/media/book/html/miasto.html',20405,121,19,'miasto','19 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(105,'Miłość na aucie','/media/book/png/milosc-na-aucie.png','/media/book/html/milosc-na-aucie.html',2027,121,7,'mil~0os~0c~0 na aucie','2.0 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(106,'Morga','/media/book/png/morga.png','/media/book/html/morga.html',4265,121,4,'morga','4.2 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(107,'[Na bis]','/media/book/png/na-bis.png','/media/book/html/na-bis.html',3671,121,26,' na bis ','3.6 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(108,'Nic','/media/book/png/nic.png','/media/book/html/nic.html',304,121,22,'nic','304 B','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(109,'Panienki w lesie','/media/book/png/panienki-w-lesie.png','/media/book/html/panienki-w-lesie.html',1565,121,6,'panienki w lesie','1.5 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(110,'Perche?','/media/book/png/perche.png','/media/book/html/perche.html',3694,121,8,'perche ','3.6 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(111,'Podróżniczki','/media/book/png/podrozniczki.png','/media/book/html/podrozniczki.html',2995,121,21,'podro~0z~1niczki','2.9 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(112,'Prozowierszem','/media/book/png/prozowierszem.png','/media/book/html/prozowierszem.html',3628,121,16,'prozowierszem','3.5 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(113,'Przejechali','/media/book/png/przejechali.png','/media/book/html/przejechali.html',1627,121,13,'przejechali','1.6 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(114,'Śmierć Pana Premiera','/media/book/png/smierc-pana-premiera.png','/media/book/html/smierc-pana-premiera.html',11872,121,9,'s~0mierc~0 pana premiera','11 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(115,'Śnieg','/media/book/png/snieg.png','/media/book/html/snieg.html',2561,121,17,'s~0nieg','2.5 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(116,'Spacer','/media/book/png/spacer.png','/media/book/html/spacer.html',1335,121,18,'spacer','1.3 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(117,'Tango jesienne','/media/book/png/tango-jesienne.png','/media/book/html/tango-jesienne.html',2221,121,24,'tango jesienne','2.2 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(118,'Trupy z kawiorem','/media/book/png/trupy-z-kawiorem.png','/media/book/html/trupy-z-kawiorem.html',5845,121,11,'trupy z kawiorem','5.7 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(119,'Wiosna','/media/book/png/wiosna.png','/media/book/html/wiosna.html',1335,121,15,'wiosna','1.3 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(120,'Żygające posągi','/media/book/png/zygajace-posagi.png','/media/book/html/zygajace-posagi.html',6812,121,2,'z~1ygaja~0ce posa~0gi','6.7 KiB','Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(121,'But w butonierce (tomik)','/media/book/png/but-w-butonierce-tomik.png',NULL,NULL,NULL,0,'but w butonierce tomik ',NULL,'Bruno Jasieński',NULL);
+INSERT INTO "book" VALUES(122,'Byłbym cię oddał...','/media/book/png/bylbym-cie-oddal.png','/media/book/html/bylbym-cie-oddal.html',1974,NULL,0,'byl~0bym cie~0 oddal~0 ','1.9 KiB','Kazimierz Przerwa-Tetmajer',NULL);
+INSERT INTO "book" VALUES(123,'Bywaj dziewczę zdrowe...','/media/book/png/bywaj-dziewcze-zdrowe.png','/media/book/html/bywaj-dziewcze-zdrowe.html',3045,NULL,0,'bywaj dziewcze~0 zdrowe ','3.0 KiB','Autor nieznany',NULL);
+INSERT INTO "book" VALUES(124,'Calineczka','/media/book/png/calineczka.png','/media/book/html/calineczka.html',39028,NULL,0,'calineczka','38 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(125,'Cesarz chiński i syn jego','/media/book/png/cesarz-chinski-i-syn-jego.png','/media/book/html/cesarz-chinski-i-syn-jego.html',2628,NULL,0,'cesarz chin~0ski i syn jego','2.6 KiB','Ignacy Krasicki',NULL);
+INSERT INTO "book" VALUES(126,'Chart i kotka','/media/book/png/chart-i-kotka.png','/media/book/html/chart-i-kotka.html',870,NULL,0,'chart i kotka','870 B','Ignacy Krasicki',NULL);
+INSERT INTO "book" VALUES(127,'Chata w lesie','/media/book/png/chata-w-lesie.png','/media/book/html/chata-w-lesie.html',22693,NULL,0,'chata w lesie','22 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(128,'Chleb i szabla','/media/book/png/chleb-i-szabla.png','/media/book/html/chleb-i-szabla.html',1419,NULL,0,'chleb i szabla','1.4 KiB','Ignacy Krasicki',NULL);
+INSERT INTO "book" VALUES(129,'Część pierwsza - Jesień','/media/book/png/czesc-pierwsza-jesien.png','/media/book/html/czesc-pierwsza-jesien.html',872778,NULL,0,'cze~0s~0c~0 pierwsza jesien~0','852 KiB','Władysław Stanisław Reymont',NULL);
+INSERT INTO "book" VALUES(130,'Choinka','/media/book/png/choinka.png','/media/book/html/choinka.html',33876,NULL,0,'choinka','33 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(131,'Cień','/media/book/png/cien.png','/media/book/html/cien.html',42016,NULL,0,'cien~0','41 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(132,'Cierpienia młodego Wertera','/media/book/png/cierpienia-mlodego-wertera.png','/media/book/html/cierpienia-mlodego-wertera.html',425658,NULL,0,'cierpienia ml~0odego wertera','415 KiB','Johann Wolfgang von Goethe',NULL);
+INSERT INTO "book" VALUES(133,'Coś','/media/book/png/cos.png','/media/book/html/cos.html',23942,NULL,0,'cos~0','23 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(134,'Cudzoziemiec','/media/book/png/cudzoziemiec.png','/media/book/html/cudzoziemiec.html',3059,NULL,0,'cudzoziemiec','3.0 KiB','Charles Baudelaire',NULL);
+INSERT INTO "book" VALUES(135,'Czerwone buciki','/media/book/png/czerwone-buciki.png','/media/book/html/czerwone-buciki.html',20884,NULL,0,'czerwone buciki','20 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(136,'Do Matki (W ciemnościach postać mi stoi matczyna...)','/media/book/png/do-matki-w-ciemnosciach-postac-mi-stoi-matczyna.png','/media/book/html/do-matki-w-ciemnosciach-postac-mi-stoi-matczyna.html',763,NULL,0,'do matki w ciemnos~0ciach postac~0 mi stoi matczyna ','763 B','Juliusz Słowacki',NULL);
+INSERT INTO "book" VALUES(137,'Do matki (Zadrży ci nieraz serce, miła matko moja...)','/media/book/png/do-matki-zadrzy-ci-nieraz-serce-mila-matko-moja.png','/media/book/html/do-matki-zadrzy-ci-nieraz-serce-mila-matko-moja.html',2211,NULL,0,'do matki zadrz~1y ci nieraz serce mil~0a matko moja ','2.2 KiB','Juliusz Słowacki',NULL);
+INSERT INTO "book" VALUES(138,'Duch we flaszce','/media/book/png/duch-we-flaszce.png','/media/book/html/duch-we-flaszce.html',21959,NULL,0,'duch we flaszce','21 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(139,'Dym','/media/book/png/dym.png','/media/book/html/dym.html',34800,NULL,0,'dym','33 KiB','Maria Konopnicka',NULL);
+INSERT INTO "book" VALUES(140,'Dzieje Tristana i Izoldy','/media/book/png/dzieje-tristana-i-izoldy.png','/media/book/html/dzieje-tristana-i-izoldy.html',450949,NULL,0,'dzieje tristana i izoldy','440 KiB','Autor nieznany',NULL);
+INSERT INTO "book" VALUES(141,'Dziewczynka i lalka','/media/book/png/dziewczynka-i-lalka.png','/media/book/html/dziewczynka-i-lalka.html',15314,NULL,0,'dziewczynka i lalka','14 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(142,'Dziewczynka z zapałkami','/media/book/png/dziewczynka-z-zapalkami.png','/media/book/html/dziewczynka-z-zapalkami.html',8378,NULL,0,'dziewczynka z zapal~0kami','8.2 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(143,'Dzwony','/media/book/png/dzwony.png','/media/book/html/dzwony.html',19144,NULL,0,'dzwony','18 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(144,'Flirt z Melpomeną','/media/book/png/flirt-z-melpomena.png','/media/book/html/flirt-z-melpomena.html',847717,NULL,0,'flirt z melpomena~0','827 KiB','Tadeusz Boy-Żeleński',NULL);
+INSERT INTO "book" VALUES(145,'Gaj święcony','/media/book/png/gaj-swiecony.png','/media/book/html/gaj-swiecony.html',2163,NULL,0,'gaj s~0wie~0cony','2.1 KiB','Louis le Cardonnel',NULL);
+INSERT INTO "book" VALUES(146,'Gargantua i Pantagruel','/media/book/png/gargantua-i-pantagruel.png','/media/book/html/gargantua-i-pantagruel.html',968440,NULL,0,'gargantua i pantagruel','945 KiB','François Rabelais',NULL);
+INSERT INTO "book" VALUES(147,'Golem','/media/book/png/golem.png','/media/book/html/golem.html',912326,NULL,0,'golem','890 KiB','Gustav Meyrink',NULL);
+INSERT INTO "book" VALUES(148,'Grób Agamemnona','/media/book/png/grob-agamemnona.png','/media/book/html/grob-agamemnona.html',29539,NULL,0,'gro~0b agamemnona','28 KiB','Juliusz Słowacki',NULL);
+INSERT INTO "book" VALUES(149,'Wpatruj się co wieczora...','/media/book/png/wpatruj-sie-co-wieczora.png','/media/book/html/wpatruj-sie-co-wieczora.html',5835,NULL,0,'wpatruj sie~0 co wieczora ','5.7 KiB','Charles Guérin',NULL);
+INSERT INTO "book" VALUES(150,'[Gusła - Dedykacja]','/media/book/png/gusla-dedykacja.png','/media/book/html/gusla-dedykacja.html',380,NULL,0,' gusl~0a dedykacja ','380 B','Jerzy Liebert',NULL);
+INSERT INTO "book" VALUES(151,'Historia roku','/media/book/png/historia-roku.png','/media/book/html/historia-roku.html',31005,NULL,0,'historia roku','30 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(152,'Hymn (Bogarodzico, Dziewico!)','/media/book/png/hymn-bogarodzico-dziewico.png','/media/book/html/hymn-bogarodzico-dziewico.html',8220,NULL,0,'hymn bogarodzico dziewico ','8.0 KiB','Juliusz Słowacki',NULL);
+INSERT INTO "book" VALUES(153,'Jak skończyć z piekłem kobiet?','/media/book/png/jak-skonczyc-z-pieklem-kobiet.png','/media/book/html/jak-skonczyc-z-pieklem-kobiet.html',87009,NULL,0,'jak skon~0czyc~0 z piekl~0em kobiet ','84 KiB','Tadeusz Boy-Żeleński',NULL);
+INSERT INTO "book" VALUES(154,'Śnieg spadnie...','/media/book/png/snieg-spadnie.png','/media/book/html/snieg-spadnie.html',3636,NULL,0,'s~0nieg spadnie ','3.6 KiB','Francis Jammes',NULL);
+INSERT INTO "book" VALUES(155,'Jednooczka, Dwuoczka, Trzyoczka','/media/book/png/jednooczka-dwuoczka-trzyoczka.png','/media/book/html/jednooczka-dwuoczka-trzyoczka.html',25395,NULL,0,'jednooczka dwuoczka trzyoczka','24 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(156,'Juliusz Cezar','/media/book/png/juliusz-cezar.png','/media/book/html/juliusz-cezar.html',391829,NULL,0,'juliusz cezar','382 KiB','William Shakespeare',NULL);
+INSERT INTO "book" VALUES(157,'Już!','/media/book/png/juz.png','/media/book/html/juz.html',4386,NULL,0,'juz~1 ','4.3 KiB','Charles Baudelaire',NULL);
+INSERT INTO "book" VALUES(158,'Śpiewaj wolno...','/media/book/png/spiewaj-wolno.png','/media/book/html/spiewaj-wolno.html',4761,NULL,0,'s~0piewaj wolno ','4.6 KiB','Gustave Kahn',NULL);
+INSERT INTO "book" VALUES(159,'Czarny kozioł','/media/book/png/czarny-koziol.png','/media/book/html/czarny-koziol.html',55259,164,0,'czarny koziol~0','53 KiB','Bolesław Leśmian',NULL);
+INSERT INTO "book" VALUES(160,'Jan Tajemnik','/media/book/png/jan-tajemnik.png','/media/book/html/jan-tajemnik.html',97914,164,1,'jan tajemnik','95 KiB','Bolesław Leśmian',NULL);
+INSERT INTO "book" VALUES(161,'Majka','/media/book/png/majka.png','/media/book/html/majka.html',174034,164,2,'majka','169 KiB','Bolesław Leśmian',NULL);
+INSERT INTO "book" VALUES(162,'Podlasiak','/media/book/png/podlasiak.png','/media/book/html/podlasiak.html',159449,164,3,'podlasiak','155 KiB','Bolesław Leśmian',NULL);
+INSERT INTO "book" VALUES(163,'Wiedźma','/media/book/png/wiedzma.png','/media/book/html/wiedzma.html',173677,164,4,'wiedz~0ma','169 KiB','Bolesław Leśmian',NULL);
+INSERT INTO "book" VALUES(164,'Klechdy polskie','/media/book/png/klechdy-polskie.png',NULL,NULL,NULL,0,'klechdy polskie',NULL,'Bolesław Leśmian',NULL);
+INSERT INTO "book" VALUES(165,'Kopciuszek','/media/book/png/kopciuszek.png','/media/book/html/kopciuszek.html',24683,NULL,0,'kopciuszek','24 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(166,'Krasnoludek','/media/book/png/krasnoludek.png','/media/book/html/krasnoludek.html',15052,NULL,0,'krasnoludek','14 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(167,'Krasnoludki','/media/book/png/krasnoludki.png','/media/book/html/krasnoludki.html',4478,NULL,0,'krasnoludki','4.4 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(168,'Król Drozdobrody','/media/book/png/krol-drozdobrody.png','/media/book/html/krol-drozdobrody.html',20809,NULL,0,'kro~0l drozdobrody','20 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(169,'Król żab','/media/book/png/krol-zab.png','/media/book/html/krol-zab.html',16991,NULL,0,'kro~0l z~1ab','16 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(170,'Król Zamczyska','/media/book/png/krol-zamczyska.png','/media/book/html/krol-zamczyska.html',337164,NULL,0,'kro~0l zamczyska','329 KiB','Seweryn Goszczyński',NULL);
+INSERT INTO "book" VALUES(171,'Królowa śniegu','/media/book/png/krolowa-sniegu.png','/media/book/html/krolowa-sniegu.html',104379,NULL,0,'kro~0lowa s~0niegu','101 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(172,'Kubuś fatalista i jego pan','/media/book/png/kubus-fatalista-i-jego-pan.png','/media/book/html/kubus-fatalista-i-jego-pan.html',868561,NULL,0,'kubus~0 fatalista i jego pan','848 KiB','Denis Diderot',NULL);
+INSERT INTO "book" VALUES(173,'Kwiaty Idalki','/media/book/png/kwiaty-idalki.png','/media/book/html/kwiaty-idalki.html',25480,NULL,0,'kwiaty idalki','24 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(174,'Cały świat byś ściągnęła...','/media/book/png/caly-swiat-bys-sciagnela.png','/media/book/html/caly-swiat-bys-sciagnela.html',3082,NULL,0,'cal~0y s~0wiat bys~0 s~0cia~0gne~0l~0a ','3.0 KiB','Charles Baudelaire',NULL);
+INSERT INTO "book" VALUES(175,'Larwa','/media/book/png/larwa.png','/media/book/html/larwa.html',3324,NULL,0,'larwa','3.2 KiB','Cyprian Kamil Norwid',NULL);
+INSERT INTO "book" VALUES(176,'Legenda Młodej Polski','/media/book/png/legenda-mlodej-polski.png','/media/book/html/legenda-mlodej-polski.html',1412744,NULL,0,'legenda ml~0odej polski','1.3 MiB','Stanisław Brzozowski',NULL);
+INSERT INTO "book" VALUES(177,'Wstęp [Legendy warszawskie]','/media/book/png/wstep-legendy-warszawskie.png','/media/book/html/wstep-legendy-warszawskie.html',5256,NULL,0,'wste~0p legendy warszawskie ','5.1 KiB','Artur Oppman',NULL);
+INSERT INTO "book" VALUES(178,'Len','/media/book/png/len.png','/media/book/html/len.html',19045,NULL,0,'len','18 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(179,'Listek z nieba','/media/book/png/listek-z-nieba.png','/media/book/html/listek-z-nieba.html',10951,NULL,0,'listek z nieba','10 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(180,'Listy perskie','/media/book/png/listy-perskie.png','/media/book/html/listy-perskie.html',749232,NULL,0,'listy perskie','731 KiB','Montesquieu',NULL);
+INSERT INTO "book" VALUES(181,'Mali czarodzieje','/media/book/png/mali-czarodzieje.png','/media/book/html/mali-czarodzieje.html',7873,NULL,0,'mali czarodzieje','7.7 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(182,'Matka','/media/book/png/matka.png','/media/book/html/matka.html',18741,NULL,0,'matka','18 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(183,'Mendel gdański','/media/book/png/mendel-gdanski.png','/media/book/html/mendel-gdanski.html',80805,NULL,0,'mendel gdan~0ski','78 KiB','Maria Konopnicka',NULL);
+INSERT INTO "book" VALUES(184,'Mieszczanin szlachcicem','/media/book/png/mieszczanin-szlachcicem.png','/media/book/html/mieszczanin-szlachcicem.html',367578,NULL,0,'mieszczanin szlachcicem','358 KiB','Molière',NULL);
+INSERT INTO "book" VALUES(185,'Mizantrop','/media/book/png/mizantrop.png','/media/book/html/mizantrop.html',407252,NULL,0,'mizantrop','397 KiB','Molière',NULL);
+INSERT INTO "book" VALUES(186,'Mizerna, cicha...','/media/book/png/mizerna-cicha.png','/media/book/html/mizerna-cicha.html',8862,NULL,0,'mizerna cicha ','8.7 KiB','Teofil Lenartowicz',NULL);
+INSERT INTO "book" VALUES(187,'Motylek','/media/book/png/motylek.png','/media/book/html/motylek.html',9190,NULL,0,'motylek','9.0 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(188,'Mysi-królik i niedźwiedź','/media/book/png/mysi-krolik-i-niedzwiedz.png','/media/book/html/mysi-krolik-i-niedzwiedz.html',12011,NULL,0,'mysi kro~0lik i niedz~0wiedz~0','11 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(189,'Myśli','/media/book/png/mysli.png','/media/book/html/mysli.html',1314990,NULL,0,'mys~0li','1.3 MiB','Pascal',NULL);
+INSERT INTO "book" VALUES(190,'(Bóg mnie opuścił...)','/media/book/png/bog-mnie-opuscil.png','/media/book/html/bog-mnie-opuscil.html',2171,NULL,0,' bo~0g mnie opus~0cil~0 ','2.1 KiB','Bolesław Leśmian',NULL);
+INSERT INTO "book" VALUES(191,'(Coś tam mignęło dalekiego...)','/media/book/png/cos-tam-mignelo-dalekiego.png','/media/book/html/cos-tam-mignelo-dalekiego.html',1575,NULL,0,' cos~0 tam migne~0l~0o dalekiego ','1.5 KiB','Bolesław Leśmian',NULL);
+INSERT INTO "book" VALUES(192,'(Gdy domdlewasz na łożu...)','/media/book/png/gdy-domdlewasz-na-lozu.png','/media/book/html/gdy-domdlewasz-na-lozu.html',1612,NULL,0,' gdy domdlewasz na l~0oz~1u ','1.6 KiB','Bolesław Leśmian',NULL);
+INSERT INTO "book" VALUES(193,'(Już czas ukochać w sadzie...)','/media/book/png/juz-czas-ukochac-w-sadzie.png','/media/book/html/juz-czas-ukochac-w-sadzie.html',2509,NULL,0,' juz~1 czas ukochac~0 w sadzie ','2.5 KiB','Bolesław Leśmian',NULL);
+INSERT INTO "book" VALUES(194,'(Módlmy się śród drzew...)','/media/book/png/modlmy-sie-srod-drzew.png','/media/book/html/modlmy-sie-srod-drzew.html',1187,NULL,0,' mo~0dlmy sie~0 s~0ro~0d drzew ','1.2 KiB','Bolesław Leśmian',NULL);
+INSERT INTO "book" VALUES(195,'(Płomienny uśmiech nietrwałych zórz...)','/media/book/png/plomienny-usmiech-nietrwalych-zorz.png','/media/book/html/plomienny-usmiech-nietrwalych-zorz.html',1171,NULL,0,' pl~0omienny us~0miech nietrwal~0ych zo~0rz ','1.1 KiB','Bolesław Leśmian',NULL);
+INSERT INTO "book" VALUES(196,'(Po co tyle świec nade mną...)','/media/book/png/po-co-tyle-swiec-nade-mna.png','/media/book/html/po-co-tyle-swiec-nade-mna.html',2217,NULL,0,' po co tyle s~0wiec nade mna~0 ','2.2 KiB','Bolesław Leśmian',NULL);
+INSERT INTO "book" VALUES(197,'(Tam na rzece...)','/media/book/png/tam-na-rzece.png','/media/book/html/tam-na-rzece.html',2557,NULL,0,' tam na rzece ','2.5 KiB','Bolesław Leśmian',NULL);
+INSERT INTO "book" VALUES(198,'(Uwiędły sad...)','/media/book/png/uwiedly-sad.png','/media/book/html/uwiedly-sad.html',1199,NULL,0,' uwie~0dl~0y sad ','1.2 KiB','Bolesław Leśmian',NULL);
+INSERT INTO "book" VALUES(199,'(Zwoływali się surmą na wrzawę-zabawę...)','/media/book/png/zwolywali-sie-surma-na-wrzawe-zabawe.png','/media/book/html/zwolywali-sie-surma-na-wrzawe-zabawe.html',2144,NULL,0,' zwol~0ywali sie~0 surma~0 na wrzawe~0 zabawe~0 ','2.1 KiB','Bolesław Leśmian',NULL);
+INSERT INTO "book" VALUES(200,'Nasi okupanci','/media/book/png/nasi-okupanci.png','/media/book/html/nasi-okupanci.html',283890,NULL,0,'nasi okupanci','277 KiB','Tadeusz Boy-Żeleński',NULL);
+INSERT INTO "book" VALUES(201,'Nasza szkapa','/media/book/png/nasza-szkapa.png','/media/book/html/nasza-szkapa.html',128168,NULL,0,'nasza szkapa','125 KiB','Maria Konopnicka',NULL);
+INSERT INTO "book" VALUES(202,'Nie-Boska komedia','/media/book/png/nie-boska-komedia.png','/media/book/html/nie-boska-komedia.html',450700,NULL,0,'nie boska komedia','440 KiB','Zygmunt Krasiński',NULL);
+INSERT INTO "book" VALUES(203,'(Nim próg przestąpiłem celi...)','/media/book/png/nim-prog-przestapilem-celi.png','/media/book/html/nim-prog-przestapilem-celi.html',1685,NULL,0,' nim pro~0g przesta~0pil~0em celi ','1.6 KiB','Guillaume Apollinaire',NULL);
+INSERT INTO "book" VALUES(204,'Noc tysiączna druga','/media/book/png/noc-tysiaczna-druga.png','/media/book/html/noc-tysiaczna-druga.html',86785,NULL,0,'noc tysia~0czna druga','84 KiB','Cyprian Kamil Norwid',NULL);
+INSERT INTO "book" VALUES(205,'O duchu praw','/media/book/png/o-duchu-praw.png','/media/book/html/o-duchu-praw.html',1979242,NULL,0,'o duchu praw','1.9 MiB','Montesquieu',NULL);
+INSERT INTO "book" VALUES(206,'(O, jak się trapię...)','/media/book/png/o-jak-sie-trapie.png','/media/book/html/o-jak-sie-trapie.html',1987,NULL,0,' o jak sie~0 trapie~0 ','1.9 KiB','Guillaume Apollinaire',NULL);
+INSERT INTO "book" VALUES(207,'O pierwszej nad ranem','/media/book/png/o-pierwszej-nad-ranem.png','/media/book/html/o-pierwszej-nad-ranem.html',4217,NULL,0,'o pierwszej nad ranem','4.1 KiB','Charles Baudelaire',NULL);
+INSERT INTO "book" VALUES(208,'Ojciec Goriot','/media/book/png/ojciec-goriot.png','/media/book/html/ojciec-goriot.html',798552,NULL,0,'ojciec goriot','779 KiB','Honoré de Balzac',NULL);
+INSERT INTO "book" VALUES(209,'Okna','/media/book/png/okna.png','/media/book/html/okna.html',2214,NULL,0,'okna','2.2 KiB','Charles Baudelaire',NULL);
+INSERT INTO "book" VALUES(210,'Pan Grubas','/media/book/png/pan-grubas.png','/media/book/html/pan-grubas.html',6014,NULL,0,'pan grubas','5.9 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(211,'Pastuszek','/media/book/png/pastuszek.png','/media/book/html/pastuszek.html',5579,NULL,0,'pastuszek','5.4 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(212,'Pastuszka gęsi','/media/book/png/pastuszka-gesi.png','/media/book/html/pastuszka-gesi.html',13975,NULL,0,'pastuszka ge~0si','13 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(213,'Pies i flakon','/media/book/png/pies-i-flakon.png','/media/book/html/pies-i-flakon.html',1747,NULL,0,'pies i flakon','1.7 KiB','Charles Baudelaire',NULL);
+INSERT INTO "book" VALUES(214,'Pies i wróbel','/media/book/png/pies-i-wrobel.png','/media/book/html/pies-i-wrobel.html',17317,NULL,0,'pies i wro~0bel','16 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(215,'Pod starą wierzbą','/media/book/png/pod-stara-wierzba.png','/media/book/html/pod-stara-wierzba.html',41936,NULL,0,'pod stara~0 wierzba~0','40 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(216,'Półkula w lokach','/media/book/png/polkula-w-lokach.png','/media/book/html/polkula-w-lokach.html',3805,NULL,0,'po~0l~0kula w lokach','3.7 KiB','Charles Baudelaire',NULL);
+INSERT INTO "book" VALUES(217,'Polny kwiatek','/media/book/png/polny-kwiatek.png','/media/book/html/polny-kwiatek.html',13649,NULL,0,'polny kwiatek','13 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(218,'Poskromienie złośnicy','/media/book/png/poskromienie-zlosnicy.png','/media/book/html/poskromienie-zlosnicy.html',404707,NULL,0,'poskromienie zl~0os~0nicy','395 KiB','William Shakespeare',NULL);
+INSERT INTO "book" VALUES(219,'Don Juan','/media/book/png/don-juan.png','/media/book/html/don-juan.html',41897,228,1,'don juan','40 KiB','E. T. A. Hoffmann',NULL);
+INSERT INTO "book" VALUES(220,'Kawaler Gluck','/media/book/png/kawaler-gluck.png','/media/book/html/kawaler-gluck.html',49341,228,2,'kawaler gluck','48 KiB','E. T. A. Hoffmann',NULL);
+INSERT INTO "book" VALUES(221,'Majorat','/media/book/png/majorat.png','/media/book/html/majorat.html',256184,228,3,'majorat','250 KiB','E. T. A. Hoffmann',NULL);
+INSERT INTO "book" VALUES(222,'Narożne okno','/media/book/png/narozne-okno.png','/media/book/html/narozne-okno.html',97962,228,4,'naroz~1ne okno','95 KiB','E. T. A. Hoffmann',NULL);
+INSERT INTO "book" VALUES(223,'Piaskun','/media/book/png/piaskun.png','/media/book/html/piaskun.html',114486,228,5,'piaskun','111 KiB','E. T. A. Hoffmann',NULL);
+INSERT INTO "book" VALUES(224,'[Powieści fantastyczne] Przedmowa','/media/book/png/powiesci-fantastyczne-przedmowa.png','/media/book/html/powiesci-fantastyczne-przedmowa.html',23687,228,0,' powies~0ci fantastyczne przedmowa','23 KiB','Antoni Lange',NULL);
+INSERT INTO "book" VALUES(225,'Skrzypce z Cremony (Radca Crespel)','/media/book/png/skrzypce-z-cremony-radca-crespel.png','/media/book/html/skrzypce-z-cremony-radca-crespel.html',68788,228,6,'skrzypce z cremony radca crespel ','67 KiB','E. T. A. Hoffmann',NULL);
+INSERT INTO "book" VALUES(226,'Ślub','/media/book/png/slub.png','/media/book/html/slub.html',87517,228,7,'s~0lub','85 KiB','E. T. A. Hoffmann',NULL);
+INSERT INTO "book" VALUES(227,'Wybór narzeczonej','/media/book/png/wybor-narzeczonej.png','/media/book/html/wybor-narzeczonej.html',186572,228,8,'wybo~0r narzeczonej','182 KiB','E. T. A. Hoffmann',NULL);
+INSERT INTO "book" VALUES(228,'Powieści fantastyczne','/media/book/png/powiesci-fantastyczne.png',NULL,NULL,NULL,0,'powies~0ci fantastyczne',NULL,'E. T. A. Hoffmann',NULL);
+INSERT INTO "book" VALUES(229,'Przedwiośnie','/media/book/png/przedwiosnie.png','/media/book/html/przedwiosnie.html',1019386,NULL,0,'przedwios~0nie','995 KiB','Stefan Żeromski',NULL);
+INSERT INTO "book" VALUES(230,'Przygody Sindbada żeglarza','/media/book/png/przygody-sindbada-zeglarza.png','/media/book/html/przygody-sindbada-zeglarza.html',685135,NULL,0,'przygody sindbada z~1eglarza','669 KiB','Bolesław Leśmian',NULL);
+INSERT INTO "book" VALUES(231,'Chłopi, Część druga - Zima','/media/book/png/chlopi-czesc-druga-zima.png','/media/book/html/chlopi-czesc-druga-zima.html',947423,NULL,0,'chl~0opi cze~0s~0c~0 druga zima','925 KiB','Władysław Stanisław Reymont',NULL);
+INSERT INTO "book" VALUES(232,'Robinson Crusoe','/media/book/png/robinson-crusoe.png','/media/book/html/robinson-crusoe.html',399462,NULL,0,'robinson crusoe','390 KiB','Daniel Defoe',NULL);
+INSERT INTO "book" VALUES(233,'Ropucha','/media/book/png/ropucha.png','/media/book/html/ropucha.html',27852,NULL,0,'ropucha','27 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(234,'Rota','/media/book/png/rota.png','/media/book/html/rota.html',4273,NULL,0,'rota','4.2 KiB','Maria Konopnicka',NULL);
+INSERT INTO "book" VALUES(235,'Rupiec Kopeć','/media/book/png/rupiec-kopec.png','/media/book/html/rupiec-kopec.html',15840,NULL,0,'rupiec kopec~0','15 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(236,'Siedmiośpiochy','/media/book/png/siedmiospiochy.png','/media/book/html/siedmiospiochy.html',2871,NULL,0,'siedmios~0piochy','2.8 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(237,'Skąpiec','/media/book/png/skapiec.png','/media/book/html/skapiec.html',317925,NULL,0,'ska~0piec','310 KiB','Molière',NULL);
+INSERT INTO "book" VALUES(238,'Ślimak i róża','/media/book/png/slimak-i-roza.png','/media/book/html/slimak-i-roza.html',7873,NULL,0,'s~0limak i ro~0z~1a','7.7 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(239,'Słodka potrawa','/media/book/png/slodka-potrawa.png','/media/book/html/slodka-potrawa.html',2666,NULL,0,'sl~0odka potrawa','2.6 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(240,'Słowik','/media/book/png/slowik.png','/media/book/html/slowik.html',36449,NULL,0,'sl~0owik','35 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(241,'Śmierć kurki','/media/book/png/smierc-kurki.png','/media/book/html/smierc-kurki.html',9874,NULL,0,'s~0mierc~0 kurki','9.6 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(242,'Czatyrdah','/media/book/png/czatyrdah.png','/media/book/html/czatyrdah.html',3741,NULL,0,'czatyrdah','3.7 KiB','Adam Mickiewicz',NULL);
+INSERT INTO "book" VALUES(243,'Góra Kikineis','/media/book/png/gora-kikineis.png','/media/book/html/gora-kikineis.html',3659,NULL,0,'go~0ra kikineis','3.6 KiB','Adam Mickiewicz',NULL);
+INSERT INTO "book" VALUES(244,'Śpiewak spod strzechy','/media/book/png/spiewak-spod-strzechy.png','/media/book/html/spiewak-spod-strzechy.html',9255,NULL,0,'s~0piewak spod strzechy','9.0 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(245,'Spowiedź dziecięcia wieku','/media/book/png/spowiedz-dzieciecia-wieku.png','/media/book/html/spowiedz-dzieciecia-wieku.html',749815,NULL,0,'spowiedz~0 dziecie~0cia wieku','732 KiB','Alfred de Musset',NULL);
+INSERT INTO "book" VALUES(246,'Stara baśń, tom drugi','/media/book/png/stara-basn-tom-drugi.png','/media/book/html/stara-basn-tom-drugi.html',491183,249,1,'stara bas~0n~0 tom drugi','479 KiB','Józef Ignacy Kraszewski',NULL);
+INSERT INTO "book" VALUES(247,'Stara baśń, tom pierwszy','/media/book/png/stara-basn-tom-pierwszy.png','/media/book/html/stara-basn-tom-pierwszy.html',532754,249,0,'stara bas~0n~0 tom pierwszy','520 KiB','Józef Ignacy Kraszewski',NULL);
+INSERT INTO "book" VALUES(248,'Stara baśń, tom trzeci','/media/book/png/stara-basn-tom-trzeci.png','/media/book/html/stara-basn-tom-trzeci.html',458629,249,2,'stara bas~0n~0 tom trzeci','447 KiB','Józef Ignacy Kraszewski',NULL);
+INSERT INTO "book" VALUES(249,'Stara baśń','/media/book/png/stara-basn.png',NULL,NULL,NULL,0,'stara bas~0n~0',NULL,'Józef Ignacy Kraszewski',NULL);
+INSERT INTO "book" VALUES(250,'Czerwone i czarne','/media/book/png/czerwone-i-czarne.png','/media/book/html/czerwone-i-czarne.html',1493573,NULL,0,'czerwone i czarne','1.4 MiB','Stendhal',NULL);
+INSERT INTO "book" VALUES(251,'Świętoszek','/media/book/png/swietoszek_1.png','/media/book/html/swietoszek_1.html',304674,NULL,0,'s~0wie~0toszek','297 KiB','Molière',NULL);
+INSERT INTO "book" VALUES(252,'Syzyfowe prace','/media/book/png/syzyfowe-prace.png','/media/book/html/syzyfowe-prace.html',762188,NULL,0,'syzyfowe prace','744 KiB','Stefan Żeromski',NULL);
+INSERT INTO "book" VALUES(253,'Tako rzecze Zaratustra','/media/book/png/tako-rzecze-zaratustra.png','/media/book/html/tako-rzecze-zaratustra.html',1220342,NULL,0,'tako rzecze zaratustra','1.2 MiB','Friedrich Nietzsche',NULL);
+INSERT INTO "book" VALUES(254,'Towarzysz podróży','/media/book/png/towarzysz-podrozy.png','/media/book/html/towarzysz-podrozy.html',58601,NULL,0,'towarzysz podro~0z~1y','57 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(255,'Trzej bracia','/media/book/png/trzej-bracia.png','/media/book/html/trzej-bracia.html',9350,NULL,0,'trzej bracia','9.1 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(256,'Trzy pióra','/media/book/png/trzy-piora.png','/media/book/html/trzy-piora.html',15697,NULL,0,'trzy pio~0ra','15 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(257,'U króla Olch','/media/book/png/u-krola-olch.png','/media/book/html/u-krola-olch.html',24311,NULL,0,'u kro~0la olch','23 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(258,'Ubogi bogaty','/media/book/png/ubogi-bogaty.png','/media/book/html/ubogi-bogaty.html',22131,NULL,0,'ubogi bogaty','21 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(259,'Ubu Król czyli Polacy','/media/book/png/ubu-krol-czyli-polacy.png','/media/book/html/ubu-krol-czyli-polacy.html',328665,NULL,0,'ubu kro~0l czyli polacy','320 KiB','Alfred Jarry',NULL);
+INSERT INTO "book" VALUES(260,'Ukradziony grosik','/media/book/png/ukradziony-grosik.png','/media/book/html/ukradziony-grosik.html',4017,NULL,0,'ukradziony grosik','3.9 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(261,'Ułan i dziewczyna','/media/book/png/ulan-i-dziewczyna.png','/media/book/html/ulan-i-dziewczyna.html',6346,NULL,0,'ul~0an i dziewczyna','6.2 KiB','Franciszek Kowalski',NULL);
+INSERT INTO "book" VALUES(262,'Wychodźcy','/media/book/png/wychodzcy.png','/media/book/html/wychodzcy.html',18978,NULL,0,'wychodz~0cy','18 KiB','Émile Verhaeren',NULL);
+INSERT INTO "book" VALUES(263,'W knajpie','/media/book/png/w-knajpie.png','/media/book/html/w-knajpie.html',2797,NULL,0,'w knajpie','2.7 KiB','Charles Cros',NULL);
+INSERT INTO "book" VALUES(264,'W stronę Swanna','/media/book/png/w-strone-swanna.png','/media/book/html/w-strone-swanna.html',1185235,NULL,0,'w strone~0 swanna','1.1 MiB','Marcel Proust',NULL);
+INSERT INTO "book" VALUES(265,'Wesołe kumoszki z Windsoru','/media/book/png/wesole-kumoszki-z-windsoru.png','/media/book/html/wesole-kumoszki-z-windsoru.html',429080,NULL,0,'wesol~0e kumoszki z windsoru','419 KiB','William Shakespeare',NULL);
+INSERT INTO "book" VALUES(266,'Wilk i człowiek','/media/book/png/wilk-i-czlowiek.png','/media/book/html/wilk-i-czlowiek.html',6303,NULL,0,'wilk i czl~0owiek','6.2 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(267,'Włóczęgi','/media/book/png/wloczegi.png','/media/book/html/wloczegi.html',9247,NULL,0,'wl~0o~0cze~0gi','9.0 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(268,'Wszechwiedzący doktór','/media/book/png/wszechwiedzacy-doktor.png','/media/book/html/wszechwiedzacy-doktor.html',9983,NULL,0,'wszechwiedza~0cy dokto~0r','9.7 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(269,'Wszystko na swoim miejscu','/media/book/png/wszystko-na-swoim-miejscu.png','/media/book/html/wszystko-na-swoim-miejscu.html',24381,NULL,0,'wszystko na swoim miejscu','23 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(270,'Wyznanie artysty','/media/book/png/wyznanie-artysty.png','/media/book/html/wyznanie-artysty.html',3037,NULL,0,'wyznanie artysty','3.0 KiB','Charles Baudelaire',NULL);
+INSERT INTO "book" VALUES(271,'Z jednego gniazda','/media/book/png/z-jednego-gniazda.png','/media/book/html/z-jednego-gniazda.html',10819,NULL,0,'z jednego gniazda','10 KiB','Hans Christian Andersen',NULL);
+INSERT INTO "book" VALUES(272,'Zagubienie aureoli','/media/book/png/zagubienie-aureoli.png','/media/book/html/zagubienie-aureoli.html',3148,NULL,0,'zagubienie aureoli','3.1 KiB','Charles Baudelaire',NULL);
+INSERT INTO "book" VALUES(273,'Zając i jeż','/media/book/png/zajac-i-jez.png','/media/book/html/zajac-i-jez.html',13990,NULL,0,'zaja~0c i jez~1','13 KiB','Jacob i Wilhelm Grimm',NULL);
+INSERT INTO "book" VALUES(274,'Kaśka Kariatyda','/media/book/png/kaska-kariatyda.png','/media/book/html/kaska-kariatyda.html',1041753,NULL,0,'kas~0ka kariatyda','1.0 MiB','Gabriela Zapolska',NULL);
+INSERT INTO "book" VALUES(275,'Zegar','/media/book/png/zegar.png','/media/book/html/zegar.html',4799,NULL,0,'zegar','4.7 KiB','Charles Baudelaire',NULL);
+INSERT INTO "book" VALUES(276,'Życie wymarzone','/media/book/png/zycie-wymarzone.png','/media/book/html/zycie-wymarzone.html',2352,NULL,0,'z~1ycie wymarzone','2.3 KiB','Charles Cros',NULL);
+CREATE TABLE tag (
+    id INTEGER PRIMARY KEY, 
+    name VARCHAR, 
+    category VARCHAR, 
+    sort_key VARCHAR, 
+    books VARCHAR);
+INSERT INTO "tag" VALUES(1,'Liryka','kind','liryka','190,93,191,192,150,193,194,203,206,195,196,197,198,199,2,3,4,1,6,8,10,15,22,53,62,67,23,76,77,80,85,87,88,121,122,123,174,134,242,72,24,136,137,25,26,27,28,145,243,148,152,29,157,175,30,31,186,32,207,209,33,213,34,35,36,216,37,38,39,234,40,41,154,158,261,263,42,43,149,262,270,272,44,275,65,276');
+INSERT INTO "tag" VALUES(2,'Wiersz','genre','wiersz','190,93,191,192,193,194,203,206,195,196,197,198,199,3,4,1,6,8,10,15,22,62,67,23,76,77,122,174,134,72,24,136,137,25,26,27,28,145,148,152,29,157,175,30,31,32,207,209,33,110,213,34,35,36,216,37,38,39,40,41,154,158,263,42,43,149,262,270,272,44,275,65,276');
+INSERT INTO "tag" VALUES(3,'Jan Kasprowicz','author','kasprowicz','1');
+INSERT INTO "tag" VALUES(4,'Modernizm','epoch','modernizm','190,93,191,192,193,194,203,206,195,196,197,198,199,4,1,15,122,231,129,72,144,145,147,274,164,176,200,230,252,154,158,253,259,263,264,177,262,276');
+INSERT INTO "tag" VALUES(64,'Pieśń','genre','pies~0n~0','2,88,123,186,234,261');
+INSERT INTO "tag" VALUES(65,'Autor nieznany','author','autor nieznany','2,80,88,123,140');
+INSERT INTO "tag" VALUES(66,'nie dotyczy','epoch','nie dotyczy','2,88');
+INSERT INTO "tag" VALUES(72,'Juliusz Słowacki','author','sl~0owacki','3,8,10,54,62,70,76,77,136,137,148,152');
+INSERT INTO "tag" VALUES(73,'Romantyzm','epoch','romantyzm','3,9,8,10,53,54,55,62,21,66,67,70,71,74,75,76,77,87,92,123,124,174,127,130,131,132,133,134,242,135,250,136,137,138,141,142,143,56,57,243,148,151,152,58,155,157,59,60,165,166,167,168,170,169,171,173,175,178,179,181,182,186,187,188,202,204,207,208,209,210,211,212,213,214,215,217,228,216,233,235,236,239,240,245,64,238,241,244,254,255,256,257,258,260,261,266,267,149,268,269,270,271,272,273,275,65');
+INSERT INTO "tag" VALUES(78,'Kazimierz Przerwa-Tetmajer','author','przerwa tetmajer','4,122');
+INSERT INTO "tag" VALUES(83,'Epika','kind','epika','5,7,9,11,13,14,16,55,61,63,21,66,70,71,73,74,75,78,79,89,90,91,92,124,125,126,127,128,231,130,131,132,133,135,250,129,138,18,139,140,141,142,143,56,144,146,57,147,151,153,58,155,274,164,59,60,165,166,167,168,170,169,171,172,19,173,176,178,20,179,180,181,182,183,187,188,189,200,201,205,208,210,211,212,214,215,217,228,229,230,232,233,235,236,239,240,245,249,64,252,238,241,244,253,254,255,256,257,258,260,264,266,267,177,268,269,271,273');
+INSERT INTO "tag" VALUES(84,'Bajka','genre','bajka','5,7,16,61,78,79,90,91,125,126,128,18,19,20');
+INSERT INTO "tag" VALUES(85,'Przypowieść','genre','przypowies~0c~0','5,7,16,61,78,79,90,91,125,126,128,18,19,20');
+INSERT INTO "tag" VALUES(86,'Ignacy Krasicki','author','krasicki','5,7,13,16,61,78,79,90,91,125,126,128,18,19,20');
+INSERT INTO "tag" VALUES(87,'Oświecenie','epoch','os~0wiecenie','5,7,13,16,61,78,79,90,91,125,126,128,18,172,19,20,180,205,232');
+INSERT INTO "tag" VALUES(89,'Miłosz Biedrzycki','author','biedrzycki','6');
+INSERT INTO "tag" VALUES(90,'Współczesność','epoch','wspo~0l~0czesnos~0c~0','6');
+INSERT INTO "tag" VALUES(103,'Baśń','genre','bas~0n~0','9,21,74,75,92,124,127,130,131,133,135,138,141,142,143,151,155,164,165,166,167,168,169,171,173,178,179,181,182,187,188,210,211,212,214,215,217,230,233,235,236,239,240,64,238,241,244,254,255,256,257,258,260,266,267,268,269,271,273');
+INSERT INTO "tag" VALUES(104,'Hans Christian Andersen','author','andersen','9,21,92,124,130,131,133,135,142,143,151,166,171,173,178,179,182,187,215,217,233,240,64,238,244,254,257,269,271');
+INSERT INTO "tag" VALUES(115,'Nowela','genre','nowela','11,139,183,201');
+INSERT INTO "tag" VALUES(116,'Bolesław Prus','author','prus','11');
+INSERT INTO "tag" VALUES(117,'Pozytywizm','epoch','pozytywizm','11,14,63,73,231,129,139,183,201,234,249');
+INSERT INTO "tag" VALUES(132,'Dramat','kind','dramat','12,17,54,156,184,185,202,204,218,237,86,251,259,265');
+INSERT INTO "tag" VALUES(133,'Tragedia','genre','tragedia','12,17,54,156');
+INSERT INTO "tag" VALUES(134,'Sofokles','author','sofokles','12');
+INSERT INTO "tag" VALUES(135,'Starożytność','epoch','staroz~1ytnos~0c~0','12,17');
+INSERT INTO "tag" VALUES(148,'Poemat heroikomiczny','genre','poemat heroikomiczny','13');
+INSERT INTO "tag" VALUES(186,'Opowiadanie','genre','opowiadanie','14,63,66,71,73');
+INSERT INTO "tag" VALUES(187,'Anton Czechow','author','czechow','14,73');
+INSERT INTO "tag" VALUES(189,'Louis le Cardonnel','author','cardonnel','15,145');
+INSERT INTO "tag" VALUES(197,'Eurypides','author','eurypides','17');
+INSERT INTO "tag" VALUES(223,'Józef Czechowicz','author','czechowicz','22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44');
+INSERT INTO "tag" VALUES(224,'Dwudziestolecie międzywojenne','epoch','dwudziestolecie mie~0dzywojenne','190,191,192,150,193,194,195,196,197,198,199,22,23,89,121,24,25,26,27,28,144,29,153,164,30,31,200,32,33,34,35,36,37,38,229,39,230,40,41,42,43,44');
+INSERT INTO "tag" VALUES(282,'Ballada','genre','ballada','53');
+INSERT INTO "tag" VALUES(283,'Adam Mickiewicz','author','mickiewicz','53,242,243');
+INSERT INTO "tag" VALUES(354,'Powieść','genre','powies~0c~0','55,231,250,129,140,56,146,57,147,58,274,59,60,170,172,189,208,228,229,232,245,249,252,253,264');
+INSERT INTO "tag" VALUES(355,'Honoré de Balzac','author','balzac','55,56,57,58,59,60,208');
+INSERT INTO "tag" VALUES(404,'Henryk Sienkiewicz','author','sienkiewicz','63');
+INSERT INTO "tag" VALUES(407,'Charles Baudelaire','author','baudelaire','174,134,157,207,209,213,216,270,272,275,65');
+INSERT INTO "tag" VALUES(410,'Edgar Allan Poe','author','poe','66,71');
+INSERT INTO "tag" VALUES(413,'Cyprian Kamil Norwid','author','norwid','67,175,204');
+INSERT INTO "tag" VALUES(416,'Poemat dygresyjny','genre','poemat dygresyjny','70');
+INSERT INTO "tag" VALUES(476,'Jean-Marc Bernard','author','bernard','72');
+INSERT INTO "tag" VALUES(480,'Jacob i Wilhelm Grimm','author','grimm','74,75,127,138,141,155,165,167,168,169,181,188,210,211,212,214,235,236,239,241,255,256,258,260,266,267,268,273');
+INSERT INTO "tag" VALUES(493,'Hymn','genre','hymn','80,87');
+INSERT INTO "tag" VALUES(494,'Średniowiecze','epoch','s~0redniowiecze','80,85,140');
+INSERT INTO "tag" VALUES(497,'Poemat alegoryczny','genre','poemat alegoryczny','85');
+INSERT INTO "tag" VALUES(498,'Dante Alighieri','author','alighieri','85');
+INSERT INTO "tag" VALUES(523,'Julian Korsak','author','korsak','84');
+INSERT INTO "tag" VALUES(526,'Komedia','genre','komedia','184,185,204,237,86,251');
+INSERT INTO "tag" VALUES(527,'Molière','author','molie~0re','184,185,237,86,251');
+INSERT INTO "tag" VALUES(528,'Barok','epoch','barok','184,185,189,237,86,251');
+INSERT INTO "tag" VALUES(530,'Alojzy Feliński','author','felin~0ski','87');
+INSERT INTO "tag" VALUES(533,'Felieton','genre','felieton','89,144,200');
+INSERT INTO "tag" VALUES(534,'Tadeusz Boy-Żeleński','author','boy z~1elen~0ski','89,144,153,200');
+INSERT INTO "tag" VALUES(541,'Charles Guérin','author','gue~0rin','93,149');
+INSERT INTO "tag" VALUES(543,'Wiersz sylabotoniczny','genre','wiersz sylabotoniczny','121');
+INSERT INTO "tag" VALUES(544,'Bruno Jasieński','author','jasien~0ski','121');
+INSERT INTO "tag" VALUES(547,'Dedykacja','genre','dedykacja','96,150');
+INSERT INTO "tag" VALUES(582,'Władysław Stanisław Reymont','author','reymont','231,129');
+INSERT INTO "tag" VALUES(597,'Powieść epistolarna','genre','powies~0c~0 epistolarna','132,180');
+INSERT INTO "tag" VALUES(598,'Johann Wolfgang von Goethe','author','goethe','132');
+INSERT INTO "tag" VALUES(610,'Maria Konopnicka','author','konopnicka','139,183,201,234');
+INSERT INTO "tag" VALUES(621,'Esej','genre','esej','144,153,176,200');
+INSERT INTO "tag" VALUES(635,'François Rabelais','author','rabelais','146');
+INSERT INTO "tag" VALUES(636,'Renesans','epoch','renesans','146,156,218,265');
+INSERT INTO "tag" VALUES(638,'Gustav Meyrink','author','meyrink','147');
+INSERT INTO "tag" VALUES(651,'Jerzy Liebert','author','liebert','150');
+INSERT INTO "tag" VALUES(658,'Francis Jammes','author','jammes','154');
+INSERT INTO "tag" VALUES(661,'William Shakespeare','author','shakespeare','156,218,265');
+INSERT INTO "tag" VALUES(666,'Gustave Kahn','author','kahn','158');
+INSERT INTO "tag" VALUES(668,'Bolesław Leśmian','author','les~0mian','190,191,192,193,194,195,196,197,198,199,164,230');
+INSERT INTO "tag" VALUES(698,'Seweryn Goszczyński','author','goszczyn~0ski','170');
+INSERT INTO "tag" VALUES(702,'Denis Diderot','author','diderot','172');
+INSERT INTO "tag" VALUES(708,'Stanisław Brzozowski','author','brzozowski','176');
+INSERT INTO "tag" VALUES(713,'Legenda','genre','legenda','177');
+INSERT INTO "tag" VALUES(714,'Artur Oppman','author','oppman','177');
+INSERT INTO "tag" VALUES(718,'Montesquieu','author','montesquieu','180,205');
+INSERT INTO "tag" VALUES(737,'Teofil Lenartowicz','author','lenartowicz','186');
+INSERT INTO "tag" VALUES(742,'Pascal','author','pascal','189');
+INSERT INTO "tag" VALUES(758,'Dramat romantyczny','genre','dramat romantyczny','202');
+INSERT INTO "tag" VALUES(759,'Zygmunt Krasiński','author','krasin~0ski','202');
+INSERT INTO "tag" VALUES(765,'Guillaume Apollinaire','author','apollinaire','203,206');
+INSERT INTO "tag" VALUES(768,'Rozprawa','genre','rozprawa','205');
+INSERT INTO "tag" VALUES(788,'Dramat szekspirowski','genre','dramat szekspirowski','218,265');
+INSERT INTO "tag" VALUES(790,'E. T. A. Hoffmann','author','hoffmann','228');
+INSERT INTO "tag" VALUES(799,'Antoni Lange','author','lange','224');
+INSERT INTO "tag" VALUES(806,'Stefan Żeromski','author','z~1eromski','229,252');
+INSERT INTO "tag" VALUES(816,'Daniel Defoe','author','defoe','232');
+INSERT INTO "tag" VALUES(827,'Sonet','genre','sonet','242,243');
+INSERT INTO "tag" VALUES(831,'Alfred de Musset','author','musset','245');
+INSERT INTO "tag" VALUES(836,'Józef Ignacy Kraszewski','author','kraszewski','249');
+INSERT INTO "tag" VALUES(846,'Stendhal','author','stendhal','250');
+INSERT INTO "tag" VALUES(850,'Friedrich Nietzsche','author','nietzsche','253');
+INSERT INTO "tag" VALUES(864,'Farsa','genre','farsa','259');
+INSERT INTO "tag" VALUES(865,'Alfred Jarry','author','jarry','259');
+INSERT INTO "tag" VALUES(868,'Franciszek Kowalski','author','kowalski','261');
+INSERT INTO "tag" VALUES(870,'Émile Verhaeren','author','verhaeren','262');
+INSERT INTO "tag" VALUES(872,'Charles Cros','author','cros','263,276');
+INSERT INTO "tag" VALUES(874,'Marcel Proust','author','proust','264');
+INSERT INTO "tag" VALUES(888,'Gabriela Zapolska','author','zapolska','274');
+CREATE TABLE state (last_checked INTEGER);
+INSERT INTO "state" VALUES(1342375843);
+CREATE INDEX book_title_index ON book (sort_key);
+CREATE INDEX book_parent_index ON book (parent);
+CREATE INDEX tag_name_index ON tag (name);
+CREATE INDEX tag_category_index ON tag (category);
+CREATE INDEX tag_sort_key_index ON tag (sort_key);
+COMMIT;
diff --git a/js/app/AjaxList.js b/js/app/AjaxList.js
deleted file mode 100644 (file)
index d2d0897..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-(function() {
-
-  Readings.TagList = (function() {
-
-    TagList.prototype.defaults = null;
-
-    function TagList(list, category, options) {
-      this.category = category;
-      this.options = $.extend(this.defaults, options);
-    }
-
-    TagList.prototype.load = function() {
-      return $.ajax({
-        url: Readings.config.get('wlurl') + ("/api/" + this.category),
-        success: function() {
-          return true;
-        }
-      });
-    };
-
-    return TagList;
-
-  })();
-
-}).call(this);
diff --git a/js/app/BooksList.coffee b/js/app/BooksList.coffee
deleted file mode 100644 (file)
index 21b6d19..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-
-slug_in_url = /([a-z0-9-]+)[/]?$/
-
-class Readings.Book
-  constructor: (record) ->
-    @url = record.url
-    @href = record.href
-    @cover = record.cover
-    @author = record.author
-    @title = record.title
-    @slug = slug_in_url.exec(@href)[1]
-
-  render: ->
-    "<li><a href=\"reader.html?slug=#{@slug}\">#{@title}</a></li>"
-
-  group: ->
-    @author
-
-
-$.fn.Readings.BookList = (category, tag) ->
-  this.each ->
-    $('[data-role=header] h1').text tag.name
-    list = $('[data-role=listview]', this)
-    $.ajax
-      url: "#{tag.href}books/"
-      #url: Readings.config.get('wlurl') + "/api/#{category}"
-      contentType: "json"
-      success: (data) ->
-        console.log(data)
-        books = $.map data, (rec) -> new Readings.Book(rec)
-        list.empty()
-        last_separator = null
-        show_separator = !(category == 'authors')
-
-        for b in books
-          # throw a separator in for some categories
-          if show_separator
-            separator = t.group()
-            if last_separator != separator
-              list.append "<li data-role=\"list-divider\">#{separator}</li>"
-              last_separator = separator
-
-          list.append b.render()
-          list.listview 'refresh'
diff --git a/js/app/BooksList.js b/js/app/BooksList.js
deleted file mode 100644 (file)
index 4f61927..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-// Generated by CoffeeScript 1.3.3
-(function() {
-  var slug_in_url;
-
-  slug_in_url = /([a-z0-9-]+)[/]?$/;
-
-  Readings.Book = (function() {
-
-    function Book(record) {
-      this.url = record.url;
-      this.href = record.href;
-      this.cover = record.cover;
-      this.author = record.author;
-      this.title = record.title;
-      this.slug = slug_in_url.exec(this.href)[1];
-    }
-
-    Book.prototype.render = function() {
-      return "<li><a href=\"reader.html?slug=" + this.slug + "\">" + this.title + "</a></li>";
-    };
-
-    Book.prototype.group = function() {
-      return this.author;
-    };
-
-    return Book;
-
-  })();
-
-  $.fn.Readings.BookList = function(category, tag) {
-    return this.each(function() {
-      var list;
-      $('[data-role=header] h1').text(tag.name);
-      list = $('[data-role=listview]', this);
-      return $.ajax({
-        url: "" + tag.href + "books/",
-        contentType: "json",
-        success: function(data) {
-          var b, books, last_separator, separator, show_separator, _i, _len, _results;
-          console.log(data);
-          books = $.map(data, function(rec) {
-            return new Readings.Book(rec);
-          });
-          list.empty();
-          last_separator = null;
-          show_separator = !(category === 'authors');
-          _results = [];
-          for (_i = 0, _len = books.length; _i < _len; _i++) {
-            b = books[_i];
-            if (show_separator) {
-              separator = t.group();
-              if (last_separator !== separator) {
-                list.append("<li data-role=\"list-divider\">" + separator + "</li>");
-                last_separator = separator;
-              }
-            }
-            list.append(b.render());
-            _results.push(list.listview('refresh'));
-          }
-          return _results;
-        }
-      });
-    });
-  };
-
-}).call(this);
diff --git a/js/app/Catalogue.coffee b/js/app/Catalogue.coffee
new file mode 100644 (file)
index 0000000..c556e5b
--- /dev/null
@@ -0,0 +1,75 @@
+
+class Readings.Catalogue
+  open: () ->
+    version = Readings.config.get 'db_version'
+    console.log "opening db ver #{version}"
+    @db = openDatabase 'catalogue', version, 'Catalogue', 65535, @init
+    this
+
+  init: (db) ->
+    if not db?
+      db = @db
+    console.log "initializing DB"
+    db.changeVersion "", Readings.config.get 'db_version'
+    $.ajax "initdb.sql"
+      type: "GET"
+      dataType: 'text'
+      success: (sql) =>
+        sql = sql.split /;\n/
+        sql = sql.slice(1,-2)
+
+        create = (tx) =>
+          for stmt in sql
+            console.log stmt
+            tx.executeSql stmt, [],
+              (tx,rs) => true,
+              (tx,err) => console.error(err)
+
+        db.transaction create
+      error: =>
+        console.error "can't get initial sql"
+
+  wrap_error: (error_cb) ->
+    (tx, error) ->
+      window.last_error = error
+      alert "SQL ERROR: #{error.message}"
+      if error_cb
+        error_cb(error)
+      else
+        throw error
+
+  map_rs: (rs, mapper) ->
+    objs = []
+    for i in [0...rs.rows.length]
+      objs.push(mapper(rs.rows.item(i)))
+    return objs
+
+## TODO update method
+  withCategory: (category, callback, error) ->
+    rs_to_tags = (tx, data) ->
+      tags = []
+      for i in [0...data.rows.length]
+        tags.push new Readings.Tag(data.rows.item(i))
+      callback(tags)
+
+    @db.readTransaction (tx)=>
+      tx.executeSql "SELECT * FROM tag WHERE category=? ORDER BY sort_key",
+        [category], rs_to_tags, @wrap_error(error)
+
+  withTag: (tag_id, cb) ->
+    @db.readTransaction (tx) =>
+      tx.executeSql "SELECT * FROM tag WHERE id=?", [tag_id],
+        (tx, rs) =>
+          if rs.rows.length > 0
+            tag = new Readings.Tag rs.rows.item(0)
+            return cb(tag)
+          else
+            alert "No tag id #{tag_id}"
+        ,
+        @wrap_error()
+
+  withBooks: (tag, cb) ->
+    @db.readTransaction (tx)=>
+      console.log "books in tag: #{tag.books}"
+      tx.executeSql "SELECT * FROM book WHERE id IN (#{tag.books}) ORDER BY sort_key",
+        [], ((tx, rs) => cb(@map_rs(rs, (rec)->new Readings.Book(rec)))), @wrap_error()
diff --git a/js/app/Catalogue.js b/js/app/Catalogue.js
new file mode 100644 (file)
index 0000000..38fbce6
--- /dev/null
@@ -0,0 +1,120 @@
+// Generated by CoffeeScript 1.3.3
+(function() {
+
+  Readings.Catalogue = (function() {
+
+    function Catalogue() {}
+
+    Catalogue.prototype.open = function() {
+      var version;
+      version = Readings.config.get('db_version');
+      console.log("opening db ver " + version);
+      this.db = openDatabase('catalogue', version, 'Catalogue', 65535, this.init);
+      return this;
+    };
+
+    Catalogue.prototype.init = function(db) {
+      var _this = this;
+      if (!(db != null)) {
+        db = this.db;
+      }
+      console.log("initializing DB");
+      db.changeVersion("", Readings.config.get('db_version'));
+      return $.ajax("initdb.sql", {
+        type: "GET",
+        dataType: 'text',
+        success: function(sql) {
+          var create;
+          sql = sql.split(/;\n/);
+          sql = sql.slice(1, -2);
+          create = function(tx) {
+            var stmt, _i, _len, _results;
+            _results = [];
+            for (_i = 0, _len = sql.length; _i < _len; _i++) {
+              stmt = sql[_i];
+              console.log(stmt);
+              _results.push(tx.executeSql(stmt, [], function(tx, rs) {
+                return true;
+              }, function(tx, err) {
+                return console.error(err);
+              }));
+            }
+            return _results;
+          };
+          return db.transaction(create);
+        },
+        error: function() {
+          return console.error("can't get initial sql");
+        }
+      });
+    };
+
+    Catalogue.prototype.wrap_error = function(error_cb) {
+      return function(tx, error) {
+        window.last_error = error;
+        alert("SQL ERROR: " + error.message);
+        if (error_cb) {
+          return error_cb(error);
+        } else {
+          throw error;
+        }
+      };
+    };
+
+    Catalogue.prototype.map_rs = function(rs, mapper) {
+      var i, objs, _i, _ref;
+      objs = [];
+      for (i = _i = 0, _ref = rs.rows.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
+        objs.push(mapper(rs.rows.item(i)));
+      }
+      return objs;
+    };
+
+    Catalogue.prototype.withCategory = function(category, callback, error) {
+      var rs_to_tags,
+        _this = this;
+      rs_to_tags = function(tx, data) {
+        var i, tags, _i, _ref;
+        tags = [];
+        for (i = _i = 0, _ref = data.rows.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
+          tags.push(new Readings.Tag(data.rows.item(i)));
+        }
+        return callback(tags);
+      };
+      return this.db.readTransaction(function(tx) {
+        return tx.executeSql("SELECT * FROM tag WHERE category=? ORDER BY sort_key", [category], rs_to_tags, _this.wrap_error(error));
+      });
+    };
+
+    Catalogue.prototype.withTag = function(tag_id, cb) {
+      var _this = this;
+      return this.db.readTransaction(function(tx) {
+        return tx.executeSql("SELECT * FROM tag WHERE id=?", [tag_id], function(tx, rs) {
+          var tag;
+          if (rs.rows.length > 0) {
+            tag = new Readings.Tag(rs.rows.item(0));
+            return cb(tag);
+          } else {
+            return alert("No tag id " + tag_id);
+          }
+        }, _this.wrap_error());
+      });
+    };
+
+    Catalogue.prototype.withBooks = function(tag, cb) {
+      var _this = this;
+      return this.db.readTransaction(function(tx) {
+        console.log("books in tag: " + tag.books);
+        return tx.executeSql("SELECT * FROM book WHERE id IN (" + tag.books + ") ORDER BY sort_key", [], (function(tx, rs) {
+          return cb(_this.map_rs(rs, function(rec) {
+            return new Readings.Book(rec);
+          }));
+        }), _this.wrap_error());
+      });
+    };
+
+    return Catalogue;
+
+  })();
+
+}).call(this);
index 00df4a1..0aa420e 100644 (file)
@@ -2,5 +2,14 @@
 class Readings.Config
   constructor: (@opts) ->
 
+  key: (name) ->
+    "config.#{name}"
+
   get: (name) ->
+    v = localStorage.getItem @key(name)
+    if v?
+      return JSON.parse(v)
     @opts[name]
+
+  save: (name, value) ->
+    localStorage.setItem @key(name), JSON.stringify(value)
\ No newline at end of file
index 87a99b7..19df0d1 100644 (file)
@@ -1,3 +1,4 @@
+// Generated by CoffeeScript 1.3.3
 (function() {
 
   Readings.Config = (function() {
@@ -6,10 +7,23 @@
       this.opts = opts;
     }
 
+    Config.prototype.key = function(name) {
+      return "config." + name;
+    };
+
     Config.prototype.get = function(name) {
+      var v;
+      v = localStorage.getItem(this.key(name));
+      if (v != null) {
+        return JSON.parse(v);
+      }
       return this.opts[name];
     };
 
+    Config.prototype.save = function(name, value) {
+      return localStorage.setItem(this.key(name), JSON.stringify(value));
+    };
+
     return Config;
 
   })();
diff --git a/js/app/TagList.coffee b/js/app/TagList.coffee
deleted file mode 100644 (file)
index a765172..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-
-class Readings.Tag
-  constructor: (record, @category) ->
-    @href = record.href
-    @name = record.name
-    #@url = record.url
-    @slug = $.grep(@href.split('/'), (e) -> e != "")
-
-  render: ->
-    "<li><a href=\"#\">#{@name}</a></li>"
-
-  group: ->
-    if @category == 'authors'
-      # last word, first letter
-      @name.split(' ').slice(-1)[0][0].toUpperCase()
-    else
-      @name[0].toUpperCase()
-
-
-$.fn.Readings.list = (opts) ->
-  # category
-  # url
-  # mapper
-  # title
-  # filter
-  # mapper (rec) -> obj
-  this.each ->
-    $('[data-role=header] h1').text opts.title
-    list = $('[data-role=listview]', this)
-    if !opts.filter
-      $(".ui-listview-filter").hide()
-    $.ajax
-      url: opts.url
-      contentType: "json"
-      success: (data) ->
-        objs = $.map data, opts.mapper
-        list.empty()
-        last_divider = null
-
-        for obj in objs
-          # throw a divider in for some categories
-          if opts.dividers
-            divider = obj.group()
-            if last_divider != divider
-              list.append "<li data-role=\"list-divider\">#{divider}</li>"
-              last_divider = divider
-
-          list.append obj.render()
-        list.listview 'refresh'
-
-
-
-$.fn.Readings.TagList = (category) ->
-  this.each ->
-    $('[data-role=header] h1').text Readings.config.get('categories')[category]
-    list = $('[data-role=listview]', this)
-    if Readings.config.get('show_filter').indexOf(category) < 0
-      $(".ui-listview-filter").hide()
-    $.ajax
-      url: Readings.config.get('wlurl') + "/api/#{category}"
-      contentType: "json"
-      success: (data) ->
-        tags = $.map data, (rec) -> new Readings.Tag(rec, category)
-        list.empty()
-        last_separator = null
-        show_separator = Readings.config.get('show_dividers').indexOf(category) >= 0
-        for t in tags
-          # throw a separator in for some categories
-          if show_separator
-            separator = t.group()
-            if last_separator != separator
-              list.append "<li data-role=\"list-divider\">#{separator}</li>"
-              last_separator = separator
-
-          list.append t.render()
-        list.listview 'refresh'
diff --git a/js/app/TagList.js b/js/app/TagList.js
deleted file mode 100644 (file)
index f31e855..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-// Generated by CoffeeScript 1.3.3
-(function() {
-
-  Readings.Tag = (function() {
-
-    function Tag(record, category) {
-      this.category = category;
-      this.href = record.href;
-      this.name = record.name;
-      this.slug = $.grep(this.href.split('/'), function(e) {
-        return e !== "";
-      });
-    }
-
-    Tag.prototype.render = function() {
-      return "<li><a href=\"#\">" + this.name + "</a></li>";
-    };
-
-    Tag.prototype.group = function() {
-      if (this.category === 'authors') {
-        return this.name.split(' ').slice(-1)[0][0].toUpperCase();
-      } else {
-        return this.name[0].toUpperCase();
-      }
-    };
-
-    return Tag;
-
-  })();
-
-  $.fn.Readings.list = function(opts) {
-    return this.each(function() {
-      var list;
-      $('[data-role=header] h1').text(opts.title);
-      list = $('[data-role=listview]', this);
-      if (!opts.filter) {
-        $(".ui-listview-filter").hide();
-      }
-      return $.ajax({
-        url: opts.url,
-        contentType: "json",
-        success: function(data) {
-          var divider, last_divider, obj, objs, _i, _len;
-          objs = $.map(data, opts.mapper);
-          list.empty();
-          last_divider = null;
-          for (_i = 0, _len = objs.length; _i < _len; _i++) {
-            obj = objs[_i];
-            if (opts.dividers) {
-              divider = obj.group();
-              if (last_divider !== divider) {
-                list.append("<li data-role=\"list-divider\">" + divider + "</li>");
-                last_divider = divider;
-              }
-            }
-            list.append(obj.render());
-          }
-          return list.listview('refresh');
-        }
-      });
-    });
-  };
-
-  $.fn.Readings.TagList = function(category) {
-    return this.each(function() {
-      var list;
-      $('[data-role=header] h1').text(Readings.config.get('categories')[category]);
-      list = $('[data-role=listview]', this);
-      if (Readings.config.get('show_filter').indexOf(category) < 0) {
-        $(".ui-listview-filter").hide();
-      }
-      return $.ajax({
-        url: Readings.config.get('wlurl') + ("/api/" + category),
-        contentType: "json",
-        success: function(data) {
-          var last_separator, separator, show_separator, t, tags, _i, _len;
-          tags = $.map(data, function(rec) {
-            return new Readings.Tag(rec, category);
-          });
-          list.empty();
-          last_separator = null;
-          show_separator = Readings.config.get('show_dividers').indexOf(category) >= 0;
-          for (_i = 0, _len = tags.length; _i < _len; _i++) {
-            t = tags[_i];
-            if (show_separator) {
-              separator = t.group();
-              if (last_separator !== separator) {
-                list.append("<li data-role=\"list-divider\">" + separator + "</li>");
-                last_separator = separator;
-              }
-            }
-            list.append(t.render());
-          }
-          return list.listview('refresh');
-        }
-      });
-    });
-  };
-
-}).call(this);
index c6e4cb4..2f447d5 100644 (file)
@@ -17,13 +17,15 @@ Readings.init = ->
   Readings.config = new Readings.Config
     wlurl: 'http://readings.local'
     categories:
-      'authors': 'autor',
-      'epochs': 'epoka',
-      'genres': 'gatunek',
-      'kinds': 'rodzaj',
-      'themes': 'motyw'
+      'author': 'autor',
+      'epoch': 'epoka',
+      'genre': 'gatunek',
+      'kind': 'rodzaj',
+     # 'themes': 'motyw'
     show_filter: [ 'authors', 'themes' ]
     show_dividers: [ 'authors', 'themes']
+    db_version: '1.0'
+  Readings.catalogue = new Readings.Catalogue().open()
   Readings.initialized = true
 
 $(document).on 'pageinit', '#page-categories' , (ev) ->
@@ -31,14 +33,30 @@ $(document).on 'pageinit', '#page-categories' , (ev) ->
   $('#list-categories').Readings 'CategoryList'
 
 rcategory = /category=(\w+)/
+rtag = /tag=([a-z0-9-]+)/
+rtagid = /tag_id=([0-9]+)/
+
 $(document).on 'pageinit', "#page-tags", (ev, ui) ->
   category = rcategory.exec($(this).attr('data-url'))
-  if category? and category[1]?
+  if category?
+    category = category[1]
+    if category?
+      return $(this).Readings 'list',
+#        category: category
+#        url: Readings.config.get('wlurl') + "/api/#{category}"
+        sql: "SELECT * FROM tag WHERE category=? ORDER BY sort_key"
+        params: [category]
+        filter: (Readings.config.get('show_filter').indexOf(category) >= 0)
+        mapper: (rec) -> new Readings.Tag(rec, category)
+        dividers: (Readings.config.get('show_dividers').indexOf(category) >= 0)
+  alert 'no category in query string'
+
+$(document).on 'pageinit', '#page-books', (ev, ui) ->
+  tag_id_m = rtagid.exec($(this).attr('data-url'))
+  tag_id = tag_id_m[1] if tag_id_m?
+
+  tag = Readings.catalogue.withTag tag_id, (tag) =>
     $(this).Readings 'list',
-      category: category[1]
-      url: Readings.config.get('wlurl') + "/api/#{category[1]}"
-      filter: (Readings.config.get('show_filter').indexOf(category[1]) >= 0)
-      mapper: (rec) -> new Readings.Tag(rec, category[1])
-      dividers: (Readings.config.get('show_dividers').indexOf(category[1]) >= 0)
-  else
-    alert 'no category in query string'
\ No newline at end of file
+      fetch: (cb) -> Readings.catalogue.withBooks(tag, cb)
+      filter: true
+      dividers: (tag.category != 'author')
index b5e2ba2..01d1f4a 100644 (file)
@@ -1,6 +1,6 @@
 // Generated by CoffeeScript 1.3.3
 (function() {
-  var rcategory;
+  var rcategory, rtag, rtagid;
 
   window.Readings = {};
 
     Readings.config = new Readings.Config({
       wlurl: 'http://readings.local',
       categories: {
-        'authors': 'autor',
-        'epochs': 'epoka',
-        'genres': 'gatunek',
-        'kinds': 'rodzaj',
-        'themes': 'motyw'
+        'author': 'autor',
+        'epoch': 'epoka',
+        'genre': 'gatunek',
+        'kind': 'rodzaj'
       },
       show_filter: ['authors', 'themes'],
-      show_dividers: ['authors', 'themes']
+      show_dividers: ['authors', 'themes'],
+      db_version: '1.0'
     });
+    Readings.catalogue = new Readings.Catalogue().open();
     return Readings.initialized = true;
   };
 
 
   rcategory = /category=(\w+)/;
 
+  rtag = /tag=([a-z0-9-]+)/;
+
+  rtagid = /tag_id=([0-9]+)/;
+
   $(document).on('pageinit', "#page-tags", function(ev, ui) {
     var category;
     category = rcategory.exec($(this).attr('data-url'));
-    if ((category != null) && (category[1] != null)) {
-      return $(this).Readings('list', {
-        category: category[1],
-        url: Readings.config.get('wlurl') + ("/api/" + category[1]),
-        filter: Readings.config.get('show_filter').indexOf(category[1]) >= 0,
-        mapper: function(rec) {
-          return new Readings.Tag(rec, category[1]);
+    if (category != null) {
+      category = category[1];
+      if (category != null) {
+        return $(this).Readings('list', {
+          sql: "SELECT * FROM tag WHERE category=? ORDER BY sort_key",
+          params: [category],
+          filter: Readings.config.get('show_filter').indexOf(category) >= 0,
+          mapper: function(rec) {
+            return new Readings.Tag(rec, category);
+          },
+          dividers: Readings.config.get('show_dividers').indexOf(category) >= 0
+        });
+      }
+    }
+    return alert('no category in query string');
+  });
+
+  $(document).on('pageinit', '#page-books', function(ev, ui) {
+    var tag, tag_id, tag_id_m,
+      _this = this;
+    tag_id_m = rtagid.exec($(this).attr('data-url'));
+    if (tag_id_m != null) {
+      tag_id = tag_id_m[1];
+    }
+    return tag = Readings.catalogue.withTag(tag_id, function(tag) {
+      return $(_this).Readings('list', {
+        fetch: function(cb) {
+          return Readings.catalogue.withBooks(tag, cb);
         },
-        dividers: Readings.config.get('show_dividers').indexOf(category[1]) >= 0
+        filter: true,
+        dividers: tag.category !== 'author'
       });
-    } else {
-      return alert('no category in query string');
-    }
+    });
   });
 
 }).call(this);
diff --git a/js/app/list.coffee b/js/app/list.coffee
new file mode 100644 (file)
index 0000000..97506e0
--- /dev/null
@@ -0,0 +1,81 @@
+
+$.fn.Readings.list = (opts) ->
+  # category
+  # url
+  # mapper
+  # title
+  # filter
+  # mapper (rec) -> obj
+  #
+  this.each ->
+    $('[data-role=header] h1').text opts.title
+    list = $('[data-role=listview]', this)
+    console.log "lst1 #{list.length}"
+
+    # show filter search?
+    if !opts.filter
+      $(".ui-listview-filter").hide()
+
+    # display elements
+    render = (objs) =>
+      console.log("lst #{list.length}")
+      list.empty()
+      last_divider = null
+
+      for obj in objs
+        # throw a divider in for some categories
+        if opts.dividers
+          divider = obj.group()
+          if last_divider != divider
+            list.append "<li data-role=\"list-divider\">#{divider}</li>"
+            last_divider = divider
+
+        list.append obj.render()
+      list.listview 'refresh'
+
+    if opts.sql
+      Readings.catalogue.db.transaction (tx) ->
+        tx.executeSql opts.sql, opts.params,
+        (tx, rs) ->
+          objs = []
+          for i in [0...rs.rows.length]
+            objs.push opts.mapper rs.rows.item i
+          render(objs)
+        ,
+        (tx, err) ->
+          window.last_error = err
+          alert "SQL Error while fetching list contents: #{err.message}"
+
+    if opts.url
+      $.ajax
+        url: opts.url
+        contentType: "json"
+        success: (data) -> render($.map(data, opts.mapper))
+
+    if opts.fetch
+      opts.fetch(render)
+
+$.fn.Readings.TagList = (category) ->
+  this.each ->
+    $('[data-role=header] h1').text Readings.config.get('categories')[category]
+    list = $('[data-role=listview]', this)
+    if Readings.config.get('show_filter').indexOf(category) < 0
+      $(".ui-listview-filter").hide()
+    $.ajax
+      url: Readings.config.get('wlurl') + "/api/#{category}"
+      contentType: "json"
+      success: (data) ->
+        tags = $.map data, (rec) -> new Readings.Tag(rec, category)
+        list.empty()
+        last_separator = null
+        show_separator = Readings.config.get('show_dividers').indexOf(category) >= 0
+        for t in tags
+          # throw a separator in for some categories
+          if show_separator
+            separator = t.group()
+            if last_separator != separator
+              list.append "<li data-role=\"list-divider\">#{separator}</li>"
+              last_separator = separator
+
+          list.append t.render()
+        list.listview 'refresh'
diff --git a/js/app/list.js b/js/app/list.js
new file mode 100644 (file)
index 0000000..7b0b0a5
--- /dev/null
@@ -0,0 +1,98 @@
+// Generated by CoffeeScript 1.3.3
+(function() {
+
+  $.fn.Readings.list = function(opts) {
+    return this.each(function() {
+      var list, render,
+        _this = this;
+      $('[data-role=header] h1').text(opts.title);
+      list = $('[data-role=listview]', this);
+      console.log("lst1 " + list.length);
+      if (!opts.filter) {
+        $(".ui-listview-filter").hide();
+      }
+      render = function(objs) {
+        var divider, last_divider, obj, _i, _len;
+        console.log("lst " + list.length);
+        list.empty();
+        last_divider = null;
+        for (_i = 0, _len = objs.length; _i < _len; _i++) {
+          obj = objs[_i];
+          if (opts.dividers) {
+            divider = obj.group();
+            if (last_divider !== divider) {
+              list.append("<li data-role=\"list-divider\">" + divider + "</li>");
+              last_divider = divider;
+            }
+          }
+          list.append(obj.render());
+        }
+        return list.listview('refresh');
+      };
+      if (opts.sql) {
+        Readings.catalogue.db.transaction(function(tx) {
+          return tx.executeSql(opts.sql, opts.params, function(tx, rs) {
+            var i, objs, _i, _ref;
+            objs = [];
+            for (i = _i = 0, _ref = rs.rows.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
+              objs.push(opts.mapper(rs.rows.item(i)));
+            }
+            return render(objs);
+          }, function(tx, err) {
+            window.last_error = err;
+            return alert("SQL Error while fetching list contents: " + err.message);
+          });
+        });
+      }
+      if (opts.url) {
+        $.ajax({
+          url: opts.url,
+          contentType: "json",
+          success: function(data) {
+            return render($.map(data, opts.mapper));
+          }
+        });
+      }
+      if (opts.fetch) {
+        return opts.fetch(render);
+      }
+    });
+  };
+
+  $.fn.Readings.TagList = function(category) {
+    return this.each(function() {
+      var list;
+      $('[data-role=header] h1').text(Readings.config.get('categories')[category]);
+      list = $('[data-role=listview]', this);
+      if (Readings.config.get('show_filter').indexOf(category) < 0) {
+        $(".ui-listview-filter").hide();
+      }
+      return $.ajax({
+        url: Readings.config.get('wlurl') + ("/api/" + category),
+        contentType: "json",
+        success: function(data) {
+          var last_separator, separator, show_separator, t, tags, _i, _len;
+          tags = $.map(data, function(rec) {
+            return new Readings.Tag(rec, category);
+          });
+          list.empty();
+          last_separator = null;
+          show_separator = Readings.config.get('show_dividers').indexOf(category) >= 0;
+          for (_i = 0, _len = tags.length; _i < _len; _i++) {
+            t = tags[_i];
+            if (show_separator) {
+              separator = t.group();
+              if (last_separator !== separator) {
+                list.append("<li data-role=\"list-divider\">" + separator + "</li>");
+                last_separator = separator;
+              }
+            }
+            list.append(t.render());
+          }
+          return list.listview('refresh');
+        }
+      });
+    });
+  };
+
+}).call(this);
diff --git a/js/app/models.coffee b/js/app/models.coffee
new file mode 100644 (file)
index 0000000..ef1c7f5
--- /dev/null
@@ -0,0 +1,65 @@
+
+
+url_to_slug = (url) ->
+  slug_in_url = /([a-z0-9-]+)[/]?$/
+  slug_in_url.exec(url)[1]
+
+class Readings.Book
+  constructor: (record) ->
+    $.extend(this, record)
+
+  render: ->
+    wlurl = Readings.config.get 'wlurl'
+    "<li>
+      <a href=\"reader.html?book_id=#{@id}\">
+        <img src=\"#{wlurl}#{@cover}\">
+        <h3> #{@title}</h3>
+       </a>
+     </li>"
+
+  group: ->
+    @authors
+
+
+class Readings.Tag
+  constructor: (record, @category) ->
+    $.extend(this, record)
+
+  render: ->
+    "<li><a href=\"books.html?tag_id=#{@id}\">#{@name}</a></li>"
+
+  group: ->
+    @sort_key[0].toUpperCase()
+    # if @category == 'author'
+    #   # last word, first letter
+    #   @name.split(' ').slice(-1)[0][0].toUpperCase()
+    # else
+    #   @name[0].toUpperCase()
+
+
+
+# $.fn.Readings.BookList = (category, tag) ->
+#   this.each ->
+#     $('[data-role=header] h1').text tag.name
+#     list = $('[data-role=listview]', this)
+#     $.ajax
+#       url: "#{tag.href}books/"
+#       #url: Readings.config.get('wlurl') + "/api/#{category}"
+#       contentType: "json"
+#       success: (data) ->
+#         console.log(data)
+#         books = $.map data, (rec) -> new Readings.Book(rec)
+#         list.empty()
+#         last_separator = null
+#         show_separator = !(category == 'authors')
+
+#         for b in books
+#           # throw a separator in for some categories
+#           if show_separator
+#             separator = t.group()
+#             if last_separator != separator
+#               list.append "<li data-role=\"list-divider\">#{separator}</li>"
+#               last_separator = separator
+
+#           list.append b.render()
+#           list.listview 'refresh'
diff --git a/js/app/models.js b/js/app/models.js
new file mode 100644 (file)
index 0000000..d332ac1
--- /dev/null
@@ -0,0 +1,50 @@
+// Generated by CoffeeScript 1.3.3
+(function() {
+  var url_to_slug;
+
+  url_to_slug = function(url) {
+    var slug_in_url;
+    slug_in_url = /([a-z0-9-]+)[/]?$/;
+    return slug_in_url.exec(url)[1];
+  };
+
+  Readings.Book = (function() {
+
+    function Book(record) {
+      $.extend(this, record);
+    }
+
+    Book.prototype.render = function() {
+      var wlurl;
+      wlurl = Readings.config.get('wlurl');
+      return "<li>      <a href=\"reader.html?book_id=" + this.id + "\">        <img src=\"" + wlurl + this.cover + "\">        <h3> " + this.title + "</h3>       </a>     </li>";
+    };
+
+    Book.prototype.group = function() {
+      return this.authors;
+    };
+
+    return Book;
+
+  })();
+
+  Readings.Tag = (function() {
+
+    function Tag(record, category) {
+      this.category = category;
+      $.extend(this, record);
+    }
+
+    Tag.prototype.render = function() {
+      return "<li><a href=\"books.html?tag_id=" + this.id + "\">" + this.name + "</a></li>";
+    };
+
+    Tag.prototype.group = function() {
+      return this.sort_key[0].toUpperCase();
+    };
+
+    return Tag;
+
+  })();
+
+}).call(this);