Tomato 1.28
[tomato.git] / release / src / router / www / qos-detailed.asp
blob0d0abed0b7f2e7baa28c59e45a27f758021732b4
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: 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 <script type='text/javascript' src='debug.js'></script>
21 <script type='text/javascript' src='protocols.js'></script>
23 <script type='text/javascript'>
24 // <% nvram(''); %> // http_id
26 var abc = ['Unclassified', 'Highest', 'High', 'Medium', 'Low', 'Lowest', 'Class A','Class B','Class C','Class D','Class E'];
27 var colors = ['F08080','E6E6FA','0066CC','8FBC8F','FAFAD2','ADD8E6','9ACD32','E0FFFF','90EE90','FF9933','FFF0F5'];
29 if ((viewClass = '<% cgi_get("class"); %>') == '') {
30 viewClass = -1;
32 else if ((isNaN(viewClass *= 1)) || (viewClass < 0) || (viewClass > 10)) {
33 viewClass = 0;
36 var queue = [];
37 var xob = null;
38 var cache = [];
39 var lock = 0;
41 function resolve()
43 if ((queue.length == 0) || (xob)) return;
45 xob = new XmlHttp();
46 xob.onCompleted = function(text, xml) {
47 eval(text);
48 for (var i = 0; i < resolve_data.length; ++i) {
49 var r = resolve_data[i];
50 if (r[1] == '') r[1] = r[0];
51 cache[r[0]] = r[1];
52 if (lock == 0) grid.setName(r[0], r[1]);
54 if (queue.length == 0) {
55 if ((lock == 0) && (resolveCB) && (grid.sortColumn == 3)) grid.resort();
57 else setTimeout(resolve, 500);
58 xob = null;
60 xob.onError = function(ex) {
61 xob = null;
64 xob.post('resolve.cgi', 'ip=' + queue.splice(0, 20).join(','));
67 var resolveCB = 0;
69 function resolveChanged()
71 var b;
73 b = E('resolve').checked ? 1 : 0;
74 if (b != resolveCB) {
75 resolveCB = b;
76 cookie.set('qos-resolve', b);
77 if (b) grid.resolveAll();
81 var grid = new TomatoGrid();
83 grid.sortCompare = function(a, b) {
84 var obj = TGO(a);
85 var col = obj.sortColumn;
86 var da = a.getRowData();
87 var db = b.getRowData();
88 var r;
90 switch (col) {
91 case 2:
92 case 4:
93 r = cmpInt(da[col], db[col]);
94 break;
95 case 1:
96 case 3:
97 var a = fixIP(da[col]);
98 var b = fixIP(db[col]);
99 if ((a != null) && (b != null)) {
100 r = aton(a) - aton(b);
101 break;
103 // fall
104 default:
105 r = cmpText(da[col], db[col]);
106 break;
108 return obj.sortAscending ? r : -r;
111 grid.onClick = function(cell) {
112 var row = PR(cell);
113 var ip = row.getRowData()[3];
114 if (this.lastClicked != row) {
115 this.lastClicked = row;
116 if (ip.indexOf('<') == -1) {
117 queue.push(ip);
118 row.style.cursor = 'wait';
119 resolve();
122 else {
123 this.resolveAll();
127 grid.resolveAll = function()
129 var i, ip, row, q;
131 q = [];
132 for (i = 1; i < this.tb.rows.length; ++i) {
133 row = this.tb.rows[i];
134 ip = row.getRowData()[3];
135 if (ip.indexOf('<') == -1) {
136 if (!q[ip]) {
137 q[ip] = 1;
138 queue.push(ip);
140 row.style.cursor = 'wait';
143 q = null;
144 resolve();
147 grid.setName = function(ip, name) {
148 var i, row, data;
150 for (i = this.tb.rows.length - 1; i > 0; --i) {
151 row = this.tb.rows[i];
152 data = row.getRowData();
153 if (data[3] == ip) {
154 data[3] = name + ' <small>(' + ip + ')</small>';
155 row.setRowData(data);
156 row.cells[3].innerHTML = data[3];
157 row.style.cursor = 'default';
162 grid.setup = function() {
163 this.init('grid', 'sort');
164 this.headerSet(['Proto', 'Source', 'S Port', 'Destination', 'D Port', 'Class']);
167 var ref = new TomatoRefresh('update.cgi', '', 0, 'qos_detailed');
169 ref.refresh = function(text)
171 var i, b, d;
173 ++lock;
175 try {
176 ctdump = [];
177 eval(text);
179 catch (ex) {
180 ctdump = [];
183 grid.lastClicked = null;
184 grid.removeAllData();
186 var c = [];
187 var q = [];
188 var cursor;
189 var ip;
191 for (i = 0; i < ctdump.length; ++i) {
192 b = ctdump[i];
193 ip = b[3];
194 if (cache[ip] != null) {
195 c[ip] = cache[ip];
196 b[3] = cache[ip] + ' <small>(' + ip + ')</small>';
197 cursor = 'default';
199 else {
200 if (resolveCB) {
201 if (!q[ip]) {
202 q[ip] = 1;
203 queue.push(ip);
205 cursor = 'wait';
207 else cursor = null;
209 d = [protocols[b[0]] || b[0], b[2], b[4], b[3], b[5], abc[b[6]] || ('' + b[6])];
210 var row = grid.insert(-1, d, d, false);
211 if (cursor) row.style.cursor = cursor;
213 cache = c;
214 c = null;
215 q = null;
217 grid.resort();
218 setTimeout(function() { E('loading').style.visibility = 'hidden'; }, 100);
220 --lock;
222 if (resolveCB) resolve();
225 function init()
227 var c;
229 if (((c = cookie.get('qos-resolve')) != null) && (c == '1')) {
230 E('resolve').checked = resolveCB = 1;
233 if (viewClass != -1) E('stitle').innerHTML = 'View Details: ' + abc[viewClass];
234 grid.setup();
235 ref.postData = 'exec=ctdump&arg0=' + viewClass;
236 ref.initPage(-250);
238 </script>
239 </head>
240 <body onload='init()'>
241 <form id='_fom' action='javascript:{}'>
242 <table id='container' cellspacing=0>
243 <tr><td colspan=2 id='header'>
244 <div class='title'>Tomato</div>
245 <div class='version'>Version <% version(); %></div>
246 </td></tr>
247 <tr id='body'><td id='navi'><script type='text/javascript'>navi()</script></td>
248 <td id='content'>
249 <div id='ident'><% ident(); %></div>
251 <!-- / / / -->
253 <div class='section-title' id='stitle' onclick='document.location="qos-graphs.asp"' style='cursor:pointer'>View Details</div>
254 <div class='section'>
255 <table id='grid' class='tomato-grid' style="float:left" cellspacing=1></table>
256 <input type='checkbox' id='resolve' onclick='resolveChanged()' onchange='resolveChanged()'> Automatically Resolve Addresses
257 <div id='loading'><br><b>Loading...</b></div>
258 </div>
260 <!-- / / / -->
262 </td></tr>
263 <tr><td id='footer' colspan=2>
264 <script type='text/javascript'>genStdRefresh(1,10,'ref.toggle()');</script>
265 </td></tr>
266 </table>
267 </form>
268 </body>
269 </html>