multi languages, in backend only for the moment
[booh] / data / booh / themes / simple / root / booh.js
1 var images_ary = new Array();
2 var images_loaded = new Array();
3 var current = 0;
4 var slideshow = 0;
5 var slideshow_pause = null;
6 var slideshow_timer = null;
7
8 for (i = 0; i < images.length; i++) { 
9     /* this array will contain 0 if image not yet loaded, 1 when loading,
10      * 2 when complete */
11     images_loaded[i] = 0;
12 }
13
14 function dbg(t) {
15     document.getElementById('dbg_text').innerHTML += t + "\n";
16 }
17
18 /* load image, return 1 if image is finished loading */
19 function load(i) {
20     if (images_loaded[i] == 0) {
21         images_ary[i] = new Image();
22         images_ary[i].src = images[i];
23         images_loaded[i] = 1;
24     }
25     if (images_loaded[i] == 1) {
26         if (images_ary[i].complete) {
27             images_loaded[i] = 2;
28         } else {
29             return 0;
30         }
31     }
32     return 1;
33 }
34
35 function getparam(key) {
36     all_params = location.href.split("#")
37     if (all_params.length > 1) {
38         params = all_params[1].split("&");
39         for (i = 0; i < params.length; i++) {
40             keyvalue = params[i].split("=");
41             if (keyvalue[0] == key) {
42                 return keyvalue[1];
43             }
44         }
45     }
46     return null;
47 }
48
49 function loadcurrent(img) {
50     for (i = 0; i < images.length; i++) {
51         if (images[i] == img) {
52             current = i;
53             display_current();
54             return;
55         }
56     }
57     current = 0;
58     display_current();
59 }
60
61 function browser_href() {
62     all = location.href.split("/");
63     return all[all.length - 1];
64 }
65
66 /* check URL for changes; allows the URL to reflect currently showed image */
67 var currentURL = '';
68 function checkURL() {
69     if (currentURL == 'ignore1') {
70         // do nothing
71     } else if (currentURL == 'ignore2') {
72         currentURL = browser_href();
73     } else {
74         href = browser_href();
75         if (href != currentURL) {
76             currentURL = href;
77             img = getparam('current');
78             loadcurrent(img);
79         }
80     }
81     setTimeout("checkURL()", 50);
82 }
83
84 function preload() { 
85
86     /* favor current image, if user clicked on `last' or something */
87     load(current);
88
89     /* don't blindly preload all images at the beginning,
90      * but rather load them one by one, in order to get
91      * next ones faster, beginning with next to current
92      */
93     if (current + 1 < images.length && load(current + 1) == 0) {
94         setTimeout("preload()", 50);
95         return;
96     }
97     if (current - 1 >= 0 && load(current - 1) == 0) {
98         setTimeout("preload()", 50);
99         return;
100     }
101
102     for (i = current + 2; i < images.length && i <= current + 5; i++) { 
103         if (load(i) == 0) {
104             setTimeout("preload()", 50);
105             return;
106         }
107     }
108     for (i = current - 2; i >= current - 3; i--) { 
109         if (i >= 0) {
110             if (load(i) == 0) {
111                 setTimeout("preload()", 50);
112                 return;
113             }
114         }
115     }
116
117     setTimeout("preload()", 50);
118 }
119
120 function add_cookie(val) {
121     var expires = new Date(new Date().getTime() + (30 * 86400000));  // 30 days
122     document.cookie = val
123                       + '; expires=' + expires.toGMTString()
124                       + '; path=/';
125 }
126
127 function get_cookie(key) {
128     if (document.cookie) {
129         var index = document.cookie.indexOf(key);
130         if (index != -1) {
131             var oleft = (document.cookie.indexOf('=', index) + 1);
132             var oright = document.cookie.indexOf(';', index);
133             if (oright == -1) {
134                 oright = document.cookie.length;
135             }
136             return document.cookie.substring(oleft, oright);
137         }
138     }
139     return null;
140 }
141
142 function init() {
143
144
145     preferred_pause = get_cookie('booh-slideshow-pause-' + dbltilda_theme);
146     if (preferred_pause != null) {
147         document.getElementById('secs').value = preferred_pause;
148     }
149
150     if (getparam('run_slideshow')) {
151         toggle_slideshow();
152     }
153
154     checkURL();
155
156     preload();
157
158     if (images.length == 1) {
159         document.getElementById("b_slideshow").disabled = true;
160         document.getElementById("b_slideshow").setAttribute("class", "disabled");
161     }
162
163     if (navigator.userAgent.indexOf('Opera') == -1) {
164         document.onkeydown = keyDownEvent;
165     }
166 }
167
168 function update_sensibilities() {
169     if (current == 0) {
170         document.getElementById("b_first").disabled = true;
171         document.getElementById("b_previous").disabled = true;
172         document.getElementById("b_first").setAttribute("class", "disabled");
173         document.getElementById("b_previous").setAttribute("class", "disabled");
174     } else {
175         document.getElementById("b_first").disabled = false;
176         document.getElementById("b_previous").disabled = false;
177         document.getElementById("b_first").removeAttribute("class");
178         document.getElementById("b_previous").removeAttribute("class");
179     }
180
181     if (current == images.length - 1) {
182         document.getElementById("b_next").disabled = true;
183         document.getElementById("b_last").disabled = true;
184         document.getElementById("b_next").setAttribute("class", "disabled");
185         document.getElementById("b_last").setAttribute("class", "disabled");
186     } else {
187         document.getElementById("b_next").disabled = false;
188         document.getElementById("b_last").disabled = false;
189         document.getElementById("b_next").removeAttribute("class");
190         document.getElementById("b_last").removeAttribute("class");
191     }
192 }
193
194 function set_cursor_(value, element) {
195
196     if (!element || !element.style) {
197         return;
198     }
199
200     element.style.cursor = value;
201
202     children = element.childNodes;
203     for (i = 0; i < children.length; i++) {
204         set_cursor_(value, children.item[i]);
205     }
206 }
207
208 function set_cursor(value) {
209     set_cursor_(value, document.getElementById('body'));
210     set_cursor_(value, document.getElementById('b_first'));
211     set_cursor_(value, document.getElementById('b_previous'));
212     set_cursor_(value, document.getElementById('b_next'));
213     set_cursor_(value, document.getElementById('b_last'));
214 }
215
216 function show_current_text() {
217     /* don't show text if image not yet loaded because navigator
218      * won't refresh it during load */
219     if (images_loaded[current] == 2) {
220         document.getElementById('image_counter').innerHTML = ( current + 1 ) + "/" + images.length;
221         document.getElementById('main_text').innerHTML = captions[current];
222         for (i = 0; i < other_sizes.length; i++) { 
223             if (other_sizes[i] == "original") {
224                 document.getElementById('link' + other_sizes[i]).href = eval("images_" + other_sizes[i] + "[current]");
225             } else {
226                 document.getElementById('link' + other_sizes[i]).href = 'image-' + other_sizes[i] + dbltilda_htmlsuffix + '#current=' + eval("images_" + other_sizes[i] + "[current]");
227             }
228         }
229         document.getElementById('thumbnails').href = 'thumbnails-' + dbltilda_current_size + '-' + thumbnailspages[current] + dbltilda_htmlsuffix + '#' + images[current];
230         set_cursor("default");
231     } else {
232         setTimeout("show_current_text()", 50);
233         set_cursor("wait");
234     }
235 }
236
237 function display_current() {
238     document.main_img.src = images[current];
239     oldhref = browser_href();
240     newhref = 'image-' + dbltilda_current_size + dbltilda_htmlsuffix + '#current=' + images[current];
241     if (oldhref != newhref) {
242         currentURL = 'ignore1';
243         location.href = newhref;
244         currentURL = 'ignore2';
245     }
246     show_current_text();
247     update_sensibilities();
248 }
249
250 function first() {
251     if (slideshow == 1) {
252         toggle_slideshow(true);
253     }
254     
255     current = 0;
256     display_current();
257 }
258
259 function next() {
260     if (slideshow == 1) {
261         toggle_slideshow(true);
262     }
263
264     if (current < images.length - 1) {
265         current++;
266         display_current();
267     }
268 }
269
270 function next10() {
271     if (slideshow == 1) {
272         toggle_slideshow(true);
273     }
274
275     if (current < images.length - 11) {
276         current += 10;
277     } else {
278         current = images.length - 1;
279     }
280     display_current();
281 }
282
283 function previous() {
284     if (slideshow == 1) {
285         toggle_slideshow(true);
286     }
287
288     if (current > 0) {
289         current--;
290         display_current();
291     }
292 }
293
294 function previous10() {
295     if (slideshow == 1) {
296         toggle_slideshow(true);
297     }
298
299     if (current > 10) {
300         current -= 10;
301     } else {
302         current = 0;
303     }
304     display_current();
305 }
306
307 function last() {
308     if (slideshow == 1) {
309         toggle_slideshow(true);
310     }
311
312     current = images.length - 1;
313     display_current();
314 }
315
316 function keyDownEvent(key) {
317     if (!key) {
318         key = event;
319         key.which = key.keyCode;
320     }
321     if (key.altKey || key.ctrlKey || key.shiftKey) {
322         return;
323     }
324     switch (key.which) {
325       case 36: // home
326         first();
327         break;
328       case 35: // end
329         last();
330         break;
331       case 37: // left
332         previous();
333         break;
334       case 39: // right
335         next();
336         break;
337       case 38: // up
338         previous10();
339         break;
340       case 40: // down
341         next10();
342         break;
343     }
344 }
345
346 function toggle_slideshow(now) {
347     if (slideshow == 0) {
348         slideshow_pause = document.getElementById('secs').value;
349         add_cookie('booh-slideshow-pause-' + dbltilda_theme + '=' + slideshow_pause)
350         document.getElementById("b_slideshow").value = dbltilda_stop_slideshow;
351         slideshow = 1;
352         if (current == images.length - 1) {
353             current = -1;
354         }
355         if (now) {
356             run_slideshow();
357         } else {
358             setTimeout("run_slideshow()", slideshow_pause * 1000);
359         }
360     } else {
361         clearTimeout(slideshow_timer);
362         document.getElementById("b_slideshow").value = dbltilda_run_slideshow;
363         slideshow = 0;
364     }
365 }
366
367 function run_slideshow() {
368     if (slideshow == 0) {
369         return;
370     }
371
372     if (images_loaded[current + 1] == 2) {
373         current++;
374         display_current();
375         slideshow_timer = setTimeout("run_slideshow()", slideshow_pause * 1000);
376     } else {
377         slideshow_timer = setTimeout("run_slideshow()", 50);
378     }
379
380     if (current == images.length - 1) {
381         toggle_slideshow(true);
382     }
383 }
384
385 function set_preferred_size(val) {
386     var expires = new Date(new Date().getTime() + (30 * 86400000));  // 30 days
387     document.cookie = 'booh-preferred-size-' + dbltilda_theme + '='
388                       + val
389                       + '; expires=' + expires.toGMTString()
390                       + '; path=/';
391 }
392