some fixes for last commit
[tomato.git] / release / src / router / www / nas-usb.asp
blobab60388af3207dbd92683c9460014a6719f7a51d
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(); %>] <% translate("NAS"); %>: <% translate("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_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"); %>
51 // <% usbdevices(); %>
53 list = [];
55 var xob = null;
57 function _umountHost(host)
59 form.submitHidden('usbcmd.cgi', { remove: host });
62 function _mountHost(host)
64 form.submitHidden('usbcmd.cgi', { mount: host });
67 function _forceRefresh()
69 if (!ref.running) ref.once = 1;
70 ref.start();
73 function umountHost(a, host)
75 if (xob) return;
77 if ((xob = new XmlHttp()) == null) {
78 _umountHost(host);
79 return;
82 a = E(a);
83 a.innerHTML = '<% translate("Please wait..."); %>';
85 xob.onCompleted = function(text, xml) {
86 eval(text);
87 if (usb.length == 1) {
88 if (usb[0] != 0)
89 ferror.set(a, '<% translate("The device is busy. Please make sure no applications are using it, and try again"); %>.', 0);
91 xob = null;
92 _forceRefresh();
95 xob.onError = function() {
96 xob = null;
97 _forceRefresh();
100 xob.post('usbcmd.cgi', 'remove=' + host);
103 function mountHost(a, host)
105 if (xob) return;
107 if ((xob = new XmlHttp()) == null) {
108 _mountHost(host);
109 return;
112 a = E(a);
113 a.innerHTML = '<% translate("Please wait..."); %>';
115 xob.onCompleted = function(text, xml) {
116 eval(text);
117 if (usb.length == 1) {
118 if (usb[0] == 0)
119 ferror.set(a, '<% translate("Failed to mount. Verify the device is plugged in, and try again"); %>.', 0);
121 xob = null;
122 _forceRefresh();
125 xob.onError = function() {
126 xob = null;
127 _forceRefresh();
130 xob.post('usbcmd.cgi', 'mount=' + host);
133 var ref = new TomatoRefresh('update.cgi', 'exec=usbdevices', 0, 'nas_usb_refresh');
135 ref.refresh = function(text)
137 try {
138 eval(text);
140 catch (ex) {
141 return;
143 dg.removeAllData();
144 dg.populate();
145 dg.resort();
148 var dg = new TomatoGrid();
150 dg.sortCompare = function(a, b) {
151 var col = this.sortColumn;
152 var ra = a.getRowData();
153 var rb = b.getRowData();
154 var r;
156 switch (col) {
157 case 1:
158 if (ra.type == 'Storage' && ra.type == rb.type)
159 r = cmpInt(ra.host, rb.host);
160 else
161 r = cmpText(ra.host, rb.host);
162 break;
163 default:
164 r = cmpText(a.cells[col].innerHTML, b.cells[col].innerHTML);
166 return this.sortAscending ? r : -r;
169 dg.populate = function()
171 var i, j, k, a, b, c, e, s, desc, d, parts, p;
173 list = [];
175 for (i = 0; i < list.length; ++i) {
176 list[i].type = '';
177 list[i].host = '';
178 list[i].vendor = '';
179 list[i].product = '';
180 list[i].serial = '';
181 list[i].discs = [];
182 list[i].is_mounted = 0;
185 for (i = usbdev.length - 1; i >= 0; --i) {
186 a = usbdev[i];
187 e = {
188 type: a[0],
189 host: a[1],
190 vendor: a[2],
191 product: a[3],
192 serial: a[4],
193 discs: a[5],
194 is_mounted: a[6]
196 list.push(e);
199 for (i = list.length - 1; i >= 0; --i) {
200 e = list[i];
202 if (e.type != 'Storage')
203 s = '&nbsp<br><small>&nbsp</small>';
204 else {
205 if (xob)
206 s = ((e.is_mounted == 0) ? '<% translate("No"); %>' : '<% translate("Yes"); %>') + '<br><small><% translate("Please wait"); %>...</small>';
207 else if (e.is_mounted == 0)
208 s = '<% translate("No"); %><br><small><a href="javascript:mountHost(\'L' + i + '\',\'' + e.host + '\')" title="<% translate("Mount all Partitions of Storage Device"); %>" id="L' + i + '">[ <% translate("Mount"); %> ]</a></small>';
209 else
210 s = '<% translate("Yes"); %><br><small><a href="javascript:umountHost(\'L' + i + '\',\'' + e.host + '\')" title="<% translate("Safely Remove Storage Device"); %>" id="L' + i + '">[ <% translate("Unmount"); %> ]</a></small>';
212 desc = (e.vendor + ' ' + e.product).trim() + '<small>'; // + (e.serial == '' ? '' : '<br><% translate("Serial No"); %>: ' + e.serial);
213 if (e.discs) {
214 for (j = 0; j <= e.discs.length - 1; ++j) {
215 d = e.discs[j];
216 parts = d[1];
217 for (k = 0; k <= parts.length - 1; ++k) {
218 p = parts[k];
219 if (p) {
220 desc = desc + '<br><% translate("Partition"); %> \'' + p[0] + '\'' + (p[3] != '' ? ' ' + p[3] : '') +
221 ((p[5] != 0) ? ' (' + doScaleSize(p[5], 0) +
222 ((p[1] == 1) ? ' / ' + doScaleSize(p[6], 0) + ' <% translate("free"); %>' : '') +
223 ')' : '') + ' <% translate("is"); %> ' +
224 ((p[1] != 0) ? '' : '<% translate("not"); %> ') + ((p[3] == 'swap') ? '<% translate("active"); %>' : '<% translate("mounted"); %>') +
225 ((p[2] != '') ? ' <% translate("on"); %> ' + p[2] : '');
230 desc = desc + '</small>';
231 this.insert(-1, e, [e.type, e.host, desc, s], false);
234 list = [];
237 dg.setup = function()
239 this.init('dev-grid', 'sort');
240 this.headerSet(['<% translate("Type"); %>', '<% translate("Host"); %>', '<% translate("Description"); %>', '<% translate("Mounted"); %>?']);
241 this.populate();
242 this.sort(1);
245 function earlyInit()
247 dg.setup();
250 function init()
252 dg.recolor();
253 ref.initPage();
256 function verifyFields(focused, quiet)
258 var b = !E('_f_usb').checked;
259 var a = !E('_f_storage').checked;
261 E('_f_uhci').disabled = b || nvram.usb_uhci == -1;
262 E('_f_ohci').disabled = b || nvram.usb_ohci == -1;
263 E('_f_usb2').disabled = b;
264 E('_f_print').disabled = b;
265 E('_f_storage').disabled = b;
267 E('_f_ext3').disabled = b || a;
268 E('_f_fat').disabled = b || a;
269 /* LINUX26-BEGIN */
270 E('_f_idle_enable').disabled = b || a;
271 E('_f_usb_3g').disabled = b || a;
272 /* LINUX26-END */
273 /* NTFS-BEGIN */
274 E('_f_ntfs').disabled = b || a;
275 /* NTFS-END */
276 E('_f_hfs').disabled = b || a; //!Victek
277 E('_f_hfsplus').disabled = b || a; //!Victek
278 E('_f_automount').disabled = b || a;
279 E('_f_bprint').disabled = b || !E('_f_print').checked;
281 elem.display(PR('_f_automount'), !b && !a);
282 elem.display(PR('_script_usbmount'), PR('_script_usbumount'), !b && !a && E('_f_automount').checked);
283 elem.display(PR('_script_usbhotplug'), !b && (!a || E('_f_print').checked));
285 if (!v_length('_script_usbmount', quiet, 0, 2048)) return 0;
286 if (!v_length('_script_usbumount', quiet, 0, 2048)) return 0;
287 if (!v_length('_script_usbhotplug', quiet, 0, 2048)) return 0;
289 return 1;
292 function save()
294 var fom;
296 if (!verifyFields(null, 0)) return;
298 fom = E('_fom');
299 fom.usb_enable.value = E('_f_usb').checked ? 1 : 0;
300 fom.usb_uhci.value = nvram.usb_uhci == -1 ? -1 : (E('_f_uhci').checked ? 1 : 0);
301 fom.usb_ohci.value = nvram.usb_ohci == -1 ? -1 : (E('_f_ohci').checked ? 1 : 0);
302 fom.usb_usb2.value = E('_f_usb2').checked ? 1 : 0;
303 fom.usb_storage.value = E('_f_storage').checked ? 1 : 0;
304 fom.usb_printer.value = E('_f_print').checked ? 1 : 0;
305 fom.usb_printer_bidirect.value = E('_f_bprint').checked ? 1 : 0;
306 fom.usb_fs_ext3.value = E('_f_ext3').checked ? 1 : 0;
307 fom.usb_fs_fat.value = E('_f_fat').checked ? 1 : 0;
308 /* NTFS-BEGIN */
309 fom.usb_fs_ntfs.value = E('_f_ntfs').checked ? 1 : 0;
310 /* NTFS-END */
311 fom.usb_fs_hfs.value = E('_f_hfs').checked ? 1 : 0; //!Victek
312 fom.usb_fs_hfsplus.value = E('_f_hfsplus').checked ? 1 : 0; //!Victek
313 fom.usb_automount.value = E('_f_automount').checked ? 1 : 0;
314 /* LINUX26-BEGIN */
315 fom.idle_enable.value = E('_f_idle_enable').checked ? 1 : 0;
316 fom.usb_3g.value = E('_f_usb_3g').checked ? 1 : 0;
317 /* LINUX26-END */
319 form.submit(fom, 1);
322 function submit_complete()
324 reloadPage();
326 </script>
328 </head>
329 <body onload='init()'>
330 <form id='_fom' method='post' action='tomato.cgi'>
331 <table id='container' cellspacing=0>
332 <tr><td colspan=2 id='header'>
333 <div class='title'>Tomato</div>
334 <div class='version'><% translate("Version"); %> <% version(); %></div>
335 </td></tr>
336 <tr id='body'><td id='navi'><script type='text/javascript'>navi()</script></td>
337 <td id='content'>
338 <div id='ident'><% ident(); %></div>
340 <!-- / / / -->
342 <input type='hidden' name='_nextpage' value='nas-usb.asp'>
343 <input type='hidden' name='_service' value='usb-restart'>
345 <input type='hidden' name='usb_enable'>
346 <input type='hidden' name='usb_uhci'>
347 <input type='hidden' name='usb_ohci'>
348 <input type='hidden' name='usb_usb2'>
349 <input type='hidden' name='usb_storage'>
350 <input type='hidden' name='usb_printer'>
351 <input type='hidden' name='usb_printer_bidirect'>
352 <input type='hidden' name='usb_fs_ext3'>
353 <input type='hidden' name='usb_fs_fat'>
354 <!-- NTFS-BEGIN
355 <input type='hidden' name='usb_fs_ntfs'>
356 NTFS-END -->
357 <input type='hidden' name='usb_fs_hfs'>
358 <input type='hidden' name='usb_fs_hfsplus'>
359 <input type='hidden' name='usb_automount'>
360 /* LINUX26-BEGIN */
361 <input type='hidden' name='idle_enable'>
362 <input type='hidden' name='usb_3g'>
363 /* LINUX26-END */
365 <div class='section-title'><% translate("USB Support"); %></div>
366 <div class='section'>
367 <script type='text/javascript'>
369 createFieldTable('', [
370 { title: '<% translate("Core USB Support"); %>', name: 'f_usb', type: 'checkbox', value: nvram.usb_enable == 1 },
371 { title: '<% translate("USB 2.0 Support"); %>', indent: 2, name: 'f_usb2', type: 'checkbox', value: nvram.usb_usb2 == 1 },
372 { title: '<% translate("USB 1.1 Support"); %>', indent: 2, multi: [
373 { suffix: '&nbsp; OHCI &nbsp;&nbsp;&nbsp;', name: 'f_ohci', type: 'checkbox', value: nvram.usb_ohci == 1 },
374 { suffix: '&nbsp; UHCI &nbsp;', name: 'f_uhci', type: 'checkbox', value: nvram.usb_uhci == 1 }
375 ] },
376 null,
377 { title: '<% translate("USB Printer Support"); %>', name: 'f_print', type: 'checkbox', value: nvram.usb_printer == 1 },
378 { title: '<% translate("Bidirectional copying"); %>', indent: 2, name: 'f_bprint', type: 'checkbox', value: nvram.usb_printer_bidirect == 1 },
379 null,
380 { title: '<% translate("USB Storage Support"); %>', name: 'f_storage', type: 'checkbox', value: nvram.usb_storage == 1 },
381 { title: '<% translate("File Systems Support"); %>', indent: 2, multi: [
382 { suffix: '&nbsp; Ext2 / Ext3 &nbsp;&nbsp;&nbsp;', name: 'f_ext3', type: 'checkbox', value: nvram.usb_fs_ext3 == 1 },
383 /* NTFS-BEGIN */
384 { suffix: '&nbsp; NTFS &nbsp;&nbsp;&nbsp;', name: 'f_ntfs', type: 'checkbox', value: nvram.usb_fs_ntfs == 1 },
385 /* NTFS-END */
386 { suffix: '&nbsp; FAT &nbsp;', name: 'f_fat', type: 'checkbox', value: nvram.usb_fs_fat == 1 },
387 { suffix: '&nbsp; HFS &nbsp;', name: 'f_hfs', type: 'checkbox', value: nvram.usb_fs_hfs == 1 },
388 { suffix: '&nbsp; HFS+ &nbsp;', name: 'f_hfsplus', type: 'checkbox', value: nvram.usb_fs_hfsplus == 1 }
389 ] },
390 { title: '<% translate("Automount"); %>', indent: 2, name: 'f_automount', type: 'checkbox',
391 suffix: ' <small><% translate("Automatically mount all partitions to sub-directories in"); %> <i>/mnt</i>.</small>', value: nvram.usb_automount == 1 },
392 { title: '<% translate("Run after mounting"); %>', indent: 2, name: 'script_usbmount', type: 'textarea', value: nvram.script_usbmount },
393 { title: '<% translate("Run before unmounting"); %>', indent: 2, name: 'script_usbumount', type: 'textarea', value: nvram.script_usbumount },
394 null,
395 /* LINUX26-BEGIN */
396 { title: '<% translate("HDD Spindown"); %>', name: 'f_idle_enable', type: 'checkbox',
397 suffix: ' <small><% translate("Spin down each HDD when idle. No need to use with flashdrive"); %>.</small>', value: nvram.idle_enable == 1 },
398 null,
399 { title: '<% translate("USB 3G Modem support"); %>', name: 'f_usb_3g', type: 'checkbox',
400 suffix: ' <small><% translate("Before disconnecting 3G Modem from USB port, remember to uncheck box"); %>.</small>', value: nvram.usb_3g == 1 },
401 null,
402 /* LINUX26-END */
403 { title: '<% translate("Hotplug script"); %><br><small>(<% translate("called when any USB device is attached or removed"); %>)</small>', name: 'script_usbhotplug', type: 'textarea', value: nvram.script_usbhotplug },
404 null,
405 { text: '<small><% translate("Some of the changes will take effect only after a restart"); %>.</small>' }
407 </script>
408 </div>
410 <!-- / / / -->
412 <div class='section-title'><% translate("Attached Devices"); %></div>
413 <div class='section'>
414 <table id='dev-grid' class='tomato-grid' cellspacing=0></table>
415 <div id='usb-controls'>
416 <script type='text/javascript'>genStdRefresh(1,0,'ref.toggle()');</script>
417 </div>
418 <script type='text/javascript'></script>
419 </div>
421 <!-- / / / -->
423 </td></tr>
424 <tr><td id='footer' colspan=2>
425 <span id='footer-msg'></span>
426 <input type='button' value='<% translate("Save"); %>' id='save-button' onclick='save()'>
427 <input type='button' value='<% translate("Cancel"); %>' id='cancel-button' onclick='javascript:reloadPage();'>
428 </td></tr>
429 </table>
430 </form>
431 <script type='text/javascript'>earlyInit();verifyFields(null, 1);</script>
432 </body>
433 </html>