Merge commit 'origin/tomato-RT' into tomato-shibby
[tomato.git] / release / src / router / www / bwm-common.js
blob838eefe46bde36fb712363060a4125c7380f8766
1 /*
2         Tomato GUI
3         Copyright (C) 2006-2010 Jonathan Zarate
4         http://www.polarcloud.com/tomato/
6         For use with Tomato Firmware only.
7         No part of this file may be used without permission.
8 */
10 var tabs = [];
11 var rx_max, rx_avg;
12 var tx_max, tx_avg;
13 var xx_max = 0;
14 var ifname;
15 var htmReady = 0;
16 var svgReady = 0;
17 var updating = 0;
18 var scaleMode = 0;
19 var scaleLast = -1;
20 var drawMode = 0;
21 var drawLast = -1;
22 var drawColor = 0;
23 var avgMode = 0;
24 var avgLast = -1;
25 var colorX = 0;
26 var colors = [
27         ['Green & Blue', '#118811', '#6495ed'], ['Blue & Orange', '#003EBA', '#FF9000'],
28         ['Blue & Red', '#003EDD', '#CC4040'], ['Blue', '#22f', '#225'], ['Gray', '#000', '#999'],
29         ['Red & Black', '#d00', '#000']];
31 function xpsb(byt)
33 /* REMOVE-BEGIN
34         kbit/s = 1000 bits/s
35         125 = 1000 / 8
36         ((B * 8) / 1000)
37 REMOVE-END */
38         return (byt / 125).toFixed(2) + ' <small>kbit/s</small><br>(' + (byt / 1024).toFixed(2) + ' <small>KB/s</small>)';
41 function showCTab()
43         showTab('speed-tab-' + ifname);
46 function showSelectedOption(prefix, prev, now)
48         var e;
50         elem.removeClass(prefix + prev, 'selected');    // safe if prev doesn't exist
51         if ((e = E(prefix + now)) != null) {
52                 elem.addClass(e, 'selected');
53                 e.blur();
54         }
57 function showDraw()
59         if (drawLast == drawMode) return;
60         showSelectedOption('draw', drawLast, drawMode);
61         drawLast = drawMode;
64 function switchDraw(n)
66         if ((!svgReady) || (updating)) return;
67         drawMode = n;
68         showDraw();
69         showCTab();
70         cookie.set(cprefix + 'draw', drawMode);
73 function showColor()
75         E('drawcolor').innerHTML = colors[drawColor][0] + ' &raquo;';
76         E('rx-name').style.borderBottom = '2px dashed ' + colors[drawColor][1 + colorX];
77         E('tx-name').style.borderBottom = '2px dashed ' + colors[drawColor][1 + (colorX ^ 1)];
80 function switchColor(rev)
82         if ((!svgReady) || (updating)) return;
83         if (rev) colorX ^= 1;
84                 else drawColor = (drawColor + 1) % colors.length;
85         showColor();
86         showCTab();
87         cookie.set(cprefix + 'color', drawColor + ',' + colorX);
90 function showScale()
92         if (scaleMode == scaleLast) return;
93         showSelectedOption('scale', scaleLast, scaleMode);
94         scaleLast = scaleMode;
97 function switchScale(n)
99         scaleMode = n;
100         showScale();
101         showTab('speed-tab-' + ifname);
102         cookie.set(cprefix + 'scale', scaleMode);
105 function showAvg()
107         if (avgMode == avgLast) return;
108         showSelectedOption('avg', avgLast, avgMode);
109         avgLast = avgMode;
112 function switchAvg(n)
114         if ((!svgReady) || (updating)) return;
115         avgMode = n;
116         showAvg();
117         showCTab();
118         cookie.set(cprefix + 'avg', avgMode);
121 function tabSelect(name)
123         if (!updating) showTab(name);
126 function showTab(name)
128         var h;
129         var max;
130         var i;
131         var rx, tx;
132         var e;
134         ifname = name.replace('speed-tab-', '');
135         cookie.set(cprefix + 'tab', ifname, 14);
136         tabHigh(name);
138         h = speed_history[ifname];
139         if (!h) return;
141         E('rx-current').innerHTML = xpsb(h.rx[h.rx.length - 1] / updateDiv);
142         E('rx-avg').innerHTML = xpsb(h.rx_avg);
143         E('rx-max').innerHTML = xpsb(h.rx_max);
145         E('tx-current').innerHTML = xpsb(h.tx[h.tx.length - 1] / updateDiv);
146         E('tx-avg').innerHTML = xpsb(h.tx_avg);
147         E('tx-max').innerHTML = xpsb(h.tx_max);
149         E('rx-total').innerHTML = scaleSize(h.rx_total);
150         E('tx-total').innerHTML = scaleSize(h.tx_total);
152         if (svgReady) {
153                 max = scaleMode ? MAX(h.rx_max, h.tx_max) : xx_max
154                 if (max > 12500) max = Math.round((max + 12499) / 12500) * 12500;
155                         else max += 100;
156                 updateSVG(h.rx, h.tx, max, drawMode,
157                         colors[drawColor][1 + colorX], colors[drawColor][1 + (colorX ^ 1)],
158                         updateInt, updateMaxL, updateDiv, avgMode, clock);
159         }
162 function loadData()
164         var old;
165         var t, e;
166         var name;
167         var i;
168         var changed;
170         xx_max = 0;
171         old = tabs;
172         tabs = [];
173         clock = new Date();
175         if (!speed_history) {
176                 speed_history = [];
177         }
178         else {
179                 for (var i in speed_history) {
180                         var h = speed_history[i];
181                         if ((typeof(h.rx) == 'undefined') || (typeof(h.tx) == 'undefined')) {
182                                 delete speed_history[i];
183                                 continue;
184                         }
185                         if ((h.rx_total == 0) && (h.tx_total == 0) && (h.up == 0)) {
186                                 delete speed_history[i];
187                                 continue;
188                         }
190                         if (updateReTotal) {
191                                 h.rx_total = h.rx_max = 0;
192                                 h.tx_total = h.tx_max = 0;
193                                 for (j = (h.rx.length - updateMaxL); j < h.rx.length; ++j) {
194                                         t = h.rx[j];
195                                         if (t > h.rx_max) h.rx_max = t;
196                                         h.rx_total += t;
197                                         t = h.tx[j];
198                                         if (t > h.tx_max) h.tx_max = t;
199                                         h.tx_total += t;
200                                 }
201                                 h.rx_avg = h.rx_total / updateMaxL;
202                                 h.tx_avg = h.tx_total / updateMaxL;
203                         }
205                         if (updateDiv > 1) {
206                                 h.rx_max /= updateDiv;
207                                 h.tx_max /= updateDiv;
208                                 h.rx_avg /= updateDiv;
209                                 h.tx_avg /= updateDiv;
210                         }
211                         if (h.rx_max > xx_max) xx_max = h.rx_max;
212                         if (h.tx_max > xx_max) xx_max = h.tx_max;
214                         t = i;
215                         
216                         if (wl_ifidx(i) >= 0) {
217                                 t = 'WL <small>(' + i + ')</small>';
218                         }
219                    
220                        if (i == 'imq0')        {
221                                t = 'Limit/Up <small>(' + i + ')</small>';
222                        }
223                        
224                        if (i == 'imq1')        {
225                                t = 'Limit/Dwn <small>(' + i + ')</small>';
226                        }
227                        
228                         else if ((nvram.wan_proto == 'pptp') || (nvram.wan_proto == 'pppoe') || (nvram.wan_proto == 'l2tp')) {
229                                 if (nvram.wan_iface == i) t = 'WAN <small>(' + i + ')</small>';
230                                 else if (nvram.wan_ifname == i && nvram.wan_proto != 'pppoe') t = 'MAN <small>(' + i + ')</small>';
231                         }
232                         else if (nvram.wan_proto != 'disabled') {
233                                 if (nvram.wan_ifname == i) t = 'WAN <small>(' + i + ')</small>';
234                         }
235                         tabs.push(['speed-tab-' + i, t]);
236                 }
238                 tabs = tabs.sort(
239                         function(a, b) {
240                                 if (a[1] < b[1]) return -1;
241                                 if (a[1] > b[1]) return 1;
242                                 return 0;
243                         });
244         }
246         if (tabs.length == old.length) {
247                 for (i = tabs.length - 1; i >= 0; --i)
248                         if (tabs[i][0] != old[i][0]) break;
249                 changed = i > 0;
250         }
251         else changed = 1;
253         if (changed) {
254                 E('tab-area').innerHTML = _tabCreate.apply(this, tabs);
255         }
256         if (((name = cookie.get(cprefix + 'tab')) != null) && ((speed_history[name] != undefined))) {
257                 showTab('speed-tab-' + name);
258                 return;
259         }
260         if (tabs.length) showTab(tabs[0][0]);
263 function initData()
265         if (htmReady) {
266                 loadData();
267                 if (svgReady) {
268                         E('graph').style.visibility = 'visible';
269                         E('bwm-controls').style.visibility = 'visible';
270                 }
271         }
274 function initCommon(defAvg, defDrawMode, defDrawColor)
276         drawMode = fixInt(cookie.get(cprefix + 'draw'), 0, 1, defDrawMode);
277         showDraw();
279         var c = nvram.rstats_colors.split(',');
280         while (c.length >= 3) {
281                 c[0] = escapeHTML(c[0]);
282                 colors.push(c.splice(0, 3));
283         }
285         c = (cookie.get(cprefix + 'color') || '').split(',');
286         if (c.length == 2) {
287                 drawColor = fixInt(c[0], 0, colors.length - 1, defDrawColor);
288                 colorX = fixInt(c[1], 0, 1, 0);
289         }
290         else {
291                 drawColor = defDrawColor;
292         }
293         showColor();
295         scaleMode = fixInt(cookie.get(cprefix + 'scale'), 0, 1, 0);
296         showScale();
298         avgMode = fixInt(cookie.get(cprefix + 'avg'), 1, 10, defAvg);
299         showAvg();
301         // if just switched
302         if ((nvram.wan_proto == 'disabled') || (nvram.wan_proto == 'wet')) {
303                 nvram.wan_ifname = '';
304         }
306         htmReady = 1;
307         initData();
308         E('refresh-spinner').style.visibility = 'hidden';