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