3 /* using prototype.js */
5 /* disable/enable input fields according to the selected method */
6 function updateMethodFields() {
7 var method=$('method');
8 var index = method.selectedIndex;
9 var selectedText = method[index].text;
11 var is_static = selectedText == 'Static';
12 var is_tap = selectedText == 'TUN/TAP';
14 $('netmask').disabled= !is_static;
15 $('network').disabled= !is_static;
16 $('gateway').disabled= !is_static && !is_tap;
17 $('broadcast').disabled= !is_static;
18 $('dns1').disabled= !is_static;
19 $('dns2').disabled= !is_static;
22 /* updates broadcast & network from IP and netmask, as long as they are reasonably set */
24 /* a is assumed to be a 4-items array text.split('.') */
25 function arr_to_int (as) {
26 /*a=as.map(parseInt);*/
27 a=as.map( function (x) { return parseInt(x) & 0xff;} );
28 return (a[0]<<24) | (a[1]<<16) | (a[2]<<8) | a[3];
30 function int_to_arr (n) {
32 a[0]=(n&0xff000000)>>>24;
33 a[1]=(n&0x00ff0000)>>>16;
34 a[2]=(n&0x0000ff00)>>>8;
35 a[3]=(n&0x000000ff)>>>0;
39 function int_to_bits (n) {
41 for (var i=0; i<32; i++) {
48 function mask (masklen) {
49 return ( 0xffffffff<<(32-masklen));
52 // input is the user-typed text
53 // return the number of bits in the mask (like 24 for a /24) or -1 if the mask is wrong
54 function get_masklen (nm) {
55 var a = nm.split('.');
56 if ( 4 != a.length ) return -1;
57 var n = arr_to_int (a);
58 var bits = int_to_bits (n);
60 while (bits[masklen] && masklen<32 ) masklen++;
61 // masklen holds the number of consecutive bits; just need to check
62 var n_mask = mask(masklen);
63 return (n == n_mask) ? masklen : -1;
67 // returns network and broadcast from ip and masklen
68 function get_derived (n,masklen) {
69 var n_mask = mask(masklen);
71 r[0]=int_to_arr(n&n_mask).join(".");
72 r[1]=int_to_arr(n|~n_mask).join(".");
76 function same_subnet (ip1,ip2,masklen) {
77 var n1=arr_to_int(ip1.split("."));
78 var n2=arr_to_int(ip2.split("."));
79 return (n1&mask(masklen)) == (n2 & mask(masklen));
82 function networkHelper () {
83 window.console.log('networkHelper');
85 var nm=$('netmask').value;
87 var ip_a = ip.split('.');
88 var nm_a = ip.split('.');
90 /* don't trigger if the input does not make sense */
91 if (ip_a.length != 4) return;
92 if (ip_a[3] == "") return;
93 if (nm_a.length != 4) return;
94 if (nm_a[3] == "") return;
97 var masklen=get_masklen (nm);
98 if (masklen < 0) return;
100 var ip_n=arr_to_int(ip_a);
101 var derived = get_derived(ip_n,masklen);
103 $('network').value=derived[0];
104 $('broadcast').value=derived[1];
108 function subnetChecker (id, optional) {
109 var error= subnetCheckerSilent([id,optional]);
111 Form.Element.focus($(id));
116 function subnetCheckerSilent (args) {
122 if (optional && (ip2=="")) return "";
123 if ( ip2.split(".").length != 4) return "Inconsistent value for " + id;
125 var masklen = get_masklen ($('netmask').value);
126 if (masklen < 0) return "Inconsistent netmask";
128 var ip=$('ip').value;
129 if ( ip.split(".").length != 4) return "Inconsistent IP";
131 if ( ! same_subnet (ip,ip2,masklen) )
132 return id + ' ' + ip2 + ' is not in the /' + masklen + ' subnet range';
137 function interfaceSubmit () {
138 alert ('submitting');
139 // get error strings, and remove the empty ones
141 var errors=['gateway','dns1','dns2'].zip ([true,true,false],subnetCheckerSilent).reject( function (s) {return s.length==0;} );
142 if ( ! errors.length)
143 $('ip').up('form').submit();
145 alert(errors.join("\n"));