kamishibai 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (166) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/LICENSE +29 -0
  4. data/README.md +91 -0
  5. data/bin/kamishibai +59 -0
  6. data/changelogs.txt +6 -0
  7. data/images/reading.jpg +0 -0
  8. data/images/settings.jpg +0 -0
  9. data/images/view_browse.jpg +0 -0
  10. data/images/view_dir.jpg +0 -0
  11. data/kamishibai.gemspec +31 -0
  12. data/lib/kamishibai.rb +35 -0
  13. data/lib/kamishibai/book.rb +97 -0
  14. data/lib/kamishibai/config.rb +90 -0
  15. data/lib/kamishibai/database.rb +330 -0
  16. data/lib/kamishibai/functions.rb +332 -0
  17. data/lib/kamishibai/patches.rb +58 -0
  18. data/lib/kamishibai/version.rb +7 -0
  19. data/lib/kamishibai/webserver.rb +502 -0
  20. data/lib/kamishibai/webserver_cmds.rb +26 -0
  21. data/lib/kamishibai/webserver_config.rb +91 -0
  22. data/lib/kamishibai/webserver_filemanager.rb +29 -0
  23. data/lib/kamishibai/webserver_tablet.rb +259 -0
  24. data/lib/kamishibai/workers.rb +39 -0
  25. data/public/css/browse.css +390 -0
  26. data/public/css/config.css +3 -0
  27. data/public/css/reader.css +119 -0
  28. data/public/css/styles.css +30 -0
  29. data/public/css/tablet_browse.css +247 -0
  30. data/public/css/tablet_reader.css +323 -0
  31. data/public/css/tablet_reader_input.css +191 -0
  32. data/public/images/ajax-loader.gif +0 -0
  33. data/public/images/delete.png +0 -0
  34. data/public/images/folder-mini-up.png +0 -0
  35. data/public/images/folder-mini.png +0 -0
  36. data/public/images/spinner.gif +0 -0
  37. data/public/images/trash-empty-mini.png +0 -0
  38. data/public/images/trash-full-mini.png +0 -0
  39. data/public/js/browse.js +391 -0
  40. data/public/js/config.js +190 -0
  41. data/public/js/reader.js +497 -0
  42. data/public/js/swipeview-k.js +478 -0
  43. data/public/js/tablet3.js +241 -0
  44. data/public/js/tablet3_browse.js +173 -0
  45. data/public/js/tablet3_reader.js +534 -0
  46. data/public/js/utilities.js +170 -0
  47. data/public/lang/k-cn.json +82 -0
  48. data/public/lang/k-en.json +82 -0
  49. data/public/lang/k-ja.json +82 -0
  50. data/public/vendor/css/bootstrap-slider.css +252 -0
  51. data/public/vendor/css/bootstrap-theme.css +476 -0
  52. data/public/vendor/css/bootstrap-theme.css.map +1 -0
  53. data/public/vendor/css/bootstrap-theme.min.css +5 -0
  54. data/public/vendor/css/bootstrap.css +6584 -0
  55. data/public/vendor/css/bootstrap.css.map +1 -0
  56. data/public/vendor/css/bootstrap.min.css +5 -0
  57. data/public/vendor/css/jquery-ui-1.10.0.custom.css +1614 -0
  58. data/public/vendor/css/jquery.mobile-1.3.1.min.css +3 -0
  59. data/public/vendor/css/jqueryFileTree.css +91 -0
  60. data/public/vendor/fonts/glyphicons-halflings-regular.eot +0 -0
  61. data/public/vendor/fonts/glyphicons-halflings-regular.svg +288 -0
  62. data/public/vendor/fonts/glyphicons-halflings-regular.ttf +0 -0
  63. data/public/vendor/fonts/glyphicons-halflings-regular.woff +0 -0
  64. data/public/vendor/fonts/glyphicons-halflings-regular.woff2 +0 -0
  65. data/public/vendor/images/application.png +0 -0
  66. data/public/vendor/images/code.png +0 -0
  67. data/public/vendor/images/css.png +0 -0
  68. data/public/vendor/images/db.png +0 -0
  69. data/public/vendor/images/dim.png +0 -0
  70. data/public/vendor/images/directory.png +0 -0
  71. data/public/vendor/images/doc.png +0 -0
  72. data/public/vendor/images/file.png +0 -0
  73. data/public/vendor/images/film.png +0 -0
  74. data/public/vendor/images/flash.png +0 -0
  75. data/public/vendor/images/folder_open.png +0 -0
  76. data/public/vendor/images/grey.png +0 -0
  77. data/public/vendor/images/html.png +0 -0
  78. data/public/vendor/images/icons-18-black.png +0 -0
  79. data/public/vendor/images/icons-18-white.png +0 -0
  80. data/public/vendor/images/icons-36-black.png +0 -0
  81. data/public/vendor/images/icons-36-white.png +0 -0
  82. data/public/vendor/images/java.png +0 -0
  83. data/public/vendor/images/linux.png +0 -0
  84. data/public/vendor/images/music.png +0 -0
  85. data/public/vendor/images/pdf.png +0 -0
  86. data/public/vendor/images/php.png +0 -0
  87. data/public/vendor/images/picture.png +0 -0
  88. data/public/vendor/images/ppt.png +0 -0
  89. data/public/vendor/images/psd.png +0 -0
  90. data/public/vendor/images/ruby.png +0 -0
  91. data/public/vendor/images/script.png +0 -0
  92. data/public/vendor/images/spinner.gif +0 -0
  93. data/public/vendor/images/txt.png +0 -0
  94. data/public/vendor/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  95. data/public/vendor/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  96. data/public/vendor/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  97. data/public/vendor/images/ui-bg_flat_10_000000_40x100.png +0 -0
  98. data/public/vendor/images/ui-bg_flat_30_cccccc_40x100.png +0 -0
  99. data/public/vendor/images/ui-bg_flat_50_5c5c5c_40x100.png +0 -0
  100. data/public/vendor/images/ui-bg_flat_55_fbec88_40x100.png +0 -0
  101. data/public/vendor/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  102. data/public/vendor/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  103. data/public/vendor/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  104. data/public/vendor/images/ui-bg_glass_20_555555_1x400.png +0 -0
  105. data/public/vendor/images/ui-bg_glass_40_0078a3_1x400.png +0 -0
  106. data/public/vendor/images/ui-bg_glass_40_ffc73d_1x400.png +0 -0
  107. data/public/vendor/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  108. data/public/vendor/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  109. data/public/vendor/images/ui-bg_glass_75_d0e5f5_1x400.png +0 -0
  110. data/public/vendor/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  111. data/public/vendor/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  112. data/public/vendor/images/ui-bg_glass_85_dfeffc_1x400.png +0 -0
  113. data/public/vendor/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  114. data/public/vendor/images/ui-bg_gloss-wave_25_333333_500x100.png +0 -0
  115. data/public/vendor/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  116. data/public/vendor/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png +0 -0
  117. data/public/vendor/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  118. data/public/vendor/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  119. data/public/vendor/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  120. data/public/vendor/images/ui-bg_highlight-soft_80_eeeeee_1x100.png +0 -0
  121. data/public/vendor/images/ui-bg_inset-hard_100_f5f8f9_1x100.png +0 -0
  122. data/public/vendor/images/ui-bg_inset-hard_100_fcfdfd_1x100.png +0 -0
  123. data/public/vendor/images/ui-bg_inset-soft_25_000000_1x100.png +0 -0
  124. data/public/vendor/images/ui-bg_inset-soft_30_f58400_1x100.png +0 -0
  125. data/public/vendor/images/ui-icons_217bc0_256x240.png +0 -0
  126. data/public/vendor/images/ui-icons_222222_256x240.png +0 -0
  127. data/public/vendor/images/ui-icons_228ef1_256x240.png +0 -0
  128. data/public/vendor/images/ui-icons_2e83ff_256x240.png +0 -0
  129. data/public/vendor/images/ui-icons_454545_256x240.png +0 -0
  130. data/public/vendor/images/ui-icons_469bdd_256x240.png +0 -0
  131. data/public/vendor/images/ui-icons_4b8e0b_256x240.png +0 -0
  132. data/public/vendor/images/ui-icons_6da8d5_256x240.png +0 -0
  133. data/public/vendor/images/ui-icons_888888_256x240.png +0 -0
  134. data/public/vendor/images/ui-icons_a83300_256x240.png +0 -0
  135. data/public/vendor/images/ui-icons_cccccc_256x240.png +0 -0
  136. data/public/vendor/images/ui-icons_cd0a0a_256x240.png +0 -0
  137. data/public/vendor/images/ui-icons_d8e7f3_256x240.png +0 -0
  138. data/public/vendor/images/ui-icons_ef8c08_256x240.png +0 -0
  139. data/public/vendor/images/ui-icons_f9bd01_256x240.png +0 -0
  140. data/public/vendor/images/ui-icons_ffd27a_256x240.png +0 -0
  141. data/public/vendor/images/ui-icons_ffffff_256x240.png +0 -0
  142. data/public/vendor/images/xls.png +0 -0
  143. data/public/vendor/images/zip.png +0 -0
  144. data/public/vendor/js/bootstrap-slider.js +1550 -0
  145. data/public/vendor/js/bootstrap.js +2317 -0
  146. data/public/vendor/js/bootstrap.min.js +7 -0
  147. data/public/vendor/js/jquery-2.1.4.js +9210 -0
  148. data/public/vendor/js/jquery-2.1.4.min.js +4 -0
  149. data/public/vendor/js/jquery-2.1.4.min.map +1 -0
  150. data/public/vendor/js/jquery-ui-1.10.2.custom.min.js +7 -0
  151. data/public/vendor/js/jquery.cookie.js +72 -0
  152. data/public/vendor/js/jquery.hammer.min.js +7 -0
  153. data/public/vendor/js/jquery.lazyload.min.js +15 -0
  154. data/public/vendor/js/jquery.localize.js +180 -0
  155. data/public/vendor/js/jquery.mobile-1.3.1.min.js +7 -0
  156. data/public/vendor/js/jquery.scrollTo-1.4.3.1.js +218 -0
  157. data/public/vendor/js/jqueryFileTree.js +95 -0
  158. data/public/vendor/js/swipeview.js +471 -0
  159. data/views/browse.haml +97 -0
  160. data/views/config.haml +115 -0
  161. data/views/layout.haml +12 -0
  162. data/views/login.haml +51 -0
  163. data/views/reader.haml +70 -0
  164. data/views/statistics.haml +108 -0
  165. data/views/tablet3.haml +80 -0
  166. metadata +334 -0
