modules/admin-full: rework status javascript code to use XHR.poll()
authorJo-Philipp Wich <jow@openwrt.org>
Mon, 26 Sep 2011 00:24:34 +0000 (00:24 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Mon, 26 Sep 2011 00:24:34 +0000 (00:24 +0000)
modules/admin-full/luasrc/view/admin_network/iface_overview.htm
modules/admin-full/luasrc/view/admin_network/iface_status.htm
modules/admin-full/luasrc/view/admin_network/lease_status.htm
modules/admin-full/luasrc/view/admin_network/wifi_overview.htm
modules/admin-full/luasrc/view/admin_network/wifi_status.htm
modules/admin-full/luasrc/view/admin_status/index.htm

index 6a94c2d..8a91ca4 100644 (file)
@@ -44,8 +44,7 @@ $Id$
                        s.innerHTML = '<%:Waiting for router...%>';
                }
 
-               var rcxhr = new XHR();
-               rcxhr.get('<%=luci.dispatcher.build_url("admin", "network")%>/iface_' + (reconnect ? 'reconnect' : 'shutdown') + '/' + id, null,
+               XHR.get('<%=luci.dispatcher.build_url("admin", "network")%>/iface_' + (reconnect ? 'reconnect' : 'shutdown') + '/' + id, null,
                        function(x)
                        {
                                if (s)
@@ -67,117 +66,112 @@ $Id$
        var wifidevs = <%=luci.http.write_json(netdevs)%>;
        var arptable = <%=luci.http.write_json(arpcache)%>;
 
-       (function() {
-               var func = arguments.callee;
-               iwxhr.get('<%=luci.dispatcher.build_url("admin", "network", "iface_status", table.concat(netlist, ","))%>', null,
-                       function(x, ifcs)
+       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "iface_status", table.concat(netlist, ","))%>', null,
+               function(x, ifcs)
+               {
+                       if (ifcs)
                        {
-                               if (ifcs)
+                               for (var idx = 0; idx < ifcs.length; idx++)
                                {
-                                       for (var idx = 0; idx < ifcs.length; idx++)
+                                       var ifc = ifcs[idx];
+                                       var html = '';
+
+                                       var s = document.getElementById(ifc.id + '-ifc-devices');
+                                       if (s)
                                        {
-                                               var ifc = ifcs[idx];
-                                               var html = '';
+                                               var stat = String.format(
+                                                       '<img src="<%=resource%>/icons/%s%s.png" style="width:16px; height:16px; vertical-align:middle" />',
+                                                               ifc.type,
+                                                               ifc.is_up ? '' : '_disabled'
+                                               );
 
-                                               var s = document.getElementById(ifc.id + '-ifc-devices');
-                                               if (s)
+                                               if (ifc.subdevices && ifc.subdevices.length)
                                                {
-                                                       var stat = String.format(
-                                                               '<img src="<%=resource%>/icons/%s%s.png" style="width:16px; height:16px; vertical-align:middle" />',
-                                                                       ifc.type,
-                                                                       ifc.is_up ? '' : '_disabled'
-                                                       );
+                                                       stat += ' <strong>(';
 
-                                                       if (ifc.subdevices && ifc.subdevices.length)
+                                                       for (var j = 0; j < ifc.subdevices.length; j++)
                                                        {
-                                                               stat += ' <strong>(';
-
-                                                               for (var j = 0; j < ifc.subdevices.length; j++)
-                                                               {
-                                                                       var sif = ifc.subdevices[j];
+                                                               var sif = ifc.subdevices[j];
+
+                                                               stat += String.format(
+                                                                       '<img src="<%=resource%>/icons/%s%s.png" style="width:16px; height:16px; vertical-align:middle" title="%q" />',
+                                                                               sif.type,
+                                                                               sif.is_up ? '' : '_disabled',
+                                                                               sif.name
+                                                               );
+                                                       }
 
-                                                                       stat += String.format(
-                                                                               '<img src="<%=resource%>/icons/%s%s.png" style="width:16px; height:16px; vertical-align:middle" title="%q" />',
-                                                                                       sif.type,
-                                                                                       sif.is_up ? '' : '_disabled',
-                                                                                       sif.name
-                                                                       );
-                                                               }
+                                                       stat += ')</strong>';
+                                               }
 
-                                                               stat += ')</strong>';
-                                                       }
+                                               stat += String.format(
+                                                       '<br /><small>%s</small>',
+                                                               ifc.name
+                                               );
 
-                                                       stat += String.format(
-                                                               '<br /><small>%s</small>',
-                                                                       ifc.name
-                                                       );
+                                               s.innerHTML = stat;
+                                       }
 
-                                                       s.innerHTML = stat;
+                                       var d = document.getElementById(ifc.id + '-ifc-description');
+                                       if (d && ifc.ifname)
+                                       {
+                                               if (ifc.is_up)
+                                               {
+                                                       html += String.format('<strong><%:Uptime%>:</strong> %t<br />', ifc.uptime);
                                                }
 
-                                               var d = document.getElementById(ifc.id + '-ifc-description');
-                                               if (d && ifc.ifname)
+                                               if (ifc.type != 'tunnel')
                                                {
-                                                       if (ifc.is_up)
-                                                       {
-                                                               html += String.format('<strong><%:Uptime%>:</strong> %t<br />', ifc.uptime);
-                                                       }
-
-                                                       if (ifc.type != 'tunnel')
-                                                       {
-                                                               html += String.format('<strong><%:MAC Address%>:</strong> %s<br />', ifc.macaddr);
-                                                       }
-
-                                                       html += String.format(
-                                                               '<strong><%:RX%></strong>: %.2mB (%d <%:Pkts.%>)<br />' +
-                                                               '<strong><%:TX%></strong>: %.2mB (%d <%:Pkts.%>)<br />',
-                                                                       ifc.rx_bytes, ifc.rx_packets,
-                                                                       ifc.tx_bytes, ifc.tx_packets
-                                                       );
+                                                       html += String.format('<strong><%:MAC Address%>:</strong> %s<br />', ifc.macaddr);
+                                               }
 
-                                                       if (ifc.ipaddrs && ifc.ipaddrs.length)
-                                                       {
-                                                               html += '<strong><%:IPv4%>: </strong>';
+                                               html += String.format(
+                                                       '<strong><%:RX%></strong>: %.2mB (%d <%:Pkts.%>)<br />' +
+                                                       '<strong><%:TX%></strong>: %.2mB (%d <%:Pkts.%>)<br />',
+                                                               ifc.rx_bytes, ifc.rx_packets,
+                                                               ifc.tx_bytes, ifc.tx_packets
+                                               );
 
-                                                               for (var i = 0; i < ifc.ipaddrs.length; i++)
-                                                                       html += String.format(
-                                                                               '%s%s/%d',
-                                                                               i ? ', ' : '',
-                                                                               ifc.ipaddrs[i].addr,
-                                                                               ifc.ipaddrs[i].prefix
-                                                                       );
+                                               if (ifc.ipaddrs && ifc.ipaddrs.length)
+                                               {
+                                                       html += '<strong><%:IPv4%>: </strong>';
 
-                                                               html += '<br />';
-                                                       }
+                                                       for (var i = 0; i < ifc.ipaddrs.length; i++)
+                                                               html += String.format(
+                                                                       '%s%s/%d',
+                                                                       i ? ', ' : '',
+                                                                       ifc.ipaddrs[i].addr,
+                                                                       ifc.ipaddrs[i].prefix
+                                                               );
 
-                                                       if (ifc.ip6addrs && ifc.ip6addrs.length)
-                                                       {
-                                                               html += '<strong><%:IPv6%>: </strong>';
+                                                       html += '<br />';
+                                               }
 
-                                                               for (var i = 0; i < ifc.ip6addrs.length; i++)
-                                                                       html += String.format(
-                                                                               '%s%s/%d',
-                                                                               i ? ', ' : '',
-                                                                               ifc.ip6addrs[i].addr.toUpperCase(),
-                                                                               ifc.ip6addrs[i].prefix
-                                                                       );
+                                               if (ifc.ip6addrs && ifc.ip6addrs.length)
+                                               {
+                                                       html += '<strong><%:IPv6%>: </strong>';
 
-                                                               html += '<br />';
-                                                       }
+                                                       for (var i = 0; i < ifc.ip6addrs.length; i++)
+                                                               html += String.format(
+                                                                       '%s%s/%d',
+                                                                       i ? ', ' : '',
+                                                                       ifc.ip6addrs[i].addr.toUpperCase(),
+                                                                       ifc.ip6addrs[i].prefix
+                                                               );
 
-                                                       d.innerHTML = html;
-                                               }
-                                               else if (d)
-                                               {
-                                                       d.innerHTML = '<em><%:Interface not present or not connected yet.%></em>';
+                                                       html += '<br />';
                                                }
+
+                                               d.innerHTML = html;
+                                       }
+                                       else if (d)
+                                       {
+                                               d.innerHTML = '<em><%:Interface not present or not connected yet.%></em>';
                                        }
                                }
-
-                               window.setTimeout(func, 5000);
                        }
-               )
-       })();
+               }
+       );
 //]]></script>
 
 <fieldset class="cbi-section" style="display:none">
