optimize CDR rating after timed rate perf regression, RT#15739
[freeside.git] / httemplate / edit / svc_acct.cgi
index 5c2d5f4..38567ef 100755 (executable)
@@ -1,11 +1,11 @@
-<% include('/elements/header.html', "$action $svc account") %>
+<& /elements/header.html, mt("$action [_1] account",$svc) &>
 
-<% include('/elements/error.html') %>
+<& /elements/error.html &>
 
 % if ( $cust_main ) { 
 
-  <% include( '/elements/small_custview.html', $cust_main, '', 1,
-              popurl(2) . "view/cust_main.cgi") %>
+  <& /elements/small_custview.html, $cust_main, '', 1,
+              popurl(2) . "view/cust_main.cgi" &>
   <BR>
 % } 
 
@@ -27,28 +27,40 @@ function randomPass() {
 <INPUT TYPE="hidden" NAME="pkgnum" VALUE="<% $pkgnum %>">
 <INPUT TYPE="hidden" NAME="svcpart" VALUE="<% $svcpart %>">
 
-Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
+% if ( $svcnum ) {
+% my $svclabel = emt("Service #[_1]",$svcnum);
+% $svclabel =~ s/$svcnum/<B>$svcnum<\/B>/;
+<% $svclabel %>
+% } else {
+<% mt("Service # (NEW)") |h %>
+% }
+<BR>
 
 <% ntable("#cccccc",2) %>
 
 <TR>
-  <TD ALIGN="right">Service</TD>
+  <TD ALIGN="right"><% mt('Service') |h %></TD>
   <TD BGCOLOR="#eeeeee"><% $part_svc->svc %></TD>
 </TR>
 
 <TR>
-  <TD ALIGN="right">Username</TD>
-  <TD>
-    <INPUT TYPE="text" NAME="username" VALUE="<% $username %>" SIZE=<% $ulen2 %> MAXLENGTH=<% $ulen %>>
-  </TD>
+  <TD ALIGN="right"><% mt('Username') |h %></TD>
+% if ( $svcnum && $conf->exists('svc_acct-no_edit_username') ) {
+    <TD BGCOLOR="#eeeeee"><% $svc_acct->username() %></TD>
+    <INPUT TYPE="hidden" NAME="username" VALUE="<% $username %>">
+% } else {
+    <TD>
+      <INPUT TYPE="text" NAME="username" VALUE="<% $username %>" SIZE=<% $ulen2 %> MAXLENGTH=<% $ulen %>>
+    </TD>
+% }
 </TR>
 
 %if ( $part_svc->part_svc_column('_password')->columnflag ne 'F' ) {
 <TR>
-  <TD ALIGN="right">Password</TD>
+  <TD ALIGN="right"><% mt('Password') |h %></TD>
   <TD>
     <INPUT TYPE="text" NAME="clear_password" VALUE="<% $password %>" SIZE=<% $pmax2 %> MAXLENGTH=<% $pmax %>>
-    <INPUT TYPE="button" VALUE="Generate" onclick="randomPass();">
+    <INPUT TYPE="button" VALUE="<% mt('Generate') |h %>" onclick="randomPass();">
   </TD>
 </TR>
 %}else{
@@ -59,19 +71,16 @@ Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
 %my $sec_phrase = $svc_acct->sec_phrase;
 %if ( $conf->exists('security_phrase') 
 %  && $part_svc->part_svc_column('sec_phrase')->columnflag ne 'F' ) {
-%
-
 
   <TR>
-    <TD ALIGN="right">Security phrase</TD>
+    <TD ALIGN="right"><% mt('Security phrase') |h %></TD>
     <TD>
       <INPUT TYPE="text" NAME="sec_phrase" VALUE="<% $sec_phrase %>" SIZE=32>
-      (for forgotten passwords)
+      (<% mt('for forgotten passwords') |h %>)
     </TD>
   </TD>
 % } else { 
 
-
   <INPUT TYPE="hidden" NAME="sec_phrase" VALUE="<% $sec_phrase %>">
 % } 
 %
@@ -80,7 +89,6 @@ Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
 %if ( $part_svc->part_svc_column('domsvc')->columnflag eq 'F' ) {
 %
 
-
   <INPUT TYPE="hidden" NAME="domsvc" VALUE="<% $domsvc %>">
 % } else { 
 %
@@ -89,7 +97,7 @@ Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
 %  if ( $domsvc ) {
 %    my $svc_domain = qsearchs('svc_domain', { 'svcnum' => $domsvc, } );
 %    if ( $svc_domain ) {
-%      $svc_domain{$svc_domain->svcnum} = $svc_domain;
+%      $svc_domain{$svc_domain->svcnum} = $svc_domain->domain;
 %    } else {
 %      warn "unknown svc_domain.svcnum for svc_acct.domsvc: $domsvc";
 %    }
@@ -100,11 +108,9 @@ Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
 %                                                 'pkgnum'  => $pkgnum,
 %                                                )
 %                );
-%
-
 
   <TR>
-    <TD ALIGN="right">Domain</TD>
+    <TD ALIGN="right"><% mt('Domain') |h %></TD>
     <TD>
       <SELECT NAME="domsvc" SIZE=1>
 % foreach my $svcnum (
@@ -114,7 +120,6 @@ Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
 %             my $svc_domain = $svc_domain{$svcnum};
 %        
 
-
              <OPTION VALUE="<% $svcnum %>" <% $svcnum == $domsvc ? ' SELECTED' : '' %>><% $svc_domain{$svcnum} %>
 % } 
 
@@ -127,7 +132,7 @@ Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
 % if ( $communigate ) {
 
     <TR>
-      <TD ALIGN="right">Aliases</TD>
+      <TD ALIGN="right"><% mt('Aliases') |h %></TD>
       <TD><INPUT TYPE="text" NAME="cgp_aliases" VALUE="<% $svc_acct->cgp_aliases %>"></TD>
     </TR>
 
@@ -136,28 +141,38 @@ Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
 % }
 
 
-<% include('/elements/tr-select-svc_pbx.html',
+<& /elements/tr-select-svc_pbx.html,
              'curr_value' => $svc_acct->pbxsvc,
              'part_svc'   => $part_svc,
              'cust_pkg'   => $cust_pkg,
-          )
-%>
+&>
 
 %#pop
 %my $popnum = $svc_acct->popnum || 0;
 %if ( $part_svc->part_svc_column('popnum')->columnflag eq 'F' ) {
 %
 
-
   <INPUT TYPE="hidden" NAME="popnum" VALUE="<% $popnum %>">
 % } else { 
 
-
   <TR>
-    <TD ALIGN="right">Access number</TD>
+    <TD ALIGN="right"><% mt('Access number') |h %></TD>
     <TD><% FS::svc_acct_pop::popselector($popnum) %></TD>
   </TR>
 % } 
+
+%#tower (huh)
+%if ( $conf->exists('svc_acct-tower_sector')
+%     && $part_svc->part_svc_column('sectornum')->columnflag ne 'F' ) {
+    <& /elements/tr-select-tower_sector.html,
+         'curr_value' => $svc_acct->sectornum,
+         #'part_svc'   => $part_svc,
+         #'cust_pkg'   => $cust_pkg,
+    &>
+%} else {
+    <INPUT TYPE="hidden" NAME="sectornum" VALUE="<% $svc_acct->sectornum %>">
+%}
+
 % #uid/gid 
 % foreach my $xid (qw( uid gid )) { 
 %
@@ -167,7 +182,6 @@ Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
 %  
 % if ( length($svc_acct->$xid()) ) { 
 
-  
       <TR>
         <TD ALIGN="right"><% uc($xid) %></TD>
           <TD BGCOLOR="#eeeeee"><% $svc_acct->$xid() %></TD>
@@ -175,11 +189,9 @@ Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
         </TD>
       </TR>
 % } 
-
   
     <INPUT TYPE="hidden" NAME="<% $xid %>" VALUE="<% $svc_acct->$xid() %>">
 % } else { 
-
   
     <TR>
       <TD ALIGN="right"><% uc($xid) %></TD>
@@ -195,13 +207,12 @@ Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
 %     && ! $svc_acct->finger ) { 
 %
 
-
   <INPUT TYPE="hidden" NAME="finger" VALUE="">
 % } else { 
 
 
   <TR>
-    <TD ALIGN="right">Real Name</TD>
+    <TD ALIGN="right"><% mt('Real Name') |h %></TD>
     <TD>
       <INPUT TYPE="text" NAME="finger" VALUE="<% $svc_acct->finger %>">
     </TD>
@@ -219,7 +230,7 @@ Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
 
 
   <TR>
-    <TD ALIGN="right">Home directory</TD>
+    <TD ALIGN="right"><% mt('Home directory') |h %></TD>
     <TD><INPUT TYPE="text" NAME="dir" VALUE="<% $svc_acct->dir %>"></TD>
   </TR>
 % } 
@@ -231,13 +242,12 @@ Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
 %   ) {
 %
 
-
   <INPUT TYPE="hidden" NAME="shell" VALUE="<% $shell %>">
 % } else { 
 
 
   <TR>
-    <TD ALIGN="right">Shell</TD>
+    <TD ALIGN="right"><% mt('Shell') |h %></TD>
     <TD>
       <SELECT NAME="shell" SIZE=1>
 %
@@ -245,7 +255,6 @@ Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
 %           foreach $etc_shell (@shells) {
 %        
 
-
           <OPTION<% $etc_shell eq $shell ? ' SELECTED' : '' %>><% $etc_shell %>
 % } 
 
@@ -255,284 +264,17 @@ Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
   </TR>
 % } 
 
-
-% if ( $communigate
-%      && $part_svc->part_svc_column('cgp_type')->columnflag ne 'F' )
-% {
-
-% # settings
-
-  <TR>
-    <TD ALIGN="right">Mailbox type</TD>
-    <TD>
-      <SELECT NAME="cgp_type">
-%       foreach my $option (qw( MultiMailbox TextMailbox MailDirMailbox
-%                               AGrade BGrade CGrade                    )) {
-          <OPTION VALUE="<% $option %>"
-                  <% $option eq $svc_acct->cgp_type() ? 'SELECTED' : '' %>
-          ><% $option %>
-%       }
-      </SELECT>
-    </TD>
-  </TR>
-
-% } else {
-    <INPUT TYPE="hidden" NAME="cgp_type" VALUE="<% $svc_acct->cgp_type() %>">
-% }
-
-
-% #false laziness w/svc_domain
-% if ( $communigate
-%      && $part_svc->part_svc_column('cgp_accessmodes')->columnflag ne 'F' )
-% {
-
-  <TR>
-    <TD ALIGN="right">Enabled services</TD>
-    <TD>
-      <% include( '/elements/communigate_pro-accessmodes.html',
-                    'curr_value' => $svc_acct->cgp_accessmodes,
-                )
-      %>
-    </TD>
-  </TR>
-
-% } else {
-    <INPUT TYPE="hidden" NAME="cgp_accessmodes" VALUE="<% $svc_acct->cgp_accessmodes() |h %>">
-% }
-
-
-% if ( $part_svc->part_svc_column('quota')->columnflag eq 'F' ) { 
-  <INPUT TYPE="hidden" NAME="quota" VALUE="<% $svc_acct->quota %>">
-% } else {
-%   my $quota_label = $communigate ? 'Mail storage limit' : 'Quota';
-    <TR>
-      <TD ALIGN="right"><% $quota_label %></TD>
-      <TD><INPUT TYPE="text" NAME="quota" VALUE="<% $svc_acct->quota %>"></TD>
-    </TR>
-% }
-
-% tie my %cgp_label, 'Tie::IxHash',
-%   'file_quota'   => 'File storage limit',
-%   'file_maxnum'  => 'Number of files limit',
-%   'file_maxsize' => 'File size limit',
-% ;
-%
-% foreach my $key (keys %cgp_label) {
-%
-%   if ( !$communigate || $part_svc->part_svc_column($key)->columnflag eq 'F' ){
-      <INPUT TYPE="hidden" NAME="<%$key%>" VALUE="<% $svc_acct->$key() |h %>">
-%   } else {
-
-      <TR>
-        <TD ALIGN="right"><% $cgp_label{$key} %></TD>
-        <TD><INPUT TYPE="text" NAME="<% $key %>" VALUE="<% $svc_acct->$key() |h %>"></TD>
-      </TR>
-
-%   }
-% }
-
-% if ( $communigate ) {
-
-  <% include('/elements/tr-checkbox.html',
-               'label'      => 'Password recovery',
-               'field'      => 'password_recover',
-               'curr_value' => $svc_acct->password_recover,
-               'value'      => 'Y',
-            )
-  %>
-
-  <% include('/elements/tr-select.html',
-               'label'      => 'Allowed mail rules',
-               'field'      => 'cgp_rulesallowed',
-               'options'    => [ '', 'No', 'Filter Only', 'All But Exec', 'Any' ],
-               'labels'     => {
-                                 '' => 'default (No)', #No always the default?
-                               },
-               'curr_value' => $svc_acct->cgp_rulesallowed,
-            )
-  %>
-
-  <% include('/elements/tr-checkbox.html',
-               'label'      => 'RPOP modifications',
-               'field'      => 'cgp_rpopallowed',
-               'curr_value' => $svc_acct->cgp_rpopallowed,
-               'value'      => 'Y',
-            )
-  %>
-
-  <% include('/elements/tr-checkbox.html',
-               'label'      => 'Accepts mail to "all"',
-               'field'      => 'cgp_mailtoall',
-               'curr_value' => $svc_acct->cgp_mailtoall,
-               'value'      => 'Y',
-            )
-  %>
-
-  <% include('/elements/tr-checkbox.html',
-               'label'      => 'Add trailer to sent mail',
-               'field'      => 'cgp_addmailtrailer',
-               'curr_value' => $svc_acct->cgp_addmailtrailer,
-               'value'      => 'Y',
-            )
-  %>
-
-%  #preferences
-
-%# false laziness w/svc_domain acct_def
-  <TR>
-    <TD ALIGN="right">Message delete method</TD>
-    <TD>
-      <SELECT NAME="cgp_deletemode">
-%       for ( 'Move To Trash', 'Immediately', 'Mark' ) {
-          <OPTION VALUE="<% $_ %>"
-                  <% $_ eq $svc_acct->cgp_deletemode ? 'SELECTED' : '' %>
-          ><% $_ %>
-%       }
-      </SELECT>
-    </TD>
-  </TR>
-
-  <TR>
-    <TD ALIGN="right">On logout remove trash</TD>
-    <TD><INPUT TYPE="text" NAME="cgp_emptytrash" VALUE="<% $svc_acct->cgp_emptytrash %>"></TD>
-  </TR>
-
-  <% include('/elements/tr-select.html',
-               'label'      => 'Language',
-               'field'      => 'cgp_language',
-               'options'    => [ '', qw( English Arabic Chinese Dutch French German Hebrew Italian Japanese Portuguese Russian Slovak Spanish Thai ) ],
-               'labels'     => {
-                                 '' => 'default (English)',
-                               },
-               'curr_value' => $svc_acct->cgp_language,
-            )
-  %>
-
-  <% include('/elements/tr-select.html',
-               'label'      => 'Time zone',
-               'field'      => 'cgp_timezone',
-               'options'    => [
-                                 'HostOS',
-                                 '(+0100) Algeria/Congo',
-                                 '(+0200) Egypt/South Africa',
-                                 '(+0300) Saudi Arabia',
-                                 '(+0400) Oman',
-                                 '(+0500) Pakistan',
-                                 '(+0600) Bangladesh',
-                                 '(+0700) Thailand/Vietnam',
-                                 '(+0800) China/Malaysia',
-                                 '(+0900) Japan/Korea',
-                                 '(+1000) Queensland',
-                                 '(+1100) Micronesia',
-                                 '(+1200) Fiji',
-                                 '(+1300) Tonga/Kiribati',
-                                 '(+1400) Christmas Islands',
-                                 '(-0100) Azores/Cape Verde',
-                                 '(-0200) Fernando de Noronha',
-                                 '(-0300) Argentina/Uruguay',
-                                 '(-0400) Venezuela/Guyana',
-                                 '(-0500) Haiti/Peru',
-                                 '(-0600) Central America',
-                                 '(-0700) Arisona',
-                                 '(-0800) Adamstown',
-                                 '(-0900) Marquesas Islands',
-                                 '(-1000) Hawaii/Tahiti',
-                                 '(-1100) Samoa',
-                                 'Asia/Afghanistan',
-                                 'Asia/India',
-                                 'Asia/Iran',
-                                 'Asia/Iraq',
-                                 'Asia/Israel',
-                                 'Asia/Jordan',
-                                 'Asia/Lebanon',
-                                 'Asia/Syria',
-                                 'Australia/Adelaide',
-                                 'Australia/East',
-                                 'Australia/NorthernTerritory',
-                                 'Europe/Central',
-                                 'Europe/Eastern',
-                                 'Europe/Moscow',
-                                 'Europe/Western',
-                                 'GMT (+0000)',
-                                 'Newfoundland',
-                                 'NewZealand/Auckland',
-                                 'NorthAmerica/Alaska',
-                                 'NorthAmerica/Atlantic',
-                                 'NorthAmerica/Central',
-                                 'NorthAmerica/Eastern',
-                                 'NorthAmerica/Mountain',
-                                 'NorthAmerica/Pacific',
-                                 'Russia/Ekaterinburg',
-                                 'Russia/Irkutsk',
-                                 'Russia/Kamchatka',
-                                 'Russia/Krasnoyarsk',
-                                 'Russia/Magadan',
-                                 'Russia/Novosibirsk',
-                                 'Russia/Vladivostok',
-                                 'Russia/Yakutsk',
-                                 'SouthAmerica/Brasil',
-                                 'SouthAmerica/Chile',
-                                 'SouthAmerica/Paraguay',
-                               ],
-               'labels'     => {
-                                 '' => 'default (HostOS)',
-                               },
-               'curr_value' => $svc_acct->cgp_timezone,
-            )
-  %>
-
-  <% include('/elements/tr-select.html',
-               'label'      => 'Layout',
-               'field'      => 'cgp_skinname',
-               'options'    => [ '', '***', 'GoldFleece', 'Skin2' ],
-               'labels'     => {
-                                 '' => 'default (***)',
-                               },
-               'curr_value' => $svc_acct->cgp_skinname,
-            )
-  %>
-
-  <% include('/elements/tr-select.html',
-               'label'      => 'Pronto style',
-               'field'      => 'cgp_prontoskinname',
-               'options'    => [ '', 'Pronto', 'Pronto-darkflame', 'Pronto-steel', 'Pronto-twilight', ],
-
-               'curr_value' => $svc_acct->cgp_prontoskinname,
-            )
-  %>
-
-  <% include('/elements/tr-select.html',
-               'label'      => 'Send read receipts',
-               'field'      => 'cgp_sendmdnmode',
-               'options'    => [ '', 'Never', 'Manually', 'Automatically' ],
-               'labels'     => {
-                                 '' => 'default (Automatically)',
-                               },
-               'curr_value' => $svc_acct->cgp_language,
-            )
-  %>
-
-%#XXX vacation message, redirect all mail, mail rules
-
-% } else {
-
-%   for (qw( password_recover cgp_rulesallowed cgp_rpopallowed cgp_mailtoall
-%            cgp_addmailtrailer
-%            cgp_deletemode cgp_emptytrash cgp_language cgp_timezone
-%            cgp_skinname cgp_sendmdnmode
-%          ) ) {
-
-      <INPUT TYPE="hidden" NAME="<% $_ %>" VALUE="<% $svc_acct->$_() %>">
-%   }
-
-% }
-
+<& svc_acct/communigate.html,
+             'svc_acct'    => $svc_acct,
+             'part_svc'    => $part_svc,
+             'communigate' => $communigate,
+&>
 
 % if ( $part_svc->part_svc_column('slipip')->columnflag =~ /^[FA]$/ ) { 
   <INPUT TYPE="hidden" NAME="slipip" VALUE="<% $svc_acct->slipip %>">
 % } else { 
   <TR>
-    <TD ALIGN="right">IP</TD>
+    <TD ALIGN="right"><% mt('IP') |h %></TD>
     <TD><INPUT TYPE="text" NAME="slipip" VALUE="<% $svc_acct->slipip %>"></TD>
   </TR>
 % } 
@@ -546,12 +288,12 @@ Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
 %   my $tf = $uf . "_threshold";
 %   if ( $curuser->access_right('Edit usage') ) { 
   <TR>
-    <TD ALIGN="right"><% $label{$uf} %> remaining</TD>
-    <TD><INPUT TYPE="text" NAME="<% $uf %>" VALUE="<% $svc_acct->$uf %>">(blank disables)</TD>
+    <TD ALIGN="right"><% mt("[_1] remaining",$label{$uf}) |h %> </TD>
+    <TD><INPUT TYPE="text" NAME="<% $uf %>" VALUE="<% $svc_acct->$uf %>">(<% mt('blank disables') |h %>)</TD>
   </TR>
   <TR>
-    <TD ALIGN="right"><% $label{$uf} %> threshold</TD>
-    <TD><INPUT TYPE="text" NAME="<% $tf %>" VALUE="<% $svc_acct->$tf %>">(blank disables)</TD>
+    <TD ALIGN="right"><% mt("[_1] threshold",$label{$uf}) |h %> </TD>
+    <TD><INPUT TYPE="text" NAME="<% $tf %>" VALUE="<% $svc_acct->$tf %>">(<% mt('blank disables') |h %>)</TD>
   </TR>
 %   }else{
       <INPUT TYPE="hidden" NAME="<% $uf %>" VALUE="<% $svc_acct->$uf %>">
@@ -565,11 +307,9 @@ Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
 %
 % if ( $part_svc->part_svc_column($r)->columnflag =~ /^[FA]$/ ) { 
 
-
     <INPUT TYPE="hidden" NAME="<% $r %>" VALUE="<% $svc_acct->getfield($r) %>">
 % } else { 
 
-
     <TR>
       <TD ALIGN="right"><% $FS::raddb::attrib{$a} %></TD>
       <TD><INPUT TYPE="text" NAME="<% $r %>" VALUE="<% $svc_acct->getfield($r) %>"></TD>
@@ -578,39 +318,49 @@ Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
 % } 
 
 
-
 <TR>
-  <TD ALIGN="right">RADIUS groups</TD>
-% if ( $part_svc->part_svc_column('usergroup')->columnflag eq 'F' ) { 
-
-
-    <TD BGCOLOR="#eeeeee"><% join('<BR>', @groups) %></TD>
+  <TD ALIGN="right"><% mt('RADIUS groups') |h %></TD>
+% if ( $part_svc_usergroup->columnflag eq 'F' ) { 
+    <TD BGCOLOR="#eeeeee"><% join('<BR>', @groupnames) %></TD>
 % } else { 
-
-
-    <TD><% FS::svc_acct::radius_usergroup_selector( \@groups ) %></TD>
+%   my $radius_group_selected = '';
+%   if ( $svc_acct->svcnum ) {
+%      $radius_group_selected = join(',',$svc_acct->radius_groups('groupnum'));
+%   }
+%   elsif ( !$svc_acct->svcnum && $part_svc_usergroup->columnflag eq 'D' ) {
+%       $radius_group_selected = $part_svc_usergroup->columnvalue;
+%   }
+    <TD><& /elements/select-radius_group.html, 
+                curr_value => $radius_group_selected,
+                element_name => 'radius_usergroup',
+                multiple => 1,
+        &>
+    </TD>
 % } 
 
-
 </TR>
 % foreach my $field ($svc_acct->virtual_fields) { 
 % # If the flag is X, it won't even show up in $svc_acct->virtual_fields. 
 % if ( $part_svc->part_svc_column($field)->columnflag ne 'F' ) { 
 
-
     <% $svc_acct->pvf($field)->widget('HTML', 'edit', $svc_acct->getfield($field)) %>
 % } 
 % } 
-
   
 </TABLE>
 <BR>
 
+% if ( $captcha_url ) {
+<IMG SRC="<% $captcha_url %>"><BR>
+<% mt('Enter the word shown above:') |h %> <INPUT TYPE="text" NAME="captcha_response"><BR>
+<BR>
+% }
+
 <INPUT TYPE="submit" VALUE="Submit">
 
 </FORM>
 
-<% include('/elements/footer.html') %>
+<& /elements/footer.html &>
 
 <%init>
 
@@ -711,9 +461,15 @@ unless ( $svcnum || $cgi->param('error') ) { #adding
 
 }
 
+my $part_svc_usergroup = $part_svc->part_svc_column('usergroup');
 #fixed radius groups always override & display
-if ( $part_svc->part_svc_column('usergroup')->columnflag eq 'F' ) {
-  @groups = split(',', $part_svc->part_svc_column('usergroup')->columnvalue);
+my @groupnames; # only used for display of Fixed RADIUS groups
+if ( $part_svc_usergroup->columnflag eq 'F' ) {
+  @groups = split(',',$part_svc_usergroup->columnvalue);
+  @groupnames = map { $_->long_description } 
+                    qsearch({ 'table'         => 'radius_group',
+                           'extra_sql'     => "where groupnum in (".$part_svc_usergroup->columnvalue.")",
+                        }) if length($part_svc_usergroup->columnvalue);
 }
 
 my $action = $svcnum ? 'Edit' : 'Add';
@@ -751,4 +507,18 @@ sub max {
   (sort(@_))[-1]
 }
 
+my $captcha_url;
+my ($export_google) = $part_svc->part_export('acct_google');
+if ( $export_google ) {
+  my $error = $export_google->auth_error;
+  if ( $error ) {
+    if ( $error->{'captcha_url'} ) {
+      $captcha_url = $error->{'captcha_url'};
+    }
+    else {
+      $cgi->param('error', $error->{'message'});
+    }
+  } #if $error
+}
+
 </%init>