Column sorting fixes, thanks to Tony550
[tomato.git] / release / src / router / www / nas-usb.asp
blobe214d51ec425fa80f918b09ef9df55ce2a90f4db
1 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0//EN'>
2 <!--
3 Tomato GUI
4 USB Support - !!TB
6 For use with Tomato Firmware only.
7 No part of this file may be used without permission.
8 -->
9 <html>
10 <head>
11 <meta http-equiv='content-type' content='text/html;charset=utf-8'>
12 <meta name='robots' content='noindex,nofollow'>
13 <title>[<% ident(); %>] NAS: USB Support</title>
14 <link rel='stylesheet' type='text/css' href='tomato.css'>
15 <link rel='stylesheet' type='text/css' href='color.css'>
16 <script type='text/javascript' src='tomato.js'></script>
18 <!-- / / / -->
20 <style type='text/css'>
21 textarea {
22 width: 98%;
23 height: 5em;
25 </style>
27 <style type='text/css'>
28 #dev-grid .co1 {
29 width: 10%;
31 #dev-grid .co2 {
32 width: 9%;
34 #dev-grid .co3 {
35 width: 65%;
37 #dev-grid .co4 {
38 width: 16%;
39 text-align: center;
41 #dev-grid .header {
42 text-align: left;
44 </style>
46 <script type='text/javascript' src='debug.js'></script>
48 <script type='text/javascript'>
50 // <% nvram("usb_enable,usb_uhci,usb_ohci,usb_usb2,usb_mmc,usb_storage,usb_printer,usb_printer_bidirect,usb_automount,usb_fs_ext3,usb_fs_fat,usb_fs_ntfs,usb_fs_hfs,usb_fs_hfsplus,script_usbmount,script_usbumount,script_usbhotplug,idle_enable,usb_3g"); %>
52 // <% usbdevices(); %>
54 list = [];
56 var xob = null;
58 function _umountHost(host)
60 form.submitHidden('usbcmd.cgi', { remove: host });
63 function _mountHost(host)
65 form.submitHidden('usbcmd.cgi', { mount: host });
68 function _forceRefresh()
70 if (!ref.running) ref.once = 1;
71 ref.start();
74 function umountHost(a, host)
76 if (xob) return;
78 if ((xob = new XmlHttp()) == null) {
79 _umountHost(host);
80 return;
83 a = E(a);
84 a.innerHTML = 'Please wait...';
86 xob.onCompleted = function(text, xml) {
87 eval(text);
88 if (usb.length == 1) {
89 if (usb[0] != 0)
90 ferror.set(a, 'The device is busy. Please make sure no applications are using it, and try again.', 0);
92 xob = null;
93 _forceRefresh();
96 xob.onError = function() {
97 xob = null;
98 _forceRefresh();
101 xob.post('usbcmd.cgi', 'remove=' + host);
104 function mountHost(a, host)
106 if (xob) return;
108 if ((xob = new XmlHttp()) == null) {
109 _mountHost(host);
110 return;
113 a = E(a);
114 a.innerHTML = 'Please wait...';
116 xob.onCompleted = function(text, xml) {
117 eval(text);
118 if (usb.length == 1) {
119 if (usb[0] == 0)
120 ferror.set(a, 'Failed to mount. Verify the device is plugged in, and try again.', 0);
122 xob = null;
123 _forceRefresh();
126 xob.onError = function() {
127 xob = null;
128 _forceRefresh();
131 xob.post('usbcmd.cgi', 'mount=' + host);
134 var ref = new TomatoRefresh('update.cgi', 'exec=usbdevices', 0, 'nas_usb_refresh');
136 ref.refresh = function(text)
138 try {
139 eval(text);
141 catch (ex) {
142 return;
144 dg.removeAllData();
145 dg.populate();
146 dg.resort();
149 var dg = new TomatoGrid();
151 dg.sortCompare = function(a, b) {
152 var col = this.sortColumn;
153 var ra = a.getRowData();
154 var rb = b.getRowData();
155 var r;
157 switch (col) {
158 case 1:
159 if (ra.type == 'Storage' && ra.type == rb.type)
160 r = cmpInt(ra.host, rb.host);
161 else
162 r = cmpText(ra.host, rb.host);
163 break;
164 default:
165 r = cmpText(a.cells[col].innerHTML, b.cells[col].innerHTML);
167 return this.sortAscending ? r : -r;
170 dg.populate = function()
172 var i, j, k, a, b, c, e, s, desc, d, parts, p;
174 list = [];
176 for (i = 0; i < list.length; ++i) {
177 list[i].type = '';
178 list[i].host = '';
179 list[i].vendor = '';
180 list[i].product = '';
181 list[i].serial = '';
182 list[i].discs = [];
183 list[i].is_mounted = 0;
186 for (i = usbdev.length - 1; i >= 0; --i) {
187 a = usbdev[i];
188 e = {
189 type: a[0],
190 host: a[1],
191 vendor: a[2],
192 product: a[3],
193 serial: a[4],
194 discs: a[5],
195 is_mounted: a[6]
197 list.push(e);
200 for (i = list.length - 1; i >= 0; --i) {
201 e = list[i];
203 if (e.type != 'Storage')
204 s = '&nbsp<br><small>&nbsp</small>';
205 else {
206 if (xob)
207 s = ((e.is_mounted == 0) ? 'No' : 'Yes') + '<br><small>Please wait...</small>';
208 else if (e.is_mounted == 0)
209 s = 'No<br><small><a href="javascript:mountHost(\'L' + i + '\',\'' + e.host + '\')" title="Mount all Partitions of Storage Device" id="L' + i + '">[ Mount ]</a></small>';
210 else
211 s = 'Yes<br><small><a href="javascript:umountHost(\'L' + i + '\',\'' + e.host + '\')" title="Safely Remove Storage Device" id="L' + i + '">[ Unmount ]</a></small>';
213 desc = (e.vendor + ' ' + e.product).trim() + '<small>'; // + (e.serial == '' ? '' : '<br>Serial No: ' + e.serial);
214 if (e.discs) {
215 for (j = 0; j <= e.discs.length - 1; ++j) {
216 d = e.discs[j];
217 parts = d[1];
218 for (k = 0; k <= parts.length - 1; ++k) {
219 p = parts[k];
220 if (p) {
221 desc = desc + '<br>Partition \'' + p[0] + '\'' + (p[3] != '' ? ' ' + p[3] : '') +
222 ((p[5] != 0) ? ' (' + doScaleSize(p[5], 0) +
223 ((p[1] == 1) ? ' / ' + doScaleSize(p[6], 0) + ' free' : '') +
224 ')' : '') + ' is ' +
225 ((p[1] != 0) ? '' : 'not ') + ((p[3] == 'swap') ? 'active' : 'mounted') +
226 ((p[2] != '') ? ' on ' + p[2] : '');
231 desc = desc + '</small>';
232 this.insert(-1, e, [e.type, e.host, desc, s], false);
235 list = [];
238 dg.setup = function()
240 this.init('dev-grid', 'sort');
241 this.headerSet(['Type', 'Host', 'Description', 'Mounted?']);
242 this.populate();
243 this.sort(1);
246 function earlyInit()
248 dg.setup();
251 function init()
253 dg.recolor();
254 ref.initPage();
257 function verifyFields(focused, quiet)
259 var b = !E('_f_usb').checked;
260 var a = !E('_f_storage').checked;
262 E('_f_uhci').disabled = b || nvram.usb_uhci == -1;
263 E('_f_ohci').disabled = b || nvram.usb_ohci == -1;
264 E('_f_usb2').disabled = b;
265 E('_f_print').disabled = b;
266 E('_f_storage').disabled = b;
268 /* LINUX26-BEGIN */
269 /* EXTRAS-BEGIN */
270 E('_f_mmc').disabled = a || b || nvram.usb_mmc == -1;
271 elem.display(PR('_f_mmc'), nvram.usb_mmc != -1);
272 /* EXTRAS-END */
273 /* LINUX26-END */
275 E('_f_ext3').disabled = b || a;
276 E('_f_fat').disabled = b || a;
278 /* LINUX26-BEGIN */
279 E('_f_idle_enable').disabled = b || a;
280 E('_f_usb_3g').disabled = b;
281 /* LINUX26-END */
282 /* NTFS-BEGIN */
283 E('_f_ntfs').disabled = b || a;
284 /* NTFS-END */
285 E('_f_hfs').disabled = b || a; //!Victek
286 E('_f_hfsplus').disabled = b || a; //!Victek
287 E('_f_automount').disabled = b || a;
288 E('_f_bprint').disabled = b || !E('_f_print').checked;
290 elem.display(PR('_f_automount'), !b && !a);
291 elem.display(PR('_script_usbmount'), PR('_script_usbumount'), !b && !a && E('_f_automount').checked);
292 elem.display(PR('_script_usbhotplug'), !b && (!a || E('_f_print').checked));
294 if (!v_length('_script_usbmount', quiet, 0, 2048)) return 0;
295 if (!v_length('_script_usbumount', quiet, 0, 2048)) return 0;
296 if (!v_length('_script_usbhotplug', quiet, 0, 2048)) return 0;
298 return 1;
301 function save()
303 var fom;
305 if (!verifyFields(null, 0)) return;
307 fom = E('_fom');
308 fom.usb_enable.value = E('_f_usb').checked ? 1 : 0;
309 fom.usb_uhci.value = nvram.usb_uhci == -1 ? -1 : (E('_f_uhci').checked ? 1 : 0);
310 fom.usb_ohci.value = nvram.usb_ohci == -1 ? -1 : (E('_f_ohci').checked ? 1 : 0);
311 fom.usb_usb2.value = E('_f_usb2').checked ? 1 : 0;
312 fom.usb_storage.value = E('_f_storage').checked ? 1 : 0;
313 fom.usb_printer.value = E('_f_print').checked ? 1 : 0;
314 fom.usb_printer_bidirect.value = E('_f_bprint').checked ? 1 : 0;
316 /* LINUX26-BEGIN */
317 /* EXTRAS-BEGIN */
318 fom.usb_mmc.value = nvram.usb_mmc == -1 ? -1 : (E('_f_mmc').checked ? 1 : 0);
319 /* EXTRAS-END */
320 /* LINUX26-END */
322 fom.usb_fs_ext3.value = E('_f_ext3').checked ? 1 : 0;
323 fom.usb_fs_fat.value = E('_f_fat').checked ? 1 : 0;
324 /* NTFS-BEGIN */
325 fom.usb_fs_ntfs.value = E('_f_ntfs').checked ? 1 : 0;
326 /* NTFS-END */
327 fom.usb_fs_hfs.value = E('_f_hfs').checked ? 1 : 0; //!Victek
328 fom.usb_fs_hfsplus.value = E('_f_hfsplus').checked ? 1 : 0; //!Victek
329 fom.usb_automount.value = E('_f_automount').checked ? 1 : 0;
330 /* LINUX26-BEGIN */
331 fom.idle_enable.value = E('_f_idle_enable').checked ? 1 : 0;
332 fom.usb_3g.value = E('_f_usb_3g').checked ? 1 : 0;
333 /* LINUX26-END */
335 form.submit(fom, 1);
338 function submit_complete()
340 reloadPage();
342 </script>
344 </head>
345 <body onload='init()'>
346 <form id='_fom' method='post' action='tomato.cgi'>
347 <table id='container' cellspacing=0>
348 <tr><td colspan=2 id='header'>
349 <div class='title'>Tomato</div>
350 <div class='version'>Version <% version(); %></div>
351 </td></tr>
352 <tr id='body'><td id='navi'><script type='text/javascript'>navi()</script></td>
353 <td id='content'>
354 <div id='ident'><% ident(); %></div>
356 <!-- / / / -->
358 <input type='hidden' name='_nextpage' value='nas-usb.asp'>
359 <input type='hidden' name='_service' value='usb-restart'>
361 <input type='hidden' name='usb_enable'>
362 <input type='hidden' name='usb_uhci'>
363 <input type='hidden' name='usb_ohci'>
364 <input type='hidden' name='usb_usb2'>
365 <input type='hidden' name='usb_mmc'>
366 <input type='hidden' name='usb_storage'>
367 <input type='hidden' name='usb_printer'>
368 <input type='hidden' name='usb_printer_bidirect'>
369 <input type='hidden' name='usb_fs_ext3'>
370 <input type='hidden' name='usb_fs_fat'>
371 <!-- NTFS-BEGIN
372 <input type='hidden' name='usb_fs_ntfs'>
373 NTFS-END -->
374 <input type='hidden' name='usb_fs_hfs'>
375 <input type='hidden' name='usb_fs_hfsplus'>
376 <input type='hidden' name='usb_automount'>
377 /* LINUX26-BEGIN */
378 <input type='hidden' name='idle_enable'>
379 <input type='hidden' name='usb_3g'>
380 /* LINUX26-END */
382 <div class='section-title'>USB Support</div>
383 <div class='section'>
384 <script type='text/javascript'>
386 createFieldTable('', [
387 { title: 'Core USB Support', name: 'f_usb', type: 'checkbox', value: nvram.usb_enable == 1 },
388 { title: 'USB 2.0 Support', indent: 2, name: 'f_usb2', type: 'checkbox', value: nvram.usb_usb2 == 1 },
389 { title: 'USB 1.1 Support', indent: 2, multi: [
390 { suffix: '&nbsp; OHCI &nbsp;&nbsp;&nbsp;', name: 'f_ohci', type: 'checkbox', value: nvram.usb_ohci == 1 },
391 { suffix: '&nbsp; UHCI &nbsp;', name: 'f_uhci', type: 'checkbox', value: nvram.usb_uhci == 1 }
392 ] },
393 null,
394 { title: 'USB Printer Support', name: 'f_print', type: 'checkbox', value: nvram.usb_printer == 1 },
395 { title: 'Bidirectional copying', indent: 2, name: 'f_bprint', type: 'checkbox', value: nvram.usb_printer_bidirect == 1 },
396 null,
397 { title: 'USB Storage Support', name: 'f_storage', type: 'checkbox', value: nvram.usb_storage == 1 },
398 { title: 'File Systems Support', indent: 2, multi: [
399 { suffix: '&nbsp; Ext2 / Ext3 &nbsp;&nbsp;&nbsp;', name: 'f_ext3', type: 'checkbox', value: nvram.usb_fs_ext3 == 1 },
400 /* NTFS-BEGIN */
401 { suffix: '&nbsp; NTFS &nbsp;&nbsp;&nbsp;', name: 'f_ntfs', type: 'checkbox', value: nvram.usb_fs_ntfs == 1 },
402 /* NTFS-END */
403 { suffix: '&nbsp; FAT &nbsp;', name: 'f_fat', type: 'checkbox', value: nvram.usb_fs_fat == 1 },
404 { suffix: '&nbsp; HFS &nbsp;', name: 'f_hfs', type: 'checkbox', value: nvram.usb_fs_hfs == 1 },
405 { suffix: '&nbsp; HFS+ &nbsp;', name: 'f_hfsplus', type: 'checkbox', value: nvram.usb_fs_hfsplus == 1 }
406 ] },
407 /* LINUX26-BEGIN */
408 /* EXTRAS-BEGIN */
409 { title: 'SD/MMC Card Support', indent: 2, name: 'f_mmc', type: 'checkbox', value: nvram.usb_mmc == 1 },
410 /* EXTRAS-END */
411 /* LINUX26-END */
412 { title: 'Automount', indent: 2, name: 'f_automount', type: 'checkbox',
413 suffix: ' <small>Automatically mount all partitions to sub-directories in <i>/mnt</i>.</small>', value: nvram.usb_automount == 1 },
414 { title: 'Run after mounting', indent: 2, name: 'script_usbmount', type: 'textarea', value: nvram.script_usbmount },
415 { title: 'Run before unmounting', indent: 2, name: 'script_usbumount', type: 'textarea', value: nvram.script_usbumount },
416 null,
417 /* LINUX26-BEGIN */
418 { title: 'HDD Spindown', name: 'f_idle_enable', type: 'checkbox',
419 suffix: ' <small>Spin down each HDD when idle (not for use with Flashdrive)</small>', value: nvram.idle_enable == 1 },
420 null,
421 { title: 'USB 3G Modem support', name: 'f_usb_3g', type: 'checkbox',
422 suffix: ' <small>Before disconnecting 3G Modem from USB port, remember to uncheck this box first. If your modem uses the usbserial module, you may have to reboot your router before plugging/unplugging the modem.</small>', value: nvram.usb_3g == 1 },
423 null,
424 /* LINUX26-END */
425 { title: 'Hotplug script<br><small>(called when any USB device is attached or removed)</small>', name: 'script_usbhotplug', type: 'textarea', value: nvram.script_usbhotplug },
426 null,
427 { text: '<small>Some of the changes will take effect only after a restart.</small>' }
429 </script>
430 </div>
432 <!-- / / / -->
434 <div class='section-title'>Attached Devices</div>
435 <div class='section'>
436 <table id='dev-grid' class='tomato-grid' cellspacing=0></table>
437 <div id='usb-controls'>
438 <script type='text/javascript'>genStdRefresh(1,0,'ref.toggle()');</script>
439 </div>
440 <script type='text/javascript'></script>
441 </div>
443 <!-- / / / -->
445 </td></tr>
446 <tr><td id='footer' colspan=2>
447 <span id='footer-msg'></span>
448 <input type='button' value='Save' id='save-button' onclick='save()'>
449 <input type='button' value='Cancel' id='cancel-button' onclick='javascript:reloadPage();'>
450 </td></tr>
451 </table>
452 </form>
453 <script type='text/javascript'>earlyInit();verifyFields(null, 1);</script>
454 </body>
455 </html>