index 69ae052..f80fb5e 100644 (file)
@@ -1,89 +1,81 @@
 <%+cbi/valueheader%>
 
 <script type="text/javascript">//<![CDATA[
-       var iwxhr = new XHR();
-
-       (function() {
-               var func = arguments.callee;
-
-               iwxhr.get('<%=luci.dispatcher.build_url("admin", "network", "iface_status", self.network)%>', null,
-                       function(x, ifc)
+       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "iface_status", self.network)%>', null,
+               function(x, ifc)
+               {
+                       if (ifc && (ifc = ifc[0]))
                        {
-                               if (ifc && (ifc = ifc[0]))
+                               var html = '';
+
+                               var s = document.getElementById('<%=self.option%>-ifc-signal');
+                               if (s)
+                                       s.innerHTML = String.format(
+                                               '<img src="<%=resource%>/icons/%s%s.png" style="width:16px; height:16px" />' +
+                                               '<br /><small>%s</small>',
+                                                       ifc.type, ifc.is_up ? '' : '_disabled',
+                                                       ifc.is_up ? ifc.ifname : '?'
+                                       );
+
+                               var d = document.getElementById('<%=self.option%>-ifc-description');
+                               if (d && ifc.ifname && ifc.macaddr != '00:00:00:00:00:00')
                                {
-                                       var html = '';
-
-                                       var s = document.getElementById('<%=self.option%>-ifc-signal');
-                                       if (s)
-                                               s.innerHTML = String.format(
-                                                       '<img src="<%=resource%>/icons/%s%s.png" style="width:16px; height:16px" />' +
-                                                       '<br /><small>%s</small>',
-                                                               ifc.type, ifc.is_up ? '' : '_disabled',
-                                                               ifc.is_up ? ifc.ifname : '?'
-                                               );
-
-                                       var d = document.getElementById('<%=self.option%>-ifc-description');
-                                       if (d && ifc.ifname && ifc.macaddr != '00:00:00:00:00:00')
+                                       if (ifc.is_up)
                                        {
-                                               if (ifc.is_up)
-                                               {
-                                                       html += String.format('<strong><%:Uptime%>:</strong> %t<br />', ifc.uptime);
-                                               }
-
-                                               if (ifc.type != 'tunnel')
-                                               {
-                                                       html += String.format('<strong><%:MAC Address%>:</strong> %s<br />', ifc.macaddr);
-                                               }
+                                               html += String.format('<strong><%:Uptime%>:</strong> %t<br />', ifc.uptime);
+                                       }
 
-                                               html += String.format(
-                                                       '<strong><%:RX%></strong>: %.2mB (%d <%:Pkts.%>)<br />' +
-                                                       '<strong><%:TX%></strong>: %.2mB (%d <%:Pkts.%>)<br />',
-                                                               ifc.rx_bytes, ifc.rx_packets,
-                                                               ifc.tx_bytes, ifc.tx_packets
-                                               );
+                                       if (ifc.type != 'tunnel')
+                                       {
+                                               html += String.format('<strong><%:MAC Address%>:</strong> %s<br />', ifc.macaddr);
+                                       }
 
-                                               if (ifc.ipaddrs && ifc.ipaddrs.length)
-                                               {
-                                                       html += '<strong><%:IPv4%>: </strong>';
+                                       html += String.format(
+                                               '<strong><%:RX%></strong>: %.2mB (%d <%:Pkts.%>)<br />' +
+                                               '<strong><%:TX%></strong>: %.2mB (%d <%:Pkts.%>)<br />',
+                                                       ifc.rx_bytes, ifc.rx_packets,
+                                                       ifc.tx_bytes, ifc.tx_packets
+                                       );
 
-                                                       for (var i = 0; i < ifc.ipaddrs.length; i++)
-                                                               html += String.format(
-                                                                       '%s%s/%d',
-                                                                       i ? ', ' : '',
-                                                                       ifc.ipaddrs[i].addr,
-                                                                       ifc.ipaddrs[i].prefix
-                                                               );
+                                       if (ifc.ipaddrs && ifc.ipaddrs.length)
+                                       {
+                                               html += '<strong><%:IPv4%>: </strong>';
 
-                                                       html += '<br />';
-                                               }
+                                               for (var i = 0; i < ifc.ipaddrs.length; i++)
+                                                       html += String.format(
+                                                               '%s%s/%d',
+                                                               i ? ', ' : '',
+                                                               ifc.ipaddrs[i].addr,
+                                                               ifc.ipaddrs[i].prefix
+                                                       );
 
-                                               if (ifc.ip6addrs && ifc.ip6addrs.length)
-                                               {
-                                                       html += '<strong><%:IPv6%>: </strong>';
+                                               html += '<br />';
+                                       }
 
-                                                       for (var i = 0; i < ifc.ip6addrs.length; i++)
-                                                               html += String.format(
-                                                                       '%s%s/%d',
-                                                                       i ? ', ' : '',
-                                                                       ifc.ip6addrs[i].addr.toUpperCase(),
-                                                                       ifc.ip6addrs[i].prefix
-                                                               );
+                                       if (ifc.ip6addrs && ifc.ip6addrs.length)
+                                       {
+                                               html += '<strong><%:IPv6%>: </strong>';
 
-                                                       html += '<br />';
-                                               }
+                                               for (var i = 0; i < ifc.ip6addrs.length; i++)
+                                                       html += String.format(
+                                                               '%s%s/%d',
+                                                               i ? ', ' : '',
+                                                               ifc.ip6addrs[i].addr.toUpperCase(),
+                                                               ifc.ip6addrs[i].prefix
+                                                       );
 
-                                               d.innerHTML = html;
-                                       }
-                                       else if (d)
-                                       {
-                                               d.innerHTML = '<em><%:Interface not present or not connected yet.%></em>';
+                                               html += '<br />';
                                        }
-                               }
 
-                               window.setTimeout(func, 5000);
+                                       d.innerHTML = html;
+                               }
+                               else if (d)
+                               {
+                                       d.innerHTML = '<em><%:Interface not present or not connected yet.%></em>';
+                               }
                        }
-               )
-       })();
+               }
+       );
 //]]></script>
 
 <table>
index 519b63e..bf5a5c2 100644 (file)
@@ -1,56 +1,48 @@
 <script type="text/javascript">//<![CDATA[
