Merge branch 'collectd-5.8'
[collectd.git] / contrib / collection3 / share / navigate.js
1 function nav_init (time_begin, time_end)
2 {
3   var all_images;
4   var i;
5
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;
11
12     all_images[i].navTimeBegin = new Number (time_begin);
13     all_images[i].navTimeEnd   = new Number (time_end);
14
15     all_images[i].navBaseURL = all_images[i].src.replace (/;(begin|end)=[^;]*/g, '');
16
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   }
30
31   return (true);
32 } /* nav_init */
33
34 function nav_image_repaint (img)
35 {
36   if (!img || !img.navBaseURL
37       || !img.navTimeBegin || !img.navTimeEnd)
38     return;
39
40   img.src = img.navBaseURL + ";"
41     + "begin=" + img.navTimeBegin.toFixed (0) + ";"
42     + "end=" + img.navTimeEnd.toFixed (0);
43 } /* nav_image_repaint */
44
45 function nav_time_reset (img_id ,diff)
46 {
47   var img;
48
49   img = document.getElementById (img_id);
50   if (!img)
51     return (false);
52
53   img.navTimeEnd = new Number ((new Date ()).getTime () / 1000);
54   img.navTimeBegin = new Number (img.navTimeEnd - diff);
55
56   nav_image_repaint (img);
57
58   return (true);
59 }
60
61 function nav_time_change_obj (img, factor_begin, factor_end)
62 {
63   var diff;
64
65   if (!img || !img.navBaseURL
66       || !img.navTimeBegin || !img.navTimeEnd)
67     return (false);
68
69   diff = img.navTimeEnd - img.navTimeBegin;
70
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);
74
75   img.navTimeBegin += (diff * factor_begin);
76   img.navTimeEnd   += (diff * factor_end);
77
78   nav_image_repaint (img);
79
80   return (true);
81 } /* nav_time_change */
82
83 function nav_time_change (img_id, factor_begin, factor_end)
84 {
85   var diff;
86
87   if (img_id == '*')
88   {
89     var all_images;
90     var i;
91
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;
97     
98       nav_time_change_obj (all_images[i], factor_begin, factor_end);
99     }
100   }
101   else
102   {
103     var img;
104
105     img = document.getElementById (img_id);
106     if (!img)
107       return (false);
108
109     nav_time_change_obj (img, factor_begin, factor_end);
110   }
111
112   return (true);
113 } /* nav_time_change */
114
115 function nav_move_earlier (img_id)
116 {
117   return (nav_time_change (img_id, -0.2, -0.2));
118 } /* nav_move_earlier */
119
120 function nav_move_later (img_id)
121 {
122   return (nav_time_change (img_id, +0.2, +0.2));
123 } /* nav_move_later */
124
125 function nav_zoom_in (img_id)
126 {
127   return (nav_time_change (img_id, +0.2, -0.2));
128 } /* nav_zoom_in */
129
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 */
134
135 function nav_set_reference (img_id)
136 {
137   var img;
138   var all_images;
139   var tmp;
140   var i;
141
142   img = document.getElementById (img_id);
143   if (!img || (img.className != "graph_image")
144       || !img.navTimeBegin || !img.navTimeEnd)
145     return;
146
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;
154
155     if (tmp.id == img_id)
156       continue;
157
158     tmp.navTimeBegin = img.navTimeBegin;
159     tmp.navTimeEnd = img.navTimeEnd;
160
161     nav_image_repaint (tmp);
162   }
163 } /* nav_set_reference */
164
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;
172
173   if (!obj)
174     return (offset);
175
176   offset = obj.offsetLeft;
177   if (obj.offsetParent)
178     offset += nav_calculate_offset_x (obj.offsetParent);
179
180   return (offset);
181 } /* nav_calculate_offset_x */
182
183 function nav_calculate_event_x (e)
184 {
185   var pos = 0;
186   var off = 0;
187
188   if (!e || !e.target)
189     return;
190   
191   off = nav_calculate_offset_x (e.target);
192
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   }
202
203   return (pos);
204 } /* nav_calculate_event_x */
205
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;
215
216   img = e.target;
217   if (!img || (img.className != "graph_image")
218       || !img.navTimeBegin || !img.navTimeEnd)
219     return;
220
221   width = img.width - 97;
222
223   x = e.layerX - 70;
224   if (!x || (x < 0) || (x > width))
225     return;
226
227   y = e.layerY;
228   if (!y || (y < 35) || (y > 135))
229     return;
230
231   diff = img.navTimeEnd - img.navTimeBegin;
232
233   time_old_center = img.navTimeBegin + (diff / 2.0);
234   time_new_center = img.navTimeBegin + (x * diff / width);
235
236   img.navTimeBegin += (time_new_center - time_old_center);
237   img.navTimeEnd   += (time_new_center - time_old_center);
238 } /* nav_recenter */
239
240 function nav_handle_dblclick (e)
241 {
242   var img;
243
244   /* M$IE */
245   if (!e)
246     e = window.event;
247
248   img = e.target;
249   if (!img || (img.className != "graph_image")
250       || !img.navTimeBegin || !img.navTimeEnd)
251     return;
252
253   nav_recenter (e);
254   nav_image_repaint (img);
255
256   // e.returnValue = false;
257 } /* nav_handle_dblclick */
258
259 /* Taken from <http://adomas.org/javascript-mouse-wheel/> */
260 function nav_handle_wheel (e)
261 {
262   var delta = 0;
263   var img;
264   
265   /* M$IE */
266   if (!e)
267     e = window.event;
268
269   img = e.target;
270   if (!img || (img.className != "graph_image")
271       || !img.navTimeBegin || !img.navTimeEnd)
272     return;
273
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   }
285
286   if (!delta)
287     return;
288
289   nav_recenter (e);
290   if (delta > 0)
291     nav_zoom_in (img.id);
292   else
293     nav_zoom_out (img.id);
294
295   if (e.preventDefault)
296     e.preventDefault ();
297   e.returnValue = false;
298 } /* function nav_handle_wheel */
299
300 /* vim: set sw=2 sts=2 et : */