handle a link to original image
[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
34 var images = new Array(~~images~~);
35 ~~other_images~~
36 var other_sizes = new Array(~~other_sizes~~);
37 var captions = new Array(~~captions~~);
38
39 var images_ary = new Array();
40 var images_loaded = new Array();
41 var current = 0;
42 var slideshow = 0;
43 var slideshow_pause = 3;
44 var slideshow_timer = null;
45
46 for (i = 0; i < images.length; i++) { 
47     /* this array will contain 0 if image not yet loaded, 1 when loading,
48      * 2 when complete */
49     images_loaded[i] = 0;
50 }
51
52 function dbg(t) {
53     document.getElementById('dbg_text').firstChild.data += t + "\n";
54 }
55
56 /* load image, return 1 if image is finished loading */
57 function load(i) {
58     if (images_loaded[i] == 0) {
59         images_ary[i] = new Image();
60         images_ary[i].src = images[i];
61         images_loaded[i] = 1;
62     }
63     if (images_loaded[i] == 1) {
64         if (images_ary[i].complete) {
65             images_loaded[i] = 2;
66         } else {
67             return 0;
68         }
69     }
70     return 1;
71 }
72
73 function preload() { 
74
75     /* favor current image, if user clicked on `last' or something */
76     load(current);
77
78     /* don't blindly preload all images at the beginning,
79      * but rather load them one by one, in order to get
80      * next ones faster, beginning with next to current
81      */
82     for (i = current + 1; i < images.length && i <= current + 5; i++) { 
83         if (load(i) == 0) {
84             setTimeout("preload()", 500);
85             return;
86         }
87     }
88     for (i = current - 1; i >= current - 3; i--) { 
89         if (i >= 0) {
90             if (load(i) == 0) {
91                 setTimeout("preload()", 500);
92                 return;
93             }
94         }
95     }
96
97     setTimeout("preload()", 500);
98 }
99
100 function init() {
101
102     var expires = new Date(new Date().getTime() + (30 * 86400000));  // 30 days
103     document.cookie = 'booh-preferred-size-~~theme~~=~~current_size~~'
104                       + '; expires=' + expires.toGMTString()
105                       + '; path=/';
106
107     /* retrieve GET parameters */
108     all_params = location.href.split("?")
109     if (all_params.length > 1) {
110         params = all_params[1].split("&");
111         for (i = 0; i < params.length; i++) {
112             keyvalue = params[i].split("=");
113             if (keyvalue[0] == "slideshow_pause") {
114                 slideshow_pause = keyvalue[1];
115             }
116             if (keyvalue[0] == "run_slideshow") {
117                 toggle_slideshow();
118             }
119             if (keyvalue[0] == "current") {
120                 for (i = 0; i < images.length; i++) {
121                     if (images[i] == keyvalue[1]) {
122                         current = i;
123                         break;
124                     }
125                 }
126             }
127         }
128     }
129
130     preload();
131     display_current();
132     if (images.length == 1) {
133         document.getElementById("b_slideshow").disabled = true;
134     }
135 }
136
137 function update_sensibilities() {
138     if (current == 0) {
139         document.getElementById("b_first").disabled = true;
140         document.getElementById("b_previous").disabled = true;
141     } else {
142         document.getElementById("b_first").disabled = false;
143         document.getElementById("b_previous").disabled = false;
144     }
145
146     if (current == images.length - 1) {
147         document.getElementById("b_next").disabled = true;
148         document.getElementById("b_last").disabled = true;
149     } else {
150         document.getElementById("b_next").disabled = false;
151         document.getElementById("b_last").disabled = false;
152     }
153 }
154
155 function set_cursor_(value, element) {
156
157     if (!element || !element.style) {
158         return;
159     }
160
161     element.style.cursor = value;
162
163     children = element.childNodes;
164     for (i = 0; i < children.length; i++) {
165         set_cursor_(value, children.item[i]);
166     }
167 }
168
169 function set_cursor(value) {
170     set_cursor_(value, document.getElementById('body'));
171 }
172
173 function show_current_text() {
174     /* don't show text if image not yet loaded because navigator
175      * won't refresh it during load */
176     if (images_loaded[current] == 2) {
177         document.getElementById('image_counter').firstChild.data = ( current + 1 ) + "/" + images.length;
178         document.getElementById('main_text').firstChild.data = captions[current] || images[current];
179         for (i = 0; i < other_sizes.length; i++) { 
180             if (other_sizes[i] == "original") {
181                 document.getElementById('link' + other_sizes[i]).href = eval("images_" + other_sizes[i] + "[current]");
182             } else {
183                 document.getElementById('link' + other_sizes[i]).href = 'image-' + other_sizes[i] + '.html?current=' + eval("images_" + other_sizes[i] + "[current]");
184             }
185         }
186         document.getElementById('thumbnails').href = 'thumbnails-~~current_size~~.html#' + images[current];
187         set_cursor("default");
188     } else {
189         setTimeout("show_current_text()", 100);
190         set_cursor("wait");
191     }
192 }
193
194 function display_current() {
195     eval("document.main_img.src = images[" + current + "]");
196     show_current_text();
197     update_sensibilities();
198 }
199
200 function first() {
201     if (slideshow == 1) {
202         toggle_slideshow(true);
203     }
204     
205     current = 0;
206     display_current();
207 }
208
209 function next() {
210     if (slideshow == 1) {
211         toggle_slideshow(true);
212     }
213
214     if (current < images.length - 1) {
215         current++;
216         display_current();
217     }
218 }
219
220 function previous() {
221     if (slideshow == 1) {
222         toggle_slideshow(true);
223     }
224
225     if (current > 0) {
226         current--;
227         display_current();
228     }
229 }
230
231 function last() {
232     if (slideshow == 1) {
233         toggle_slideshow(true);
234     }
235
236     current = images.length - 1;
237     display_current();
238 }
239
240 function toggle_slideshow(now) {
241     if (slideshow == 0) {
242         document.getElementById("b_slideshow").value = "~~stop_slideshow~~";
243         slideshow = 1;
244         if (current == images.length - 1) {
245             current = -1;
246         }
247         if (now) {
248             run_slideshow();
249         } else {
250             setTimeout("run_slideshow()", slideshow_pause * 1000);
251         }
252     } else {
253         clearTimeout(slideshow_timer);
254         document.getElementById("b_slideshow").value = "~~run_slideshow~~";
255         slideshow = 0;
256     }
257 }
258
259 function run_slideshow() {
260     if (slideshow == 0) {
261         return;
262     }
263
264     if (images_loaded[current + 1] == 2) {
265         current++;
266         display_current();
267         slideshow_timer = setTimeout("run_slideshow()", slideshow_pause * 1000);
268     } else {
269         slideshow_timer = setTimeout("run_slideshow()", 500);
270     }
271
272     if (current == images.length - 1) {
273         toggle_slideshow(true);
274     }
275 }
276 </script>
277 EOF
278
279 $image_head_code.sub!('~~run_slideshow~~', utf8(_('Run slideshow!')))
280 $image_head_code.sub!('~~stop_slideshow~~', utf8(_('Stop slideshow')))
281
282 $body_additions = <<'EOF'
283 onload="init()" id="body"
284 EOF
285
286 $button_first = '
287     <form><input type="button"
288                  onclick="first()"
289                  value="' + utf8(_('<<- First')) + '"
290                  id="b_first"></form>';
291
292 $button_previous = '
293     <form><input type="button"
294                  onclick="previous()"
295                  value="' + utf8(_('<- Previous')) + '"
296                  id="b_previous"></form>';
297
298 $button_next = '
299     <form><input type="button"
300                  onclick="next()"
301                  value="' + utf8(_('Next ->')) + '"
302                  id="b_next"></form>';
303
304 $button_last = '
305     <form><input type="button"
306                  onclick="last()"
307                  value="' + utf8(_('Last ->>')) + '"
308                  id="b_last"></form>';
309
310 $button_slideshow = '
311   <form><input type="button"
312                onclick="toggle_slideshow(true)"
313                value="' + utf8(_('Run slideshow!')) + '"
314                id="b_slideshow">
315   </form>';
316
317 $image = <<'EOF'
318   <img name="main_img">
319 EOF
320
321 $image_counter_additions = <<'EOF'
322   id="image_counter"
323 EOF
324
325 $caption_additions = <<'EOF'
326   id="main_text"
327 EOF
328
329 $body_code = <<'EOF'
330 EOF
331
332
333 $thumbnails_head_code = <<'EOF'
334 <script language="JavaScript1.1" type="text/JavaScript">
335     var expires = new Date(new Date().getTime() + (30 * 86400000));  // 30 days
336     document.cookie = 'booh-preferred-size-~~theme~~=~~current_size~~'
337                       + '; expires=' + expires.toGMTString()
338                       + '; path=/';
339 </script>
340 EOF
341
342
343 $preferred_size_reloader = <<'EOF'
344 <html>
345     <head>
346         <script language="JavaScript1.1" type="text/JavaScript">
347
348 function getPreferredSize() {
349     if (document.cookie) {
350         var index = document.cookie.indexOf('booh-preferred-size-~~theme~~');
351         if (index != -1) {
352             var oleft = (document.cookie.indexOf('=', index) + 1);
353             var oright = document.cookie.indexOf(';', index);
354             if (oright == -1) {
355                 oright = document.cookie.length;
356             }
357             return 'thumbnails-' + document.cookie.substring(oleft, oright) + '.html';
358         }
359     }
360     return 'thumbnails-~~default_size~~.html';
361 }
362
363 window.location.href = getPreferredSize();
364
365         </script>
366     </head>
367 </html>
368 EOF