-       var stxhr = new XHR();
-
-       (function() {
-               var func = arguments.callee;
-
-               stxhr.get('<%=luci.dispatcher.build_url("admin", "network", "dhcplease_status")%>', null,
-                       function(x, st)
+       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "dhcplease_status")%>', null,
+               function(x, st)
+               {
+                       var tb = document.getElementById('lease_status_table');
+                       if (st && tb)
                        {
-                               var tb = document.getElementById('lease_status_table');
-                               if (st && tb)
+                               /* clear all rows */
+                               while( tb.rows.length > 1 )
+                                       tb.deleteRow(1);
+
+                               for( var i = 0; i < st.length; i++ )
                                {
-                                       /* clear all rows */
-                                       while( tb.rows.length > 1 )
-                                               tb.deleteRow(1);
+                                       var timestr;
 
-                                       for( var i = 0; i < st.length; i++ )
+                                       if (st[i].expires <= 0)
                                        {
-                                               var timestr;
-
-                                               if (st[i].expires <= 0)
-                                               {
-                                                       timestr = '<em><%:expired%></em>';
-                                               }
-                                               else
-                                               {
-                                                       timestr = String.format('%t', st[i].expires);
-                                               }
-
-                                               var tr = tb.insertRow(-1);
-                                                       tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
-
-                                               tr.insertCell(-1).innerHTML = st[i].hostname ? st[i].hostname : '?';
-                                               tr.insertCell(-1).innerHTML = st[i].ipaddr;
-                                               tr.insertCell(-1).innerHTML = st[i].macaddr;
-                                               tr.insertCell(-1).innerHTML = timestr;
+                                               timestr = '<em><%:expired%></em>';
                                        }
-
-                                       if( tb.rows.length == 1 )
+                                       else
                                        {
-                                               var tr = tb.insertRow(-1);
-                                                       tr.className = 'cbi-section-table-row';
-
-                                               var td = tr.insertCell(-1);
-                                                       td.colSpan = 4;
-                                                       td.innerHTML = '<em><br /><%:There are no active leases.%></em>';
+                                               timestr = String.format('%t', st[i].expires);
                                        }
+
+                                       var tr = tb.insertRow(-1);
+                                               tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
+
+                                       tr.insertCell(-1).innerHTML = st[i].hostname ? st[i].hostname : '?';
+                                       tr.insertCell(-1).innerHTML = st[i].ipaddr;
+                                       tr.insertCell(-1).innerHTML = st[i].macaddr;
+                                       tr.insertCell(-1).innerHTML = timestr;
                                }
 
-                               window.setTimeout(func, 5000);
+                               if( tb.rows.length == 1 )
+                               {
+                                       var tr = tb.insertRow(-1);
+                                               tr.className = 'cbi-section-table-row';
+
+                                       var td = tr.insertCell(-1);
+                                               td.colSpan = 4;
+                                               td.innerHTML = '<em><br /><%:There are no active leases.%></em>';
+                               }
                        }
-               )
-       })();
+               }
+       );
 //]]></script>
 
 <fieldset class="cbi-section">
index 06725c1..485ad40 100644 (file)
@@ -119,7 +119,6 @@ $Id$
 
 <script type="text/javascript" src="<%=resource%>/cbi.js"></script>
 <script type="text/javascript">//<![CDATA[
-       var iwxhr = new XHR();
        var wifidevs = <%=luci.http.write_json(netdevs)%>;
        var arptable = <%=luci.http.write_json(arpcache)%>;
 
@@ -147,8 +146,7 @@ $Id$
                                st.innerHTML = '<em><%:Wireless is restarting...%></em>';
                }
 
