diff options
Diffstat (limited to 'httemplate/elements/tr-select-cust_location.html')
-rw-r--r-- | httemplate/elements/tr-select-cust_location.html | 334 |
1 files changed, 334 insertions, 0 deletions
diff --git a/httemplate/elements/tr-select-cust_location.html b/httemplate/elements/tr-select-cust_location.html new file mode 100644 index 000000000..a876f6225 --- /dev/null +++ b/httemplate/elements/tr-select-cust_location.html @@ -0,0 +1,334 @@ +<%doc> + +Example: + + include('/elements/tr-select-cust_location.html', + 'cgi' => $cgi, + + 'cust_main' => $cust_main, + #or + 'prospect_main' => $prospect_main, + + #optional + 'empty_label' => '(default service address)', + 'disable_empty' => 0, #1 to disable + ) + +</%doc> + +<% include('/elements/xmlhttp.html', + 'url' => $p.'misc/location.cgi', + 'subs' => [ 'get_location' ], + ) +%> + +<SCRIPT TYPE="text/javascript"> + + function location_disable(what) { +% for (@location_fields, 'city_select') { + what.form.<%$_%>.disabled = true; + var ftype = what.form.<%$_%>.tagName; + if( ftype == 'SELECT') changeSelect(what.form.<%$_%>, ''); + else what.form.<%$_%>.value = ''; + if( ftype != 'SELECT') what.form.<%$_%>.style.backgroundColor = '#dddddd'; +% } + } + + function location_clear(what) { +% for (grep { $_ ne 'location_number' } @location_fields, 'city_select') { + var ftype = what.form.<%$_%>.tagName; + if( ftype == 'INPUT' ) what.form.<%$_%>.value = ''; +% } +% if ( $opt{'alt_format'} ) { + changeSelect(what.form.location_kind, ''); + changeSelect(what.form.location_type, ''); + what.form.location_number.value = ''; +% } + } + + function location_enable(what) { +% for (grep { $_ ne 'location_number' } @location_fields, 'city_select') { + what.form.<%$_%>.disabled = false; + var ftype = what.form.<%$_%>.tagName; + if( ftype != 'SELECT') what.form.<%$_%>.style.backgroundColor = '#ffffff'; +% } + + if ( what.form.location_type.options[what.form.location_type.selectedIndex].value ) { + what.form.location_number.disabled = false; + what.form.location_number.style.backgroundColor = '#ffffff'; + } + } + + function locationnum_changed(what) { + var locationnum = what.options[what.selectedIndex].value; + if ( locationnum == -2 ) { //(not required) + location_disable(what); + return; + } + if ( locationnum == -1 ) { //Add new location + location_clear(what); + + changeSelect(what.form.country, <% $countrydefault |js_string %>); + + country_changed( what.form.country, + fix_state_factory( <% $statedefault |js_string %>, + '' + ) + ); + + location_enable(what); + return; + } + if ( locationnum == -3 ) { //service address location for qualificaitons + what.form.address1.value = <% $cust_location->address1 |js_string %>; + what.form.address2.value = <% $cust_location->address2 |js_string %>; + what.form.city.value = <% $cust_location->city |js_string %>; + what.form.zip.value = <% $cust_location->zip |js_string %>; +% if ( $opt{'alt_format'} ) { + what.form.location_number.value = <% $cust_location->location_number |js_string %>; + changeSelect(what.form.location_kind, <% $cust_location->location_kind |js_string %> ); + changeSelect(what.form.location_type, <% $cust_location->location_type |js_string %> ); +% } + + changeSelect(what.form.country, <% $cust_location->country | js_string %> ); + + country_changed( what.form.country, + fix_state_factory( <% $cust_location->state | js_string %>, + <% $cust_location->county | js_string %> + ) + ); + location_enable(what); + return; + } + + if ( locationnum == 0 ) { //(default service address) +% if ( $cust_main ) { + what.form.address1.value = <% $cust_main->get($prefix.'address1') |js_string %>; + what.form.address2.value = <% $cust_main->get($prefix.'address2') |js_string %>; + what.form.city.value = <% $cust_main->get($prefix.'city') |js_string %>; + what.form.zip.value = <% $cust_main->get($prefix.'zip') |js_string %>; + + changeSelect(what.form.country, <% $cust_main->get($prefix.'country') | js_string %> ); + + country_changed( what.form.country, + fix_state_factory( <% $cust_main->get($prefix.'state') | js_string %>, + <% $cust_main->get($prefix.'county') | js_string %> + ) + ); +% } + + } else { + get_location( locationnum, update_location ); + } + +% if ( $editable ) { + if ( locationnum == 0 ) { +% } + +% #sleep/wait until dropdowns are updated? + location_disable(what); + +% if ( $editable ) { + } else { + +% #sleep/wait until dropdowns are updated? + location_enable(what); + + } +% } + + } + + function fix_state_factory (state, county) { + function fix_state() { + var state_el = document.getElementById('state'); + changeSelect(state_el, state); + state_changed(state_el, fix_county_factory(county) ); + } + return fix_state; + } + + function fix_county_factory(county) { + function fix_county() { + var county_el = document.getElementById('county'); + if ( county.length > 0 ) { + changeSelect(county_el, county ); + } else { + county_el.selectedIndex = 0; + } + county_changed(county_el); + } + return fix_county; + } + + function changeSelect(what, value) { + for ( var i=0; i<what.length; i++) { + if ( what.options[i].value == value ) { + what.selectedIndex = i; + } + } + } + + function update_location( string ) { + var hash = eval('('+string+')'); + document.getElementById('address1').value = hash['address1']; + document.getElementById('city').value = hash['city']; + document.getElementById('zip').value = hash['zip']; + +% if ( $opt{'alt_format'} ) { + changeSelect( document.getElementById('location_kind'), hash['location_kind']); + changeSelect( document.getElementById('location_type'), hash['location_type']); + document.getElementById('location_number').value = hash['location_number']; +% } else { + document.getElementById('address2').value = hash['address2']; +% } + + var country_el = document.getElementById('country'); + + changeSelect( country_el, hash['country'] ); + + country_changed( country_el, + fix_state_factory( hash['state'], + hash['county'] + ) + ); + } + +</SCRIPT> + +<TR> + <<%$th%> ALIGN="right"><% $opt{'label'} || emt('Service location') %></<%$th%>> + <TD COLSPAN=7> + <SELECT NAME = "locationnum" + ID = "locationnum" + onChange = "locationnum_changed(this);" + > +% if ( !$prospect_main && !$opt{'disable_empty'} ) { + <OPTION VALUE=""><% $opt{'empty_label'} || '(default service address)' |h %> +% } +% if ( $opt{'is_optional'} ) { + <OPTION VALUE="-2" <% $locationnum == -2 ? 'SELECTED' : ''%>><% $opt{'optional_label'} || '(not required)' |h %> +% } +% +% foreach my $loc ( @cust_location ) { + <OPTION VALUE="<% $loc->locationnum %>" + <% $locationnum == $loc->locationnum ? 'SELECTED' : '' %> + ><% $loc->line |h %> +% } +% if ( $addnew ) { + <OPTION VALUE="-1" + <% $locationnum == -1 ? 'SELECTED' : '' %> + >Add new location +% } + </SELECT> + </TD> +</TR> + +<% include('/elements/location.html', + 'object' => $cust_location, + #'onchange' ? probably not + 'disabled' => $disabled, + 'no_asterisks' => 1, + 'no_bold' => $opt{'no_bold'}, + 'alt_format' => $opt{'alt_format'}, + ) +%> + +<%init> + +my $conf = new FS::Conf; +my $countrydefault = $conf->config('countrydefault') || 'US'; +my $statedefault = $conf->config('statedefault') + || ($countrydefault eq 'US' ? 'CA' : ''); + +my %opt = @_; +my $cgi = $opt{'cgi'}; +my $cust_pkg = $opt{'cust_pkg'}; +my $cust_main = $opt{'cust_main'}; +my $prospect_main = $opt{'prospect_main'}; + +my $prefix = ($cust_main && length($cust_main->ship_last)) ? 'ship_' : ''; + +my $locationnum = ''; +if ( $cgi->param('error') ) { + $cgi->param('locationnum') =~ /^(\-?\d*)$/ or die "illegal locationnum"; + $locationnum = $1; +} else { + if ( length($opt{'curr_value'}) ) { + $locationnum = $opt{'curr_value'}; + } elsif ($prospect_main) { + my @cust_location = $prospect_main->cust_location; + $locationnum = $cust_location[0]->locationnum if scalar(@cust_location)==1; + } else { #? + $cgi->param('locationnum') =~ /^(\-?\d*)$/ or die "illegal locationnum"; + $locationnum = $1; + } +} + +#probably could use explicit controls +# (cust_main locations not editable for tax reasons) +my $editable = $cust_main ? 0 : 1; #could use explicit control +my $addnew = $cust_main ? 1 : ( $locationnum>0 ? 0 : 1 ); + +my @location_fields = qw( address1 address2 city county state zip country ); +if ( $opt{'alt_format'} ) { + push @location_fields, qw( location_type location_number location_kind ); +} + +my $cust_location; +if ( $locationnum && $locationnum > 0 ) { + $cust_location = qsearchs('cust_location', { 'locationnum' => $locationnum } ) + or die "unknown locationnum"; +} else { + $cust_location = new FS::cust_location; + if ( $locationnum == -1 || $locationnum == -3 ) { + $cust_location->$_( $cgi->param($_) ) foreach @location_fields; + } elsif ( $cust_pkg && $cust_pkg->locationnum ) { + my $pkg_location = $cust_pkg->cust_location; + $cust_location->$_( $pkg_location->$_ ) foreach @location_fields; + $opt{'empty_label'} ||= 'package address: '.$pkg_location->line; + } elsif ( $cust_main ) { + $cust_location->$_( $cust_main->get($prefix.$_) ) foreach @location_fields; + } +} + +my $location_sort = sub { + $a->country cmp $b->country + or lc($a->city) cmp lc($b->city) + or lc($a->address1) cmp lc($b->address1) + or lc($a->address2) cmp lc($b->address2) +}; + +my @cust_location = (); +push @cust_location, $cust_main->cust_location if $cust_main; +push @cust_location, $prospect_main->cust_location if $prospect_main; +push @cust_location, $cust_location + if !$cust_main && $cust_location && $cust_location->locationnum > 0 + && ! grep { $_->locationnum == $cust_location->locationnum } @cust_location; + +@cust_location = sort $location_sort grep !$_->disabled, @cust_location; + +$cust_location = $cust_location[0] + if ( $prospect_main || $opt{'disable_empty'} ) + && !$opt{'is_optional'} + && @cust_location; + +my $disabled = + ( $locationnum < 0 + || ( $editable && $locationnum ) + || ( ( $prospect_main || $opt{'disable_empty'} ) + && !$opt{'is_optional'} && !@cust_location && $addnew + ) + ) + ? '' + : 'DISABLED'; + +if ( $cust_main && $opt{'alt_format'} && ! @cust_location ) { + $cust_location->locationnum(-3); + $cust_location->alternize; + push @cust_location, $cust_location; +} + +my $th = $opt{'no_bold'} ? 'TD' : 'TH'; + +</%init> |