PNG-fix the close button as well.
[pr0n] / files / pr0n-fullscreen.js
1 var req;
2
3 function init_ajax()
4 {
5         req = false;
6
7         if (window.XMLHttpRequest) {
8                 // Mozilla/Safari
9                 try {
10                         req = new XMLHttpRequest();
11                 } catch(e) {
12                         req = false;
13                 }
14         } else if (window.ActiveXObject) {
15                 // IE/Windows
16                 try {
17                         req = new ActiveXObject("Msxml2.XMLHTTP");
18                 } catch(e) {
19                         try {
20                                 req = new ActiveXObject("Microsoft.XMLHTTP");
21                         } catch(e) {
22                                 req = false;
23                         }
24                 }
25         }
26 }
27
28 function find_width()
29 {
30         if (typeof(window.innerWidth) == 'number') {
31                 // non-IE
32                 return [window.innerWidth, window.innerHeight];
33         } else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
34                 // IE 6+ in 'standards compliant mode'
35                 return [document.documentElement.clientWidth, document.documentElement.clientHeight];
36         } else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
37                 // IE 4-compatible
38                 return [document.body.clientWidth, document.body.clientHeight];
39         }
40         return [null,null];
41 }
42
43 /*
44  * pr0n can resize to any size we'd like, but we're much more likely
45  * to have this set of fixed-resolution screens cached, so to increase
46  * performance, we round down to the closest fit and use that.
47  */
48 function reduce_to_fixed_width(size)
49 {
50         var fixed_sizes = [
51                 [ 1280, 960 ],
52                 [ 1024, 768 ],
53                 [ 800, 600 ],
54                 [ 640, 480 ],
55                 [ 512, 384 ],
56                 [ 320, 256 ],
57                 [ 240, 192 ],
58                 [ 120, 96 ],
59                 [ 80, 64 ]
60         ];
61         for (i = 0; i < fixed_sizes.length; ++i) {
62                 if (size[0] >= fixed_sizes[i][0] && size[1] >= fixed_sizes[i][1])
63                         return fixed_sizes[i];
64         }
65         return [ 80, 64 ];
66 }
67         
68 function display_image(width, height, evt, filename, element_id)
69 {
70         var url = "http://" + global_vhost + "/" + evt + "/" + width + "x" + height + "/" + filename;
71         var img = document.getElementById(element_id);
72         if (img != null) {
73                 img.src = "";
74                 img.parentNode.removeChild(img);
75         }
76
77         img = document.createElement("img");
78         img.id = element_id;
79         img.alt = "";
80
81         if (img.src != url) {
82                 img.src = url;
83         }
84         
85         var main = document.getElementById("main");
86         main.appendChild(img);
87
88         return img;
89 }
90
91 function prepare_preload(img, width, height, evt, filename)
92 {
93         // cancel any pending preload
94         var preload = document.getElementById("preload");
95         if (preload != null) {
96                 preload.src = "";
97                 preload.parentNode.removeChild(preload);
98         }
99                 
100         if (document.all) {  // IE-specific
101                 img.onload = "display_image(" + width + "," + height + ",\"" + evt + "\",\"" + filename + "\",\"preload\");";
102         } else {
103                 img.onload = function() { display_image(width, height, evt, filename, "preload"); }
104         }
105 }
106
107 function relayout()
108 {
109         var size = find_width();
110         var adjusted_size = reduce_to_fixed_width(size);
111
112         var img = display_image(adjusted_size[0], adjusted_size[1], global_evt, global_image_list[global_image_num], "image");
113         if (can_go_next()) {
114                 prepare_preload(img, adjusted_size[0], adjusted_size[1], global_evt, global_image_list[global_image_num + 1]);
115         }
116         
117         // center the image on-screen
118         var main = document.getElementById("main");
119         main.style.position = "absolute";
120         main.style.left = (size[0] - adjusted_size[0]) / 2 + "px";
121         main.style.top = (size[1] - adjusted_size[1]) / 2 + "px"; 
122         main.style.width = adjusted_size[0] + "px";
123         main.style.height = adjusted_size[1] + "px";
124         main.style.lineHeight = adjusted_size[1] + "px"; 
125
126         set_opacity("previous", can_go_previous() ? 0.7 : 0.1);
127         set_opacity("next", can_go_next() ? 0.7 : 0.1);
128         set_opacity("close", 0.7);
129 }
130
131 function set_opacity(id, amount)
132 {
133         var elem = document.getElementById(id);
134         if (typeof(elem.style.opacity) != 'undefined') {            // W3C
135                 elem.style.opacity = amount;
136         } else if (typeof(elem.style.mozOpacity) != 'undefined') {  // older Mozilla
137                 elem.style.mozOpacity = amount;
138         } else if (typeof(elem.style.filter) != 'undefined') {      // IE
139                 if (elem.style.filter.indexOf("alpha") == -1) {
140                         // add an alpha filter if there isn't one already
141                         if (elem.style.filter) {
142                                 elem.style.filter += " ";
143                         } else {
144                                 elem.style.filter = "";
145                         }
146                         elem.style.filter += "alpha(opacity=" + (amount*100.0) + ")";
147                 } else {
148                         elem.filters.alpha.opacity = (amount * 100.0);
149                 }
150         } else {                             // no alpha support
151                 if (amount > 0.5) {
152                         elem.style.visibility = "visible";
153                         elem.style.zorder = 1;
154                 } else {
155                         elem.style.visibility = "hidden";
156                 }
157         }
158 }
159
160 function can_go_previous()
161 {
162         return (global_image_num > 0);
163 }
164
165 function go_previous()
166 {
167         if (!can_go_previous())
168                 return;
169
170         --global_image_num;
171
172         var adjusted_size = reduce_to_fixed_width(find_width());
173
174         var img = display_image(adjusted_size[0], adjusted_size[1], global_evt, global_image_list[global_image_num], "image");
175         if (can_go_previous()) {
176                 set_opacity("previous", 0.7);
177                 prepare_preload(img, adjusted_size[0], adjusted_size[1], global_evt, global_image_list[global_image_num - 1]);
178         } else {
179                 set_opacity("previous", 0.1);
180         }
181         set_opacity("next", can_go_next() ? 0.7 : 0.1);
182 }
183
184 function can_go_next()
185 {
186         return (global_image_num < global_image_list.length - 1);
187 }
188
189 function go_next()
190 {
191         if (!can_go_next())
192                 return;
193
194         ++global_image_num;
195
196         var adjusted_size = reduce_to_fixed_width(find_width());
197
198         var img = display_image(adjusted_size[0], adjusted_size[1], global_evt, global_image_list[global_image_num], "image");
199         if (can_go_next()) {
200                 set_opacity("next", 0.7);
201                 prepare_preload(img, adjusted_size[0], adjusted_size[1], global_evt, global_image_list[global_image_num + 1]);
202         } else {
203                 set_opacity("next", 0.1);
204         }
205         set_opacity("previous", can_go_previous() ? 0.7 : 0.1);
206 }
207
208 function key_down(which)
209 {
210         if (which == 39) {   // right
211                 if (can_go_next()) {
212                         set_opacity("next", 0.99);
213                 }
214         } else if (which == 37) {   // left
215                 if (can_go_previous()) {
216                         set_opacity("previous", 0.99);
217                 }
218         } else if (which == 27) {   // escape
219                 set_opacity("close", 0.99);
220         }
221 }
222
223 function key_up(which) {
224         if (which == 39) {   // right
225                 if (can_go_next()) {
226                         set_opacity("next", 0.7);
227                         go_next();
228                 }
229         } else if (which == 37) {   // left
230                 if (can_go_previous()) {
231                         set_opacity("previous", 0.7);
232                         go_previous();
233                 }
234         } else if (which == 27) {   // escape
235                 set_opacity("close", 0.7);
236                 do_close();
237         } else if (which == 32 && global_select) {   // space
238                 select_image(global_image_list[global_image_num]);
239         }
240 }
241
242 function select_image(filename)
243 {
244         if (!req)
245                 return;
246
247         draw_text("Selecting " + filename + "...");
248         
249         req.open("POST", "http://" + global_vhost + "/select", false);
250         req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
251         req.send("mode=single&event=" + global_evt + "&filename=" + filename);
252
253         setTimeout("fade_text(0.99)", 30);
254 }
255
256 function fade_text(opacity)
257 {
258         set_opacity("text", opacity);
259         if (opacity > 0.0) {
260                 opacity -= 0.03;
261                 if (opacity < 0.0)
262                         opacity = 0.0;
263                 setTimeout("fade_text(" + opacity + ")", 30);
264         } else {
265                 var text = document.getElementById("text");
266                 if (text != null) {
267                         text.parentNode.removeChild(text);
268                 }
269         }
270 }
271
272 function do_close()
273 {
274         window.location = global_return_url;
275 }
276
277 function draw_text(msg)
278 {
279         // remove any text we might have left
280         var text = document.getElementById("text");
281         if (text != null) {
282                 text.parentNode.removeChild(text);
283         }
284
285         text = document.createElement("p");
286         text.id = "text";
287         text.style.position = "absolute";
288         text.style.color = "white";
289         text.style.lineHeight = "24px";
290         text.style.font = "24px verdana, arial, sans-serif";
291         text.innerHTML = msg;
292
293         var main = document.getElementById("main");
294         main.appendChild(text);
295
296         text.style.left = (main.clientWidth - text.clientWidth) / 2 + "px";
297         text.style.top = (main.clientHeight - text.clientHeight) / 2 + "px";
298 }
299
300 // enable the horrible horrible IE PNG hack
301 function ie_png_hack()
302 {
303         var vstr = navigator.appVersion.split("MSIE");
304         var v = parseFloat(vstr[1]);
305         if (v >= 5.5 && v < 7.0 && document.body.filters) {
306                 var next = document.getElementById("next");
307                 next.outerHTML = "<span id=\"next\" style=\"display: inline-block; position: absolute; bottom: 0px; right: 0px; width: 50px; height: 50px; filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + next.src + "')\" onmousedown=\"if (can_go_next()) set_opacity('next', 1.0)\" onmouseup=\"if (can_go_next()) { set_opacity('next', 0.7); go_next(); }\" onmouseout=\"if (can_go_next()) { set_opacity('next', 0.7); }\" />";
308                 
309                 var previous = document.getElementById("previous");
310                 previous.outerHTML = "<span id=\"previous\" style=\"display: inline-block; position: absolute; bottom: 0px; right: 0px; width: 50px; height: 50px; filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + previous.src + "')\" onmousedown=\"if (can_go_previous()) set_opacity('previous', 1.0)\" onmouseup=\"if (can_go_previous()) { set_opacity('previous', 0.7); go_previous(); }\" onmouseout=\"if (can_go_previous()) { set_opacity('previous', 0.7); }\" />";
311                 
312                 var close = document.getElementById("close");
313                 close.outerHTML = "<span id=\"close\" style=\"display: inline-block; position: absolute; top: 0px; right: 0px; width: 50px; height: 50px; filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + close.src + "')\" onmousedown=\"if (can_go_close()) set_opacity('close', 1.0)\" onmouseup=\"if (can_go_close()) { set_opacity('close', 0.7); go_close(); }\" onmouseout=\"if (can_go_close()) { set_opacity('close', 0.7); }\" />";
314         }
315 }