add navigation from subalbums to upper albums
[booh] / html_merges.rb
1 #
2 #                         *  BOOH  *
3 #
4 # A.k.a `Best web-album Of the world, Or your money back, Humerus'.
5 #
6 # The acronyn sucks, however this is a tribute to Dragon Ball by
7 # Akira Toriyama, where the last enemy beaten by heroes of Dragon
8 # Ball is named "Boo". But there was already a free software project
9 # called Boo, so this one will be it "Booh". Or whatever.
10 #
11 #
12 # Copyright (c) 2004 Guillaume Cottenceau <gc3 at bluewin.ch>
13 #
14 # This software may be freely redistributed under the terms of the GNU
15 # public license version 2.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program; if not, write to the Free Software
19 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20
21 # holds static data to merge in the html "themes"
22
23 require 'gettext'
24 bindtextdomain("booh")
25 require 'iconv'
26 $CURRENT_CHARSET = `locale charmap`.chomp
27
28 def utf8(string)
29     return Iconv::iconv("UTF-8", $CURRENT_CHARSET, string).to_s
30 end
31
32 $head_code = <<'EOF'
33 <meta name="generator" content="Generated by Booh! http://zarb.org/~gc/html/booh.html">
34
35 <script language="JavaScript1.1" type="text/JavaScript">
36
37 var images = new Array(~~images~~);
38 ~~other_images~~
39 var other_sizes = new Array(~~other_sizes~~);
40 var captions = new Array(~~captions~~);
41
42 var images_ary = new Array();
43 var images_loaded = new Array();
44 var current = 0;
45 var slideshow = 0;
46 var slideshow_pause = 3;
47 var slideshow_timer = null;
48
49 for (i = 0; i < images.length; i++) { 
50     /* this array will contain 0 if image not yet loaded, 1 when loading,
51      * 2 when complete */
52     images_loaded[i] = 0;
53 }
54
55 function dbg(t) {
56     document.getElementById('dbg_text').firstChild.data += t + "\n";
57 }
58
59 /* load image, return 1 if image is finished loading */
60 function load(i) {
61     if (images_loaded[i] == 0) {
62         images_ary[i] = new Image();
63         images_ary[i].src = images[i];
64         images_loaded[i] = 1;
65     }
66     if (images_loaded[i] == 1) {
67         if (images_ary[i].complete) {
68             images_loaded[i] = 2;
69         } else {
70             return 0;
71         }
72     }
73     return 1;
74 }
75
76 function preload() { 
77
78     /* favor current image, if user clicked on `last' or something */
79     load(current);
80
81     /* don't blindly preload all images at the beginning,
82      * but rather load them one by one, in order to get
83      * next ones faster, beginning with next to current
84      */
85     for (i = current + 1; i < images.length && i <= current + 5; i++) { 
86         if (load(i) == 0) {
87             setTimeout("preload()", 500);
88             return;
89         }
90     }
91     for (i = current - 1; i >= current - 3; i--) { 
92         if (i >= 0) {
93             if (load(i) == 0) {
94                 setTimeout("preload()", 500);
95                 return;
96             }
97         }
98     }
99
100     setTimeout("preload()", 500);
101 }
102
103 function init() {
104   
105     /* retrieve GET parameters */
106     all_params = location.href.split("?")
107     if (all_params.length > 1) {
108         params = all_params[1].split("&");
109         for (i = 0; i < params.length; i++) {
110             keyvalue = params[i].split("=");
111             if (keyvalue[0] == "slideshow_pause") {
112                 slideshow_pause = keyvalue[1];
113             }
114             if (keyvalue[0] == "run_slideshow") {
115                 toggle_slideshow();
116             }
117             if (keyvalue[0] == "current") {
118                 for (i = 0; i < images.length; i++) {
119                     if (images[i] == keyvalue[1]) {
120                         current = i;
121                         break;
122                     }
123                 }
124             }
125         }
126     }
127
128     preload();
129     display_current();
130 }
131
132 function update_sensibilities() {
133     if (current == 0) {
134         document.getElementById("b_first").disabled = true;
135         document.getElementById("b_previous").disabled = true;
136         document.getElementById("b_next").disabled = false;
137         document.getElementById("b_last").disabled = false;
138     } else if (current == images.length - 1) {
139         document.getElementById("b_first").disabled = false;
140         document.getElementById("b_previous").disabled = false;
141         document.getElementById("b_next").disabled = true;
142         document.getElementById("b_last").disabled = true;
143     } else {
144         document.getElementById("b_first").disabled = false;
145         document.getElementById("b_previous").disabled = false;
146         document.getElementById("b_next").disabled = false;
147         document.getElementById("b_last").disabled = false;
148     }
149 }
150
151 function set_cursor_(value, element) {
152
153     if (!element || !element.style) {
154         return;
155     }
156
157     element.style.cursor = value;
158
159     children = element.childNodes;
160     for (i = 0; i < children.length; i++) {
161         set_cursor_(value, children.item[i]);
162     }
163 }
164
165 function set_cursor(value) {
166     set_cursor_(value, document.getElementById('body'));
167 }
168
169 function show_current_text() {
170     /* don't show text if image not yet loaded because navigator
171      * won't refresh it during load */
172     if (images_loaded[current] == 2) {
173         eval("document.getElementById('image_counter')" +
174                      ".firstChild.data = '" + ( current + 1 ) + "/" + images.length + "'");
175         eval("document.getElementById('main_text')" +
176                      ".firstChild.data = \"" + ( captions[current] || images[current] ) + "\"");
177         for (i = 0; i < other_sizes.length; i++) { 
178             eval("linkelems = document.getElementById('link" + other_sizes[i] + "').href.split('?');" +
179                  "document.getElementById('link" + other_sizes[i] + "').href = linkelems[0] + '?current=" + eval("images_" + other_sizes[i] + "[current]") + "'");
180         }
181         set_cursor("default");
182     } else {
183         setTimeout("show_current_text()", 100);
184         set_cursor("wait");
185     }
186 }
187
188 function display_current() {
189     eval("document.main_img.src = images[" + current + "]");
190     show_current_text();
191     update_sensibilities();
192 }
193
194 function first() {
195     if (slideshow == 1) {
196         toggle_slideshow(true);
197     }
198     
199     current = 0;
200     display_current();
201 }
202
203 function next() {
204     if (slideshow == 1) {
205         toggle_slideshow(true);
206     }
207
208     if (current < images.length - 1) {
209         current++;
210         display_current();
211     }
212 }
213
214 function previous() {
215     if (slideshow == 1) {
216         toggle_slideshow(true);
217     }
218
219     if (current > 0) {
220         current--;
221         display_current();
222     }
223 }
224
225 function last() {
226     if (slideshow == 1) {
227         toggle_slideshow(true);
228     }
229
230     current = images.length - 1;
231     display_current();
232 }
233
234 function toggle_slideshow(now) {
235     if (slideshow == 0) {
236         document.getElementById("b_slideshow").value = "~~stop_slideshow~~";
237         slideshow = 1;
238         if (current == images.length - 1) {
239             current = -1;
240         }
241         if (now) {
242             run_slideshow();
243         } else {
244             setTimeout("run_slideshow()", slideshow_pause * 1000);
245         }
246     } else {
247         clearTimeout(slideshow_timer);
248         document.getElementById("b_slideshow").value = "~~run_slideshow~~";
249         slideshow = 0;
250     }
251 }
252
253 function run_slideshow() {
254     if (slideshow == 0) {
255         return;
256     }
257
258     if (images_loaded[current + 1] == 2) {
259         current++;
260         display_current();
261         slideshow_timer = setTimeout("run_slideshow()", slideshow_pause * 1000);
262     } else {
263         slideshow_timer = setTimeout("run_slideshow()", 500);
264     }
265
266     if (current == images.length - 1) {
267         toggle_slideshow(true);
268     }
269 }
270 </script>
271 EOF
272
273 $head_code.sub!('~~run_slideshow~~', utf8(_('Run slideshow!')))
274 $head_code.sub!('~~stop_slideshow~~', utf8(_('Stop slideshow')))
275
276 $body_additions = <<'EOF'
277 onload="init()" id="body"
278 EOF
279
280 $button_first = '
281     <form><input type="button"
282                  onclick="first()"
283                  value="' + utf8(_('<<- First')) + '"
284                  id="b_first"></form>';
285
286 $button_previous = '
287     <form><input type="button"
288                  onclick="previous()"
289                  value="' + utf8(_('<- Previous')) + '"
290                  id="b_previous"></form>';
291
292 $button_next = '
293     <form><input type="button"
294                  onclick="next()"
295                  value="' + utf8(_('Next ->')) + '"
296                  id="b_next"></form>';
297
298 $button_last = '
299     <form><input type="button"
300                  onclick="last()"
301                  value="' + utf8(_('Last ->>')) + '"
302                  id="b_last"></form>';
303
304 $button_slideshow = '
305   <form><input type="button"
306                onclick="toggle_slideshow(true)"
307                value="' + utf8(_('Run slideshow!')) + '"
308                id="b_slideshow">
309   </form>';
310
311 $image = <<'EOF'
312   <img name="main_img">
313 EOF
314
315 $image_counter_additions = <<'EOF'
316   id="image_counter"
317 EOF
318
319 $caption_additions = <<'EOF'
320   id="main_text"
321 EOF
322
323 $body_code = <<'EOF'
324 EOF
325