fixes, fully translated tomato, with english dictionary and Polish translation
[tomato.git] / release / src / router / www / qos-detailed.asp
blobd317062fc0eb2d9df7ae8a64e0e35cd740772a8a
1 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0//EN'>
2 <!--
3 Tomato GUI
4 Copyright (C) 2006-2010 Jonathan Zarate
5 http://www.polarcloud.com/tomato/
7 For use with Tomato Firmware only.
8 No part of this file may be used without permission.
9 -->
10 <html>
11 <head>
12 <meta http-equiv='content-type' content='text/html;charset=utf-8'>
13 <meta name='robots' content='noindex,nofollow'>
14 <title>[<% ident(); %>] QoS: <% translate("View Details"); %></title>
15 <link rel='stylesheet' type='text/css' href='tomato.css'>
16 <link rel='stylesheet' type='text/css' href='color.css'>
17 <script type='text/javascript' src='tomato.js'></script>
19 <!-- / / / -->
20 <style type='text/css'>
21 #grid .co7 {
22 width: 20px;
24 #grid .co8 {
25 text-align: right;
27 #grid .co9 {
28 text-align: right;
30 </style>
32 <script type='text/javascript' src='debug.js'></script>
33 <script type='text/javascript' src='protocols.js'></script>
35 <script type='text/javascript'>
36 // <% nvram(''); %> // http_id
38 var abc = ['<% translate("Unclassified"); %>', '<% translate("Highest"); %>', '<% translate("High"); %>', '<% translate("Medium"); %>', '<% translate("Low"); %>', '<% translate("Lowest"); %>', '<% translate("Class"); %> A','<% translate("Class"); %> B','<% translate("Class"); %> C','<% translate("Class"); %> D','<% translate("Class"); %> E'];
39 var colors = ['F08080','E6E6FA','0066CC','8FBC8F','FAFAD2','ADD8E6','9ACD32','E0FFFF','90EE90','FF9933','FFF0F5'];
41 if ((viewClass = '<% cgi_get("class"); %>') == '') {
42 viewClass = -1;
44 else if ((isNaN(viewClass *= 1)) || (viewClass < 0) || (viewClass > 10)) {
45 viewClass = 0;
48 var queue = [];
49 var xob = null;
50 var cache = [];
51 var lock = 0;
53 function resolve()
55 if ((queue.length == 0) || (xob)) return;
57 xob = new XmlHttp();
58 xob.onCompleted = function(text, xml) {
59 eval(text);
60 for (var i = 0; i < resolve_data.length; ++i) {
61 var r = resolve_data[i];
62 if (r[1] == '') r[1] = r[0];
63 cache[r[0]] = r[1];
64 if (lock == 0) grid.setName(r[0], r[1]);
66 if (queue.length == 0) {
67 if ((lock == 0) && (resolveCB) && (grid.sortColumn == 4)) grid.resort();
69 else setTimeout(resolve, 500);
70 xob = null;
72 xob.onError = function(ex) {
73 xob = null;
76 xob.post('resolve.cgi', 'ip=' + queue.splice(0, 20).join(','));
79 var resolveCB = 0;
81 function resolveChanged()
83 var b;
85 b = E('resolve').checked ? 1 : 0;
86 if (b != resolveCB) {
87 resolveCB = b;
88 cookie.set('qos_resolve', b);
89 if (b) grid.resolveAll();
93 var grid = new TomatoGrid();
95 grid.dataToView = function(data) {
96 var s, v = [];
97 for (var col = 0; col < data.length; ++col) {
98 switch (col) {
99 case 5: // Class
100 s = abc[data[col]] || ('' + data[col]);
101 break;
102 case 6: // Rule #
103 s = (data[col] * 1 > 0) ? ('' + data[col]) : '';
104 break;
105 case 7: // Bytes out
106 case 8: // Bytes in
107 s = scaleSize(data[col] * 1);
108 break;
109 default:
110 s = '' + data[col];
111 break;
113 v.push(s);
115 return v;
118 grid.sortCompare = function(a, b) {
119 var obj = TGO(a);
120 var col = obj.sortColumn;
121 var da = a.getRowData();
122 var db = b.getRowData();
123 var r;
125 switch (col) {
126 case 2: // S port
127 case 4: // D port
128 case 6: // Rule #
129 case 7: // Bytes out
130 case 8: // Bytes in
131 r = cmpInt(da[col], db[col]);
132 break;
133 case 5: // Class
134 r = cmpInt(da[col] ? da[col] : 10000, db[col] ? db[col] : 10000);
135 break;
136 /* REMOVE-BEGIN
137 case 1:
138 case 3:
139 var a = fixIP(da[col]);
140 var b = fixIP(db[col]);
141 if ((a != null) && (b != null)) {
142 r = aton(a) - aton(b);
143 break;
145 // fall
146 REMOVE-END */
147 default:
148 r = cmpText(da[col], db[col]);
149 break;
151 return obj.sortAscending ? r : -r;
154 grid.onClick = function(cell) {
155 var row = PR(cell);
156 var ip = row.getRowData()[3];
157 if (this.lastClicked != row) {
158 this.lastClicked = row;
159 if (ip.indexOf('<') == -1) {
160 queue.push(ip);
161 row.style.cursor = 'wait';
162 resolve();
165 else {
166 this.resolveAll();
170 grid.resolveAll = function()
172 var i, ip, row, q, cols, j;
174 q = [];
175 cols = [1, 3];
176 for (i = 1; i < this.tb.rows.length; ++i) {
177 row = this.tb.rows[i];
178 for (j = cols.length-1; j >= 0; j--) {
179 ip = row.getRowData()[cols[j]];
180 if (ip.indexOf('<') == -1) {
181 if (!q[ip]) {
182 q[ip] = 1;
183 queue.push(ip);
185 row.style.cursor = 'wait';
189 q = null;
190 resolve();
193 grid.setName = function(ip, name) {
194 var i, row, data, cols, j;
196 cols = [1, 3];
197 for (i = this.tb.rows.length - 1; i > 0; --i) {
198 row = this.tb.rows[i];
199 data = row.getRowData();
200 for (j = cols.length-1; j >= 0; j--) {
201 if (data[cols[j]] == ip) {
202 data[cols[j]] = name + ((ip.indexOf(':') != -1) ? '<br>' : ' ') + '<small>(' + ip + ')</small>';
203 row.setRowData(data);
204 row.cells[cols[j]].innerHTML = data[cols[j]];
205 row.style.cursor = 'default';
211 grid.setup = function() {
212 this.init('grid', 'sort');
213 this.headerSet(['<% translate("Proto"); %>', '<% translate("Source"); %>', '<% translate("S Port"); %>', '<% translate("Destination"); %>', '<% translate("D Port"); %>', '<% translate("Class"); %>', '<% translate("Rule"); %>', '<% translate("Bytes Out"); %>', '<% translate("Bytes In"); %>']);
216 var ref = new TomatoRefresh('update.cgi', '', 0, 'qos_detailed');
218 ref.refresh = function(text)
220 var i, b, d, cols, j;
222 ++lock;
224 try {
225 ctdump = [];
226 eval(text);
228 catch (ex) {
229 ctdump = [];
232 grid.lastClicked = null;
233 grid.removeAllData();
235 var c = [];
236 var q = [];
237 var cursor;
238 var ip;
240 cols = [2, 3];
242 for (i = 0; i < ctdump.length; ++i) {
243 b = ctdump[i];
244 for (j = cols.length-1; j >= 0; j--) {
245 ip = b[cols[j]];
246 if (cache[ip] != null) {
247 c[ip] = cache[ip];
248 b[cols[j]] = cache[ip] + ((ip.indexOf(':') != -1) ? '<br>' : ' ') + '<small>(' + ip + ')</small>';
249 cursor = 'default';
251 else {
252 if (resolveCB) {
253 if (!q[ip]) {
254 q[ip] = 1;
255 queue.push(ip);
257 cursor = 'wait';
259 else cursor = null;
262 d = [protocols[b[0]] || b[0], b[2], b[4], b[3], b[5], b[8], b[9], b[6], b[7]];
263 var row = grid.insertData(-1, d);
264 if (cursor) row.style.cursor = cursor;
266 cache = c;
267 c = null;
268 q = null;
270 grid.resort();
271 setTimeout(function() { E('loading').style.visibility = 'hidden'; }, 100);
273 --lock;
275 if (resolveCB) resolve();
278 function init()
280 var c;
282 if (((c = cookie.get('qos_resolve')) != null) && (c == '1')) {
283 E('resolve').checked = resolveCB = 1;
286 if (viewClass != -1) E('stitle').innerHTML = 'View Details: ' + abc[viewClass];
287 grid.setup();
288 ref.postData = 'exec=ctdump&arg0=' + viewClass;
289 ref.initPage(250);
291 if (!ref.running) ref.once = 1;
292 ref.start();
294 </script>
295 </head>
296 <body onload='init()'>
297 <form id='_fom' action='javascript:{}'>
298 <table id='container' cellspacing=0>
299 <tr><td colspan=2 id='header'>
300 <div class='title'>Tomato</div>
301 <div class='version'><% translate("Version"); %> <% version(); %></div>
302 </td></tr>
303 <tr id='body'><td id='navi'><script type='text/javascript'>navi()</script></td>
304 <td id='content'>
305 <div id='ident'><% ident(); %></div>
307 <!-- / / / -->
309 <div class='section-title' id='stitle' onclick='document.location="qos-graphs.asp"' style='cursor:pointer'><% translate("View Details"); %></div>
310 <div class='section'>
311 <table id='grid' class='tomato-grid' style="float:left" cellspacing=1></table>
312 <input type='checkbox' id='resolve' onclick='resolveChanged()' onchange='resolveChanged()'> <% translate("Automatically Resolve Addresses"); %>
313 <div id='loading'><br><b><% translate("Loading"); %>...</b></div>
314 </div>
316 <!-- / / / -->
318 </td></tr>
319 <tr><td id='footer' colspan=2>
320 <script type='text/javascript'>genStdRefresh(1,10,'ref.toggle()');</script>
321 </td></tr>
322 </table>
323 </form>
324 </body>
325 </html>