first part of ACL and re-skinning work and some other small stuff
[freeside.git] / httemplate / edit / cust_main.cgi
index a18114c..bb2a861 100755 (executable)
@@ -1,4 +1,3 @@
-<!-- mason kludge -->
 <%
 
   #for misplaced logic below
@@ -18,6 +17,7 @@ my $conf = new FS::Conf;
 my $error = '';
 my($custnum, $username, $password, $popnum, $cust_main, $saved_pkgpart);
 my(@invoicing_list);
+my $same = '';
 if ( $cgi->param('error') ) {
   $error = $cgi->param('error');
   $cust_main = new FS::cust_main ( {
@@ -34,6 +34,8 @@ if ( $cgi->param('error') ) {
   $password = $cgi->param('_password');
   $popnum = $cgi->param('popnum');
   @invoicing_list = split( /\s*,\s*/, $cgi->param('invoicing_list') );
+  $same = $cgi->param('same');
+  $cust_main->setfield('paid' => $cgi->param('paid')) if $cgi->param('paid');
 } elsif ( $cgi->keywords ) { #editing
   my( $query ) = $cgi->keywords;
   $query =~ /^(\d+)$/;
@@ -68,15 +70,19 @@ my $action = $custnum ? 'Edit' : 'Add';
 
 <!-- top -->
 
-<%= header("Customer $action", '', ' onUnload="myclose()"') %>
+<%= include('/elements/header.html',
+      "Customer $action",
+      '',
+      ' onUnload="myclose()"'
+) %>
 
 <% if ( $error ) { %>
 <FONT SIZE="+1" COLOR="#ff0000">Error: <%= $error %></FONT>
 <% } %>
 
-<FORM ACTION="<%= popurl(1) %>process/cust_main.cgi" METHOD=POST NAME="form1" onSubmit="document.form1.submit.disabled=true">
+<FORM NAME="topform" STYLE="margin-bottom: 0">
 <INPUT TYPE="hidden" NAME="custnum" VALUE="<%= $custnum %>">
-ustomer # <%= $custnum ? "<B>$custnum</B>" : " (NEW)" %>
+Customer # <%= $custnum ? "<B>$custnum</B>" : " (NEW)" %>
 
 <!-- agent -->
 
@@ -103,59 +109,65 @@ my $agentnum = $cust_main->agentnum || $agents[0]->agentnum; #default to first
   </SELECT>
 <% } %>
 
+<!-- referral (advertising source) -->
+
 <%
+my $refnum = $cust_main->refnum || $conf->config('referraldefault') || 0;
+if ( $custnum && ! $conf->exists('editreferrals') ) {
+%>
 
-# (referral and referring customer still need to be "template"ized)
+  <INPUT TYPE="hidden" NAME="refnum" VALUE="<%= $refnum %>">
 
-#referral
+<%
+ } else {
 
-my $refnum = $cust_main->refnum || $conf->config('referraldefault') || 0;
-if ( $custnum && ! $conf->exists('editreferrals') ) {
-  print qq!<INPUT TYPE="hidden" NAME="refnum" VALUE="$refnum">!;
-} else {
-  my(@referrals) = qsearch('part_referral',{});
-  if ( scalar(@referrals) == 0 ) {
-    eidiot "You have not created any advertising sources.  You must create at least one advertising source before adding a customer.  Go to ". popurl(2). "browse/part_referral.cgi and create one or more advertising sources.";
-  } elsif ( scalar(@referrals) == 1 ) {
-    $refnum ||= $referrals[0]->refnum;
-    print qq!<INPUT TYPE="hidden" NAME="refnum" VALUE="$refnum">!;
-  } else {
-    print qq!<BR><BR>${r}Advertising source <SELECT NAME="refnum" SIZE="1">!;
-    print "<OPTION> " unless $refnum;
-    my($referral);
-    foreach $referral (sort {
-      $a->refnum <=> $b->refnum;
-    } @referrals) {
-      print "<OPTION" . " SELECTED"x($referral->refnum==$refnum),
-      ">", $referral->refnum, ": ", $referral->referral;
-    }
-    print "</SELECT>";
-  }
-}
+   my(@referrals) = qsearch('part_referral',{});
+   if ( scalar(@referrals) == 0 ) {
+     eidiot "You have not created any advertising sources.  You must create at least one advertising source before adding a customer.  Go to ". popurl(2). "browse/part_referral.cgi and create one or more advertising sources.";
+   } elsif ( scalar(@referrals) == 1 ) {
+     $refnum ||= $referrals[0]->refnum;
+%>
+
+     <INPUT TYPE="hidden" NAME="refnum" VALUE="<%= $refnum %>">
+
+<% } else { %>
 
-#referring customer
+     <BR><BR><%=$r%>Advertising source 
+     <SELECT NAME="refnum" SIZE="1">
+       <%= $refnum ? '' : '<OPTION VALUE="">' %>
+       <% foreach my $referral (sort { $a->refnum <=> $b->refnum } @referrals) { %>
+         <OPTION VALUE="<%= $referral->refnum %>" <%= $referral->refnum == $refnum ? 'SELECTED' : '' %>><%= $referral->refnum %>: <%= $referral->referral %>
+       <% } %>
+     </SELECT>
+<% } %>
+
+<% } %>
 
-#print qq!<BR><BR>Referring Customer: !;
+<!-- referring customer -->
+
+<%
 my $referring_cust_main = '';
 if ( $cust_main->referral_custnum
      and $referring_cust_main =
            qsearchs('cust_main', { custnum => $cust_main->referral_custnum } )
 ) {
-  print '<BR><BR>Referring Customer: <A HREF="'. popurl(1). '/cust_main.cgi?'.
-        $cust_main->referral_custnum. '">'.
-        $cust_main->referral_custnum. ': '.
-        ( $referring_cust_main->company
-          || $referring_cust_main->last. ', '. $referring_cust_main->first ).
-        '</A><INPUT TYPE="hidden" NAME="referral_custnum" VALUE="'.
-        $cust_main->referral_custnum. '">';
-} elsif ( ! $conf->exists('disable_customer_referrals') ) {
-  print '<BR><BR>Referring customer number: <INPUT TYPE="text" NAME="referral_custnum" VALUE="">';
-} else {
-  print '<INPUT TYPE="hidden" NAME="referral_custnum" VALUE="">';
-}
-
 %>
 
+  <BR><BR>Referring Customer: 
+  <A HREF="<%= popurl(1) %>/cust_main.cgi?<%= $cust_main->referral_custnum %>"><%= $cust_main->referral_custnum %>: <%= $referring_cust_main->name %></A>
+  <INPUT TYPE="hidden" NAME="referral_custnum" VALUE="<%= $cust_main->referral_custnum %>">
+
+<% } elsif ( ! $conf->exists('disable_customer_referrals') ) { %>
+
+  <BR><BR>Referring customer number: 
+  <INPUT TYPE="text" NAME="referral_custnum" VALUE="">
+
+<% } else { %>
+
+  <INPUT TYPE="hidden" NAME="referral_custnum" VALUE="">
+
+<% } %>
+
 <!-- contact info -->
 
 <BR><BR>
@@ -172,11 +184,17 @@ function bill_changed(what) {
 <% for (qw( last first company address1 address2 city zip daytime night fax )) { %>
     what.form.ship_<%=$_%>.value = what.form.<%=$_%>.value;
 <% } %>
+
     what.form.ship_country.selectedIndex = what.form.country.selectedIndex;
-    ship_country_changed(what.form.ship_country);
-    what.form.ship_state.selectedIndex = what.form.state.selectedIndex;
-    ship_state_changed(what.form.ship_state);
-    what.form.ship_county.selectedIndex = what.form.county.selectedIndex;
+    function fix_ship_state() {
+      what.form.ship_state.selectedIndex = what.form.state.selectedIndex;
+    }
+    ship_country_changed(what.form.ship_country, fix_ship_state );
+
+    function fix_ship_county() {
+      what.form.ship_county.selectedIndex = what.form.county.selectedIndex;
+    }
+    ship_state_changed(what.form.ship_state, fix_ship_county );
   }
 }
 function samechanged(what) {
@@ -199,7 +217,7 @@ function samechanged(what) {
   my $checked = '';
   my $disabled = '';
   my $disabledselect = '';
-  unless ( $cust_main->ship_last && $cgi->param('same') ne 'Y' ) {
+  unless ( $cust_main->ship_last && $same ne 'Y' ) {
     $checked = 'CHECKED';
     $disabled = 'DISABLED style="background-color: #dddddd"';
     foreach (
@@ -218,181 +236,140 @@ Service address
 
 <% } %>
 
-<%
-# billing info
-
-sub expselect {
-  my $prefix = shift;
-  my( $m, $y ) = (0, 0);
-  if ( scalar(@_) ) {
-    my $date = shift || '01-2000';
-    if ( $date  =~ /^(\d{4})-(\d{1,2})-\d{1,2}$/ ) { #PostgreSQL date format
-      ( $m, $y ) = ( $2, $1 );
-    } elsif ( $date =~ /^(\d{1,2})-(\d{1,2}-)?(\d{4}$)/ ) {
-      ( $m, $y ) = ( $1, $3 );
-    } else {
-      die "unrecognized expiration date format: $date";
-    }
-  }
+<!-- billing info -->
 
-  my $return = qq!<SELECT NAME="$prefix!. qq!_month" SIZE="1">!;
-  for ( 1 .. 12 ) {
-    $return .= "<OPTION";
-    $return .= " SELECTED" if $_ == $m;
-    $return .= ">$_";
-  }
-  $return .= qq!</SELECT>/<SELECT NAME="$prefix!. qq!_year" SIZE="1">!;
-  my @t = localtime;
-  my $thisYear = $t[5] + 1900;
-  for ( ($thisYear > $y && $y > 0 ? $y : $thisYear) .. 2037 ) {
-    $return .= "<OPTION";
-    $return .= " SELECTED" if $_ == $y;
-    $return .= ">$_";
-  }
-  $return .= "</SELECT>";
-
-  $return;
-}
-
-my $payby_default = $conf->config('payby-default');
-
-if ( $payby_default eq 'HIDE' ) {
-
-  $cust_main->payby('BILL') unless $cust_main->payby;
+<%= include( 'cust_main/billing.html', $cust_main,
+               'invoicing_list' => \@invoicing_list,
+           )
+%>
 
-  foreach my $field (qw( tax payby )) {
-    print qq!<INPUT TYPE="hidden" NAME="$field" VALUE="!.
-          $cust_main->getfield($field). '">';
-  }
+<SCRIPT>
+function bottomfixup(what) {
 
-  print qq!<INPUT TYPE="hidden" NAME="invoicing_list" VALUE="!.
-        join(', ', $cust_main->invoicing_list). '">';
+  var topvars = new Array(
+    'custnum', 'agentnum', 'refnum', 'referral_custnum',
 
-  foreach my $payby (qw( CARD DCRD CHEK DCHK LECB BILL COMP )) {
-    foreach my $field (qw( payinfo payname )) {
-      print qq!<INPUT TYPE="hidden" NAME="${payby}_$field" VALUE="!.
-            $cust_main->getfield($field). '">';
-    }
+    'last', 'first', 'ss', 'company',
+    'address1', 'address2', 'city',
+    'county', 'state', 'zip', 'country',
+    'daytime', 'night', 'fax',
 
-    #false laziness w/expselect
-    my( $m, $y );
-    my $date = $cust_main->paydate || '12-2037';
-    if ( $date  =~ /^(\d{4})-(\d{1,2})-\d{1,2}$/ ) { #PostgreSQL date format
-      ( $m, $y ) = ( $2, $1 );
-    } elsif ( $date =~ /^(\d{1,2})-(\d{1,2}-)?(\d{4}$)/ ) {
-      ( $m, $y ) = ( $1, $3 );
-    } else {
-      die "unrecognized expiration date format: $date";
-    }
+    'same',
 
-    print qq!<INPUT TYPE="hidden" NAME="${payby}_month" VALUE="$m">!.
-          qq!<INPUT TYPE="hidden" NAME="${payby}_year"  VALUE="$y">!;
+    'ship_last', 'ship_first', 'ship_company',
+    'ship_address1', 'ship_address2', 'ship_city',
+    'ship_county', 'ship_state', 'ship_zip', 'ship_country',
+    'ship_daytime','ship_night', 'ship_fax',
 
-  }
+    'select' // XXX key
+  );
 
-} else {
+  var layervars = new Array(
+    'payauto',
+    'payinfo', 'payinfo1', 'payinfo2',
+    'payname', 'exp_month', 'exp_year', 'paycvv',
+    'paystart_month', 'paystart_year', 'payissue',
+    'payip',
+    'paid'
+  );
 
-  print "<BR>Billing information", &itable("#cccccc"),
-        qq!<TR><TD><INPUT TYPE="checkbox" NAME="tax" VALUE="Y"!;
-  print qq! CHECKED! if $cust_main->tax eq "Y";
-  print qq!>Tax Exempt</TD></TR><TR><TD>!.
-        qq!<INPUT TYPE="checkbox" NAME="invoicing_list_POST" VALUE="POST"!;
-
-  #my @invoicing_list = $cust_main->invoicing_list;
-  print qq! CHECKED!
-    if ( ! @invoicing_list && ! $conf->exists('disablepostalinvoicedefault') )
-       || grep { $_ eq 'POST' } @invoicing_list;
-  print qq!>Postal mail invoice</TD></TR>!;
-  my $invoicing_list = join(', ', grep { $_ ne 'POST' } @invoicing_list );
-  print qq!<TR><TD>Email invoice <INPUT TYPE="text" NAME="invoicing_list" VALUE="$invoicing_list"></TD></TR>!;
-
-  print "<TR><TD>Billing type</TD></TR>",
-        "</TABLE>", '<SCRIPT>
-                       var mywindow = -1;
-                       function myopen(filename,windowname,properties) {
-                         myclose();
-                         mywindow = window.open(filename,windowname,properties);
-                       }
-                       function myclose() {
-                         if ( mywindow != -1 )
-                           mywindow.close();
-                         mywindow = -1;
-                       }
-                       var achwindow = -1;
-                       function achopen(filename,windowname,properties) {
-                         achclose();
-                         achwindow = window.open(filename,windowname,properties);
-                       }
-                       function achclose() {
-                         if ( achwindow != -1 )
-                           achwindow.close();
-                         achwindow = -1;
-                       }
-                     </SCRIPT>',
-        &table("#cccccc"), "<TR>";
-
-  my($payinfo, $payname)=(
-    $cust_main->payinfo,
-    $cust_main->payname,
+  var billing_bottomvars = new Array(
+    'tax',
+    'invoicing_list', 'invoicing_list_POST', 'invoicing_list_FAX',
+    'spool_cdr'
   );
 
-  my %payby = (
-    'CARD' => qq!Credit card (automatic)<BR>${r}<INPUT TYPE="text" NAME="CARD_payinfo" VALUE="" MAXLENGTH=19><BR>${r}Exp !. expselect("CARD"). qq!<BR>${r}Name on card<BR><INPUT TYPE="text" NAME="CARD_payname" VALUE="">!,
-    'DCRD' => qq!Credit card (on-demand)<BR>${r}<INPUT TYPE="text" NAME="DCRD_payinfo" VALUE="" MAXLENGTH=19><BR>${r}Exp !. expselect("DCRD"). qq!<BR>${r}Name on card<BR><INPUT TYPE="text" NAME="DCRD_payname" VALUE="">!,
-    'CHEK' => qq!Electronic check (automatic)<BR>${r}Account number <INPUT TYPE="text" NAME="CHEK_payinfo1" VALUE=""><BR>${r}ABA/Routing number <INPUT TYPE="text" NAME="CHEK_payinfo2" VALUE="" SIZE=10 MAXLENGTH=9> (<A HREF="javascript:achopen('../docs/ach.html','ach','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=384,height=256')">help</A>)<INPUT TYPE="hidden" NAME="CHEK_month" VALUE="12"><INPUT TYPE="hidden" NAME="CHEK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="CHEK_payname" VALUE="">!,
-    'DCHK' => qq!Electronic check (on-demand)<BR>${r}Account number <INPUT TYPE="text" NAME="DCHK_payinfo1" VALUE=""><BR>${r}ABA/Routing number <INPUT TYPE="text" NAME="DCHK_payinfo2" VALUE="" SIZE=10 MAXLENGTH=9> (<A HREF="javascript:achopen('../docs/ach.html','ach','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=384,height=256')">help</A>)<INPUT TYPE="hidden" NAME="DCHK_month" VALUE="12"><INPUT TYPE="hidden" NAME="DCHK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="DCHK_payname" VALUE="">!,
-    'LECB' => qq!Phone bill billing<BR>${r}Phone number <INPUT TYPE="text" BANE="LECB_payinfo" VALUE="" MAXLENGTH=15 SIZE=16><INPUT TYPE="hidden" NAME="LECB_month" VALUE="12"><INPUT TYPE="hidden" NAME="LECB_year" VALUE="2037"><INPUT TYPE="hidden" NAME="LECB_payname" VALUE="">!,
-    'BILL' => qq!Billing<BR>P.O. <INPUT TYPE="text" NAME="BILL_payinfo" VALUE=""><BR><INPUT TYPE="hidden" NAME="BILL_month" VALUE="12"><INPUT TYPE="hidden" NAME="BILL_year" VALUE="2037">Attention<BR><INPUT TYPE="text" NAME="BILL_payname" VALUE="">!,
-    'COMP' => qq!Complimentary<BR>${r}Approved by<INPUT TYPE="text" NAME="COMP_payinfo" VALUE=""><BR>${r}Exp !. expselect("COMP"),
-);
-
-  if ( $cust_main->dbdef_table->column('paycvv') ) {
-    foreach my $payby ( grep { exists $payby{$_} } qw(CARD DCRD) ) { #1.4/1.5 bs
-      $payby{$payby} .= qq!<BR>CVV2&nbsp;(<A HREF="javascript:myopen('../docs/cvv2.html','cvv2','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=480,height=288')">help</A>)&nbsp;<INPUT TYPE="text" NAME=${payby}_paycvv VALUE="" SIZE=4 MAXLENGTH=4>!;
-    }
+  for ( f=0; f < topvars.length; f++ ) {
+    var field = topvars[f];
+    copyelement( document.topform.elements[field],
+                 document.bottomform.elements[field]
+               );
   }
 
-  my( $account, $aba ) = split('@', $payinfo);
-
-  my %paybychecked = (
-    'CARD' => qq!Credit card (automatic)<BR>${r}<INPUT TYPE="text" NAME="CARD_payinfo" VALUE="$payinfo" MAXLENGTH=19><BR>${r}Exp !. expselect("CARD", $cust_main->paydate). qq!<BR>${r}Name on card<BR><INPUT TYPE="text" NAME="CARD_payname" VALUE="$payname">!,
-    'DCRD' => qq!Credit card (on-demand)<BR>${r}<INPUT TYPE="text" NAME="DCRD_payinfo" VALUE="$payinfo" MAXLENGTH=19><BR>${r}Exp !. expselect("DCRD", $cust_main->paydate). qq!<BR>${r}Name on card<BR><INPUT TYPE="text" NAME="DCRD_payname" VALUE="$payname">!,
-    'CHEK' => qq!Electronic check (automatic)<BR>${r}Account number <INPUT TYPE="text" NAME="CHEK_payinfo1" VALUE="$account"><BR>${r}ABA/Routing number <INPUT TYPE="text" NAME="CHEK_payinfo2" VALUE="$aba" SIZE=10 MAXLENGTH=9> (<A HREF="javascript:achopen('../docs/ach.html','ach','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=384,height=256')">help</A>)<INPUT TYPE="hidden" NAME="CHEK_month" VALUE="12"><INPUT TYPE="hidden" NAME="CHEK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="CHEK_payname" VALUE="$payname">!,
-    'DCHK' => qq!Electronic check (on-demand)<BR>${r}Account number <INPUT TYPE="text" NAME="DCHK_payinfo1" VALUE="$account"><BR>${r}ABA/Routing number <INPUT TYPE="text" NAME="DCHK_payinfo2" VALUE="$aba" SIZE=10 MAXLENGTH=9> (<A HREF="javascript:achopen('../docs/ach.html','ach','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=384,height=256')">help</A>)<INPUT TYPE="hidden" NAME="DCHK_month" VALUE="12"><INPUT TYPE="hidden" NAME="DCHK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="DCHK_payname" VALUE="$payname">!,
-    'LECB' => qq!Phone bill billing<BR>${r}Phone number <INPUT TYPE="text" BANE="LECB_payinfo" VALUE="$payinfo" MAXLENGTH=15 SIZE=16><INPUT TYPE="hidden" NAME="LECB_month" VALUE="12"><INPUT TYPE="hidden" NAME="LECB_year" VALUE="2037"><INPUT TYPE="hidden" NAME="LECB_payname" VALUE="">!,
-    'BILL' => qq!Billing<BR>P.O. <INPUT TYPE="text" NAME="BILL_payinfo" VALUE="$payinfo"><BR><INPUT TYPE="hidden" NAME="BILL_month" VALUE="12"><INPUT TYPE="hidden" NAME="BILL_year" VALUE="2037">Attention<BR><INPUT TYPE="text" NAME="BILL_payname" VALUE="$payname">!,
-    'COMP' => qq!Complimentary<BR>${r}Approved by<INPUT TYPE="text" NAME="COMP_payinfo" VALUE="$payinfo"><BR>${r}Exp !. expselect("COMP", $cust_main->paydate),
-);
-
-  if ( $cust_main->dbdef_table->column('paycvv') ) {
-    my $paycvv = $cust_main->paycvv;
+  var layerform = document.topform.select.options[document.topform.select.selectedIndex].value;
+  for ( f=0; f < layervars.length; f++ ) {
+    var field = layervars[f];
+    copyelement( document.forms[layerform].elements[field],
+                 document.bottomform.elements[field]
+               );
+  }
 
-    foreach my $payby ( grep { exists $payby{$_} } qw(CARD DCRD) ) { #1.4/1.5 bs
-      $paybychecked{$payby} .= qq!<BR>CVV2&nbsp;(<A HREF="javascript:myopen('../docs/cvv2.html','cvv2','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=480,height=288')">help</A>)&nbsp;<INPUT TYPE="text" NAME=${payby}_paycvv VALUE="$paycvv" SIZE=4 MAXLENGTH=4>!;
-    }
+  for ( f=0; f < billing_bottomvars.length; f++ ) {
+    var field = billing_bottomvars[f];
+    copyelement( document.billing_bottomform.elements[field],
+                 document.bottomform.elements[field]
+               );
   }
 
+}
 
-  $cust_main->payby($payby_default) unless $cust_main->payby;
-  for (qw(CARD DCRD CHEK DCHK LECB BILL COMP)) {
-    print qq!<TD VALIGN=TOP><INPUT TYPE="radio" NAME="payby" VALUE="$_"!;
-    if ($cust_main->payby eq "$_") {
-      print qq! CHECKED> $paybychecked{$_}</TD>!;
+function copyelement(from, to) {
+  if ( from == undefined ) {
+    to.value = '';
+  } else if ( from.type == 'select-one' ) {
+    to.value = from.options[from.selectedIndex].value;
+    //alert(from + " (" + from.type + "): " + to.name + " => (" + from.selectedIndex + ") " + to.value);
+  } else if ( from.type == 'checkbox' ) {
+    if ( from.checked ) {
+      to.value = from.value;
     } else {
-      print qq!> $payby{$_}</TD>!;
+      to.value = '';
+    }
+  } else {
+    if ( from.value == undefined ) {
+      to.value = '';
+    } else {
+      to.value = from.value;
     }
   }
+  //alert(from + " (" + from.type + "): " + to.name + " => " + to.value);
+}
 
-  print "</TR></TABLE>$r required fields for each billing type";
+</SCRIPT>
 
-}
+<FORM ACTION="<%= popurl(1) %>process/cust_main.cgi" METHOD=POST NAME="bottomform" onSubmit="document.bottomform.submit.disabled=true; bottomfixup(this.form);" STYLE="margin-top: 0; margin-bottom: 0">
+
+<% foreach my $hidden (
+     'custnum', 'agentnum', 'refnum', 'referral_custnum',
+     'last', 'first', 'ss', 'company',
+     'address1', 'address2', 'city',
+     'county', 'state', 'zip', 'country',
+     'daytime', 'night', 'fax',
+     
+     'same',
+     
+     'ship_last', 'ship_first', 'ship_company',
+     'ship_address1', 'ship_address2', 'ship_city',
+     'ship_county', 'ship_state', 'ship_zip', 'ship_country',
+     'ship_daytime','ship_night', 'ship_fax',
+     
+     'select', #XXX key
+
+     'payauto',
+     'payinfo', 'payinfo1', 'payinfo2',
+     'payname', 'exp_month', 'exp_year', 'paycvv',
+     'paystart_month', 'paystart_year', 'payissue',
+     'payip',
+     'paid',
+     
+     'tax',
+     'invoicing_list', 'invoicing_list_POST', 'invoicing_list_FAX',
+     'spool_cdr'
+   ) {
+%>
+  <INPUT TYPE="hidden" NAME="<%= $hidden %>" VALUE="">
+<% } %>
 
-if ( defined $cust_main->dbdef_table->column('comments') ) {
-    print "<BR><BR>Comments", &itable("#cccccc"),
-          qq!<TR><TD><TEXTAREA COLS=80 ROWS=5 WRAP="HARD" NAME="comments">!,
-          $cust_main->comments, "</TEXTAREA>",
-          "</TD></TR></TABLE>";
-}
+<BR>Comments
+<%= &ntable("#cccccc") %>
+  <TR>
+    <TD>
+      <TEXTAREA COLS=80 ROWS=5 WRAP="HARD" NAME="comments"><%= $cust_main->comments %></TEXTAREA>
+    </TD>
+  </TR>
+</TABLE>
+
+<%
 
 unless ( $custnum ) {
   # pry the wrong place for this logic.  also pretty expensive
@@ -420,49 +397,66 @@ unless ( $custnum ) {
 
   if ( @part_pkg ) {
 
-#    print "<BR><BR>First package", &itable("#cccccc", "0 ALIGN=LEFT"),
-#apiabuse & undesirable wrapping
-    print "<BR><BR>First package", &itable("#cccccc"),
-          qq!<TR><TD COLSPAN=2><SELECT NAME="pkgpart_svcpart">!;
+    #    print "<BR><BR>First package", &itable("#cccccc", "0 ALIGN=LEFT"),
+    #apiabuse & undesirable wrapping
+
+    %>
+    <BR>First package
+    <%= ntable("#cccccc") %>
+    
+      <TR>
+        <TD COLSPAN=2>
+          <SELECT NAME="pkgpart_svcpart">
+            <OPTION VALUE="">(none)
+    
+            <% foreach my $part_pkg ( @part_pkg ) { %>
+    
+              <OPTION VALUE="<%= $part_pkg->pkgpart. "_". $part_pkg->svcpart('svc_acct') %>"<%= ( $saved_pkgpart && $part_pkg->pkgpart == $saved_pkgpart ) ? ' SELECTED' : '' %>><%= $part_pkg->pkg. " - ". $part_pkg->comment %>
+    
+            <% } %>
+          </SELECT>
+        </TD>
+      </TR>
+    
+      <% 
+        #false laziness: (mostly) copied from edit/svc_acct.cgi
+        #$ulen = $svc_acct->dbdef_table->column('username')->length;
+        my $ulen = dbdef->table('svc_acct')->column('username')->length;
+        my $ulen2 = $ulen+2;
+        my $passwordmax = $conf->config('passwordmax') || 8;
+        my $pmax2 = $passwordmax + 2;
+      %>
+    
+      <TR>
+        <TD ALIGN="right">Username</TD>
+        <TD>
+          <INPUT TYPE="text" NAME="username" VALUE="<%= $username %>" SIZE=<%= $ulen2 %> MAXLENGTH=<%= $ulen %>>
+        </TD>
+      </TR>
+    
+      <TR>
+        <TD ALIGN="right">Password</TD>
+        <TD>
+          <INPUT TYPE="text" NAME="_password" VALUE="<%= $password %>" SIZE=<%= $pmax2 %> MAXLENGTH=<%= $passwordmax %>>
+          (blank to generate)
+        </TD>
+      </TR>
+    
+      <TR>
+        <TD ALIGN="right">Access number</TD>
+        <TD><%= FS::svc_acct_pop::popselector($popnum) %></TD>
+      </TR>
+    </TABLE>
+    
+  <% } %>
 
-    print qq!<OPTION VALUE="">(none)!;
+<% } %>
 
-    foreach my $part_pkg ( @part_pkg ) {
-      print qq!<OPTION VALUE="!,
-#              $part_pkg->pkgpart. "_". $pkgpart{ $part_pkg->pkgpart }, '"';
-              $part_pkg->pkgpart. "_". $part_pkg->svcpart('svc_acct'), '"';
-      print " SELECTED" if $saved_pkgpart && ( $part_pkg->pkgpart == $saved_pkgpart );
-      print ">", $part_pkg->pkg, " - ", $part_pkg->comment;
-    }
-    print "</SELECT></TD></TR>";
-
-    #false laziness: (mostly) copied from edit/svc_acct.cgi
-    #$ulen = $svc_acct->dbdef_table->column('username')->length;
-    my $ulen = dbdef->table('svc_acct')->column('username')->length;
-    my $ulen2 = $ulen+2;
-    my $passwordmax = $conf->config('passwordmax') || 8;
-    my $pmax2 = $passwordmax + 2;
-    print <<END;
-<TR><TD ALIGN="right">Username</TD>
-<TD><INPUT TYPE="text" NAME="username" VALUE="$username" SIZE=$ulen2 MAXLENGTH=$ulen></TD></TR>
-<TR><TD ALIGN="right">Password</TD>
-<TD><INPUT TYPE="text" NAME="_password" VALUE="$password" SIZE=$pmax2 MAXLENGTH=$passwordmax>
-(blank to generate)</TD></TR>
-END
-
-    print '<TR><TD ALIGN="right">Access number</TD><TD WIDTH="100%">'
-          .
-          &FS::svc_acct_pop::popselector($popnum).
-          '</TD></TR></TABLE>'
-          ;
-  }
-}
+<INPUT TYPE="hidden" NAME="otaker" VALUE="<%= $cust_main->otaker %>">
+<BR>
+<INPUT TYPE="submit" NAME="submit" VALUE="<%= $custnum ?  "Apply Changes" : "Add Customer" %>">
+<BR>
+</FORM>
 
-my $otaker = $cust_main->otaker;
-print qq!<INPUT TYPE="hidden" NAME="otaker" VALUE="$otaker">!,
-      qq!<BR><INPUT NAME="submit" TYPE="submit" VALUE="!,
-      $custnum ?  "Apply Changes" : "Add Customer", qq!">!,
-      "</FORM></BODY></HTML>",
-;
+<%= include('/elements/footer.html') %>
 
-%>