dont save the preferred size in the images page
[booh] / lib / 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
26 require 'booh/booh-lib'
27 include Booh
28
29 $image_head_code = <<'EOF'
30 <meta name="generator" content="Generated by Booh! http://zarb.org/~gc/html/booh.html">
31
32 <script language="JavaScript1.1" type="text/JavaScript">
33 var images = new Array(~~images~~);
34 ~~other_images~~
35 var other_sizes = new Array(~~other_sizes~~);
36 var captions = new Array(~~captions~~);
37
38 var images_ary = new Array();
39 var images_loaded = new Array();
40 var current = 0;
41 var slideshow = 0;
42 var slideshow_pause = null;
43 var slideshow_timer = null;
44
45 for (i = 0; i < images.length; i++) { 
46     /* this array will contain 0 if image not yet loaded, 1 when loading,
47      * 2 when complete */
48     images_loaded[i] = 0;
49 }
50
51 function dbg(t) {
52     document.getElementById('dbg_text').innerHTML += t + "\n";
53 }
54
55 /* load image, return 1 if image is finished loading */
56 function load(i) {
57     if (images_loaded[i] == 0) {
58         images_ary[i] = new Image();
59         images_ary[i].src = images[i];
60         images_loaded[i] = 1;
61     }
62     if (images_loaded[i] == 1) {
63         if (images_ary[i].complete) {
64             images_loaded[i] = 2;
65         } else {
66             return 0;
67         }
68     }
69     return 1;
70 }
71
72 function getparam(key) {
73     all_params = location.href.split("#")
74     if (all_params.length > 1) {
75         params = all_params[1].split("&");
76         for (i = 0; i < params.length; i++) {
77             keyvalue = params[i].split("=");
78             if (keyvalue[0] == key) {
79                 return keyvalue[1];
80             }
81         }
82     }
83     return null;
84 }
85
86 function loadcurrent(img) {
87     for (i = 0; i < images.length; i++) {
88         if (images[i] == img) {
89             current = i;
90             display_current();
91             return;
92         }
93     }
94     current = 0;
95     display_current();
96 }
97
98 function browser_href() {
99     all = location.href.split("/");
100     return all[all.length - 1];
101 }
102
103 /* check URL for changes; allows the URL to reflect currently showed image */
104 var currentURL = '';
105 function checkURL() {
106     if (currentURL == 'ignore1') {
107         // do nothing
108     } else if (currentURL == 'ignore2') {
109         currentURL = browser_href();
110     } else {
111         href = browser_href();
112         if (href != currentURL) {
113             currentURL = href;
114             img = getparam('current');
115             loadcurrent(img);
116         }
117     }
118     setTimeout("checkURL()", 100);
119 }
120
121 function preload() { 
122
123     /* favor current image, if user clicked on `last' or something */
124     load(current);
125
126     /* don't blindly preload all images at the beginning,
127      * but rather load them one by one, in order to get
128      * next ones faster, beginning with next to current
129      */
130     if (current + 1 < images.length && load(current + 1) == 0) {
131         setTimeout("preload()", 500);
132         return;
133     }
134     if (current - 1 >= 0 && load(current - 1) == 0) {
135         setTimeout("preload()", 500);
136         return;
137     }
138
139     for (i = current + 2; i < images.length && i <= current + 5; i++) { 
140         if (load(i) == 0) {
141             setTimeout("preload()", 500);
142             return;
143         }
144     }
145     for (i = current - 2; i >= current - 3; i--) { 
146         if (i >= 0) {
147             if (load(i) == 0) {
148                 setTimeout("preload()", 500);
149                 return;
150             }
151         }
152     }
153
154     setTimeout("preload()", 500);
155 }
156
157 function add_cookie(val) {
158     var expires = new Date(new Date().getTime() + (30 * 86400000));  // 30 days
159     document.cookie = val
160                       + '; expires=' + expires.toGMTString()
161                       + '; path=/';
162 }
163
164 function get_cookie(key) {
165     if (document.cookie) {
166         var index = document.cookie.indexOf(key);
167         if (index != -1) {
168             var oleft = (document.cookie.indexOf('=', index) + 1);
169             var oright = document.cookie.indexOf(';', index);
170             if (oright == -1) {
171                 oright = document.cookie.length;
172             }
173             return document.cookie.substring(oleft, oright);
174         }
175     }
176     return null;
177 }
178
179 function init() {
180
181     if (getparam('run_slideshow')) {
182         toggle_slideshow();
183     }
184
185     checkURL();
186
187     preload();
188     if (images.length == 1) {
189         document.getElementById("b_slideshow").disabled = true;
190         document.getElementById("b_slideshow").setAttribute("class", "disabled");
191     }
192
193     preferred_pause = get_cookie('booh-slideshow-pause-~~theme~~');
194     if (preferred_pause != null) {
195         document.getElementById('secs').value = preferred_pause;
196     }
197
198     if (navigator.userAgent.indexOf('Opera') == -1) {
199         document.onkeydown = keyDownEvent;
200     }
201 }
202
203 function update_sensibilities() {
204     if (current == 0) {
205         document.getElementById("b_first").disabled = true;
206         document.getElementById("b_previous").disabled = true;
207         document.getElementById("b_first").setAttribute("class", "disabled");
208         document.getElementById("b_previous").setAttribute("class", "disabled");
209     } else {
210         document.getElementById("b_first").disabled = false;
211         document.getElementById("b_previous").disabled = false;
212         document.getElementById("b_first").removeAttribute("class");
213         document.getElementById("b_previous").removeAttribute("class");
214     }
215
216     if (current == images.length - 1) {
217         document.getElementById("b_next").disabled = true;
218         document.getElementById("b_last").disabled = true;
219         document.getElementById("b_next").setAttribute("class", "disabled");
220         document.getElementById("b_last").setAttribute("class", "disabled");
221     } else {
222         document.getElementById("b_next").disabled = false;
223         document.getElementById("b_last").disabled = false;
224         document.getElementById("b_next").removeAttribute("class");
225         document.getElementById("b_last").removeAttribute("class");
226     }
227 }
228
229 function set_cursor_(value, element) {
230
231     if (!element || !element.style) {
232         return;
233     }
234
235     element.style.cursor = value;
236
237     children = element.childNodes;
238     for (i = 0; i < children.length; i++) {
239         set_cursor_(value, children.item[i]);
240     }
241 }
242
243 function set_cursor(value) {
244     set_cursor_(value, document.getElementById('body'));
245     set_cursor_(value, document.getElementById('b_first'));
246     set_cursor_(value, document.getElementById('b_previous'));
247     set_cursor_(value, document.getElementById('b_next'));
248     set_cursor_(value, document.getElementById('b_last'));
249 }
250
251 function show_current_text() {
252     /* don't show text if image not yet loaded because navigator
253      * won't refresh it during load */
254     if (images_loaded[current] == 2) {
255         document.getElementById('image_counter').innerHTML = ( current + 1 ) + "/" + images.length;
256         document.getElementById('main_text').innerHTML = captions[current];
257         for (i = 0; i < other_sizes.length; i++) { 
258             if (other_sizes[i] == "original") {
259                 document.getElementById('link' + other_sizes[i]).href = eval("images_" + other_sizes[i] + "[current]");
260             } else {
261                 document.getElementById('link' + other_sizes[i]).href = 'image-' + other_sizes[i] + '.html#current=' + eval("images_" + other_sizes[i] + "[current]");
262             }
263         }
264         document.getElementById('thumbnails').href = 'thumbnails-~~current_size~~.html#' + images[current];
265         set_cursor("default");
266     } else {
267         setTimeout("show_current_text()", 100);
268         set_cursor("wait");
269     }
270 }
271
272 function display_current() {
273     document.main_img.src = images[current];
274     oldhref = browser_href();
275     newhref = 'image-~~current_size~~.html#current=' + images[current];
276     if (oldhref != newhref) {
277         currentURL = 'ignore1';
278         location.href = newhref;
279         currentURL = 'ignore2';
280     }
281     show_current_text();
282     update_sensibilities();
283 }
284
285 function first() {
286     if (slideshow == 1) {
287         toggle_slideshow(true);
288     }
289     
290     current = 0;
291     display_current();
292 }
293
294 function next() {
295     if (slideshow == 1) {
296         toggle_slideshow(true);
297     }
298
299     if (current < images.length - 1) {
300         current++;
301         display_current();
302     }
303 }
304
305 function next10() {
306     if (slideshow == 1) {
307         toggle_slideshow(true);
308     }
309
310     if (current < images.length - 11) {
311         current += 10;
312     } else {
313         current = images.length - 1;
314     }
315     display_current();
316 }
317
318 function previous() {
319     if (slideshow == 1) {
320         toggle_slideshow(true);
321     }
322
323     if (current > 0) {
324         current--;
325         display_current();
326     }
327 }
328
329 function previous10() {
330     if (slideshow == 1) {
331         toggle_slideshow(true);
332     }
333
334     if (current > 10) {
335         current -= 10;
336     } else {
337         current = 0;
338     }
339     display_current();
340 }
341
342 function last() {
343     if (slideshow == 1) {
344         toggle_slideshow(true);
345     }
346
347     current = images.length - 1;
348     display_current();
349 }
350
351 function keyDownEvent(key) {
352     if (!key) {
353         key = event;
354         key.which = key.keyCode;
355     }
356     switch (key.which) {
357       case 36: // home
358         first();
359         break;
360       case 35: // end
361         last();
362         break;
363       case 37: // left
364         previous();
365         break;
366       case 39: // right
367         next();
368         break;
369       case 38: // up
370         previous10();
371         break;
372       case 40: // down
373         next10();
374         break;
375     }
376 }
377
378 function toggle_slideshow(now) {
379     if (slideshow == 0) {
380         slideshow_pause = document.getElementById('secs').value;
381         add_cookie('booh-slideshow-pause-~~theme~~=' + slideshow_pause)
382         document.getElementById("b_slideshow").value = "~~stop_slideshow~~";
383         slideshow = 1;
384         if (current == images.length - 1) {
385             current = -1;
386         }
387         if (now) {
388             run_slideshow();
389         } else {
390             setTimeout("run_slideshow()", slideshow_pause * 1000);
391         }
392     } else {
393         clearTimeout(slideshow_timer);
394         document.getElementById("b_slideshow").value = "~~run_slideshow~~";
395         slideshow = 0;
396     }
397 }
398
399 function run_slideshow() {
400     if (slideshow == 0) {
401         return;
402     }
403
404     if (images_loaded[current + 1] == 2) {
405         current++;
406         display_current();
407         slideshow_timer = setTimeout("run_slideshow()", slideshow_pause * 1000);
408     } else {
409         slideshow_timer = setTimeout("run_slideshow()", 500);
410     }
411
412     if (current == images.length - 1) {
413         toggle_slideshow(true);
414     }
415 }
416 </script>
417 EOF
418
419 $image_head_code.sub!('~~run_slideshow~~', utf8(_('Run slideshow!')))
420 $image_head_code.sub!('~~stop_slideshow~~', utf8(_('Stop slideshow')))
421
422 $body_additions = <<'EOF'
423 onload="init()" id="body"
424 EOF
425
426 $button_first = '
427     <form><input type="button"
428                  onclick="first()"
429                  value="' + utf8(_('<<- First')) + '"
430                  id="b_first"/></form>'
431
432 $button_previous = '
433     <form><input type="button"
434                  onclick="previous()"
435                  value="' + utf8(_('<- Previous')) + '"
436                  id="b_previous"/></form>'
437
438 $button_next = '
439     <form><input type="button"
440                  onclick="next()"
441                  value="' + utf8(_('Next ->')) + '"
442                  id="b_next"/></form>'
443
444 $button_last = '
445     <form><input type="button"
446                  onclick="last()"
447                  value="' + utf8(_('Last ->>')) + '"
448                  id="b_last"/></form>'
449
450 $button_slideshow = '
451     <input type="button"
452            onclick="toggle_slideshow(true)"
453            value="' + utf8(_('Run slideshow!')) + '"
454            id="b_slideshow"/>'
455
456 $pause_slideshow = '
457     <font size="-2">' + utf8(_('pause:')) + '<input type="text" id="secs" size="1" value="3"/>' + utf8(_('secs')) + '</font>'
458
459
460 $image = <<'EOF'
461   <img name="main_img" class="image">
462 EOF
463
464 $image_counter_additions = <<'EOF'
465   id="image_counter"
466 EOF
467
468 $caption_additions = <<'EOF'
469   id="main_text"
470 EOF
471
472 $body_code = <<'EOF'
473 EOF
474
475
476 $thumbnails_head_code = <<'EOF'
477 <meta name="generator" content="Generated by Booh! http://zarb.org/~gc/html/booh.html">
478
479 <script language="JavaScript1.1" type="text/JavaScript">
480     var expires = new Date(new Date().getTime() + (30 * 86400000));  // 30 days
481     document.cookie = 'booh-preferred-size-~~theme~~=~~current_size~~'
482                       + '; expires=' + expires.toGMTString()
483                       + '; path=/';
484 </script>
485 EOF
486
487
488 $preferred_size_reloader = <<'EOF'
489 <html>
490     <head>
491         <script language="JavaScript1.1" type="text/JavaScript">
492
493 var sizes = new Array(~~all_sizes~~);
494
495 function getPreferredSize() {
496     if (document.cookie) {
497         var index = document.cookie.indexOf('booh-preferred-size-~~theme~~');
498         if (index != -1) {
499             var oleft = (document.cookie.indexOf('=', index) + 1);
500             var oright = document.cookie.indexOf(';', index);
501             if (oright == -1) {
502                 oright = document.cookie.length;
503             }
504             size = document.cookie.substring(oleft, oright);
505             for (i = 0; i < sizes.length; i++) {
506                 if (sizes[i] == size) {
507                     return 'thumbnails-' + size + '.html';
508                 }
509             }
510         }
511     }
512     return 'thumbnails-~~default_size~~.html';
513 }
514
515 window.location.href = getPreferredSize();
516
517         </script>
518     </head>
519 </html>
520 EOF