-               var rcxhr = new XHR();
-               rcxhr.get('<%=luci.dispatcher.build_url("admin", "network")%>/wireless_' + (reconnect ? 'reconnect' : 'shutdown') + '/' + id, null,
+               XHR.get('<%=luci.dispatcher.build_url("admin", "network")%>/wireless_' + (reconnect ? 'reconnect' : 'shutdown') + '/' + id, null,
                        function(x)
                        {
                                if (s)
@@ -166,182 +164,175 @@ $Id$
                );
        }
 
-       (function() {
-               var func = arguments.callee;
-
-               iwxhr.get('<%=luci.dispatcher.build_url("admin", "network", "wireless_status", table.concat(netlist, ","))%>', null,
-                       function(x, st)
+       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "wireless_status", table.concat(netlist, ","))%>', null,
+               function(x, st)
+               {
+                       if (st)
                        {
-                               if (st)
-                               {
-                                       var assoctable = document.getElementById('iw-assoclist');
-                                       if (assoctable)
-                                               while (assoctable.rows.length > 1)
-                                                       assoctable.rows[1].parentNode.removeChild(assoctable.rows[1]);
+                               var assoctable = document.getElementById('iw-assoclist');
+                               if (assoctable)
+                                       while (assoctable.rows.length > 1)
+                                               assoctable.rows[1].parentNode.removeChild(assoctable.rows[1]);
 
-                                       var devup = { };
-                                       var rowstyle = 1;
+                               var devup = { };
+                               var rowstyle = 1;
 
-                                       for( var i = 0; i < st.length; i++ )
+                               for( var i = 0; i < st.length; i++ )
+                               {
+                                       var iw = st[i];
+                                       var is_assoc = (iw.bssid && iw.bssid != '00:00:00:00:00:00' && iw.channel);
+                                       var p = iw.quality;
+                                       var q = is_assoc ? p : -1;
+
+                                       var icon;
+                                       if (q < 0)
+                                               icon = "<%=resource%>/icons/signal-none.png";
+                                       else if (q == 0)
+                                               icon = "<%=resource%>/icons/signal-0.png";
+                                       else if (q < 25)
+                                               icon = "<%=resource%>/icons/signal-0-25.png";
+                                       else if (q < 50)
+                                               icon = "<%=resource%>/icons/signal-25-50.png";
+                                       else if (q < 75)
+                                               icon = "<%=resource%>/icons/signal-50-75.png";
+                                       else
+                                               icon = "<%=resource%>/icons/signal-75-100.png";
+
+                                       if (!devup[wifidevs[iw.id]])
+                                               devup[wifidevs[iw.id]] = is_assoc;
+
+                                       var sig = document.getElementById(iw.id + '-iw-signal');
+                                       if (sig)
+                                               sig.innerHTML = String.format(
+                                                       '<img src="%s" title="<%:Signal%>: %d dBm / <%:Noise%>: %d dBm" /><br />' +
+                                                       '<small>%d%%</small>', icon, iw.signal, iw.noise, p
+                                               );
+
+                                       var toggle = document.getElementById(iw.id + '-iw-toggle');
+                                       if (toggle)
                                        {
-                                               var iw = st[i];
-                                               var is_assoc = (iw.bssid && iw.bssid != '00:00:00:00:00:00' && iw.channel);
-                                               var p = iw.quality;
-                                               var q = is_assoc ? p : -1;
-
-                                               var icon;
-                                               if (q < 0)
-                                                       icon = "<%=resource%>/icons/signal-none.png";
-                                               else if (q == 0)
-                                                       icon = "<%=resource%>/icons/signal-0.png";
-                                               else if (q < 25)
-                                                       icon = "<%=resource%>/icons/signal-0-25.png";
-                                               else if (q < 50)
-                                                       icon = "<%=resource%>/icons/signal-25-50.png";
-                                               else if (q < 75)
-                                                       icon = "<%=resource%>/icons/signal-50-75.png";
+                                               if (is_assoc)
+                                               {
+                                                       toggle.style.backgroundImage = 'url(<%=resource%>/cbi/reset.gif)';
+                                                       toggle.value = '<%:Disable%>';
+                                                       toggle.title = '<%:Shutdown this network%>';
+                                               }
                                                else
-                                                       icon = "<%=resource%>/icons/signal-75-100.png";
+                                               {
+                                                       toggle.style.backgroundImage = 'url(<%=resource%>/cbi/reload.gif)';
+                                                       toggle.value = '<%:Enable%>';
+                                                       toggle.title = '<%:Activate this network%>';
+                                               }
 
-                                               if (!devup[wifidevs[iw.id]])
-                                                       devup[wifidevs[iw.id]] = is_assoc;
+                                               toggle.setAttribute('active', is_assoc);
+                                       }
 
-                                               var sig = document.getElementById(iw.id + '-iw-signal');
-                                               if (sig)
-                                                       sig.innerHTML = String.format(
-                                                               '<img src="%s" title="<%:Signal%>: %d dBm / <%:Noise%>: %d dBm" /><br />' +
-                                                               '<small>%d%%</small>', icon, iw.signal, iw.noise, p
+                                       var info = document.getElementById(iw.id + '-iw-status');
+                                       if (info)
+                                       {
+                                               if (is_assoc)
+                                                       info.innerHTML = String.format(
+                                                               '<strong><%:SSID%>:</strong> %h | ' +
+                                                               '<strong><%:Mode%>:</strong> %s<br />' +
+                                                               '<strong><%:BSSID%>:</strong> %s | ' +
+                                                               '<strong><%:Encryption%>:</strong> %s',
+                                                                       iw.ssid, iw.mode, iw.bssid,
+                                                                       iw.encryption ? iw.encryption : '<%:None%>'
                                                        );
+                                               else
+                                                       info.innerHTML = String.format(
+                                                               '<strong><%:SSID%>:</strong> %h | ' +
+                                                               '<strong><%:Mode%>:</strong> %s<br />' +
+                                                               '<em>%s</em>',
+                                                                       iw.ssid || '?', iw.mode,
+                                                                       is_reconnecting
+                                                                               ? '<em><%:Wireless is restarting...%></em>'
+                                                                               : '<em><%:Wireless is disabled or not associated%></em>'
+                                                       );
+                                       }
 
-                                               var toggle = document.getElementById(iw.id + '-iw-toggle');
-                                               if (toggle)
-                                               {
-                                                       if (is_assoc)
-                                                       {
-                                                               toggle.style.backgroundImage = 'url(<%=resource%>/cbi/reset.gif)';
-                                                               toggle.value = '<%:Disable%>';
-                                                               toggle.title = '<%:Shutdown this network%>';
-                                                       }
-                                                       else
-                                                       {
-                                                               toggle.style.backgroundImage = 'url(<%=resource%>/cbi/reload.gif)';
-                                                               toggle.value = '<%:Enable%>';
-                                                               toggle.title = '<%:Activate this network%>';
-
-                                                       }
-
-                                                       toggle.setAttribute('active', is_assoc);
-                                               }
+                                       var dev = document.getElementById(wifidevs[iw.id] + '-iw-devinfo');
+                                       if (dev)
+                                       {
+                                               if (is_assoc)
+                                                       dev.innerHTML = String.format(
+                                                               '<strong><%:Channel%>:</strong> %s (%s GHz) | ' +
+                                                               '<strong><%:Bitrate%>:</strong> %s Mb/s',
+                                                                       iw.channel ? iw.channel : '?',
+                                                                       iw.frequency ? iw.frequency : '?',
+                                                                       iw.bitrate ? iw.bitrate : '?'
+                                                       );
+                                               else
+                                                       dev.innerHTML = '';
+                                       }
 
-                                               var info = document.getElementById(iw.id + '-iw-status');
-                                               if (info)
+                                       if (assoctable)
+                                       {
+                                               var assoclist = [ ];
+                                               for( var bssid in iw.assoclist )
                                                {
-                                                       if (is_assoc)
-                                                               info.innerHTML = String.format(
-                                                                       '<strong><%:SSID%>:</strong> %h | ' +
-                                                                       '<strong><%:Mode%>:</strong> %s<br />' +
-                                                                       '<strong><%:BSSID%>:</strong> %s | ' +
-                                                                       '<strong><%:Encryption%>:</strong> %s',
-                                                                               iw.ssid, iw.mode, iw.bssid,
-                                                                               iw.encryption ? iw.encryption : '<%:None%>'
-                                                               );
-                                                       else
-                                                               info.innerHTML = String.format(
-                                                                       '<strong><%:SSID%>:</strong> %h | ' +
-                                                                       '<strong><%:Mode%>:</strong> %s<br />' +
-                                                                       '<em>%s</em>',
-                                                                               iw.ssid || '?', iw.mode,
-                                                                               is_reconnecting
-                                                                                       ? '<em><%:Wireless is restarting...%></em>'
-                                                                                       : '<em><%:Wireless is disabled or not associated%></em>'
-                                                               );
+                                                       assoclist.push(iw.assoclist[bssid]);
+                                                       assoclist[assoclist.length-1].bssid = bssid;
                                                }
 
-                                               var dev = document.getElementById(wifidevs[iw.id] + '-iw-devinfo');
-                                               if (dev)
+                                               assoclist.sort(function(a, b) { a.bssid < b.bssid });
+
+                                               for( var j = 0; j < assoclist.length; j++ )
                                                {
-                                                       if (is_assoc)
-                                                               dev.innerHTML = String.format(
-                                                                       '<strong><%:Channel%>:</strong> %s (%s GHz) | ' +
-                                                                       '<strong><%:Bitrate%>:</strong> %s Mb/s',
-                                                                               iw.channel ? iw.channel : '?',
-                                                                               iw.frequency ? iw.frequency : '?',
-                                                                               iw.bitrate ? iw.bitrate : '?'
-                                                               );
+                                                       var tr = assoctable.insertRow(-1);
+                                                           tr.className = 'cbi-section-table-row cbi-rowstyle-' + rowstyle;
+
+                                                       var icon;
+                                                       var q = (-1 * (assoclist[j].noise - assoclist[j].signal)) / 5;
+                                                       if (q < 1)
+                                                               icon = "<%=resource%>/icons/signal-0.png";
+                                                       else if (q < 2)
+                                                               icon = "<%=resource%>/icons/signal-0-25.png";
+                                                       else if (q < 3)
+                                                               icon = "<%=resource%>/icons/signal-25-50.png";
+                                                       else if (q < 4)
+                                                               icon = "<%=resource%>/icons/signal-50-75.png";
                                                        else
-                                                               dev.innerHTML = '';
-                                               }
+                                                               icon = "<%=resource%>/icons/signal-75-100.png";
 
-                                               if (assoctable)
-                                               {
-                                                       var assoclist = [ ];
-                                                       for( var bssid in iw.assoclist )
-                                                       {
-                                                               assoclist.push(iw.assoclist[bssid]);
-                                                               assoclist[assoclist.length-1].bssid = bssid;
-                                                       }
-
-                                                       assoclist.sort(function(a, b) { a.bssid < b.bssid });
-
-                                                       for( var j = 0; j < assoclist.length; j++ )
-                                                       {
-                                                               var tr = assoctable.insertRow(-1);
-                                                                   tr.className = 'cbi-section-table-row cbi-rowstyle-' + rowstyle;
-
-                                                               var icon;
-                                                               var q = (-1 * (assoclist[j].noise - assoclist[j].signal)) / 5;
-                                                               if (q < 1)
-                                                                       icon = "<%=resource%>/icons/signal-0.png";
-                                                               else if (q < 2)
-                                                                       icon = "<%=resource%>/icons/signal-0-25.png";
-                                                               else if (q < 3)
-                                                                       icon = "<%=resource%>/icons/signal-25-50.png";
-                                                               else if (q < 4)
-                                                                       icon = "<%=resource%>/icons/signal-50-75.png";
-                                                               else
-                                                                       icon = "<%=resource%>/icons/signal-75-100.png";
-
-                                                               tr.insertCell(-1).innerHTML = String.format(
-                                                                       '<img src="%s" title="<%:Signal%>: %d dBm / <%:Noise%>: %d dBm" />',
-                                                                       icon, assoclist[j].signal, assoclist[j].noise
-                                                               );
-
-                                                               tr.insertCell(-1).innerHTML = iw.ssid ? iw.ssid : '?';
-                                                               tr.insertCell(-1).innerHTML = assoclist[j].bssid;
-
-                                                               tr.insertCell(-1).innerHTML = arptable[assoclist[j].bssid]
-                                                                       ? arptable[assoclist[j].bssid] : '?';
-
-                                                               tr.insertCell(-1).innerHTML = String.format('%d dBm', assoclist[j].signal);
-                                                               tr.insertCell(-1).innerHTML = String.format('%d dBm', assoclist[j].noise);
-
-                                                               rowstyle = (rowstyle == 1) ? 2 : 1;
-                                                       }
-                                               }
-                                       }
+                                                       tr.insertCell(-1).innerHTML = String.format(
+                                                               '<img src="%s" title="<%:Signal%>: %d dBm / <%:Noise%>: %d dBm" />',
+                                                               icon, assoclist[j].signal, assoclist[j].noise
+                                                       );
 
-                                       if (assoctable && assoctable.rows.length == 1)
-                                       {
-                                               var tr = assoctable.insertRow(-1);
-                                                   tr.className = 'cbi-section-table-row';
+                                                       tr.insertCell(-1).innerHTML = iw.ssid ? iw.ssid : '?';
+                                                       tr.insertCell(-1).innerHTML = assoclist[j].bssid;
 
-                                               var td = tr.insertCell(-1);
-                                                   td.colSpan = 6;
-                                                   td.innerHTML = '<br /><em><%:No information available%></em>';
-                                       }
+                                                       tr.insertCell(-1).innerHTML = arptable[assoclist[j].bssid]
+                                                               ? arptable[assoclist[j].bssid] : '?';
 
-                                       for (var dev in devup)
-                                       {
-                                               var img = document.getElementById(dev + '-iw-upstate');
-                                               if (img)
-                                                       img.src = '<%=resource%>/icons/wifi_big' + (devup[dev] ? '' : '_disabled') + '.png';
+                                                       tr.insertCell(-1).innerHTML = String.format('%d dBm', assoclist[j].signal);
+                                                       tr.insertCell(-1).innerHTML = String.format('%d dBm', assoclist[j].noise);
+
+                                                       rowstyle = (rowstyle == 1) ? 2 : 1;
+                                               }
                                        }
                                }
 
-                               window.setTimeout(func, 5000);
+                               if (assoctable && assoctable.rows.length == 1)
+                               {
+                                       var tr = assoctable.insertRow(-1);
+                                           tr.className = 'cbi-section-table-row';
+
+                                       var td = tr.insertCell(-1);
+                                           td.colSpan = 6;
+                                           td.innerHTML = '<br /><em><%:No information available%></em>';
+                               }
+
+                               for (var dev in devup)
+                               {
+                                       var img = document.getElementById(dev + '-iw-upstate');
+                                       if (img)
+                                               img.src = '<%=resource%>/icons/wifi_big' + (devup[dev] ? '' : '_disabled') + '.png';
+                               }
                        }
-               )
-       })();
+               }
+       );
 //]]></script>
 
 <h2><a id="content" name="content"><%:Wireless Overview%></a></h2>
