booh-gui and distributable
[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 $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     /* retrieve GET parameters */
103     all_params = location.href.split("?")
104     if (all_params.length > 1) {
105         params = all_params[1].split("&");
106         for (i = 0; i < params.length; i++) {
107             keyvalue = params[i].split("=");
108             if (keyvalue[0] == "slideshow_pause") {
109                 slideshow_pause = keyvalue[1];
110             }
111             if (keyvalue[0] == "run_slideshow") {
112                 toggle_slideshow();
113             }
114             if (keyvalue[0] == "current") {
115                 for (i = 0; i < images.length; i++) {
116                     if (images[i] == keyvalue[1]) {
117                         current = i;
118                         break;
119                     }
120                 }
121             }
122         }
123     }
124
125     preload();
126     display_current();
127 }
128
129 function update_sensibilities() {
130     if (current == 0) {
131         document.getElementById("b_first").disabled = true;
132         document.getElementById("b_previous").disabled = true;
133         document.getElementById("b_next").disabled = false;
134         document.getElementById("b_last").disabled = false;
135     } else if (current == images.length - 1) {
136         document.getElementById("b_first").disabled = false;
137         document.getElementById("b_previous").disabled = false;
138         document.getElementById("b_next").disabled = true;
139         document.getElementById("b_last").disabled = true;
140     } else {
141         document.getElementById("b_first").disabled = false;
142         document.getElementById("b_previous").disabled = false;
143         document.getElementById("b_next").disabled = false;
144         document.getElementById("b_last").disabled = false;
145     }
146 }
147
148 function set_cursor_(value, element) {
149
150     if (!element || !element.style) {
151         return;
152     }
153
154     element.style.cursor = value;
155
156     children = element.childNodes;
157     for (i = 0; i < children.length; i++) {
158         set_cursor_(value, children.item[i]);
159     }
160 }
161
162 function set_cursor(value) {
163     set_cursor_(value, document.getElementById('body'));
164 }
165
166 function show_current_text() {
167     /* don't show text if image not yet loaded because navigator
168      * won't refresh it during load */
169     if (images_loaded[current] == 2) {
170         eval("document.getElementById('image_counter')" +
171                      ".firstChild.data = '" + ( current + 1 ) + "/" + images.length + "'");
172         eval("document.getElementById('main_text')" +
173                      ".firstChild.data = \"" + ( captions[current] || images[current] ) + "\"");
174         for (i = 0; i < other_sizes.length; i++) { 
175             eval("linkelems = document.getElementById('link" + other_sizes[i] + "').href.split('?');" +
176                  "document.getElementById('link" + other_sizes[i] + "').href = linkelems[0] + '?current=" + eval("images_" + other_sizes[i] + "[current]") + "'");
177         }
178         set_cursor("default");
179     } else {
180         setTimeout("show_current_text()", 100);
181         set_cursor("wait");
182     }
183 }
184
185 function display_current() {
186     eval("document.main_img.src = images[" + current + "]");
187     show_current_text();
188     update_sensibilities();
189 }
190
191 function first() {
192     if (slideshow == 1) {
193         toggle_slideshow(true);
194     }
195     
196     current = 0;
197     display_current();
198 }
199
200 function next() {
201     if (slideshow == 1) {
202         toggle_slideshow(true);
203     }
204
205     if (current < images.length - 1) {
206         current++;
207         display_current();
208     }
209 }
210
211 function previous() {
212     if (slideshow == 1) {
213         toggle_slideshow(true);
214     }
215
216     if (current > 0) {
217         current--;
218         display_current();
219     }
220 }
221
222 function last() {
223     if (slideshow == 1) {
224         toggle_slideshow(true);
225     }
226
227     current = images.length - 1;
228     display_current();
229 }
230
231 function toggle_slideshow(now) {
232     if (slideshow == 0) {
233         document.getElementById("b_slideshow").value = "~~stop_slideshow~~";
234         slideshow = 1;
235         if (current == images.length - 1) {
236             current = -1;
237         }
238         if (now) {
239             run_slideshow();
240         } else {
241             setTimeout("run_slideshow()", slideshow_pause * 1000);
242         }
243     } else {
244         clearTimeout(slideshow_timer);
245         document.getElementById("b_slideshow").value = "~~run_slideshow~~";
246         slideshow = 0;
247     }
248 }
249
250 function run_slideshow() {
251     if (slideshow == 0) {
252         return;
253     }
254
255     if (images_loaded[current + 1] == 2) {
256         current++;
257         display_current();
258         slideshow_timer = setTimeout("run_slideshow()", slideshow_pause * 1000);
259     } else {
260         slideshow_timer = setTimeout("run_slideshow()", 500);
261     }
262
263     if (current == images.length - 1) {
264         toggle_slideshow(true);
265     }
266 }
267 </script>
268 EOF
269
270 $head_code.sub!('~~run_slideshow~~', utf8(_('Run slideshow!')))
271 $head_code.sub!('~~stop_slideshow~~', utf8(_('Stop slideshow')))
272
273 $body_additions = <<'EOF'
274 onload="init()" id="body"
275 EOF
276
277 $button_first = '
278     <form><input type="button"
279                  onclick="first()"
280                  value="' + utf8(_('<<- First')) + '"
281                  id="b_first"></form>';
282
283 $button_previous = '
284     <form><input type="button"
285                  onclick="previous()"
286                  value="' + utf8(_('<- Previous')) + '"
287                  id="b_previous"></form>';
288
289 $button_next = '
290     <form><input type="button"
291                  onclick="next()"
292                  value="' + utf8(_('Next ->')) + '"
293                  id="b_next"></form>';
294
295 $button_last = '
296     <form><input type="button"
297                  onclick="last()"
298                  value="' + utf8(_('Last ->>')) + '"
299                  id="b_last"></form>';
300
301 $button_slideshow = '
302   <form><input type="button"
303                onclick="toggle_slideshow(true)"
304                value="' + utf8(_('Run slideshow!')) + '"
305                id="b_slideshow">
306   </form>';
307
308 $image = <<'EOF'
309   <img name="main_img">
310 EOF
311
312 $image_counter_additions = <<'EOF'
313   id="image_counter"
314 EOF
315
316 $caption_additions = <<'EOF'
317   id="main_text"
318 EOF
319
320 $body_code = <<'EOF'
321 EOF
322