properly pass init_popstate to error pages
[freeside.git] / fs_signup / FS-SignupClient / cgi / signup.cgi
index 1b87045..eeb9410 100755 (executable)
@@ -1,12 +1,14 @@
 #!/usr/bin/perl -Tw
 #
-# $Id: signup.cgi,v 1.29.2.5 2002-12-24 23:03:25 ivan Exp $
+# $Id: signup.cgi,v 1.29.2.14 2003-07-04 03:21:41 ivan Exp $
 
 use strict;
-use vars qw( @payby $cgi $locales $packages $pops $init_data $error
+use vars qw( @payby $cgi $locales $packages
+             $pops %pop %popnum2pop
+             $init_data $error
              $last $first $ss $company $address1 $address2 $city $state $county
              $country $zip $daytime $night $fax $invoicing_list $payby $payinfo
-             $paydate $payname $referral_custnum
+             $paydate $payname $referral_custnum $init_popstate
              $pkgpart $username $password $password2 $sec_phrase $popnum
              $agentnum
              $ieak_file $ieak_template $cck_file $cck_template
@@ -137,6 +139,13 @@ if ( -e $decline_html ) {
 ( $locales, $packages, $pops, $init_data ) = signup_info();
 @payby = @{$init_data->{'payby'}} if @{$init_data->{'payby'}};
 $packages = $init_data->{agentnum2part_pkg}{$agentnum} if $agentnum;
+%pop = ();
+%popnum2pop = ();
+foreach (@$pops) {
+  #push @{ $pop{ $_->{state} }->{ $_->{ac} } }, $_;
+  push @{ $pop{ $_->{state} } }, $_;
+  $popnum2pop{$_->{popnum}} = $_;
+}
 
 $cgi = new CGI;
 
@@ -204,6 +213,7 @@ if ( defined $cgi->param('magic') ) {
     $password         = $cgi->param('_password');
     $popnum           = $cgi->param('popnum');
     #$agentnum, #         = $cgi->param('agentnum'),
+    $init_popstate  = $cgi->param('init_popstate');
 
     if ( $cgi->param('_password') ne $cgi->param('_password2') ) {
       $error = $init_data->{msgcat}{passwords_dont_match}; #msgcat
@@ -275,7 +285,7 @@ if ( defined $cgi->param('magic') ) {
   $address1 = '';
   $address2 = '';
   $city = '';
-  $state = $init_data->{statedefault};
+  $state = $cgi->param('init_popstate') || $init_data->{statedefault};
   $county = '';
   $country = $init_data->{countrydefault};
   $zip = '';
@@ -294,12 +304,14 @@ if ( defined $cgi->param('magic') ) {
   $sec_phrase = '';
   $popnum = '';
   $referral_custnum = $cgi->param('ref') || '';
+  $init_popstate = $cgi->param('init_popstate') || '';
   print_form;
 }
 
 sub print_form {
 
   $cgi->delete('ref');
+  $cgi->delete('init_popstate');
   $self_url = $cgi->self_url;
 
   $error = "Error: $error" if $error;
@@ -327,7 +339,7 @@ sub print_okay {
     or die "fatal: invalid email_name got past FS::SignupClient::new_customer";
   $email_name = $1; #global for template
 
-  my $pop = pop_info($cgi->param('popnum'));
+  my $pop = $popnum2pop{$cgi->param('popnum')};
     #or die "fatal: invalid popnum got past FS::SignupClient::new_customer";
   if ( $pop ) {
     ( $ac, $exch, $loc ) = ( $pop->{'ac'}, $pop->{'exch'}, $pop->{'loc'} );
@@ -365,70 +377,78 @@ sub print_okay {
   }
 }
 
-sub pop_info {
-  my $popnum = shift;
-  my $pop;
-  foreach $pop ( @{$pops} ) {
-    if ( $pop->{'popnum'} == $popnum ) { return $pop; }
-  }
-  '';
-}
-
 #horrible false laziness with FS/FS/svc_acct_pop.pm::popselector
 sub popselector {
   my( $popnum, $state ) = @_;
 
   return '<INPUT TYPE="hidden" NAME="popnum" VALUE="">' unless @$pops;
   return $pops->[0]{city}. ', '. $pops->[0]{state}.
-         ' ('. $pops->[0]{ac}. ')/'. $pops->[0]{exch}.
+         ' ('. $pops->[0]{ac}. ')/'. $pops->[0]{exch}. '-'. $pops->[0]{loc}.
          '<INPUT TYPE="hidden" NAME="popnum" VALUE="'. $pops->[0]{popnum}. '">'
     if scalar(@$pops) == 1;
 
-  my %pop = ();
-  push @{ $pop{$_->{state}} }, $_ foreach @$pops;
+  #my %pop = ();
+  #push @{ $pop{$_->{state}} }, $_ foreach @$pops;
 
-  my $text = <<END;
-    <SCRIPT>
-    function opt(what,href,text) {
-      var optionName = new Option(text, href, false, false)
-      var length = what.length;
-      what.options[length] = optionName;
-    }
-    
-    function popstate_changed(what) {
-      state = what.options[what.selectedIndex].text;
-      for (var i = what.form.popnum.length;i > 0;i--)
-                what.form.popnum.options[i] = null;
-      what.form.popnum.options[0] = new Option("", "", false, true);
+  my $text;
+
+  if ( $init_popstate ) {
+    $text .= '<INPUT TYPE="hidden" NAME="init_popstate" VALUE="'.
+             $init_popstate. '">';
+  } else {
+    $text .= <<END;
+      <SCRIPT>
+      function opt(what,href,text) {
+        var optionName = new Option(text, href, false, false)
+        var length = what.length;
+        what.options[length] = optionName;
+      }
+      function popstate_changed(what) {
+        state = what.options[what.selectedIndex].text;
+        what.form.popnum.options.length = 0;
+        what.form.popnum.options[0] = new Option("", "", false, true);
 END
 
-  foreach my $popstate ( sort { $a cmp $b } keys %pop ) {
-    $text .= "\nif ( state == \"$popstate\" ) {\n";
+    foreach my $popstate ( sort { $a cmp $b } keys %pop ) {
+      $text .= "\nif ( state == \"$popstate\" ) {\n";
 
-    foreach my $pop ( @{$pop{$popstate}}) {
-      my $o_popnum = $pop->{popnum};
-      my $poptext =  $pop->{city}. ', '. $pop->{state}.
-                     ' ('. $pop->{ac}. ')/'. $pop->{exch};
+      foreach my $pop ( @{$pop{$popstate}}) {
+        my $o_popnum = $pop->{popnum};
+        my $poptext =  $pop->{city}. ', '. $pop->{state}.
+                       ' ('. $pop->{ac}. ')/'. $pop->{exch}. '-'. $pop->{loc};
 
-      $text .= "opt(what.form.popnum, \"$o_popnum\", \"$poptext\");\n"
+        $text .= "opt(what.form.popnum, \"$o_popnum\", \"$poptext\");\n"
+      }
+      $text .= "}\n";
     }
-    $text .= "}\n";
-  }
 
-  $text .= "}\n</SCRIPT>\n";
+    $text .= "}\n</SCRIPT>\n";
 
-  $text .=
-    qq!<SELECT NAME="popstate" SIZE=1 onChange="popstate_changed(this)">!.
-    qq!<OPTION> !;
-  $text .= "<OPTION>$_" foreach sort { $a cmp $b } keys %pop;
-  $text .= '</SELECT>'; #callback? return 3 html pieces?  #'</TD><TD>';
+    $text .=
+      qq!<SELECT NAME="popstate" SIZE=1 onChange="popstate_changed(this)">!.
+      qq!<OPTION> !;
+    $text .= "<OPTION>$_" foreach sort { $a cmp $b } keys %pop;
+    $text .= '</SELECT>'; #callback? return 3 html pieces?  #'</TD><TD>';
 
+  }
   $text .= qq!<SELECT NAME="popnum" SIZE=1><OPTION> !;
-  foreach my $pop ( @$pops ) {
+
+  #comment this block to disable initial list population
+  my @initial_select = ();
+  if ( $init_popstate ) {
+    @initial_select = grep { $_->{state} eq $init_popstate } @$pops;
+  } else {
+    if ( scalar( @$pops ) > 100 ) {
+      push @initial_select, $popnum2pop{$popnum} if $popnum2pop{$popnum};
+    } else {
+      @initial_select = @$pops;
+    }
+  }
+  foreach my $pop ( sort { $a->{state} cmp $b->{state} } @initial_select ) {
     $text .= qq!<OPTION VALUE="!. $pop->{popnum}. '"'.
              ( ( $popnum && $pop->{popnum} == $popnum ) ? ' SELECTED' : '' ). ">".
              $pop->{city}. ', '. $pop->{state}.
-               ' ('. $pop->{ac}. ')/'. $pop->{exch};
+               ' ('. $pop->{ac}. ')/'. $pop->{exch}. '-'. $pop->{loc};
   }
   $text .= '</SELECT>';