index 76635bf..900071b 100644 (file)
@@ -1,73 +1,65 @@
 <%+cbi/valueheader%>
 
 <script type="text/javascript">//<![CDATA[
-       var iwxhr = new XHR();
-
-       (function() {
-               var func = arguments.callee;
-
-               iwxhr.get('<%=luci.dispatcher.build_url("admin", "network", "wireless_status", self.ifname)%>', null,
-                       function(x, iw)
+       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "wireless_status", self.ifname)%>', null,
+               function(x, iw)
+               {
+                       if (iw && (iw = iw[0]))
                        {
-                               if (iw && (iw = iw[0]))
-                               {
-                                       var is_assoc = (iw.bssid && iw.bssid != '00:00:00:00:00:00' && iw.channel);
-                                       var p = iw.quality;
-                                       var q = is_assoc ? p : -1;
-
-                                       var icon;
-                                       if (q < 0)
-                                               icon = "<%=resource%>/icons/signal-none.png";
-                                       else if (q == 0)
-                                               icon = "<%=resource%>/icons/signal-0.png";
-                                       else if (q < 25)
-                                               icon = "<%=resource%>/icons/signal-0-25.png";
-                                       else if (q < 50)
-                                               icon = "<%=resource%>/icons/signal-25-50.png";
-                                       else if (q < 75)
-                                               icon = "<%=resource%>/icons/signal-50-75.png";
-                                       else
-                                               icon = "<%=resource%>/icons/signal-75-100.png";
+                               var is_assoc = (iw.bssid && iw.bssid != '00:00:00:00:00:00' && iw.channel);
+                               var p = iw.quality;
+                               var q = is_assoc ? p : -1;
 
-                                       var s = document.getElementById('<%=self.option%>-iw-signal');
-                                       if (s)
-                                               s.innerHTML = String.format(
-                                                       '<img src="%s" title="<%:Signal%>: %d dBm / <%:Noise%>: %d dBm" /><br />' +
-                                                       '<small>%d%%</small>', icon, iw.signal, iw.noise, p
-                                               );
+                               var icon;
+                               if (q < 0)
+                                       icon = "<%=resource%>/icons/signal-none.png";
+                               else if (q == 0)
+                                       icon = "<%=resource%>/icons/signal-0.png";
+                               else if (q < 25)
+                                       icon = "<%=resource%>/icons/signal-0-25.png";
+                               else if (q < 50)
+                                       icon = "<%=resource%>/icons/signal-25-50.png";
+                               else if (q < 75)
+                                       icon = "<%=resource%>/icons/signal-50-75.png";
+                               else
+                                       icon = "<%=resource%>/icons/signal-75-100.png";
 
-                                       var d = document.getElementById('<%=self.option%>-iw-description');
-                                       if (d && is_assoc)
-                                               d.innerHTML = String.format(
-                                                       '<strong><%:Mode%>:</strong> %s | ' +
-                                                       '<strong><%:SSID%>:</strong> %h<br />' +
-                                                       '<strong><%:BSSID%>:</strong> %s | ' +
-                                                       '<strong><%:Encryption%>:</strong> %s<br />' +
-                                                       '<strong><%:Channel%>:</strong> %d (%.3f GHz) | ' +
-                                                       '<strong><%:Tx-Power%>:</strong> %d dBm<br />' +
-                                                       '<strong><%:Signal%>:</strong> %d dBm | ' +
-                                                       '<strong><%:Noise%>:</strong> %d dBm<br />' +
-                                                       '<strong><%:Bit Rate%>:</strong> %.1f MBit/s | ' +
-                                                       '<strong><%:Country%>:</strong> %s',
-                                                               iw.mode, iw.ssid, iw.bssid,
-                                                               iw.encryption ? iw.encryption : '<%:None%>',
-                                                               iw.channel, iw.frequency ? iw.frequency : 0,
-                                                               iw.txpower, iw.signal, iw.noise,
-                                                               iw.bitrate ? iw.bitrate : 0, iw.country
-                                               );
-                                       else if (d)
-                                               d.innerHTML = String.format(
-                                                       '<strong><%:SSID%>:</strong> %h | ' +
-                                                       '<strong><%:Mode%>:</strong> %s<br />' +
-                                                       '<em><%:Wireless is disabled or not associated%></em>',
-                                                               iw.ssid || '?', iw.mode
-                                               );
-                               }
+                               var s = document.getElementById('<%=self.option%>-iw-signal');
+                               if (s)
+                                       s.innerHTML = String.format(
+                                               '<img src="%s" title="<%:Signal%>: %d dBm / <%:Noise%>: %d dBm" /><br />' +
+                                               '<small>%d%%</small>', icon, iw.signal, iw.noise, p
+                                       );
 
-                               window.setTimeout(func, 5000);
+                               var d = document.getElementById('<%=self.option%>-iw-description');
+                               if (d && is_assoc)
+                                       d.innerHTML = String.format(
+                                               '<strong><%:Mode%>:</strong> %s | ' +
+                                               '<strong><%:SSID%>:</strong> %h<br />' +
+                                               '<strong><%:BSSID%>:</strong> %s | ' +
+                                               '<strong><%:Encryption%>:</strong> %s<br />' +
+                                               '<strong><%:Channel%>:</strong> %d (%.3f GHz) | ' +
+                                               '<strong><%:Tx-Power%>:</strong> %d dBm<br />' +
+                                               '<strong><%:Signal%>:</strong> %d dBm | ' +
+                                               '<strong><%:Noise%>:</strong> %d dBm<br />' +
+                                               '<strong><%:Bit Rate%>:</strong> %.1f MBit/s | ' +
+                                               '<strong><%:Country%>:</strong> %s',
+                                                       iw.mode, iw.ssid, iw.bssid,
+                                                       iw.encryption ? iw.encryption : '<%:None%>',
+                                                       iw.channel, iw.frequency ? iw.frequency : 0,
+                                                       iw.txpower, iw.signal, iw.noise,
+                                                       iw.bitrate ? iw.bitrate : 0, iw.country
+                                       );
+                               else if (d)
+                                       d.innerHTML = String.format(
+                                               '<strong><%:SSID%>:</strong> %h | ' +
+                                               '<strong><%:Mode%>:</strong> %s<br />' +
+                                               '<em><%:Wireless is disabled or not associated%></em>',
+                                                       iw.ssid || '?', iw.mode
+                                       );
                        }
-               )
-       })();
+               }
+       );
 //]]></script>
 
 <table>
index f76511e..57ff86f 100644 (file)
@@ -119,350 +119,344 @@ $Id$
                );
        }
 
-       var iwxhr = new XHR();
        var wifidevs = <%=luci.http.write_json(netdevs)%>;
        var arptable = <%=luci.http.write_json(arpcache)%>;
 
