1 function nav_init (time_begin, time_end)
2 {
3 var all_images;
4 var i;
6 all_images = document.getElementsByTagName ("img");
7 for (i = 0; i < all_images.length; i++)
8 {
9 if (all_images[i].className != "graph_image")
10 continue;
12 all_images[i].navTimeBegin = new Number (time_begin);
13 all_images[i].navTimeEnd = new Number (time_end);
15 all_images[i].navBaseURL = all_images[i].src.replace (/;(begin|end)=[^;]*/g, '');
17 if (all_images[i].addEventListener) /* Mozilla */
18 {
19 all_images[i].addEventListener ('dblclick', nav_handle_dblclick,
20 false /* == bubbling */);
21 all_images[i].addEventListener ('DOMMouseScroll', nav_handle_wheel,
22 false /* == bubbling */);
23 }
24 else
25 {
26 all_images[i].ondblclick = nav_handle_dblclick;
27 all_images[i].onmousewheel = nav_handle_wheel;
28 }
29 }
31 return (true);
32 } /* nav_init */
34 function nav_image_repaint (img)
35 {
36 if (!img || !img.navBaseURL
37 || !img.navTimeBegin || !img.navTimeEnd)
38 return;
40 img.src = img.navBaseURL + ";"
41 + "begin=" + img.navTimeBegin.toFixed (0) + ";"
42 + "end=" + img.navTimeEnd.toFixed (0);
43 } /* nav_image_repaint */
45 function nav_time_reset (img_id ,diff)
46 {
47 var img;
49 img = document.getElementById (img_id);
50 if (!img)
51 return (false);
53 img.navTimeEnd = new Number ((new Date ()).getTime () / 1000);
54 img.navTimeBegin = new Number (img.navTimeEnd - diff);
56 nav_image_repaint (img);
58 return (true);
59 }
61 function nav_time_change_obj (img, factor_begin, factor_end)
62 {
63 var diff;
65 if (!img || !img.navBaseURL
66 || !img.navTimeBegin || !img.navTimeEnd)
67 return (false);
69 diff = img.navTimeEnd - img.navTimeBegin;
71 /* Prevent zooming in if diff is less than five minutes */
72 if ((diff <= 300) && (factor_begin > 0.0) && (factor_end < 0.0))
73 return (true);
75 img.navTimeBegin += (diff * factor_begin);
76 img.navTimeEnd += (diff * factor_end);
78 nav_image_repaint (img);
80 return (true);
81 } /* nav_time_change */
83 function nav_time_change (img_id, factor_begin, factor_end)
84 {
85 var diff;
87 if (img_id == '*')
88 {
89 var all_images;
90 var i;
92 all_images = document.getElementsByTagName ("img");
93 for (i = 0; i < all_images.length; i++)
94 {
95 if (all_images[i].className != "graph_image")
96 continue;
98 nav_time_change_obj (all_images[i], factor_begin, factor_end);
99 }
100 }
101 else
102 {
103 var img;
105 img = document.getElementById (img_id);
106 if (!img)
107 return (false);
109 nav_time_change_obj (img, factor_begin, factor_end);
110 }
112 return (true);
113 } /* nav_time_change */
115 function nav_move_earlier (img_id)
116 {
117 return (nav_time_change (img_id, -0.2, -0.2));
118 } /* nav_move_earlier */
120 function nav_move_later (img_id)
121 {
122 return (nav_time_change (img_id, +0.2, +0.2));
123 } /* nav_move_later */
125 function nav_zoom_in (img_id)
126 {
127 return (nav_time_change (img_id, +0.2, -0.2));
128 } /* nav_zoom_in */
130 function nav_zoom_out (img_id)
131 {
132 return (nav_time_change (img_id, (-1.0 / 3.0), (1.0 / 3.0)));
133 } /* nav_zoom_in */
135 function nav_set_reference (img_id)
136 {
137 var img;
138 var all_images;
139 var tmp;
140 var i;
142 img = document.getElementById (img_id);
143 if (!img || (img.className != "graph_image")
144 || !img.navTimeBegin || !img.navTimeEnd)
145 return;
147 all_images = document.getElementsByTagName ("img");
148 for (i = 0; i < all_images.length; i++)
149 {
150 tmp = all_images[i];
151 if (!tmp || (tmp.className != "graph_image")
152 || !tmp.navTimeBegin || !tmp.navTimeEnd)
153 continue;
155 if (tmp.id == img_id)
156 continue;
158 tmp.navTimeBegin = img.navTimeBegin;
159 tmp.navTimeEnd = img.navTimeEnd;
161 nav_image_repaint (tmp);
162 }
163 } /* nav_set_reference */
165 /*
166 * TODO: calculate the mouse position relative to the image in a cross-browser
167 * manner.
168 */
169 function nav_calculate_offset_x (obj)
170 {
171 var offset = 0;
173 if (!obj)
174 return (offset);
176 offset = obj.offsetLeft;
177 if (obj.offsetParent)
178 offset += nav_calculate_offset_x (obj.offsetParent);
180 return (offset);
181 } /* nav_calculate_offset_x */
183 function nav_calculate_event_x (e)
184 {
185 var pos = 0;
186 var off = 0;
188 if (!e || !e.target)
189 return;
191 off = nav_calculate_offset_x (e.target);
193 if (e.pageX || e.pageY)
194 {
195 pos = e.pageX;
196 }
197 else if (e.clientX || e.clientY)
198 {
199 pos = e.clientX + document.body.scrollLeft
200 + document.documentElement.scrollLeft;
201 }
203 return (pos);
204 } /* nav_calculate_event_x */
206 function nav_recenter (e)
207 {
208 var x;
209 var y;
210 var img;
211 var diff;
212 var time_old_center;
213 var time_new_center;
214 var width;
216 img = e.target;
217 if (!img || (img.className != "graph_image")
218 || !img.navTimeBegin || !img.navTimeEnd)
219 return;
221 width = img.width - 97;
223 x = e.layerX - 70;
224 if (!x || (x < 0) || (x > width))
225 return;
227 y = e.layerY;
228 if (!y || (y < 35) || (y > 135))
229 return;
231 diff = img.navTimeEnd - img.navTimeBegin;
233 time_old_center = img.navTimeBegin + (diff / 2.0);
234 time_new_center = img.navTimeBegin + (x * diff / width);
236 img.navTimeBegin += (time_new_center - time_old_center);
237 img.navTimeEnd += (time_new_center - time_old_center);
238 } /* nav_recenter */
240 function nav_handle_dblclick (e)
241 {
242 var img;
244 /* M$IE */
245 if (!e)
246 e = window.event;
248 img = e.target;
249 if (!img || (img.className != "graph_image")
250 || !img.navTimeBegin || !img.navTimeEnd)
251 return;
253 nav_recenter (e);
254 nav_image_repaint (img);
256 // e.returnValue = false;
257 } /* nav_handle_dblclick */
259 /* Taken from <http://adomas.org/javascript-mouse-wheel/> */
260 function nav_handle_wheel (e)
261 {
262 var delta = 0;
263 var img;
265 /* M$IE */
266 if (!e)
267 e = window.event;
269 img = e.target;
270 if (!img || (img.className != "graph_image")
271 || !img.navTimeBegin || !img.navTimeEnd)
272 return;
274 /* Opera and M$IE */
275 if (e.wheelDelta)
276 {
277 delta = e.wheelDelta;
278 if (window.opera)
279 delta = delta * (-1);
280 }
281 else if (e.detail)
282 {
283 delta = e.detail * (-1);
284 }
286 if (!delta)
287 return;
289 nav_recenter (e);
290 if (delta > 0)
291 nav_zoom_in (img.id);
292 else
293 nav_zoom_out (img.id);
295 if (e.preventDefault)
296 e.preventDefault ();
297 e.returnValue = false;
298 } /* function nav_handle_wheel */
300 /* vim: set sw=2 sts=2 et : */