@@ -0,0 +1,191 @@
1
+ /*
2
+ styling range input
3
+ https://css-tricks.com/styling-cross-browser-compatible-range-inputs-css/
4
+ */
5
+ /* Applying base CSS styles */
6
+ input[type=range] {
7
+ -webkit-appearance: none; /* Hides the slider so that custom slider can be made */
8
+ width: 100%; /* Specific width is required for Firefox. */
9
+ }
10
+ input[type=range]::-webkit-slider-thumb {
11
+ -webkit-appearance: none;
12
+ }
13
+ input[type=range]:focus {
14
+ outline: none; /* Removes the blue border. You should probably do some kind of focus styling for accessibility reasons though. */
15
+ }
16
+ /* Styling the Thumb */
17
+ input[type=range]::-webkit-slider-thumb {
18
+ -webkit-appearance: none;
19
+ border: 1px solid #000000;
20
+ height: 36px;
21
+ width: 16px;
22
+ border-radius: 3px;
23
+ background: #ffffff;
24
+ cursor: pointer;
25
+ margin-top: -14px; /* You need to specify a margin in Chrome, but in Firefox and IE it is automatic */
26
+ box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; /* Add cool effects to your sliders! */
27
+ }
28
+ input[type=range]::-moz-range-thumb {
29
+ box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
30
+ border: 1px solid #000000;
31
+ height: 36px;
32
+ width: 16px;
33
+ border-radius: 3px;
34
+ background: #ffffff;
35
+ cursor: pointer;
36
+ }
37
+ /* styling the track */
38
+ input[type=range]::-webkit-slider-runnable-track {
39
+ width: 100%;
40
+ height: 8.4px;
41
+ cursor: pointer;
42
+ box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
43
+ background: #3071a9;
44
+ border-radius: 1.3px;
45
+ border: 0.2px solid #010101;
46
+ }
47
+ input[type=range]:focus::-webkit-slider-runnable-track {
48
+ background: #367ebd;
49
+ }
50
+ input[type=range]::-moz-range-track {
51
+ width: 100%;
52
+ height: 8.4px;
53
+ cursor: pointer;
54
+ box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
55
+ background: #3071a9;
56
+ border-radius: 1.3px;
57
+ border: 0.2px solid #010101;
58
+ }
59
+ /* end styling range input */
60
+
61
+ /*
62
+ styling radio input
63
+ http://schinckel.net/2012/01/23/styling-radio-buttons-like-a-segmented-button/
64
+ */
65
+ .segmented-button {
66
+ padding: 12px;
67
+ }
68
+ .segmented-button input[type="radio"] {
69
+ width: 0px;
70
+ height: 0px;
71
+ display: none;
72
+ }
73
+ .segmented-button label {
74
+ /*display: -moz-inline-box;
75
+ -moz-box-orient: vertical;*/
76
+ display: inline-block;
77
+ vertical-align: middle;
78
+ *vertical-align: auto;
79
+ /* -moz-border-radius: 4px;
80
+ -webkit-border-radius: 4px;
81
+ -o-border-radius: 4px;
82
+ -ms-border-radius: 4px;
83
+ -khtml-border-radius: 4px;*/
84
+ border-radius: 4px;
85
+ text-shadow: white;
86
+ /* background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(100%, #e4e4e4));
87
+ background: -webkit-linear-gradient(#ffffff, #e4e4e4);
88
+ background: -moz-linear-gradient(#ffffff, #e4e4e4);
89
+ background: -o-linear-gradient(#ffffff, #e4e4e4);
90
+ background: -ms-linear-gradient(#ffffff, #e4e4e4);*/
91
+ background: linear-gradient(#111, #2D2D2D);
92
+ border: 1px solid #111;
93
+ color: #FFF;
94
+ padding: 5px 24px;
95
+ padding-bottom: 3px;
96
+ font-size: 12px;
97
+ cursor: pointer;
98
+ font-family: Helvetica;
99
+ /* -moz-border-radius: 0px;
100
+ -webkit-border-radius: 0px;
101
+ -o-border-radius: 0px;
102
+ -ms-border-radius: 0px;
103
+ -khtml-border-radius: 0px;*/
104
+ border-radius: 0px;
105
+ margin-right: -5px;
106
+ }
107
+ .segmented-button label {
108
+ *display: inline;
109
+ }
110
+ .segmented-button label:hover2 {
111
+ /*-moz-box-shadow: 0 0 5px 1px rgba(0, 0, 0, 0.1);
112
+ -webkit-box-shadow: 0 0 5px 1px rgba(0, 0, 0, 0.1);
113
+ -o-box-shadow: 0 0 5px 1px rgba(0, 0, 0, 0.1);*/
114
+ box-shadow: 0 0 5px 1px rgba(0, 0, 0, 0.1);
115
+ color: #333333;
116
+ }
117
+ .segmented-button label:active, .segmented-button label.active {
118
+ /* background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e4e4e4), color-stop(100%, #ffffff));
119
+ background: -webkit-linear-gradient(#e4e4e4, #ffffff);
120
+ background: -moz-linear-gradient(#e4e4e4, #ffffff);
121
+ background: -o-linear-gradient(#e4e4e4, #ffffff);
122
+ background: -ms-linear-gradient(#e4e4e4, #ffffff);*/
123
+ background: linear-gradient(#e4e4e4, #ffffff);
124
+ }
125
+ .segmented-button label:disabled, .segmented-button label.disabled {
126
+ /*background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(100%, #efefef));
127
+ background: -webkit-linear-gradient(#ffffff, #efefef);
128
+ background: -moz-linear-gradient(#ffffff, #efefef);
129
+ background: -o-linear-gradient(#ffffff, #efefef);
130
+ background: -ms-linear-gradient(#ffffff, #efefef);*/
131
+ background: linear-gradient(#ffffff, #efefef);
132
+ cursor: default;
133
+ color: #b2b2b2;
134
+ border-color: #cccccc;
135
+ /* -moz-box-shadow: none;
136
+ -webkit-box-shadow: none;
137
+ -o-box-shadow: none;*/
138
+ box-shadow: none;
139
+ }
140
+ .segmented-button label.first {
141
+ /* -moz-border-radius-topleft: 4px;
142
+ -webkit-border-top-left-radius: 4px;
143
+ -o-border-top-left-radius: 4px;
144
+ -ms-border-top-left-radius: 4px;
145
+ -khtml-border-top-left-radius: 4px;*/
146
+ border-top-left-radius: 4px;
147
+ /*-moz-border-radius-bottomleft: 4px;
148
+ -webkit-border-bottom-left-radius: 4px;
149
+ -o-border-bottom-left-radius: 4px;
150
+ -ms-border-bottom-left-radius: 4px;
151
+ -khtml-border-bottom-left-radius: 4px;*/
152
+ border-bottom-left-radius: 4px;
153
+ }
154
+ .segmented-button label.last {
155
+ /* -moz-border-radius-topright: 4px;
156
+ -webkit-border-top-right-radius: 4px;
157
+ -o-border-top-right-radius: 4px;
158
+ -ms-border-top-right-radius: 4px;
159
+ -khtml-border-top-right-radius: 4px;*/
160
+ border-top-right-radius: 4px;
161
+ /*-moz-border-radius-bottomright: 4px;
162
+ -webkit-border-bottom-right-radius: 4px;
163
+ -o-border-bottom-right-radius: 4px;
164
+ -ms-border-bottom-right-radius: 4px;
165
+ -khtml-border-bottom-right-radius: 4px;*/
166
+ border-bottom-right-radius: 4px;
167
+ }
168
+ .segmented-button input:checked + label, .segmented-button label.selected {
169
+ /*background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e4e4e4), color-stop(100%, #ffffff));
170
+ background: -webkit-linear-gradient(#e4e4e4, #ffffff);
171
+ background: -moz-linear-gradient(#e4e4e4, #ffffff);
172
+ background: -o-linear-gradient(#e4e4e4, #ffffff);
173
+ background: -ms-linear-gradient(#e4e4e4, #ffffff);*/
174
+ background: linear-gradient(#5393C5, #6FACD5);
175
+ }
176
+ .segmented-button input:disabled + label {
177
+ /*background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(100%, #efefef));
178
+ background: -webkit-linear-gradient(#ffffff, #efefef);
179
+ background: -moz-linear-gradient(#ffffff, #efefef);
180
+ background: -o-linear-gradient(#ffffff, #efefef);
181
+ background: -ms-linear-gradient(#ffffff, #efefef);*/
182
+ background: linear-gradient(#ffffff, #efefef);
183
+ cursor: default;
184
+ color: #b2b2b2;
185
+ border-color: #cccccc;
186
+ /*-moz-box-shadow: none;
187
+ -webkit-box-shadow: none;
188
+ -o-box-shadow: none;*/
189
+ box-shadow: none;
190
+ }
191
+ /* end styling radio input */
Binary file
Binary file
@@ -0,0 +1,391 @@
1
+ /*!
2
+ License: refer to LICENSE file
3
+ */
4
+
5
+
6
+ // global variables
7
+ var hasTouch = 'ontouchstart' in window; //find out if device is touch device or not
8
+ var items_in_row = 0; // number of items in a row (inside #container)
9
+ var lastbook = getHashParams()['lastbook'];
10
+ if (!lastbook) lastbook = '';
11
+ var isBookSelectMode = false;
12
+ var isMobile = navigator.userAgent.match(/(iPad)|(iPhone)|(iPod)|(android)|(webOS)/i)
13
+ var primary_list;
14
+ var last_window_width = window.innerWidth;
15
+ var isDeleteMode = false;
16
+
17
+ // set the last browse selected on cookie
18
+ $.cookie(uport() + '.lastbrowse', '/browse/', { path: '/' });
19
+
20
+ // detect os
21
+ var OSName="Unknown OS";
22
+ if (navigator.appVersion.indexOf("Win")!=-1) OSName="Windows";
23
+ if (navigator.appVersion.indexOf("Mac")!=-1) OSName="MacOS";
24
+ if (navigator.appVersion.indexOf("X11")!=-1) OSName="UNIX";
25
+ if (navigator.appVersion.indexOf("Linux")!=-1) OSName="Linux";
26
+
27
+
28
+ //window.console||(console={log:function(){}});
29
+ // add support to console.log if the browser doesn't support it
30
+ if (!console.log) {
31
+ console = {
32
+ log:function(str) {
33
+ window.console.log(str);
34
+ }
35
+ }
36
+ }
37
+
38
+ function homepage() {
39
+ // get dir from hash
40
+ var hashes = getHashParams();
41
+ var dir = hashes['dir'].split('/');
42
+
43
+ dir.pop();
44
+
45
+ window.location.hash = 'dir=' + dir.join('/')
46
+ return false;
47
+ }
48
+
49
+ function exe_order_by(str) {
50
+ // toggle the order button
51
+ $('.nav-collapse').collapse('toggle');
52
+
53
+ $.cookie(uport() + '.order_by', str, { path: '/' });
54
+
55
+ reload_dir_lists( getHashParams()['dir'], $('#searchbox').val() );
56
+ }
57
+
58
+ function reload_sources() {
59
+ var ul = $('#ul-sources');
60
+ ul.empty();
61
+
62
+ $.getScript('/list_sources', function() {
63
+ for (i in sources) {
64
+ ul.append('<li><a tabindex="-1" href="#dir=' + sources[i] + '" rel="' + sources[i] + '">' + i + '&nbsp;<i class="icon-bookmark"></i>&nbsp;' + sources[i] + '</a></li>');
65
+ }
66
+ });
67
+ }
68
+
69
+ function func_set_last_selected_item( str ) {
70
+ $.cookie(uport() + '.last_selected_item', str, { path: '/' });
71
+ }
72
+
73
+ function reload_dir_lists(dir_path, keyword) {
74
+ // set default to name for order_by
75
+ var order_by = 'name';
76
+ var co = $.cookie(uport() + '.order_by');
77
+ if ( co ) {
78
+ switch ( co ) {
79
+ case 'name':
80
+ case 'size':
81
+ case 'date':
82
+ order_by = co;
83
+ break;
84
+ }
85
+ }
86
+ $.cookie(uport() + '.order_by', order_by, { path: '/' }) ;
87
+
88
+ // set the last path selected on cookie
89
+ $.cookie(uport() + '.lastpath', dir_path, { path: '/' });
90
+
91
+ var el = $('#dir_lists');
92
+ el.empty();
93
+
94
+ $.post('/lists_dir', { dir: dir_path, keyword: keyword, order_by: order_by }, function(data) {
95
+ el.append(data);
96
+
97
+ // make li evenly horizontally filled
98
+ var window_width = $(window).innerWidth();
99
+ var li_width = $('.updir').eq(0).innerWidth();
100
+ var num = parseInt(window_width / li_width);
101
+ num = parseInt(window_width / num);
102
+ $('.directory, .file').css('width', num +'px');
103
+
104
+ // set container top height
105
+ container_height_refresh();
106
+
107
+ // replace all links to desktop reader
108
+ if (!hasTouch) {
109
+ for (i in el.find('LI A')) {
110
+ var el_a = el.find('LI A').eq(i);
111
+ if (el_a.parent().hasClass('file')) {
112
+ el_a.attr('href', el_a.attr('href').replace(/reader2/,'reader') );
113
+ }
114
+ }
115
+ }
116
+
117
+ // make images load only when scrolled into view
118
+ $("img.lazy").lazyload({
119
+ //effect : "fadeIn",
120
+ threshold : 500
121
+ });
122
+
123
+ // get to the last selected item
124
+ var el_lsi = $('span:contains("' + $.cookie(uport() + '.last_selected_item') + '")').parent();
125
+ if (el_lsi.length == 1) {
126
+ $(el_lsi).addClass('last-selected-item');
127
+ $(document).scrollTo( el_lsi, {offset: - $('.navbar-inner').height() } );
128
+ }
129
+
130
+ // apply click event for directory and file, so it will be focused next time
131
+ $('li.directory > a, li.file > a').click( function() {
132
+ func_set_last_selected_item( $(this).text() );
133
+ });
134
+ $('.updir > a').click( function() {
135
+ func_set_last_selected_item( getHashParams()['dir'].split('/').pop() );
136
+ });
137
+
138
+ // make sure files are deleteable if in delete mode
139
+ if (isDeleteMode) {
140
+ delete_enable();
141
+ }
142
+
143
+ // trigger scroll event, so the img.lazy show thumbnails
144
+ $(window).scroll();
145
+ });
146
+ }
147
+
148
+ function delete_book(bookcode) {
149
+ // send delete bookcode command to server
150
+ $.post('/delete_book', { bookcode: bookcode });
151
+ }
152
+
153
+ function toggleDelete( el ) {
154
+ var bookcode = el.attr('bookcode');
155
+
156
+ var el = $('[bookcode=' + bookcode + ']');
157
+
158
+ if (el.children('.countdown').length < 1) {
159
+ el.prepend("<div class='countdown'><p>Z</p></div>");
160
+
161
+ countdownDelete( el, 6 );
162
+ }
163
+ else {
164
+ var timer = el.attr('timer');
165
+ clearTimeout( timer );
166
+
167
+ el.children('.countdown').remove();
168
+ }
169
+ }
170
+
171
+ function countdownDelete(el, time) {
172
+ time = time - 1;
173
+
174
+ if (time > 0) {
175
+ // count down reduce by 1
176
+ el.children('.countdown').children('p').text(time);
177
+
178
+ var timer = setTimeout( function() {
179
+ countdownDelete(el, time);
180
+ }, 1000);
181
+
182
+ el.attr('timer', timer);
183
+ }
184
+ else {
185
+ // count down over, now delete book
186
+ el.removeAttr('timer');
187
+
188
+ var bookcode = el.attr('bookcode');
189
+ delete_book(bookcode);
190
+
191
+ el.fadeOut( "slow", function() {
192
+ // show trash if doesn't exist, change trash icon to full
193
+ var t = $('#trash');
194
+
195
+ if (t.length <= 0) {
196
+ var li_link = getHashParams()['dir'] + '/Trash/';
197
+ var li_trash = '<li class="directory collapsed trash" id="trash"><a href="#dir=' + li_link + '"><img src="/images/trash-full-mini.png" /><span>Trash</span></a></li>'
198
+ $('#ul-lists').append(li_trash);
199
+ }
200
+ else {
201
+ var img = t.find('img').attr('src').split('/').pop();
202
+
203
+ if (img == 'trash-empty-mini.png') {
204
+ t.find('img').attr('src', '/images/trash-full-mini.png');
205
+ }
206
+ }
207
+ });
208
+ }
209
+ }
210
+
211
+ function delete_enable() {
212
+ isDeleteMode = true;
213
+
214
+ $('.nav-collapse').collapse('toggle');
215
+
216
+ var el = $('#btnDeleteDisable');
217
+ el.removeClass('hidden');
218
+ el.show();
219
+
220
+ // replace click event to toggle delete
221
+ el = $('li.file > a');
222
+ el.attr('onclick','').unbind('click');
223
+ el.click( function() {
224
+ toggleDelete( $(this) );
225
+
226
+ return false;
227
+ });
228
+ }
229
+
230
+ function delete_disable() {
231
+ isDeleteMode = false;
232
+
233
+ $('[timer]').each(function() {
234
+ var timer = $(this).attr('timer');
235
+ clearTimeout( timer );
236
+
237
+ $(this).children('.countdown').remove();
238
+ });
239
+
240
+ var el = $('#btnDeleteDisable');
241
+ el.hide();
242
+ el.addClass('hidden');
243
+
244
+ // restore remember last clicked item
245
+ el = $('li.file > a');
246
+ el.attr('onclick','').unbind('click');
247
+ el.click( function() {
248
+ func_set_last_selected_item( $(this).text() );
249
+ });
250
+
251
+ }
252
+
253
+
254
+ function container_height_refresh() {
255
+ // $('#container').css('top', $('#navtop').outerHeight() - $('#navcollapse').outerHeight() );
256
+ }
257
+
258
+ function reload_path_label(dir) {
259
+ // set container top height
260
+ container_height_refresh();
261
+ }
262
+
263
+ $(document).keydown(function(e) {
264
+ /* escape key */
265
+ if (e.keyCode == 27) {
266
+ homepage();
267
+ return false;
268
+ }
269
+ });
270
+
271
+ // change dir on hashchange
272
+ window.addEventListener("hashchange", function() {
273
+ // get dir from hash
274
+ var hashes = getHashParams();
275
+ var dir = hashes['dir'];
276
+
277
+ // stop if dir not defined
278
+ if (dir == undefined) {
279
+ return false;
280
+ }
281
+
282
+ // get keyword from searchbox
283
+ var keyword = $('#searchbox').val();
284
+
285
+ // save keyword used for search
286
+ $.cookie(uport() + '.lastsearch', keyword, { path: '/' });
287
+
288
+ // update path label
289
+ var dirs = dir.split('/');
290
+ dirs.shift();
291
+ var el = '';
292
+ var ds;
293
+ for (var i = 0; i < dirs.length - 1 ; i++) {
294
+ var li_class = '';
295
+ if (i >= dirs.length) {
296
+ li_class = ' class="active"';
297
+ }
298
+
299
+ ds = '/';
300
+ for (var j = 0; j < i; j++) {
301
+ ds += dirs[j] + '/';
302
+ }
303
+ ds += dirs[i];
304
+ el += '<li' + li_class + '><a href="#dir=' + ds + '">' + dirs[i] + '</a></li>';
305
+ }
306
+ el += '<li' + li_class + '>' + dirs[i] + '</li>';
307
+ $('#path').html(el);
308
+
309
+ // reload the dir list
310
+ reload_dir_lists(dir, keyword);
311
+ });
312
+
313
+ // page init
314
+ $(function() {
315
+ // load the text localization
316
+ reload_locale();
317
+
318
+ // load sources for menu
319
+ reload_sources();
320
+
321
+ if ($.cookie(uport() + '.lastsearch')) {
322
+ $('#searchbox').val( $.cookie(uport() + '.lastsearch') );
323
+ }
324
+
325
+ $('#searchbox').bind('change', function(e) {
326
+ // get dir from hash
327
+ var hashes = getHashParams();
328
+ var dir = hashes['dir'];
329
+
330
+ // get keyword from searchbox
331
+ var keyword = $('#searchbox').val();
332
+
333
+ // stop if it the search is same as last search
334
+ if (keyword == $.cookie(uport() + '.lastsearch')) return false;
335
+
336
+ // save keyword used for search
337
+ $.cookie(uport() + '.lastsearch', keyword, { path: '/' });
338
+
339
+ // reload the dir list
340
+ reload_dir_lists(dir, keyword);
341
+ });
342
+ $('#searchbox').bind('keyup', function(e) {
343
+ e = e || window.event;
344
+
345
+ if (e.keyCode == 13 || e.keyCode == 27) {
346
+ // enter key || escape key, unfocus the searchbox
347
+ $('#searchbox').blur();
348
+ }
349
+
350
+ // get dir from hash
351
+ var hashes = getHashParams();
352
+ var dir = hashes['dir'];
353
+
354
+ // get keyword from searchbox
355
+ var keyword = $('#searchbox').val();
356
+
357
+ // stop if it the search is same as last search
358
+ if (keyword == $.cookie(uport() + '.lastsearch')) return false;
359
+
360
+ // save keyword used for search
361
+ $.cookie(uport() + '.lastsearch', keyword, { path: '/' });
362
+
363
+ // reload the dir list
364
+ reload_dir_lists(dir, keyword);
365
+ });
366
+
367
+ // load dir and file list
368
+ setTimeout( function() {
369
+ setTimeout(function() {
370
+ // set container top height, make sure it runs after everything
371
+ container_height_refresh();
372
+ }, 100);
373
+
374
+
375
+ // set hash to nothing first, then shortly after the correct hash path will be load, so the dir list will be run
376
+ window.location.hash = '';
377
+
378
+ setTimeout(function() {
379
+ if ($.cookie(uport() + '.lastpath')) {
380
+ // load last path remembered
381
+ window.location.hash = '#dir=' + $.cookie(uport() + '.lastpath');
382
+ }
383
+ else {
384
+ // click the first source if there is no lastpath
385
+ window.location.hash = $('#ul-sources').find('LI A').eq(0).attr('href');
386
+ }
387
+ }, 50);
388
+
389
+ }, 500);
390
+ });
391
+