-       (function() {
-               var func = arguments.callee;
+       XHR.poll(5, '<%=REQUEST_URI%>', { status: 1 },
+               function(x, info)
+               {
+                       var si = document.getElementById('wan4_i');
+                       var ss = document.getElementById('wan4_s');
+                       var ifc = info.wan;
 
-               iwxhr.get('<%=REQUEST_URI%>', { status: 1 },
-                       function(x, info)
+                       if (ifc && ifc.ifname && ifc.proto != 'none')
                        {
-                               var si = document.getElementById('wan4_i');
-                               var ss = document.getElementById('wan4_s');
-                               var ifc = info.wan;
-
-                               if (ifc && ifc.ifname && ifc.proto != 'none')
+                               var s = String.format(
+                                       '<strong><%:Type%>: </strong>%s<br />' +
+                                       '<strong><%:Address%>: </strong>%s<br />' +
+                                       '<strong><%:Netmask%>: </strong>%s<br />' +
+                                       '<strong><%:Gateway%>: </strong>%s<br />',
+                                               ifc.proto,
+                                               (ifc.ipaddr) ? ifc.ipaddr : '0.0.0.0',
+                                               (ifc.netmask && ifc.netmask != ifc.ipaddr) ? ifc.netmask : '255.255.255.255',
+                                               (ifc.gwaddr) ? ifc.gwaddr : '0.0.0.0'
+                               );
+
+                               for (var i = 0; i < ifc.dns.length; i++)
                                {
-                                       var s = String.format(
-                                               '<strong><%:Type%>: </strong>%s<br />' +
-                                               '<strong><%:Address%>: </strong>%s<br />' +
-                                               '<strong><%:Netmask%>: </strong>%s<br />' +
-                                               '<strong><%:Gateway%>: </strong>%s<br />',
-                                                       ifc.proto,
-                                                       (ifc.ipaddr) ? ifc.ipaddr : '0.0.0.0',
-                                                       (ifc.netmask && ifc.netmask != ifc.ipaddr) ? ifc.netmask : '255.255.255.255',
-                                                       (ifc.gwaddr) ? ifc.gwaddr : '0.0.0.0'
-                                       );
-
-                                       for (var i = 0; i < ifc.dns.length; i++)
-                                       {
-                                               s += String.format(
-                                                       '<strong><%:DNS%> %d: </strong>%s<br />',
-                                                       i + 1, ifc.dns[i]
-                                               );
-                                       }
-
-                                       if (ifc.expires > -1)
-                                       {
-                                               s += String.format(
-                                                       '<strong><%:Expires%>: </strong>%t<br />',
-                                                       ifc.expires
-                                               );
-                                       }
-
-                                       if (ifc.uptime > 0)
-                                       {
-                                               s += String.format(
-                                                       '<strong><%:Connected%>: </strong>%t<br />',
-                                                       ifc.uptime
-                                               );
-                                       }
-
-                                       ss.innerHTML = String.format('<small>%s</small>', s);
-                                       si.innerHTML = String.format(
-                                               '<img src="<%=resource%>/icons/ethernet.png" />' +
-                                               '<br /><small><a href="%s">%s</a></small>',
-                                                       ifc.link, ifc.ifname
+                                       s += String.format(
+                                               '<strong><%:DNS%> %d: </strong>%s<br />',
+                                               i + 1, ifc.dns[i]
                                        );
                                }
-                               else
+
+                               if (ifc.expires > -1)
                                {
-                                       si.innerHTML = '<img src="<%=resource%>/icons/ethernet_disabled.png" /><br /><small>?</small>';
-                                       ss.innerHTML = '<em>Not connected</em>';
+                                       s += String.format(
+                                               '<strong><%:Expires%>: </strong>%t<br />',
+                                               ifc.expires
+                                       );
                                }
 
-                               <% if has_ipv6 then %>
-                               var si6 = document.getElementById('wan6_i');
-                               var ss6 = document.getElementById('wan6_s');
-                               var ifc6 = info.wan6;
-
-                               if (ifc6 && ifc6.ifname && ifc6.proto != 'none')
+                               if (ifc.uptime > 0)
                                {
-                                       var s = String.format(
-                                               '<strong><%:Address%>: </strong>%s<br />' +
-                                               '<strong><%:Gateway%>: </strong>%s<br />',
-                                                       (ifc6.ip6addr) ? ifc6.ip6addr : '::',
-                                                       (ifc6.gw6addr) ? ifc6.gw6addr : '::'
+                                       s += String.format(
+                                               '<strong><%:Connected%>: </strong>%t<br />',
+                                               ifc.uptime
                                        );
+                               }
 
-                                       for (var i = 0; i < ifc6.dns.length; i++)
-                                       {
-                                               s += String.format(
-                                                       '<strong><%:DNS%> %d: </strong>%s<br />',
-                                                       i + 1, ifc6.dns[i]
-                                               );
-                                       }
+                               ss.innerHTML = String.format('<small>%s</small>', s);
+                               si.innerHTML = String.format(
+                                       '<img src="<%=resource%>/icons/ethernet.png" />' +
+                                       '<br /><small><a href="%s">%s</a></small>',
+                                               ifc.link, ifc.ifname
+                               );
+                       }
+                       else
+                       {
+                               si.innerHTML = '<img src="<%=resource%>/icons/ethernet_disabled.png" /><br /><small>?</small>';
+                               ss.innerHTML = '<em>Not connected</em>';
+                       }
 
-                                       if (ifc6.uptime > 0)
-                                       {
-                                               s += String.format(
-                                                       '<strong><%:Connected%>: </strong>%t<br />',
-                                                       ifc6.uptime
-                                               );
-                                       }
+                       <% if has_ipv6 then %>
+                       var si6 = document.getElementById('wan6_i');
+                       var ss6 = document.getElementById('wan6_s');
+                       var ifc6 = info.wan6;
 
-                                       ss6.innerHTML = String.format('<small>%s</small>', s);
-                                       si6.innerHTML = String.format(
-                                               '<img src="<%=resource%>/icons/ethernet.png" />' +
-                                               '<br /><small><a href="%s">%s</a></small>',
-                                                       ifc6.link, ifc6.ifname
-                                       );
-                               }
-                               else
+                       if (ifc6 && ifc6.ifname && ifc6.proto != 'none')
+                       {
+                               var s = String.format(
+                                       '<strong><%:Address%>: </strong>%s<br />' +
+                                       '<strong><%:Gateway%>: </strong>%s<br />',
+                                               (ifc6.ip6addr) ? ifc6.ip6addr : '::',
+                                               (ifc6.gw6addr) ? ifc6.gw6addr : '::'
+                               );
+
+                               for (var i = 0; i < ifc6.dns.length; i++)
                                {
-                                       si6.innerHTML = '<img src="<%=resource%>/icons/ethernet_disabled.png" /><br /><small>?</small>';
-                                       ss6.innerHTML = '<em>Not connected</em>';
+                                       s += String.format(
+                                               '<strong><%:DNS%> %d: </strong>%s<br />',
+                                               i + 1, ifc6.dns[i]
+                                       );
                                }
-                               <% end %>
 
-                               <% if has_dhcp then %>
-                               var ls = document.getElementById('lease_status_table');
-                               if (ls)
+                               if (ifc6.uptime > 0)
                                {
-                                       /* clear all rows */
-                                       while( ls.rows.length > 1 )
-                                               ls.rows[0].parentNode.deleteRow(1);
+                                       s += String.format(
+                                               '<strong><%:Connected%>: </strong>%t<br />',
+                                               ifc6.uptime
+                                       );
+                               }
 
-                                       for( var i = 0; i < info.leases.length; i++ )
-                                       {
-                                               var timestr;
+                               ss6.innerHTML = String.format('<small>%s</small>', s);
+                               si6.innerHTML = String.format(
+                                       '<img src="<%=resource%>/icons/ethernet.png" />' +
+                                       '<br /><small><a href="%s">%s</a></small>',
+                                               ifc6.link, ifc6.ifname
+                               );
+                       }
+                       else
+                       {
+                               si6.innerHTML = '<img src="<%=resource%>/icons/ethernet_disabled.png" /><br /><small>?</small>';
+                               ss6.innerHTML = '<em>Not connected</em>';
+                       }
+                       <% end %>
 
-                                               if (info.leases[i].expires <= 0)
-                                                       timestr = '<em><%:expired%></em>';
-                                               else
-                                                       timestr = String.format('%t', info.leases[i].expires);
+                       <% if has_dhcp then %>
+                       var ls = document.getElementById('lease_status_table');
+                       if (ls)
+                       {
+                               /* clear all rows */
+                               while( ls.rows.length > 1 )
+                                       ls.rows[0].parentNode.deleteRow(1);
 
-                                               var tr = ls.rows[0].parentNode.insertRow(-1);
-                                                       tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
+                               for( var i = 0; i < info.leases.length; i++ )
+                               {
+                                       var timestr;
 
-                                               tr.insertCell(-1).innerHTML = info.leases[i].hostname ? info.leases[i].hostname : '?';
-                                               tr.insertCell(-1).innerHTML = info.leases[i].ipaddr;
-                                               tr.insertCell(-1).innerHTML = info.leases[i].macaddr;
-                                               tr.insertCell(-1).innerHTML = timestr;
-                                       }
+                                       if (info.leases[i].expires <= 0)
+                                               timestr = '<em><%:expired%></em>';
+                                       else
+                                               timestr = String.format('%t', info.leases[i].expires);
 
-                                       if( ls.rows.length == 1 )
-                                       {
-                                               var tr = ls.rows[0].parentNode.insertRow(-1);
-                                                       tr.className = 'cbi-section-table-row';
+                                       var tr = ls.rows[0].parentNode.insertRow(-1);
+                                               tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
 
-                                               var td = tr.insertCell(-1);
-                                                       td.colSpan = 4;
-                                                       td.innerHTML = '<em><br /><%:There are no active leases.%></em>';
-                                       }
+                                       tr.insertCell(-1).innerHTML = info.leases[i].hostname ? info.leases[i].hostname : '?';
+                                       tr.insertCell(-1).innerHTML = info.leases[i].ipaddr;
+                                       tr.insertCell(-1).innerHTML = info.leases[i].macaddr;
+                                       tr.insertCell(-1).innerHTML = timestr;
                                }
-                               <% end %>
 
-                               <% if has_wifi then %>
-                               var assoclist = [ ];
-
-                               var ws = document.getElementById('wifi_status_table');
-                               if (ws)
+                               if( ls.rows.length == 1 )
                                {
-                                       var wsbody = ws.rows[0].parentNode;
-                                       while (ws.rows.length > 0)
-                                               wsbody.deleteRow(0);
+                                       var tr = ls.rows[0].parentNode.insertRow(-1);
+                                               tr.className = 'cbi-section-table-row';
 
-                                       for (var didx = 0; didx < info.wifinets.length; didx++)
-                                       {
-                                               var dev = info.wifinets[didx];
+                                       var td = tr.insertCell(-1);
+                                               td.colSpan = 4;
+                                               td.innerHTML = '<em><br /><%:There are no active leases.%></em>';
+                               }
+                       }
+                       <% end %>
 
-                                               var tr = wsbody.insertRow(-1);
-                                               var td;
+                       <% if has_wifi then %>
+                       var assoclist = [ ];
 
-                                               td = tr.insertCell(-1);
-                                               td.width     = "33%";
-                                               td.innerHTML = dev.name;
-                                               td.style.verticalAlign = "top";
+                       var ws = document.getElementById('wifi_status_table');
+                       if (ws)
+                       {
+                               var wsbody = ws.rows[0].parentNode;
+                               while (ws.rows.length > 0)
+                                       wsbody.deleteRow(0);
 
-                                               td = tr.insertCell(-1);
+                               for (var didx = 0; didx < info.wifinets.length; didx++)
+                               {
+                                       var dev = info.wifinets[didx];
 
-                                               var s = '';
+                                       var tr = wsbody.insertRow(-1);
+                                       var td;
 
-                                               for (var nidx = 0; nidx < dev.networks.length; nidx++)
-                                               {
-                                                       var net = dev.networks[nidx];
-                                                       var is_assoc = (net.bssid != '00:00:00:00:00:00' && net.channel);
-
-                                                       var icon;
-                                                       if (!is_assoc)
-                                                               icon = "<%=resource%>/icons/signal-none.png";
-                                                       else if (net.quality == 0)
-                                                               icon = "<%=resource%>/icons/signal-0.png";
-                                                       else if (net.quality < 25)
-                                                               icon = "<%=resource%>/icons/signal-0-25.png";
-                                                       else if (net.quality < 50)
-                                                               icon = "<%=resource%>/icons/signal-25-50.png";
-                                                       else if (net.quality < 75)
-                                                               icon = "<%=resource%>/icons/signal-50-75.png";
-                                                       else
-                                                               icon = "<%=resource%>/icons/signal-75-100.png";
+                                       td = tr.insertCell(-1);
+                                       td.width     = "33%";
+                                       td.innerHTML = dev.name;
+                                       td.style.verticalAlign = "top";
 
-                                                       s += String.format(
-                                                               '<table><tr><td style="text-align:center; width:32px; padding:3px">' +
-                                                                       '<img src="%s" title="<%:Signal%>: %d dBm / <%:Noise%>: %d dBm" />' +
-                                                                       '<br /><small>%d%%</small>' +
-                                                               '</td><td style="text-align:left; padding:3px"><small>' +
-                                                                       '<strong><%:SSID%>:</strong> <a href="%s">%h</a><br />' +
-                                                                       '<strong><%:Mode%>:</strong> %s<br />' +
-                                                                       '<strong><%:Channel%>:</strong> %d (%.2f GHz)<br />' +
-                                                                       '<strong><%:Bitrate%>:</strong> %s Mb/s<br />',
-                                                                       icon, net.signal, net.noise,
-                                                                       net.quality,
-                                                                       net.link, net.ssid,
-                                                                       net.mode,
-                                                                       net.channel, net.frequency,
-                                                                       net.bitrate || '?'
-                                                       );
-
-                                                       if (is_assoc)
-                                                       {
-                                                               s += String.format(
-                                                                       '<strong><%:BSSID%>:</strong> %s<br />' +
-                                                                       '<strong><%:Encryption%>:</strong> %s',
-                                                                               net.bssid,
-                                                                               net.encryption
-                                                               );
-                                                       }
-                                                       else
-                                                       {
-                                                               s += '<em><%:Wireless is disabled or not associated%></em>';
-                                                       }
-
-                                                       s += '</small></td></tr></table>';
-
-                                                       for (var bssid in net.assoclist)
-                                                       {
-                                                               assoclist.push({
-                                                                       bssid:  bssid,
-                                                                       signal: net.assoclist[bssid].signal,
-                                                                       noise:  net.assoclist[bssid].noise,
-                                                                       link:   net.link,
-                                                                       name:   net.name
-                                                               });
-                                                       }
-                                               }
+                                       td = tr.insertCell(-1);
 
-                                               if (!s)
-                                                       s = '<em><%:No information available%></em>';
+                                       var s = '';
 
-                                               td.innerHTML = s;
-                                       }
-                               }
-
-                               var ac = document.getElementById('wifi_assoc_table');
-                               if (ac)
-                               {
-                                       /* clear all rows */
-                                       while( ac.rows.length > 1 )
-                                               ac.rows[0].parentNode.deleteRow(1);
-
-                                       assoclist.sort(function(a, b) {
-                                               return (a.name == b.name)
-                                                       ? (a.bssid < b.bssid)
-                                                       : (a.name  > b.name )
-                                               ;
-                                       });
-
-                                       for( var i = 0; i < assoclist.length; i++ )
+                                       for (var nidx = 0; nidx < dev.networks.length; nidx++)
                                        {
-                                               var tr = ac.rows[0].parentNode.insertRow(-1);
-                                                       tr.className = 'cbi-section-table-row cbi-rowstyle-' + (1 + (i % 2));
+                                               var net = dev.networks[nidx];
+                                               var is_assoc = (net.bssid != '00:00:00:00:00:00' && net.channel);
 
                                                var icon;
-                                               var q = (-1 * (assoclist[i].noise - assoclist[i].signal)) / 5;
-                                               if (q < 1)
+                                               if (!is_assoc)
+                                                       icon = "<%=resource%>/icons/signal-none.png";
+                                               else if (net.quality == 0)
                                                        icon = "<%=resource%>/icons/signal-0.png";
-                                               else if (q < 2)
+                                               else if (net.quality < 25)
                                                        icon = "<%=resource%>/icons/signal-0-25.png";
-                                               else if (q < 3)
+                                               else if (net.quality < 50)
                                                        icon = "<%=resource%>/icons/signal-25-50.png";
-                                               else if (q < 4)
+                                               else if (net.quality < 75)
                                                        icon = "<%=resource%>/icons/signal-50-75.png";
                                                else
                                                        icon = "<%=resource%>/icons/signal-75-100.png";
 
-                                               tr.insertCell(-1).innerHTML = String.format(
-                                                       '<img src="%s" title="<%:Signal%>: %d dBm / <%:Noise%>: %d dBm" />',
-                                                       icon, assoclist[i].signal, assoclist[i].noise
+                                               s += String.format(
+                                                       '<table><tr><td style="text-align:center; width:32px; padding:3px">' +
+                                                               '<img src="%s" title="<%:Signal%>: %d dBm / <%:Noise%>: %d dBm" />' +
+                                                               '<br /><small>%d%%</small>' +
+                                                       '</td><td style="text-align:left; padding:3px"><small>' +
+                                                               '<strong><%:SSID%>:</strong> <a href="%s">%h</a><br />' +
+                                                               '<strong><%:Mode%>:</strong> %s<br />' +
+                                                               '<strong><%:Channel%>:</strong> %d (%.2f GHz)<br />' +
+                                                               '<strong><%:Bitrate%>:</strong> %s Mb/s<br />',
+                                                               icon, net.signal, net.noise,
+                                                               net.quality,
+                                                               net.link, net.ssid,
+                                                               net.mode,
+                                                               net.channel, net.frequency,
+                                                               net.bitrate || '?'
                                                );
 
-                                               tr.insertCell(-1).innerHTML = assoclist[i].bssid;
+                                               if (is_assoc)
+                                               {
+                                                       s += String.format(
+                                                               '<strong><%:BSSID%>:</strong> %s<br />' +
+                                                               '<strong><%:Encryption%>:</strong> %s',
+                                                                       net.bssid,
+                                                                       net.encryption
+                                                       );
+                                               }
+                                               else
+                                               {
+                                                       s += '<em><%:Wireless is disabled or not associated%></em>';
+                                               }
 
-                                               tr.insertCell(-1).innerHTML = String.format(
-                                                       '<a href="%s">%h</a>',
-                                                               assoclist[i].link,
-                                                               assoclist[i].name
-                                               );
+                                               s += '</small></td></tr></table>';
 
-                                               tr.insertCell(-1).innerHTML = String.format('%d dBm', assoclist[i].signal);
-                                               tr.insertCell(-1).innerHTML = String.format('%d dBm', assoclist[i].noise);
+                                               for (var bssid in net.assoclist)
+                                               {
+                                                       assoclist.push({
+                                                               bssid:  bssid,
+                                                               signal: net.assoclist[bssid].signal,
+                                                               noise:  net.assoclist[bssid].noise,
+                                                               link:   net.link,
+                                                               name:   net.name
+                                                       });
+                                               }
                                        }
 
-                                       if (ac.rows.length == 1)
-                                       {
-                                               var tr = ac.rows[0].parentNode.insertRow(-1);
-                                                   tr.className = 'cbi-section-table-row';
+                                       if (!s)
+                                               s = '<em><%:No information available%></em>';
 
-                                               var td = tr.insertCell(-1);
-                                                   td.colSpan = 5;
-                                                   td.innerHTML = '<br /><em><%:No information available%></em>';
-                                       }
+                                       td.innerHTML = s;
                                }
-                               <% end %>
+                       }
 
-                               var e;
+                       var ac = document.getElementById('wifi_assoc_table');
+                       if (ac)
+                       {
+                               /* clear all rows */
+                               while( ac.rows.length > 1 )
+                                       ac.rows[0].parentNode.deleteRow(1);
+
+                               assoclist.sort(function(a, b) {
+                                       return (a.name == b.name)
+                                               ? (a.bssid < b.bssid)
+                                               : (a.name  > b.name )
+                                       ;
+                               });
+
+                               for( var i = 0; i < assoclist.length; i++ )
+                               {
+                                       var tr = ac.rows[0].parentNode.insertRow(-1);
+                                               tr.className = 'cbi-section-table-row cbi-rowstyle-' + (1 + (i % 2));
+
+                                       var icon;
+                                       var q = (-1 * (assoclist[i].noise - assoclist[i].signal)) / 5;
+                                       if (q < 1)
+                                               icon = "<%=resource%>/icons/signal-0.png";
+                                       else if (q < 2)
+                                               icon = "<%=resource%>/icons/signal-0-25.png";
+                                       else if (q < 3)
+                                               icon = "<%=resource%>/icons/signal-25-50.png";
+                                       else if (q < 4)
+                                               icon = "<%=resource%>/icons/signal-50-75.png";
+                                       else
+                                               icon = "<%=resource%>/icons/signal-75-100.png";
+
+                                       tr.insertCell(-1).innerHTML = String.format(
+                                               '<img src="%s" title="<%:Signal%>: %d dBm / <%:Noise%>: %d dBm" />',
+                                               icon, assoclist[i].signal, assoclist[i].noise
+                                       );
 
-                               if (e = document.getElementById('localtime'))
-                                       e.innerHTML = info.localtime;
+                                       tr.insertCell(-1).innerHTML = assoclist[i].bssid;
 
-                               if (e = document.getElementById('uptime'))
-                                       e.innerHTML = String.format('%t', info.uptime);
+                                       tr.insertCell(-1).innerHTML = String.format(
+                                               '<a href="%s">%h</a>',
+                                                       assoclist[i].link,
+                                                       assoclist[i].name
+                                       );
 
-                               if (e = document.getElementById('loadavg'))
-                                       e.innerHTML = String.format('%.02f, %.02f, %.02f',
-                                               info.loadavg[0], info.loadavg[1], info.loadavg[2]);
+                                       tr.insertCell(-1).innerHTML = String.format('%d dBm', assoclist[i].signal);
+                                       tr.insertCell(-1).innerHTML = String.format('%d dBm', assoclist[i].noise);
+                               }
 
-                               if (e = document.getElementById('memtotal'))
-                                       e.innerHTML = progressbar(
-                                               (info.memfree + info.membuffers + info.memcached) + " kB",
-                                               info.memtotal + " kB"
-                                       );
+                               if (ac.rows.length == 1)
+                               {
+                                       var tr = ac.rows[0].parentNode.insertRow(-1);
+                                               tr.className = 'cbi-section-table-row';
 
-                               if (e = document.getElementById('memfree'))
-                                       e.innerHTML = progressbar(
-                                               info.memfree + " kB", info.memtotal + " kB"
-                                       );
+                                       var td = tr.insertCell(-1);
+                                               td.colSpan = 5;
+                                               td.innerHTML = '<br /><em><%:No information available%></em>';
+                               }
+                       }
+                       <% end %>
 
-                               if (e = document.getElementById('memcache'))
-                                       e.innerHTML = progressbar(
-                                               info.memcached + " kB", info.memtotal + " kB"
-                                       );
+                       var e;
 
-                               if (e = document.getElementById('membuff'))
-                                       e.innerHTML = progressbar(
-                                               info.membuffers + " kB", info.memtotal + " kB"
-                                       );
+                       if (e = document.getElementById('localtime'))
+                               e.innerHTML = info.localtime;
 
-                               if (e = document.getElementById('conns'))
-                                       e.innerHTML = progressbar(info.conncount, info.connmax);
+                       if (e = document.getElementById('uptime'))
+                               e.innerHTML = String.format('%t', info.uptime);
 
-                               window.setTimeout(func, 5000);
-                       }
-               )
-       })();
+                       if (e = document.getElementById('loadavg'))
+                               e.innerHTML = String.format('%.02f, %.02f, %.02f',
+                                       info.loadavg[0], info.loadavg[1], info.loadavg[2]);
+
+                       if (e = document.getElementById('memtotal'))
+                               e.innerHTML = progressbar(
+                                       (info.memfree + info.membuffers + info.memcached) + " kB",
+                                       info.memtotal + " kB"
+                               );
+
+                       if (e = document.getElementById('memfree'))
+                               e.innerHTML = progressbar(
+                                       info.memfree + " kB", info.memtotal + " kB"
+                               );
+
+                       if (e = document.getElementById('memcache'))
+                               e.innerHTML = progressbar(
+                                       info.memcached + " kB", info.memtotal + " kB"
+                               );
+
+                       if (e = document.getElementById('membuff'))
+                               e.innerHTML = progressbar(
+                                       info.membuffers + " kB", info.memtotal + " kB"
+                               );
+
+                       if (e = document.getElementById('conns'))
+                               e.innerHTML = progressbar(info.conncount, info.connmax);
+
+               }
+       );
 //]]></script>
 
 <h2><a id="content" name="content"><%:Status%></a></h2>