3 function format_signal(bss
) {
4 var qval
= bss
.quality
|| 0,
5 qmax
= bss
.quality_max
|| 100,
6 scale
= 100 / qmax
* qval
,
9 if (!bss
.bssid
|| bss
.bssid
== '00:00:00:00:00:00')
24 title
: '%s: %d%s / %s: %d/%d'.format(_('Signal'), bss
.signal
, _('dB'), _('Quality'), qval
, qmax
)
26 E('img', { src
: L
.resource('icons/signal-%s.png').format(range
) }),
31 function format_encryption(bss
) {
32 var enc
= bss
.encryption
|| { }
38 title
: 'Pairwise: %h / Group: %h'.format(
39 enc
.pair_ciphers
.join(', '),
40 enc
.group_ciphers
.join(', '))
43 (enc
.wpa
=== 3) ? _('mixed WPA/WPA2') : (enc
.wpa
=== 2 ? 'WPA2' : 'WPA'),
44 enc
.auth_suites
.join(', ')));
46 return E('em', enc
.enabled
? _('unknown') : _('open'));
49 function format_actions(dev
, type
, bss
) {
50 var enc
= bss
.encryption
|| { },
52 E('input', { type
: 'submit', class: 'cbi-button cbi-button-action important', value
: _('Join Network') }),
53 E('input', { type
: 'hidden', name
: 'token', value
: L
.env
.token
}),
54 E('input', { type
: 'hidden', name
: 'device', value
: dev
}),
55 E('input', { type
: 'hidden', name
: 'join', value
: bss
.ssid
}),
56 E('input', { type
: 'hidden', name
: 'mode', value
: bss
.mode
}),
57 E('input', { type
: 'hidden', name
: 'bssid', value
: bss
.bssid
}),
58 E('input', { type
: 'hidden', name
: 'channel', value
: bss
.channel
}),
59 E('input', { type
: 'hidden', name
: 'clbridge', value
: type
=== 'wl' ? 1 : 0 }),
60 E('input', { type
: 'hidden', name
: 'wep', value
: enc
.wep
? 1 : 0 })
64 input
.push(E('input', { type
: 'hidden', name
: 'wpa_version', value
: enc
.wpa
}));
66 enc
.auth_suites
.forEach(function(s
) {
67 input
.push(E('input', { type
: 'hidden', name
: 'wpa_suites', value
: s
}));
70 enc
.group_ciphers
.forEach(function(s
) {
71 input
.push(E('input', { type
: 'hidden', name
: 'wpa_group', value
: s
}));
74 enc
.pair_ciphers
.forEach(function(s
) {
75 input
.push(E('input', { type
: 'hidden', name
: 'wpa_pairwise', value
: s
}));
82 action
: L
.url('admin/network/wireless_join')
86 function fade(bss
, content
) {
88 return E('span', { style
: 'opacity:0.5' }, content
);
101 var tbl
= document
.querySelector('[data-wifi-scan]'),
102 dev
= tbl
.getAttribute('data-wifi-scan'),
103 type
= tbl
.getAttribute('data-wifi-type');
105 cbi_update_table(tbl
, [], E('em', { class: 'spinning' }, _('Starting wireless scan...')));
107 L
.post(L
.url('admin/network/wireless_scan_trigger', dev
), null, function(s
) {
108 if (s
.status
!== 204) {
109 cbi_update_table(tbl
, [], E('em', _('Scan request failed')));
115 poll
= L
.poll(3, L
.url('admin/network/wireless_scan_results', dev
), null, function(s
, results
) {
117 if (Array
.isArray(results
)) {
120 results
.sort(function(a
, b
) {
121 var diff
= (b
.quality
- a
.quality
) || (a
.channel
- b
.channel
);
128 else if (a
.ssid
> b
.ssid
)
131 if (a
.bssid
< b
.bssid
)
133 else if (a
.bssid
> b
.bssid
)
135 }).forEach(function(res
) {
137 fade(res
, format_signal(res
)),
138 fade(res
, res
.ssid
? '%h'.format(res
.ssid
) : E('em', {}, _('hidden'))),
139 fade(res
, res
.channel
),
141 fade(res
, res
.bssid
),
142 fade(res
, format_encryption(res
)),
143 format_actions(dev
, type
, res
)
147 cbi_update_table(tbl
, bss
, E('em', {}, _('No networks in range')));
150 cbi_update_table(tbl
, [], E('em', { class: 'spinning' }, _('No scan results available yet...')));
156 L
.post(L
.url('admin/network/wireless_scan_trigger', dev
, 1), null, function() {});
164 document
.addEventListener('DOMContentLoaded', scan
);