controb/collection3: Implement zooming using the mouse wheel.
[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       all_images[i].addEventListener ('DOMMouseScroll', nav_handle_wheel,
19           false /* == bubbling */);
20     all_images[i].onmousewheel = nav_handle_wheel;
21   }
22
23   return (true);
24 } /* nav_init */
25
26 function nav_image_repaint (img)
27 {
28   if (!img || !img.navBaseURL
29       || !img.navTimeBegin || !img.navTimeEnd)
30     return;
31
32   img.src = img.navBaseURL + ";"
33     + "begin=" + img.navTimeBegin.toFixed (0) + ";"
34     + "end=" + img.navTimeEnd.toFixed (0);
35 } /* nav_image_repaint */
36
37 function nav_time_reset (img_id ,diff)
38 {
39   var img;
40
41   img = document.getElementById (img_id);
42   if (!img)
43     return (false);
44
45   img.navTimeEnd = new Number ((new Date ()).getTime () / 1000);
46   img.navTimeBegin = new Number (img.navTimeEnd - diff);
47
48   nav_image_repaint (img);
49
50   return (true);
51 }
52
53 function nav_time_change_obj (img, factor_begin, factor_end)
54 {
55   var diff;
56
57   if (!img)
58     return (false);
59
60   if (!img.navTimeEnd || !img.navTimeBegin)
61     return (false);
62
63   diff = img.navTimeEnd - img.navTimeBegin;
64
65   /* Prevent zooming in if diff is less than five minutes */
66   if ((diff <= 300) && (factor_begin > 0.0) && (factor_end < 0.0))
67     return (true);
68
69   img.navTimeBegin += (diff * factor_begin);
70   img.navTimeEnd   += (diff * factor_end);
71
72   img.src = img.navBaseURL + ";"
73     + "begin=" + img.navTimeBegin.toFixed (0) + ";"
74     + "end=" + img.navTimeEnd.toFixed (0);
75
76   return (true);
77 } /* nav_time_change */
78
79 function nav_time_change (img_id, factor_begin, factor_end)
80 {
81   var diff;
82
83   if (img_id == '*')
84   {
85     var all_images;
86
87     all_images = document.getElementsByTagName ("img");
88     for (i = 0; i < all_images.length; i++)
89     {
90       if (all_images[i].className != "graph_image")
91         continue;
92     
93       nav_time_change_obj (all_images[i], factor_begin, factor_end);
94     }
95   }
96   else
97   {
98     var img;
99
100     img = document.getElementById (img_id);
101     if (!img)
102       return (false);
103
104     nav_time_change_obj (img, factor_begin, factor_end);
105   }
106
107   return (true);
108 } /* nav_time_change */
109
110 function nav_move_earlier (img_id)
111 {
112   return (nav_time_change (img_id, -0.2, -0.2));
113 } /* nav_move_earlier */
114
115 function nav_move_later (img_id)
116 {
117   return (nav_time_change (img_id, +0.2, +0.2));
118 } /* nav_move_later */
119
120 function nav_zoom_in (img_id)
121 {
122   return (nav_time_change (img_id, +0.2, -0.2));
123 } /* nav_zoom_in */
124
125 function nav_zoom_out (img_id)
126 {
127   return (nav_time_change (img_id, (-1.0 / 3.0), (1.0 / 3.0)));
128 } /* nav_zoom_in */
129
130 function nav_recenter (e)
131 {
132   var x;
133   var y;
134   var img;
135   var diff;
136   var time_old_center;
137   var time_new_center;
138   var width;
139
140   img = e.target;
141   if (!img || (img.className != "graph_image")
142       || !img.navTimeBegin || !img.navTimeEnd)
143     return;
144
145   width = img.width - 97;
146
147   x = e.layerX - 70;
148   if (!x || (x < 0) || (x > width))
149     return;
150
151   y = e.layerY;
152   if (!y || (y < 35) || (y > 135))
153     return;
154
155   diff = img.navTimeEnd - img.navTimeBegin;
156
157   time_old_center = img.navTimeBegin + (diff / 2.0);
158   time_new_center = img.navTimeBegin + (x * diff / width);
159
160   img.navTimeBegin += (time_new_center - time_old_center);
161   img.navTimeEnd   += (time_new_center - time_old_center);
162 } /* nav_recenter */
163
164 function nav_handle_dblclick (e)
165 {
166   var img;
167
168   /* M$IE */
169   if (!e)
170     e = window.event;
171
172   img = e.target;
173   if (!img || (img.className != "graph_image")
174       || !img.navTimeBegin || !img.navTimeEnd)
175     return;
176
177   nav_recenter (e);
178   nav_image_repaint (img);
179
180   // e.returnValue = false;
181 } /* nav_handle_dblclick */
182
183 /* Taken from <http://adomas.org/javascript-mouse-wheel/> */
184 function nav_handle_wheel (e)
185 {
186   var delta = 0;
187   var img;
188   
189   /* M$IE */
190   if (!e)
191     e = window.event;
192
193   img = e.target;
194   if (!img || (img.className != "graph_image")
195       || !img.navTimeBegin || !img.navTimeEnd)
196     return;
197
198   /* Opera and M$IE */
199   if (e.wheelDelta)
200   {
201     delta = e.wheelDelta; 
202     if (window.opera)
203       delta = delta * (-1);
204   }
205   else if (e.detail)
206   {
207     delta = e.detail * (-1);
208   }
209
210   if (!delta)
211     return;
212
213   nav_recenter (e);
214   if (delta > 0)
215     nav_zoom_in (img.id);
216   else
217     nav_zoom_out (img.id);
218
219   if (e.preventDefault)
220     e.preventDefault ();
221   e.returnValue = false;
222 } /* function nav_handle_wheel */
223
224 /* vim: set sw=2 sts=2 et : */