1 <script type="text/javascript">
2 var manual_addr_routernum = <% encode_json(\%manual_addr_routernum) %>;
3 var ip_addr_curr_value = <% $opt{'ip_addr'} |js_string %>;
4 var blocknum_curr_value = <% $opt{'blocknum'} |js_string %>;
6 function update_ip_addr() {
7 var routernum = $('#router_select_0').val() || "";
8 var blocknum = $('#router_select_1').val() || "";
9 var e_input_ip_addr = $('#input_ip_addr');
10 var e_router_select_1 = $('#router_select_1');
12 <% # Is block is automatically selected for this router? %>
13 if ( manual_addr_routernum[routernum] == 'Y' ) {
16 e_router_select_1.hide();
17 e_input_ip_addr.val( ip_addr_curr_value );
19 e_router_select_1.show();
20 e_input_ip_addr.attr('placeholder', <% mt('(automatic)') | js_string %> );
21 if ( routernum == router_curr_values[0] &&
22 blocknum == router_curr_values[1] ) {
23 e_input_ip_addr.val( ip_addr_curr_value );
25 e_input_ip_addr.val('');
28 show_or_hide_toggle_ip();
32 function toggle_ip_input() {
33 if ( $('#input_ip_addr').is(':hidden') ) {
40 function show_ip_input() {
41 $('#input_ip_addr').show();
42 $('#select_ip_addr').hide();
43 depopulate_ip_select();
46 function show_ip_select() {
47 var e_input_ip_addr = $('#input_ip_addr');
48 var e_select_ip_addr = $('#select_ip_addr');
50 e_select_ip_addr.width( e_input_ip_addr.width() );
51 e_input_ip_addr.hide();
52 e_select_ip_addr.show();
56 function populate_ip_select() {
57 depopulate_ip_select();
58 var e = $('#select_ip_addr');
59 var blocknum = $('#router_select_1').val();
61 var opts = [ '<option value="">loading...</option>' ];
62 e.html(opts.join(''));
64 % if ( $opt{ip_addr} ) {
66 '<option value="<% $opt{ip_addr} |h %>"><% $opt{ip_addr} |h %></option>',
67 '<option value="">-----------</option>'
70 opts = [ '<option value=""><% mt('(automatic)') |h %></option>' ];
72 if ( blocknum && $.isNumeric(blocknum) && ! e.is(':hidden')) {
74 '<% $p %>misc/xmlhttp-free_addresses_in_block.json.html',
77 $.each( ip_json, function(idx, val) {
79 '<option' + (val == ip_addr_curr_value ? 'selected' : '') + '>'
84 e.html(opts.join(''));
90 function depopulate_ip_select() {
91 $('#select_ip_addr').children().remove();
94 function propogate_ip_select() {
95 $('#input_ip_addr').val( $('#select_ip_addr').val() );
98 function show_or_hide_toggle_ip() {
99 if ( $('#router_select_1').val() ) {
100 $('#toggle_ip').show();
103 $('#toggle_ip').hide();
109 <& /elements/tr-td-label.html, label => ($opt{'label'} || 'Router'), required => $opt{'required'} &>
111 <& /elements/select-tiered.html, prefix => 'router_', tiers => [
113 field => 'routernum',
114 records => \@routers,
115 name_col => 'routername',
116 value_col => 'routernum',
117 onchange => 'update_ip_addr',
118 curr_value=> $opt{'routernum'},
122 table => 'addr_block',
123 hashref => (exists($fixed{'blocknum'}) ?
124 { blocknum => $fixed{'blocknum'} } : {}
127 link_col => 'routernum',
128 empty_label => '(any)',
129 onchange => 'update_ip_addr',
130 curr_value => $opt{'blocknum'},
135 <& /elements/tr-td-label.html, label => ($opt{'ip_addr_label'} || 'IP address'), required => $opt{'ip_addr_required'} &>
137 % if ( exists $fixed{$ip_field} ) {
138 <input type="hidden" id="input_ip_addr" name="<% $ip_field %>"
139 value="<% $opt{'ip_addr'} |h%>"><% $opt{'ip_addr'} || '' %>
144 name="<% $ip_field %>"
145 value="<% $opt{'ip_addr'} | h %>"
146 onfocus="clearhint_ip_addr(this)">
147 <select id="select_ip_addr" style="display: none;" onChange='javascript:propogate_ip_select();'>
148 <option><% mt('loading') |h %>...</option>
150 <button type="button" onClick='javascript:toggle_ip_input();' id="toggle_ip" style="display: none;">▼</button>
153 <script type="text/javascript">
160 my $conf = FS::Conf->new;
162 my $svc_x = $opt{'object'};
164 # $svc_x->ip_addr does work, even for non-svc_broadband.
165 $opt{$_} = $svc_x->$_
166 foreach qw(routernum blocknum ip_addr svcpart);
167 if ( $svc_x->svcnum ) {
168 $opt{'svcpart'} = $svc_x->cust_svc->svcpart;
172 my $svcpart = $opt{'svcpart'} || '';
173 my $ip_field = $opt{'ip_field'} || 'ip_addr';
175 my %fixed; # which fields are fixed
176 $svcpart =~ /^\d*$/ or die "invalid svcpart '$svcpart'";
178 my $part_svc = FS::part_svc->by_key($svcpart);
179 # Traditionally, columnflag 'F' on IP address means that it MUST
180 # be auto-assigned (or, if null IP addresses are allowed, that
182 foreach (qw(routernum blocknum), $ip_field) {
183 my $psc = $part_svc->part_svc_column($_);
184 if ( $psc and $psc->columnflag eq 'F' ) {
185 $fixed{$_} = $psc->columnvalue;
188 if ( exists $fixed{'routernum'} ) {
189 @routers = (FS::router->by_key($fixed{'routernum'}))
192 @routers = map { $_->router }
193 qsearch('part_svc_router', { svcpart => $svcpart });
197 @routers = qsearch('router', {});
200 my %manual_addr_routernum = map { $_->routernum, $_->manual_addr } @routers;
202 if ( $conf->exists('auto_router') ) {
203 # Then show an "(automatic)" router, with no blocks. manual_addr is on
204 # so that the ip_addr field will be unlocked.
205 unshift @routers, FS::router->new({
207 'routername' => '(automatic)',
208 'manual_addr' => 'Y',
210 $manual_addr_routernum{''} = 'Y';