fix interaction of agent choice, agent-ship_address, and "same" checkbox, #21327...
[freeside.git] / httemplate / elements / location.html
1 <%doc>
2
3 Example:
4
5   include( '/elements/location.html',
6              'object'         => $cust_location
7              'prefix'         => $pre, # prefixed to form field names
8              'onchange'       => $javascript,
9              'geocode'        => $geocode, #passed through
10              'censustract'    => $censustract, #passed through
11              'no_asterisks'   => 0, #set true to disable the red asterisks next
12                                     #to required fields
13              'address1_label' => 'Address', #label for address
14              'enable_coords'  => 1, #show latitude/longitude fields
15              'enable_district' => 1, #show tax district field
16              'enable_censustract' => 1, #show censustract field
17              
18          )
19
20 </%doc>
21
22 % if ( $opt{'alt_format'} ) {
23
24 <TR>
25     <<%$th%> ALIGN="right">Location&nbsp;kind</<%$th%>>
26     <TD>
27     <% include('/elements/select.html',
28                  'cgi'        => $cgi,
29                  'field'      => 'location_kind',
30                  'id'         => 'location_kind',
31                  'disabled'   => $disabled,
32                  #'style'      => \@style,
33                  'options'    => \@location_kind_options,
34                  'labels'     => $location_kind_labels,
35                  'curr_value' => scalar($cgi->param('location_kind'))
36                                    || $object->get('location_kind'),
37               )
38     %>
39     </TD>
40   </TR>
41
42 % } 
43
44 % if ( $label_prefix eq '_location' ) {
45
46     <TR>
47       <TH ALIGN="right" ><% $opt{'locationname_label'} || emt('Location ID') %></TD>
48       <TD COLSPAN=7>
49         <INPUT TYPE     = "text"
50                NAME     = "<%$pre%>locationname"
51                ID       = "<%$pre%>locationname"
52                VALUE    = "<% $object->get('locationname') |h %>"
53                SIZE     = 24
54                onChange = "<% $onchange %>"
55                <% $disabled %>
56                <% $style %>
57         >
58       </TD>
59     </TR>
60
61 % } else {
62     <& hidden.html, field => $pre.'locationname', value => $object->get('locationname') &>
63
64 % }
65
66 <TR>
67   <<%$th%> STYLE="width:16ex" ALIGN="right"><%$r%><% $opt{'address1_label'} || emt('Address') %></<%$th%>>
68   <TD COLSPAN=7>
69     <INPUT TYPE     = "text"
70            NAME     = "<%$pre%>address1"
71            ID       = "<%$pre%>address1"
72            VALUE    = "<% $object->get('address1') |h %>"
73            SIZE     = 54
74            onChange = "<% $onchange %>"
75            <% $disabled %>
76            <% $style %>
77     >
78   </TD>
79 </TR>
80
81 % if ( ! $opt{'alt_format'} ) { #regular format
82
83 <TR>
84       <TH ALIGN="right"><FONT ID="<% $pre %>address2_required" color="#ff0000" <% $address2_label_style %>>*</FONT>&nbsp;<FONT ID="<% $pre %>address2_label" <% $address2_label_style %>><B>Unit&nbsp;#</B></FONT></TD>
85       <TD COLSPAN=7>
86         <INPUT TYPE     = "text"
87                NAME     = "<%$pre%>address2"
88                ID       = "<%$pre%>address2"
89                VALUE    = "<% $object->get('address2') |h %>"
90                SIZE     = 54
91                onChange = "<% $onchange %>"
92                <% $disabled %>
93                <% $style %>
94         >
95       </TD>
96 </TR>
97
98 % } else { # alternate format
99
100 <& hidden.html, field => $pre.'address2', value => $object->get('address2') &>
101
102 <TR>
103     <<%$th%> ALIGN="right">Unit&nbsp;type&nbsp;and&nbsp;#</<%$th%>>
104     <TD COLSPAN=7>
105
106 %     my $location_type = scalar($cgi->param('location_type'))
107 %                           || $object->get('location_type');
108 %     #my $location_number = scalar($cgi->param('location_number'))
109 %     #                        || $object->get($pre.'location_number');
110 %
111 %   if ( $object->get($pre.'address2') && ! $location_type ) {
112 %   }
113 %
114 %     if ( 1 ) { #ikano, switch on via config
115 %       tie my %location_types, 'Tie::IxHash',
116 %         FS::part_export::ikano->location_types;
117         <% include('/elements/select.html',
118                      'cgi'        => $cgi,
119                      'field'      => 'location_type',
120                      'id'         => 'location_type',
121                      'disabled'   => $disabled,
122                      #'style'      => \@style,
123                      'options'    => [ keys %location_types ],
124                      'labels'     => \%location_types,
125                      'curr_value' => $location_type,
126                      'onchange'   => 'location_type_changed',
127                   )
128         %>
129         <SCRIPT TYPE="text/javascript">
130           function location_type_changed (what) {
131             if ( what.options[what.selectedIndex].value == '' ) {
132               what.form.location_number.disabled = true;
133               what.form.location_number.style.backgroundColor = '#dddddd';
134             } else {
135               what.form.location_number.disabled = false;
136               what.form.location_number.style.backgroundColor = '#ffffff';
137             }
138           }
139         </SCRIPT>
140 %     } else {
141         <INPUT TYPE  = "text" 
142                NAME  = "location_type" 
143                ID    = "location_type"
144                VALUE = "<% $location_type |h %>"
145                SIZE  = "10"
146                <% $disabled %>
147                <% $style %>
148         >
149 %     }
150
151     <INPUT TYPE="text" 
152                NAME  = "location_number"
153                ID    = "location_number"
154                VALUE = "<% scalar($cgi->param('location_number')) || $object->get('location_number') |h %>"
155                SIZE  = "5"
156                <% $disabled || ($location_type ? '' : 'DISABLED') %>
157                <% $style %>
158         >
159
160 %    #XXX i don't work so well when the dropdown is changed :/  i probably need to be triggered by "default service address"
161 %    $alt_err =~ s/(ship_)?address2/'<B>'.encode_entities($object->get($1.'address2')).'<\/B>'/e;
162      <% $alt_err %>
163
164     </TD>
165
166 </TR>
167
168 % } 
169
170
171 <TR>
172 % if ($conf->exists('city_not_required')) {
173 <input type="hidden" name="<% ($select_hash{'prefix'}) ? $select_hash{'prefix'} : '' %>city" value=" "/>
174 %} else {
175   <<%$th%> ALIGN="right"><%$r%><% mt('City') |h %></<%$th%>>
176   <TD WIDTH="1"><% include('/elements/city.html', %select_hash, 'text_style' => \@style ) %></TD>
177
178   <<%$th%> ALIGN="right" WIDTH="1" ID="<%$pre%>countylabel" <%$county_style%>><%$r%>County</<%$th%>>
179   <TD WIDTH="1"><% include('/elements/select-county.html', %select_hash ) %></TD>
180 % }
181   <<%$th%> ALIGN="right" WIDTH="1"><%$r%><% mt('State') |h %></<%$th%>>
182   <TD WIDTH="1">
183     <% include('/elements/select-state.html', %select_hash ) %>
184   </TD>
185   <<%$th%> ALIGN="right" WIDTH="1"><%$r%><% mt('Zip') |h %></<%$th%>>
186   <TD>
187     <INPUT TYPE     = "text"
188            NAME     = "<%$pre%>zip"
189            ID       = "<%$pre%>zip"
190            VALUE    = "<% $object->get('zip') |h %>"
191            SIZE     = 11
192            onChange = "<% $onchange %>"
193            <% $disabled %>
194            <% $style %>
195     >
196   </TD>
197 </TR>
198
199 <TR>
200   <<%$th%> ALIGN="right"><%$r%><% mt('Country') |h %></<%$th%>>
201   <TD COLSPAN=6><% include('/elements/select-country.html', %select_hash ) %></TD>
202 </TR>
203
204 % if ( $opt{enable_coords} ) {
205 <TR>
206   <TH ALIGN="right"><% mt('Latitude') |h %></TD>
207   <TD COLSPAN=7>
208     <INPUT TYPE  = "text"
209            NAME  = "<%$pre%>latitude"
210            ID    = "<%$pre%>latitude"
211            VALUE = "<% $object->get('latitude') |h %>"
212            <% $disabled %>
213            <% $style %>
214     >
215     <FONT SIZE="-1" COLOR="#666666"><% mt('Longitude') |h %></FONT>
216     <INPUT TYPE  = "text"
217            NAME  = "<%$pre%>longitude"
218            ID    = "<%$pre%>longitude"
219            VALUE = "<% $object->get('longitude') |h %>"
220            <% $disabled %>
221            <% $style %>
222     >
223   </TD>
224 </TR>
225 % } else {
226 %   foreach (qw(latitude longitude)) {
227 <& hidden.html, field => $pre.$_, value => $object->get($_) &>
228 %   }
229 % }
230 %
231 % foreach (qw(coord_auto geocode censustract censusyear)) {
232   <& hidden.html, field => $pre.$_, value => $object->get($_) &>
233 % }
234 %
235 % if ( $opt{enable_censustract} ) {
236 <TR>
237   <TH ALIGN="right">Census&nbsp;tract</TD>
238   <TD COLSPAN=8>
239     <INPUT TYPE="text" SIZE=15
240            ID="<% $pre %>enter_censustract" 
241            NAME="<% $pre %>enter_censustract" 
242            VALUE="<% $object->censustract |h %>">
243     <FONT SIZE="-1" COLOR="#333333"><% '(automatic)' %></FONT>
244   </TD>
245 </TR>
246 % }
247 % if ( $opt{enable_district} and $conf->config('tax_district_method') ) {
248   <TR>
249     <TD ALIGN="right">Tax&nbsp;district</TD>
250     <TD COLSPAN=8>
251       <INPUT TYPE="text" SIZE=15
252              NAME="<%$pre%>district" 
253              ID="<%$pre%>district"
254              VALUE="<% $object->district |h %>">
255     <% '(automatic)' %>
256     </TD>
257   </TR>
258 % } else {
259   <& hidden.html, field => $pre.'district', value => $object->get('district') &>
260 % }
261
262 %# For address standardization:
263 %# keep a clean copy of the address so we know if we need
264 %# to re-standardize
265 % foreach (qw(locationname address1 city state country zip latitude
266 %             longitude censustract district addr_clean
267 %             ) ) {
268 <& hidden.html, field => 'old_'.$pre.$_, value => $object->get($_) &>
269 % }
270 %# Placeholders
271 <& hidden.html, field => $pre.'cachenum', value => '' &>
272 <& hidden.html, field => $pre.'addr_clean', value => '' &>
273
274 <SCRIPT TYPE="text/javascript">
275 <&| /elements/onload.js &>
276   var clear_coords_ids = [
277     '<%$pre%>latitude',
278     '<%$pre%>longitude',
279     '<%$pre%>enter_censustract',
280     '<%$pre%>censustract',
281     '<%$pre%>district'
282   ];
283   function clear_coords() {
284     for (var i=0; i < clear_coords_ids.length; i++) {
285       var el = document.getElementById(clear_coords_ids[i]);
286       if ( el ) {
287         el.value = '';
288       }
289     }
290   }
291   var clear_coords_on_change = [
292     '<%$pre%>address1',
293     '<%$pre%>address2',
294     '<%$pre%>city',
295     '<%$pre%>state',
296     '<%$pre%>zip',
297     '<%$pre%>country'
298   ];
299   for (var i=0; i < clear_coords_on_change.length; i++) {
300     var el = document.getElementById(clear_coords_on_change[i]);
301     if ( el.addEventListener ) {
302       el.addEventListener('change', clear_coords);
303     } else if ( el.attachEvent ) {
304       el.attachEvent('onchange', clear_coords);
305     }
306   }
307   function clear_censustract() {
308     // if the user manually edits the census tract, clear the 'hard' census
309     // tract field so that we can re-verify and present a confirmation popup 
310
311     // get the ID of the hidden censustract field
312     var censustract_id = this.id.replace('enter_', '');
313     var el = document.getElementById(censustract_id);
314     if (el) {
315       el.value = '';
316     }
317   }
318   var el = document.getElementById('<%$pre%>enter_censustract');
319   if (el) {
320     if ( el.addEventListener ) {
321       el.addEventListener('change', clear_censustract);
322     } else if ( el.attachEvent ) {
323       el.attachEvent('onchange', clear_censustract);
324     }
325   }
326
327 </&>
328 </SCRIPT>
329
330 <%init>
331
332 my %opt = @_;
333
334 my $pre      = $opt{'prefix'};
335 my $object   = $opt{'object'};
336 my $onchange = $opt{'onchange'};
337 my $disabled = $opt{'disabled'};
338
339 my $r = $opt{'no_asterisks'} ? '' : qq!<font color="#ff0000">*</font>&nbsp;!;
340
341 my $conf = new FS::Conf;
342 my $countrydefault = $conf->config('countrydefault') || 'US';
343 my $statedefault   = $conf->config('statedefault') 
344                        || ($countrydefault eq 'US' ? 'CA' : '');
345 my $label_prefix   = $conf->config('cust_location-label_prefix');
346
347 $object ||= FS::cust_location->new({
348   'country' => $countrydefault,
349   'state'   => $statedefault,
350 });
351
352 my $alt_err = ($opt{'alt_format'} && !$disabled) ? $object->alternize : '';
353
354 my @style = ();
355 push @style, 'background-color: #dddddd' if $disabled;
356
357 my @address2_label_style = ();
358 push @address2_label_style, 'visibility:hidden'
359   if $disabled
360   || ! $conf->exists('cust_main-require_address2')
361   || ( !$pre && !$opt{'same_checked'} );
362
363 my @counties = counties( $object->get('state'),
364                          $object->get('country'),
365                        );
366 my @county_style = ();
367 push @county_style, 'display:none' # 'visibility:hidden'
368   unless scalar(@counties) > 1;
369
370 my $style =
371   scalar(@style)
372     ? 'STYLE="'. join(';', @style). '"'
373     : '';
374 my $address2_label_style =
375   scalar(@address2_label_style)
376     ? 'STYLE="'. join(';', @address2_label_style). '"'
377     : '';
378 my $county_style = 
379   scalar(@county_style)
380     ? 'STYLE="'. join(';', @county_style). '"'
381     : '';
382
383 my %select_hash = (
384   'city'     => $object->get('city'),
385   'county'   => $object->get('county'),
386   'state'    => $object->get('state'),
387   'country'  => $object->get('country'),
388   'prefix'   => $pre,
389   'onchange' => $onchange,
390   'disabled' => $disabled,
391   #'style'    => \@style,
392 );
393
394 my $th = $opt{'no_bold'} ? 'TD' : 'TH';
395
396 my @location_kind_options = ( '', 'R', 'B' );
397 my $location_kind_labels = { '' => '', 'R' => 'Residential', 'B' => 'Business' };
398
399 </%init>