Merge pull request #3339 from jkohen/patch-1
[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
187   if (!e || !e.target)
188     return;
189   
190   nav_calculate_offset_x (e.target);
191
192   if (e.pageX || e.pageY)
193   {
194     pos = e.pageX;
195   }
196   else if (e.clientX || e.clientY)
197   {
198     pos = e.clientX + document.body.scrollLeft
199       + document.documentElement.scrollLeft;
200   }
201
202   return (pos);
203 } /* nav_calculate_event_x */
204
205 function nav_recenter (e)
206 {
207   var x;
208   var y;
209   var img;
210   var diff;
211   var time_old_center;
212   var time_new_center;
213   var width;
214
215   img = e.target;
216   if (!img || (img.className != "graph_image")
217       || !img.navTimeBegin || !img.navTimeEnd)
218     return;
219
220   width = img.width - 97;
221
222   x = e.layerX - 70;
223   if (!x || (x < 0) || (x > width))
224     return;
225
226   y = e.layerY;
227   if (!y || (y < 35) || (y > 135))
228     return;
229
230   diff = img.navTimeEnd - img.navTimeBegin;
231
232   time_old_center = img.navTimeBegin + (diff / 2.0);
233   time_new_center = img.navTimeBegin + (x * diff / width);
234
235   img.navTimeBegin += (time_new_center - time_old_center);
236   img.navTimeEnd   += (time_new_center - time_old_center);
237 } /* nav_recenter */
238
239 function nav_handle_dblclick (e)
240 {
241   var img;
242
243   /* M$IE */
244   if (!e)
245     e = window.event;
246
247   img = e.target;
248   if (!img || (img.className != "graph_image")
249       || !img.navTimeBegin || !img.navTimeEnd)
250     return;
251
252   nav_recenter (e);
253   nav_image_repaint (img);
254
255   // e.returnValue = false;
256 } /* nav_handle_dblclick */
257
258 /* Taken from <http://adomas.org/javascript-mouse-wheel/> */
259 function nav_handle_wheel (e)
260 {
261   var delta = 0;
262   var img;
263   
264   /* M$IE */
265   if (!e)
266     e = window.event;
267
268   img = e.target;
269   if (!img || (img.className != "graph_image")
270       || !img.navTimeBegin || !img.navTimeEnd)
271     return;
272
273   /* Opera and M$IE */
274   if (e.wheelDelta)
275   {
276     delta = e.wheelDelta; 
277     if (window.opera)
278       delta = delta * (-1);
279   }
280   else if (e.detail)
281   {
282     delta = e.detail * (-1);
283   }
284
285   if (!delta)
286     return;
287
288   nav_recenter (e);
289   if (delta > 0)
290     nav_zoom_in (img.id);
291   else
292     nav_zoom_out (img.id);
293
294   if (e.preventDefault)
295     e.preventDefault ();
296   e.returnValue = false;
297 } /* function nav_handle_wheel */
298
299 /* vim: set sw=2 sts=2 et : */