Diff for /loncom/interface/domainprefs.pm between versions 1.160.6.14 and 1.168

version 1.160.6.14, 2013/01/11 17:55:36 version 1.168, 2012/08/27 00:53:22
Line 45  described at http://www.lon-capa.org. Line 45  described at http://www.lon-capa.org.
 =head1 OVERVIEW  =head1 OVERVIEW
   
 Each institution using LON-CAPA will typically have a single domain designated   Each institution using LON-CAPA will typically have a single domain designated 
 for use by individuals affiliated with the institution.  Accordingly, each domain  for use by individuals affliated with the institution.  Accordingly, each domain
 may define a default set of logos and a color scheme which can be used to "brand"  may define a default set of logos and a color scheme which can be used to "brand"
 the LON-CAPA instance. In addition, an institution will typically have a language  the LON-CAPA instance. In addition, an institution will typically have a language
 and timezone which are used for the majority of courses.  and timezone which are used for the majority of courses.
Line 86  $dom,$settings,$rowtotal,$action. Line 86  $dom,$settings,$rowtotal,$action.
   
 $dom is the domain, $settings is a reference to a hash of current settings for  $dom is the domain, $settings is a reference to a hash of current settings for
 the current context, $rowtotal is a reference to the scalar used to record the   the current context, $rowtotal is a reference to the scalar used to record the 
 number of rows displayed on the page, and $action is the context (quotas,  number of rows displayed on the page, and $action is the context (quotas,  
 requestcourses or requestauthor).  requestcourses or requestauthor).
   
 The print_quotas routine was orginally created to display/store information  The print_quotas routine was orginally created to display/store information
Line 210  sub handler { Line 210  sub handler {
                 'quotas','autoenroll','autoupdate','autocreate',                  'quotas','autoenroll','autoupdate','autocreate',
                 'directorysrch','usercreation','usermodification',                  'directorysrch','usercreation','usermodification',
                 'contacts','defaults','scantron','coursecategories',                  'contacts','defaults','scantron','coursecategories',
                 'serverstatuses','requestcourses','usersessions',                  'serverstatuses','requestcourses','helpsettings',
                 'loadbalancing','requestauthor'],$dom);                  'coursedefaults','usersessions','loadbalancing',
                   'requestauthor'],$dom);
     my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll',      my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll',
                        'autoupdate','autocreate','directorysrch','contacts',                         'autoupdate','autocreate','directorysrch','contacts',
                        'usercreation','usermodification','scantron',                         'usercreation','usermodification','scantron',
                        'requestcourses','requestauthor','coursecategories',                         'requestcourses','requestauthor','coursecategories',
                        'serverstatuses','usersessions');                         'serverstatuses','helpsettings',
     my %existing;                         'coursedefaults','usersessions');
     if (ref($domconfig{'loadbalancing'}) eq 'HASH') {      if (keys(%servers) > 1) {
         %existing = %{$domconfig{'loadbalancing'}};  
     }  
     if ((keys(%servers) > 1) || (keys(%existing) > 0)) {  
         push(@prefs_order,'loadbalancing');          push(@prefs_order,'loadbalancing');
     }      }
     my %prefs = (      my %prefs = (
Line 353  sub handler { Line 351  sub handler {
                               col3 => 'Specific IPs',                                col3 => 'Specific IPs',
                             }],                              }],
                  },                   },
           'helpsettings' =>
                    {text   => 'Help page settings',
                     help   => 'Domain_Configuration_Help_Settings',
                     header => [{col1 => 'Help Settings (logged-in users)',
                                 col2 => 'Value'}],
                    },
           'coursedefaults' => 
                    {text => 'Course/Community defaults',
                     help => 'Domain_Configuration_Course_Defaults',
                     header => [{col1 => 'Defaults which can be overridden in each course by a CC',
                                 col2 => 'Value',},
                                {col1 => 'Defaults which can be overridden for each course by a DC',
                                 col2 => 'Value',},],
                    },
           'privacy' => 
                    {text   => 'User Privacy',
                     help   => 'Domain_Configuration_User_Privacy',
                     header => [{col1 => 'Setting',
                                 col2 => 'Value',}],
                    },
         'usersessions' =>          'usersessions' =>
                  {text  => 'User session hosting/offloading',                   {text  => 'User session hosting/offloading',
                   help  => 'Domain_Configuration_User_Sessions',                    help  => 'Domain_Configuration_User_Sessions',
Line 364  sub handler { Line 382  sub handler {
                               col2 => 'Rules'}],                                col2 => 'Rules'}],
                  },                   },
          'loadbalancing' =>           'loadbalancing' =>
                  {text  => 'Dedicated Load Balancer(s)',                   {text  => 'Dedicated Load Balancer',
                   help  => 'Domain_Configuration_Load_Balancing',                    help  => 'Domain_Configuration_Load_Balancing',
                   header => [{col1 => 'Balancers',                    header => [{col1 => 'Server',
                               col2 => 'Default destinations',                                col2 => 'Default destinations',
                               col3 => 'User affiliation',                                col3 => 'User affliation',
                               col4 => 'Overrides'},                                col4 => 'Overrides'},
                             ],                              ],
                  },                   },
Line 384  sub handler { Line 402  sub handler {
                                         col2 => 'Value'}],                                          col2 => 'Value'}],
                            };                             };
     }      }
   
     my @roles = ('student','coordinator','author','admin');      my @roles = ('student','coordinator','author','admin');
     my @actions = &Apache::loncommon::get_env_multiple('form.actions');      my @actions = &Apache::loncommon::get_env_multiple('form.actions');
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
     ({href=>"javascript:changePage(document.$phase,'pickactions')",      ({href=>"javascript:changePage(document.$phase,'pickactions')",
       text=>"Settings to display/modify"});        text=>"Settings to display/modify"});
     my $confname = $dom.'-domainconfig';      my $confname = $dom.'-domainconfig';
   
     if ($phase eq 'process') {      if ($phase eq 'process') {
         &Apache::lonconfigsettings::make_changes($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,\@roles);          &Apache::lonconfigsettings::make_changes($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,\@roles);
     } elsif ($phase eq 'display') {      } elsif ($phase eq 'display') {
         my $js = &recaptcha_js();          my $js = &recaptcha_js();
         if ((keys(%servers) > 1) || (keys(%existing) > 0)) {          if (keys(%servers) > 1) {
             my ($othertitle,$usertypes,$types) =              my ($othertitle,$usertypes,$types) =
                 &Apache::loncommon::sorted_inst_types($dom);                  &Apache::loncommon::sorted_inst_types($dom);
             $js .= &lonbalance_targets_js($dom,$types,\%servers,              $js = &lonbalance_targets_js($dom,$types,\%servers).
                                           $domconfig{'loadbalancing'}).                    &new_spares_js().
                    &new_spares_js().                    &common_domprefs_js().
                    &common_domprefs_js().                    &Apache::loncommon::javascript_array_indexof();
                    &Apache::loncommon::javascript_array_indexof();  
         }          }
         &Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,$js);          &Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,$js);
     } else {      } else {
 # check if domconfig user exists for the domain.  
         my $servadm = $r->dir_config('lonAdmEMail');  
         my ($configuserok,$author_ok,$switchserver) =   
             &config_check($dom,$confname,$servadm);  
         unless ($configuserok eq 'ok') {  
             &Apache::lonconfigsettings::print_header($r,$phase,$context);  
             $r->print(&mt('The domain configuration user "[_1]" has yet to be created.',  
                           $confname).  
                       '<br />'  
             );  
             if ($switchserver) {  
                 $r->print(&mt('Ordinarily, that domain configuration user is created when the ./UPDATE script is run to install LON-CAPA for the first time.').  
                           '<br />'.  
                           &mt('However, that does not apply when new domains are added to a multi-domain server, and ./UPDATE has not been run recently.').  
                           '<br />'.  
                           &mt('The "[_1]" user can be created automatically when a Domain Coordinator visits the web-based "Set domain configuration" screen, in a session hosted on the primary library server.',$confname).  
                           '<br />'.  
                           &mt('To do that now, use the following link: [_1]',$switchserver)  
                 );  
             } else {  
                 $r->print(&mt('To create that user from the command line run the ./UPDATE script found in the top level directory of the extracted LON-CAPA tarball.').  
                           '<br />'.  
                           &mt('Once that is done, you will be able to use the web-based "Set domain configuration" to configure the domain')  
                 );  
             }  
             $r->print(&Apache::loncommon::end_page());  
             return OK;  
         }  
         if (keys(%domconfig) == 0) {          if (keys(%domconfig) == 0) {
             my $primarylibserv = &Apache::lonnet::domain($dom,'primary');              my $primarylibserv = &Apache::lonnet::domain($dom,'primary');
             my @ids=&Apache::lonnet::current_machine_ids();              my @ids=&Apache::lonnet::current_machine_ids();
Line 513  sub process_changes { Line 500  sub process_changes {
         $output = &modify_quotas($dom,$action,%domconfig);          $output = &modify_quotas($dom,$action,%domconfig);
     } elsif ($action eq 'requestauthor') {      } elsif ($action eq 'requestauthor') {
         $output = &modify_quotas($dom,$action,%domconfig);          $output = &modify_quotas($dom,$action,%domconfig);
       } elsif ($action eq 'helpsettings') {
           $output = &modify_helpsettings($r,$dom,$confname,%domconfig);
       } elsif ($action eq 'coursedefaults') {
           $output = &modify_coursedefaults($dom,%domconfig);
     } elsif ($action eq 'usersessions') {      } elsif ($action eq 'usersessions') {
         $output = &modify_usersessions($dom,%domconfig);          $output = &modify_usersessions($dom,%domconfig);
     } elsif ($action eq 'loadbalancing') {      } elsif ($action eq 'loadbalancing') {
Line 543  sub print_config_box { Line 534  sub print_config_box {
     if ($numheaders > 1) {      if ($numheaders > 1) {
         my $colspan = '';          my $colspan = '';
         my $rightcolspan = '';          my $rightcolspan = '';
         if (($action eq 'rolecolors') || ($action eq 'coursecategories') ||          if (($action eq 'rolecolors') || ($action eq 'coursecategories') || 
             (($action eq 'login') && ($numheaders < 3))) {              (($action eq 'login') && ($numheaders < 3))) {
             $colspan = ' colspan="2"';              $colspan = ' colspan="2"';
         }          }
Line 582  sub print_config_box { Line 573  sub print_config_box {
             $output .= &print_usersessions('top',$dom,$settings,\$rowtotal);               $output .= &print_usersessions('top',$dom,$settings,\$rowtotal); 
         } elsif ($action eq 'rolecolors') {          } elsif ($action eq 'rolecolors') {
             $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal);              $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal);
           } elsif ($action eq 'coursedefaults') {
               $output .= &print_coursedefaults('top',$dom,$settings,\$rowtotal);
         }          }
         $output .= '          $output .= '
            </table>             </table>
Line 811  sub print_login { Line 804  sub print_login {
                           '<td><select name="'.$lonhost.'_server">'.                            '<td><select name="'.$lonhost.'_server">'.
                           '<option value=""'.$direct.'>'.$choices{'directlogin'}.                            '<option value=""'.$direct.'>'.$choices{'directlogin'}.
                           '</option>';                            '</option>';
             foreach my $hostid (sort(keys(%servers))) {              foreach my $hostid (keys(%servers)) {
                 next if ($servers{$hostid} eq $servers{$lonhost});                  next if ($servers{$hostid} eq $servers{$lonhost});
                 my $selected = '';                  my $selected = '';
                 if (ref($disallowed{$lonhost}) eq 'HASH') {                  if (ref($disallowed{$lonhost}) eq 'HASH') {
Line 854  sub print_login { Line 847  sub print_login {
     } elsif ($caller eq 'page') {      } elsif ($caller eq 'page') {
         my %defaultchecked = (           my %defaultchecked = ( 
                                'coursecatalog' => 'on',                                 'coursecatalog' => 'on',
                                'helpdesk'      => 'on',  
                                'adminmail'     => 'off',                                 'adminmail'     => 'off',
                                'newuser'       => 'off',                                 'newuser'       => 'off',
                              );                               );
         my @toggles = ('coursecatalog','adminmail','helpdesk','newuser');          my @toggles = ('coursecatalog','adminmail','newuser');
         my (%checkedon,%checkedoff);          my (%checkedon,%checkedoff);
         foreach my $item (@toggles) {          foreach my $item (@toggles) {
             if ($defaultchecked{$item} eq 'on') {               if ($defaultchecked{$item} eq 'on') { 
Line 1062  sub print_login { Line 1054  sub print_login {
                 $datatable .= '<input type="file" name="loginhelpurl_add_file" />';                  $datatable .= '<input type="file" name="loginhelpurl_add_file" />';
             }              }
             $datatable .= '</td></tr>';              $datatable .= '</td></tr>';
             $itemcount ++;  
         }          }
         $datatable .= &captcha_choice('login',$settings,$itemcount);  
     }      }
     return $datatable;      return $datatable;
 }  }
Line 1074  sub login_choices { Line 1064  sub login_choices {
         &Apache::lonlocal::texthash (          &Apache::lonlocal::texthash (
             coursecatalog => 'Display Course/Community Catalog link?',              coursecatalog => 'Display Course/Community Catalog link?',
             adminmail     => "Display Administrator's E-mail Address?",              adminmail     => "Display Administrator's E-mail Address?",
             helpdesk      => 'Display "Contact Helpdesk" link',  
             disallowlogin => "Login page requests redirected",              disallowlogin => "Login page requests redirected",
             hostid        => "Server",              hostid        => "Server",
             server        => "Redirect to:",              server        => "Redirect to:",
Line 1195  sub display_color_options { Line 1184  sub display_color_options {
     } else {      } else {
         $datatable .= '<td>&nbsp;</td>';          $datatable .= '<td>&nbsp;</td>';
     }      }
     my $current_color = $designs->{'font'} ? $designs->{'font'} : $defaults->{'font'};      my $fontlink = &color_pick($phase,$role,'font',$choices->{'font'},$designs->{'font'});
   
     $datatable .= '<td><span class="LC_nobreak">'.      $datatable .= '<td><span class="LC_nobreak">'.
                   '<input type="text" class="colorchooser" size="10" name="'.$role.'_font"'.                    '<input type="text" size="10" name="'.$role.'_font"'.
                   ' value="'.$current_color.'" />&nbsp;'.                    ' value="'.$designs->{'font'}.'" />&nbsp;'.$fontlink.
                   '&nbsp;</td></tr>';                    '&nbsp;<span id="css_'.$role.'_font" style="background-color: '.
                     $designs->{'font'}.';">&nbsp;&nbsp;&nbsp;</span>'.
                     '</span></td></tr>';
     unless ($role eq 'login') {       unless ($role eq 'login') { 
         $datatable .= '<tr'.$css_class.'>'.          $datatable .= '<tr'.$css_class.'>'.
                       '<td>'.$choices->{'fontmenu'}.'</td>';                        '<td>'.$choices->{'fontmenu'}.'</td>';
Line 1209  sub display_color_options { Line 1199  sub display_color_options {
         } else {          } else {
             $datatable .= '<td>&nbsp;</td>';              $datatable .= '<td>&nbsp;</td>';
         }          }
         $current_color = $designs->{'fontmenu'} ?          $fontlink = &color_pick($phase,$role,'fontmenu',$choices->{'fontmenu'},$designs->{'fontmenu'});
             $designs->{'fontmenu'} : $defaults->{'fontmenu'};  
         $datatable .= '<td><span class="LC_nobreak">'.          $datatable .= '<td><span class="LC_nobreak">'.
                       '<input class="colorchooser" type="text" size="10" name="'                        '<input type="text" size="10" name="'.$role.'_fontmenu"'.
                       .$role.'_fontmenu"'.                        ' value="'.$designs->{'fontmenu'}.'" />&nbsp;'.$fontlink.
                       ' value="'.$current_color.'" />&nbsp;'.                        '&nbsp;<span id="css_'.$role.'_fontmenu" style="background-color: '.
                       '&nbsp;</td></tr>';                        $designs->{'fontmenu'}.';">&nbsp;&nbsp;&nbsp;</span>'.
                         '</span></td></tr>';
     }      }
     my $switchserver = &check_switchserver($dom,$confname);      my $switchserver = &check_switchserver($dom,$confname);
     foreach my $img (@{$images}) {      foreach my $img (@{$images}) {
Line 1342  sub display_color_options { Line 1332  sub display_color_options {
     }      }
     $datatable .= '<td class="LC_right_item">'.      $datatable .= '<td class="LC_right_item">'.
                   '<table border="0"><tr>';                    '<table border="0"><tr>';
   
     foreach my $item (@{$bgs}) {      foreach my $item (@{$bgs}) {
         $datatable .= '<td align="center">';          my $link = &color_pick($phase,$role,$item,$choices->{$item},$designs->{'bgs'}{$item});
         my $color = $designs->{'bgs'}{$item} ? $designs->{'bgs'}{$item} : $defaults->{'bgs'}{$item};          $datatable .= '<td align="center">'.$link;
         if ($designs->{'bgs'}{$item}) {          if ($designs->{'bgs'}{$item}) {
             $datatable .= '&nbsp;';              $datatable .= '&nbsp;<span id="css_'.$role.'_'.$item.'" style="background-color: '.$designs->{'bgs'}{$item}.';">&nbsp;&nbsp;&nbsp;</span>';
         }          }
         $datatable .= '<br /><input type="text" class="colorchooser" size="8" name="'.$role.'_'.$item.'" value="'.$color.          $datatable .= '<br /><input type="text" size="8" name="'.$role.'_'.$item.'" value="'.$designs->{'bgs'}{$item}.
                       '" onblur = "javascript:colchg_span('."'css_".$role.'_'.$item."'".',this);" /></td>';                        '" onblur = "javascript:colchg_span('."'css_".$role.'_'.$item."'".',this);" /></td>';
     }      }
     $datatable .= '</tr></table></td></tr>';      $datatable .= '</tr></table></td></tr>';
Line 1371  sub display_color_options { Line 1360  sub display_color_options {
     $datatable .= '<td class="LC_right_item">'.      $datatable .= '<td class="LC_right_item">'.
                   '<table border="0"><tr>';                    '<table border="0"><tr>';
     foreach my $item (@{$links}) {      foreach my $item (@{$links}) {
         my $color = $designs->{'link'}{$item} ? $designs->{'link'}{$item} : $defaults->{'links'}{$item};          $datatable .= '<td align="center">'."\n".
         $datatable .= '<td align="center">'."\n";                        &color_pick($phase,$role,$item,$choices->{$item},
                                     $designs->{'links'}{$item});
         if ($designs->{'links'}{$item}) {          if ($designs->{'links'}{$item}) {
             $datatable.='&nbsp;';              $datatable.='&nbsp;<span id="css_'.$role.'_'.$item.'" style="background-color: '.$designs->{'links'}{$item}.';">&nbsp;&nbsp;&nbsp;</span>';
         }          }
         $datatable .= '<br /><input type="text" size="8" class="colorchooser" name="'.$role.'_'.$item.'" value="'.$color.          $datatable .= '<br /><input type="text" size="8" name="'.$role.'_'.$item.'" value="'.$designs->{'links'}{$item}.
                       '" /></td>';                        '" /></td>';
     }      }
     $$rowtotal += $itemcount;      $$rowtotal += $itemcount;
Line 1507  sub print_quotas { Line 1496  sub print_quotas {
     } elsif ($context eq 'requestauthor') {      } elsif ($context eq 'requestauthor') {
         @usertools = ('author');          @usertools = ('author');
         @options = ('norequest','approval','automatic');          @options = ('norequest','approval','automatic');
         %titles = &authorrequest_titles();          %titles = &authorrequest_titles(); 
     } else {      } else {
         @usertools = ('aboutme','blog','webdav','portfolio');          @usertools = ('aboutme','blog','webdav','portfolio');
         %titles = &tool_titles();          %titles = &tool_titles();
Line 1718  sub print_quotas { Line 1707  sub print_quotas {
         } elsif ($context eq 'requestauthor') {          } elsif ($context eq 'requestauthor') {
             my $curroption;              my $curroption;
             if (ref($settings) eq 'HASH') {              if (ref($settings) eq 'HASH') {
                 $curroption = $settings->{'default'};                  if (ref($settings->{'requestauthor'}) eq 'HASH') {
                       $curroption = $settings->{'requestauthor'};
                   }
             }              }
             if (!$curroption) {              if (!$curroption) {
                 $curroption = 'norequest';                  $curroption = 'norequest';
Line 1863  sub print_quotas { Line 1854  sub print_quotas {
                     $checked = ' checked="checked"';                      $checked = ' checked="checked"';
                 }                  }
                 $datatable .= '<span class="LC_nobreak"><label>'.                  $datatable .= '<span class="LC_nobreak"><label>'.
                               '<input type="radio" name="authorreq__LC_adv"'.                                '<input type="radio" name="crsreq_'.$item.
                               ' value="'.$val.'"'.$checked.' />'.                                '__LC_adv" value="'.$val.'"'.$checked.' />'.
                               $titles{$option}.'</label></span>&nbsp; ';                                $titles{$option}.'</label></span>&nbsp; ';
             }              }
         } else {          } else {
Line 1967  sub print_requestmail { Line 1958  sub print_requestmail {
             $datatable .= '<span class="LC_nobreak"><label>'.              $datatable .= '<span class="LC_nobreak"><label>'.
                           '<input type="checkbox" name="reqapprovalnotify" '.                            '<input type="checkbox" name="reqapprovalnotify" '.
                           'value="'.$domcoord[$i].'"'.$check.'/>'.                            'value="'.$domcoord[$i].'"'.$check.'/>'.
                           $fullname.' ('.$uname.':'.$udom.')</label></span></td>';                            $fullname.'</label></span></td>';
         }          }
         $datatable .= '</tr></table>';          $datatable .= '</tr></table>';
     } else {      } else {
Line 2393  sub radiobutton_prefs { Line 2384  sub radiobutton_prefs {
     return unless ((ref($toggles) eq 'ARRAY') && (ref($defaultchecked) eq 'HASH') &&      return unless ((ref($toggles) eq 'ARRAY') && (ref($defaultchecked) eq 'HASH') &&
                    (ref($choices) eq 'HASH'));                     (ref($choices) eq 'HASH'));
   
     my (%checkedon,%checkedoff,$datatable,$css_class);      my (%checkedon,%checkedoff,$datatable,$css_class,$cell_colspan);
   
     foreach my $item (@{$toggles}) {      foreach my $item (@{$toggles}) {
         if ($defaultchecked->{$item} eq 'on') {          if ($defaultchecked->{$item} eq 'on') {
Line 2760  sub spares_row { Line 2751  sub spares_row {
             $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';              $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';
             $datatable .= '<tr'.$css_class.'>              $datatable .= '<tr'.$css_class.'>
                            <td rowspan="2">                             <td rowspan="2">
                             <span class="LC_nobreak">'.                              <span class="LC_nobreak"><b>'.$server.'</b> when busy, offloads to:</span></td>'."\n";
                           &mt('[_1] when busy, offloads to:'  
                               ,'<b>'.$server.'</b>').  
                           "\n";  
             my (%current,%canselect);              my (%current,%canselect);
             my @choices =               my @choices = 
                 &possible_newspares($server,$spareid->{$server},$serverhomes,$altids);                  &possible_newspares($server,$spareid->{$server},$serverhomes,$altids);
Line 2887  sub print_loadbalancing { Line 2875  sub print_loadbalancing {
     my $numinrow = 1;      my $numinrow = 1;
     my $datatable;      my $datatable;
     my %servers = &Apache::lonnet::internet_dom_servers($dom);      my %servers = &Apache::lonnet::internet_dom_servers($dom);
     my (%currbalancer,%currtargets,%currrules,%existing);      my ($currbalancer,$currtargets,$currrules);
     if (ref($settings) eq 'HASH') {      if (keys(%servers) > 1) {
         %existing = %{$settings};          if (ref($settings) eq 'HASH') {
     }              $currbalancer = $settings->{'lonhost'};
     if ((keys(%servers) > 1) || (keys(%existing) > 0)) {              $currtargets = $settings->{'targets'};
         &get_loadbalancers_config(\%servers,\%existing,\%currbalancer,              $currrules = $settings->{'rules'};
                                   \%currtargets,\%currrules);          } else {
               ($currbalancer,$currtargets) = 
                   &Apache::lonnet::get_lonbalancer_config(\%servers);
           }
     } else {      } else {
         return;          return;
     }      }
Line 2903  sub print_loadbalancing { Line 2894  sub print_loadbalancing {
     if (ref($types) eq 'ARRAY') {      if (ref($types) eq 'ARRAY') {
         $rownum += scalar(@{$types});          $rownum += scalar(@{$types});
     }      }
     my @css_class = ('LC_odd_row','LC_even_row');      my $css_class = ' class="LC_odd_row"';
     my $balnum = 0;      my $targets_div_style = 'display: none';
     my $islast;      my $disabled_div_style = 'display: block';
     my (@toshow,$disabledtext);      my $homedom_div_style = 'display: none';
     if (keys(%currbalancer) > 0) {      $datatable = '<tr'.$css_class.'>'.
         @toshow = sort(keys(%currbalancer));                   '<td rowspan="'.$rownum.'" valign="top">'.
         if (scalar(@toshow) < scalar(keys(%servers)) + 1) {                   '<p><select name="loadbalancing_lonhost" onchange="toggleTargets();">'."\n".
             push(@toshow,'');                   '<option value=""';
         }      if (($currbalancer eq '') || (!grep(/^\Q$currbalancer\E$/,keys(%servers)))) {
     } else {          $datatable .= ' selected="selected"';
         @toshow = ('');      } else {
         $disabledtext = &mt('No existing load balancer');          $targets_div_style = 'display: block';
     }          $disabled_div_style = 'display: none';
     foreach my $lonhost (@toshow) {          if ($dom eq &Apache::lonnet::host_domain($currbalancer)) {
         if ($balnum == scalar(@toshow)-1) {              $homedom_div_style = 'display: block'; 
             $islast = 1;          }
         } else {      }
             $islast = 0;      $datatable .= '>'.&mt('None').'</option>'."\n";
         }      foreach my $lonhost (sort(keys(%servers))) {
         my $cssidx = $balnum%2;          my $selected;
         my $targets_div_style = 'display: none';          if ($lonhost eq $currbalancer) {
         my $disabled_div_style = 'display: block';              $selected .= ' selected="selected"';
         my $homedom_div_style = 'display: none';          }
         $datatable .= '<tr class="'.$css_class[$cssidx].'">'.          $datatable .= '<option value="'.$lonhost.'"'.$selected.'>'.$lonhost.'</option>'."\n";
                       '<td rowspan="'.$rownum.'" valign="top">'.      }
                       '<p>';      $datatable .= '</select></p></td><td rowspan="'.$rownum.'" valign="top">'.
         if ($lonhost eq '') {                    '<div id="loadbalancing_disabled" style="'.$disabled_div_style.'">'.&mt('No dedicated Load Balancer').'</div>'."\n".
             $datatable .= '<span class="LC_nobreak">';                    '<div id="loadbalancing_targets" style="'.$targets_div_style.'">'.&mt('Offloads to:').'<br />';
             if (keys(%currbalancer) > 0) {      my ($numspares,@spares) = &count_servers($currbalancer,%servers);
                 $datatable .= &mt('Add balancer:');      my @sparestypes = ('primary','default');
             } else {      my %typetitles = &sparestype_titles();
                 $datatable .= &mt('Enable balancer:');      foreach my $sparetype (@sparestypes) {
             }          my $targettable;
             $datatable .= '&nbsp;'.          for (my $i=0; $i<$numspares; $i++) {
                           '<select name="loadbalancing_lonhost_'.$balnum.'"'.              my $checked;
                           ' id="loadbalancing_lonhost_'.$balnum.'"'.              if (ref($currtargets) eq 'HASH') {
                           ' onchange="toggleTargets('."'$balnum'".');">'."\n".                  if (ref($currtargets->{$sparetype}) eq 'ARRAY') {
                           '<option value="" selected="selected">'.&mt('None').                      if (grep(/^\Q$spares[$i]\E$/,@{$currtargets->{$sparetype}})) {
                           '</option>'."\n";                          $checked = ' checked="checked"';
             foreach my $server (sort(keys(%servers))) {  
                 next if ($currbalancer{$server});  
                 $datatable .= '<option value="'.$server.'">'.$server.'</option>'."\n";  
             }  
             $datatable .=  
                 '</select>'."\n".  
                 '<input type="hidden" name="loadbalancing_prevlonhost_'.$balnum.'" id="loadbalancing_prevlonhost_'.$balnum.'" value="" />&nbsp;</span>'."\n";  
         } else {  
             $datatable .= '<i>'.$lonhost.'</i><br /><span class="LC_nobreak">'.  
                           '<label><input type="checkbox" name="loadbalancing_delete" value="'.$balnum.'" id="loadbalancing_delete_'.$balnum.'" onclick="javascript:balancerDeleteChange('."'$balnum'".');" />&nbsp;'.  
                            &mt('Stop balancing').'</label>'.  
                            '<input type="hidden" name="loadbalancing_lonhost_'.$balnum.'" value="'.$lonhost.'" id="loadbalancing_lonhost_'.$balnum.'" /></span>';  
             $targets_div_style = 'display: block';  
             $disabled_div_style = 'display: none';  
             if ($dom eq &Apache::lonnet::host_domain($lonhost)) {  
                 $homedom_div_style = 'display: block';  
             }  
         }  
         $datatable .= '</p></td><td rowspan="'.$rownum.'" valign="top">'.  
                   '<div id="loadbalancing_disabled_'.$balnum.'" style="'.  
                   $disabled_div_style.'">'.$disabledtext.'</div>'."\n".  
                   '<div id="loadbalancing_targets_'.$balnum.'" style="'.$targets_div_style.'">'.&mt('Offloads to:').'<br />';  
         my ($numspares,@spares) = &count_servers($lonhost,%servers);  
         my @sparestypes = ('primary','default');  
         my %typetitles = &sparestype_titles();  
         foreach my $sparetype (@sparestypes) {  
             my $targettable;  
             for (my $i=0; $i<$numspares; $i++) {  
                 my $checked;  
                 if (ref($currtargets{$lonhost}) eq 'HASH') {  
                     if (ref($currtargets{$lonhost}{$sparetype}) eq 'ARRAY') {  
                         if (grep(/^\Q$spares[$i]\E$/,@{$currtargets{$lonhost}{$sparetype}})) {  
                             $checked = ' checked="checked"';  
                         }  
                     }  
                 }  
                 my ($chkboxval,$disabled);  
                 if (($lonhost ne '') && (exists($servers{$lonhost}))) {  
                     $chkboxval = $spares[$i];  
                 }  
                 if (exists($currbalancer{$spares[$i]})) {  
                     $disabled = ' disabled="disabled"';  
                 }  
                 $targettable .=  
                     '<td><label><input type="checkbox" name="loadbalancing_target_'.$balnum.'_'.$sparetype.'"'.  
                     $checked.$disabled.' value="'.$chkboxval.'" id="loadbalancing_target_'.$balnum.'_'.$sparetype.'_'.$i.'" onclick="checkOffloads('."this,'$balnum','$sparetype'".');" /><span id="loadbalancing_targettxt_'.$balnum.'_'.$sparetype.'_'.$i.'">&nbsp;'.$chkboxval.  
                     '</span></label></td>';  
                 my $rem = $i%($numinrow);  
                 if ($rem == 0) {  
                     if (($i > 0) && ($i < $numspares-1)) {  
                         $targettable .= '</tr>';  
                     }  
                     if ($i < $numspares-1) {  
                         $targettable .= '<tr>';  
                     }                      }
                 }                  }
             }              }
             if ($targettable ne '') {              my $chkboxval;
                 my $rem = $numspares%($numinrow);              if (($currbalancer ne '') && (grep((/^\Q$currbalancer\E$/,keys(%servers))))) {
                 my $colsleft = $numinrow - $rem;                  $chkboxval = $spares[$i];
                 if ($colsleft > 1 ) {              }
                     $targettable .= '<td colspan="'.$colsleft.'" class="LC_left_item">'.              $targettable .= '<td><label><input type="checkbox" name="loadbalancing_target_'.$sparetype.'"'.
                                     '&nbsp;</td>';                        $checked.' value="'.$chkboxval.'" id="loadbalancing_target_'.$sparetype.'_'.$i.'" onclick="checkOffloads('."this,'$sparetype'".');" /><span id="loadbalancing_targettxt_'.$sparetype.'_'.$i.'">&nbsp;'.$chkboxval.
                 } elsif ($colsleft == 1) {                        '</span></label></td>';
                     $targettable .= '<td class="LC_left_item">&nbsp;</td>';              my $rem = $i%($numinrow);
                 }              if ($rem == 0) {
                 $datatable .=  '<i>'.$typetitles{$sparetype}.'</i><br />'.                  if ($i > 0) {
                                '<table><tr>'.$targettable.'</tr></table><br />';                      $targettable .= '</tr>';
             }                  }
         }                  $targettable .= '<tr>';
         $datatable .= '</div></td></tr>'.  
                       &loadbalancing_rules($dom,$intdom,$currrules{$lonhost},  
                                            $othertitle,$usertypes,$types,\%servers,  
                                            \%currbalancer,$lonhost,  
                                            $targets_div_style,$homedom_div_style,  
                                            $css_class[$cssidx],$balnum,$islast);  
         $$rowtotal += $rownum;  
         $balnum ++;  
     }  
     $datatable .= '<input type="hidden" name="loadbalancing_total" id="loadbalancing_total" value="'.$balnum.'" />';  
     return $datatable;  
 }  
   
 sub get_loadbalancers_config {  
     my ($servers,$existing,$currbalancer,$currtargets,$currrules) = @_;  
     return unless ((ref($servers) eq 'HASH') &&  
                    (ref($existing) eq 'HASH') && (ref($currbalancer) eq 'HASH') &&  
                    (ref($currtargets) eq 'HASH') && (ref($currrules) eq 'HASH'));  
     if (keys(%{$existing}) > 0) {  
         my $oldlonhost;  
         foreach my $key (sort(keys(%{$existing}))) {  
             if ($key eq 'lonhost') {  
                 $oldlonhost = $existing->{'lonhost'};  
                 $currbalancer->{$oldlonhost} = 1;  
             } elsif ($key eq 'targets') {  
                 if ($oldlonhost) {  
                     $currtargets->{$oldlonhost} = $existing->{'targets'};  
                 }  
             } elsif ($key eq 'rules') {  
                 if ($oldlonhost) {  
                     $currrules->{$oldlonhost} = $existing->{'rules'};  
                 }  
             } elsif (ref($existing->{$key}) eq 'HASH') {  
                 $currbalancer->{$key} = 1;  
                 $currtargets->{$key} = $existing->{$key}{'targets'};  
                 $currrules->{$key} = $existing->{$key}{'rules'};  
             }              }
         }          }
     } else {          if ($targettable ne '') {
         my ($balancerref,$targetsref) =              my $rem = $numspares%($numinrow);
                 &Apache::lonnet::get_lonbalancer_config($servers);              my $colsleft = $numinrow - $rem;
         if ((ref($balancerref) eq 'HASH') && (ref($targetsref) eq 'HASH')) {              if ($colsleft > 1 ) {
             foreach my $server (sort(keys(%{$balancerref}))) {                  $targettable .= '<td colspan="'.$colsleft.'" class="LC_left_item">'.
                 $currbalancer->{$server} = 1;                                  '&nbsp;</td>';
                 $currtargets->{$server} = $targetsref->{$server};              } elsif ($colsleft == 1) {
                   $targettable .= '<td class="LC_left_item">&nbsp;</td>';
             }              }
               $datatable .=  '<i>'.$typetitles{$sparetype}.'</i><br />'.
                              '<table><tr>'.$targettable.'</table><br />';
         }          }
     }      }
     return;      $datatable .= '</div></td></tr>'.
                     &loadbalancing_rules($dom,$intdom,$currrules,$othertitle,
                                          $usertypes,$types,\%servers,$currbalancer,
                                          $targets_div_style,$homedom_div_style,$css_class);
       $$rowtotal += $rownum;
       return $datatable;
 }  }
   
 sub loadbalancing_rules {  sub loadbalancing_rules {
     my ($dom,$intdom,$currrules,$othertitle,$usertypes,$types,$servers,      my ($dom,$intdom,$currrules,$othertitle,$usertypes,$types,$servers,
         $currbalancer,$lonhost,$targets_div_style,$homedom_div_style,          $currbalancer,$targets_div_style,$homedom_div_style,$css_class) = @_;
         $css_class,$balnum,$islast) = @_;  
     my $output;      my $output;
     my $num = 0;      my ($alltypes,$othertypes,$titles) = 
     my ($alltypes,$othertypes,$titles) =  
         &loadbalancing_titles($dom,$intdom,$usertypes,$types);          &loadbalancing_titles($dom,$intdom,$usertypes,$types);
     if ((ref($alltypes) eq 'ARRAY') && (ref($titles) eq 'HASH'))  {      if ((ref($alltypes) eq 'ARRAY') && (ref($titles) eq 'HASH'))  {
         foreach my $type (@{$alltypes}) {          foreach my $type (@{$alltypes}) {
             $num ++;  
             my $current;              my $current;
             if (ref($currrules) eq 'HASH') {              if (ref($currrules) eq 'HASH') {
                 $current = $currrules->{$type};                  $current = $currrules->{$type};
             }              }
             if (($type eq '_LC_external') || ($type eq '_LC_internetdom')) {              if (($type eq '_LC_external') || ($type eq '_LC_internetdom')) {
                 if ($dom ne &Apache::lonnet::host_domain($lonhost)) {                  if ($dom ne &Apache::lonnet::host_domain($currbalancer)) {
                     $current = '';                      $current = '';
                 }                  }
             }              }
             $output .= &loadbalance_rule_row($type,$titles->{$type},$current,              $output .= &loadbalance_rule_row($type,$titles->{$type},$current,
                                              $servers,$currbalancer,$lonhost,$dom,                                               $servers,$currbalancer,$dom,
                                              $targets_div_style,$homedom_div_style,                                               $targets_div_style,$homedom_div_style,$css_class);
                                              $css_class,$balnum,$num,$islast);  
         }          }
     }      }
     return $output;      return $output;
Line 3123  sub loadbalancing_titles { Line 3028  sub loadbalancing_titles {
 }  }
   
 sub loadbalance_rule_row {  sub loadbalance_rule_row {
     my ($type,$title,$current,$servers,$currbalancer,$lonhost,$dom,      my ($type,$title,$current,$servers,$currbalancer,$dom,$targets_div_style,
         $targets_div_style,$homedom_div_style,$css_class,$balnum,$num,$islast) = @_;          $homedom_div_style,$css_class) = @_;
     my @rulenames = ('default','homeserver');      my @rulenames = ('default','homeserver');
     my %ruletitles = &offloadtype_text();      my %ruletitles = &offloadtype_text();
     if ($type eq '_LC_external') {      if ($type eq '_LC_external') {
Line 3137  sub loadbalance_rule_row { Line 3042  sub loadbalance_rule_row {
     if (($type eq '_LC_external') || ($type eq '_LC_internetdom')) {      if (($type eq '_LC_external') || ($type eq '_LC_internetdom')) {
         $style = $homedom_div_style;          $style = $homedom_div_style;
     }      }
     my $space;      my $output = 
     if ($islast && $num == 1) {          '<tr'.$css_class.'><td valign="top"><div id="balanceruletitle_'.$type.'" style="'.$style.'">'.$title.'</div></td>'."\n".
         $space = '<div display="inline-block">&nbsp;</div>';          '<td><div id="balancerule_'.$type.'" style="'.$style.'">'."\n";
     }  
     my $output =  
         '<tr class="'.$css_class.'" id="balanceruletr_'.$balnum.'_'.$num.'"><td valign="top">'.$space.  
         '<div id="balanceruletitle_'.$balnum.'_'.$type.'" style="'.$style.'">'.$title.'</div></td>'."\n".  
         '<td valaign="top">'.$space.  
         '<div id="balancerule_'.$balnum.'_'.$type.'" style="'.$style.'">'."\n";  
     for (my $i=0; $i<@rulenames; $i++) {      for (my $i=0; $i<@rulenames; $i++) {
         my $rule = $rulenames[$i];          my $rule = $rulenames[$i];
         my ($checked,$extra);          my ($checked,$extra);
Line 3161  sub loadbalance_rule_row { Line 3060  sub loadbalance_rule_row {
                 unless ($checked) {                  unless ($checked) {
                     $default = ' selected="selected"';                      $default = ' selected="selected"';
                 }                  }
                 $extra =                  $extra = ':&nbsp;<select name="loadbalancing_singleserver_'.$type.
                     ':&nbsp;<select name="loadbalancing_singleserver_'.$balnum.'_'.$type.                           '" id="loadbalancing_singleserver_'.$type.
                     '" id="loadbalancing_singleserver_'.$balnum.'_'.$type.                           '" onchange="singleServerToggle('."'$type'".')">'."\n".
                     '" onchange="singleServerToggle('."'$balnum','$type'".')">'."\n".                           '<option value=""'.$default.'></option>'."\n";
                     '<option value=""'.$default.'></option>'."\n";                  foreach my $lonhost (sort(keys(%{$servers}))) {
                 foreach my $server (sort(keys(%{$servers}))) {                      next if ($lonhost eq $currbalancer);
                     if (ref($currbalancer) eq 'HASH') {  
                         next if (exists($currbalancer->{$server}));  
                     }  
                     my $selected;                      my $selected;
                     if ($server eq $current) {                      if ($lonhost eq $current) {
                         $selected = ' selected="selected"';                          $selected = ' selected="selected"';
                     }                      }
                     $extra .= '<option value="'.$server.'"'.$selected.'>'.$server.'</option>';                      $extra .= '<option value="'.$lonhost.'"'.$selected.'>'.$lonhost.'</option>';
                 }                  }
                 $extra .= '</select>';                  $extra .= '</select>';
             }              }
Line 3182  sub loadbalance_rule_row { Line 3078  sub loadbalance_rule_row {
             $checked = ' checked="checked"';              $checked = ' checked="checked"';
         }          }
         $output .= '<span class="LC_nobreak"><label>'.          $output .= '<span class="LC_nobreak"><label>'.
                    '<input type="radio" name="loadbalancing_rules_'.$balnum.'_'.$type.                     '<input type="radio" name="loadbalancing_rules_'.$type.
                    '" id="loadbalancing_rules_'.$balnum.'_'.$type.'_'.$i.'" value="'.                     '" id="loadbalancing_rules_'.$type.'_'.$i.'" value="'.
                    $rule.'" onclick="balanceruleChange('."this.form,'$balnum','$type'".                     $rule.'" onclick="balanceruleChange('."this.form,'$type'".
                    ')"'.$checked.' />&nbsp;'.$ruletitles{$rulenames[$i]}.                     ')"'.$checked.' />&nbsp;'.$ruletitles{$rulenames[$i]}.
                    '</label>'.$extra.'</span><br />'."\n";                     '</label>'.$extra.'</span><br />'."\n";
     }      }
Line 3262  sub authorrequest_titles { Line 3158  sub authorrequest_titles {
                                    automatic  => 'Automatic approval',                                     automatic  => 'Automatic approval',
                  );                   );
     return %titles;      return %titles;
 }  } 
   
 sub courserequest_conditions {  sub courserequest_conditions {
     my %conditions = &Apache::lonlocal::texthash (      my %conditions = &Apache::lonlocal::texthash (
Line 3403  sub print_usercreation { Line 3299  sub print_usercreation {
                                              $dom,$numinrow,$othertitle,                                               $dom,$numinrow,$othertitle,
                                              'statustocreate');                                               'statustocreate');
                 $$rowtotal ++;                  $$rowtotal ++;
                 $rownum ++;  
             }              }
         }          }
         $datatable .= &captcha_choice('cancreate',$createsettings,$rownum);          $datatable .= &captcha_choice('cancreate',$createsettings);
     } else {      } else {
         my @contexts = ('author','course','domain');          my @contexts = ('author','course','domain');
         my @authtypes = ('int','krb4','krb5','loc');          my @authtypes = ('int','krb4','krb5','loc');
Line 3459  sub print_usercreation { Line 3354  sub print_usercreation {
 }  }
   
 sub captcha_choice {  sub captcha_choice {
     my ($context,$settings,$itemcount) = @_;      my ($context,$settings) = @_;
     my ($keyentry,$currpub,$currpriv,%checked,$rowname,$pubtext,$privtext);      my ($keyentry,$currpub,$currpriv,%checked,$rowname,$pubtext,$privtext);
     my %lt = &captcha_phrases();      my %lt = &captcha_phrases();
     $keyentry = 'hidden';      $keyentry = 'hidden';
     if ($context eq 'cancreate') {      if ($context eq 'cancreate') {
         $rowname = &mt('CAPTCHA validation (e-mail as username)');          $rowname = &mt('CAPTCHA validation (e-mail as username)');
     } elsif ($context eq 'login') {      } elsif ($context eq 'help') {
         $rowname =  &mt('"Contact helpdesk" CAPTCHA validation');          $rowname =  &mt('CAPTCHA validation');
     }      }
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         if ($settings->{'captcha'}) {          if ($settings->{'captcha'}) {
Line 3486  sub captcha_choice { Line 3381  sub captcha_choice {
     } else {      } else {
         $checked{'original'} = ' checked="checked"';          $checked{'original'} = ' checked="checked"';
     }      }
     my $css_class = $itemcount%2?' class="LC_odd_row"':'';      my $output = '<tr class="LC_odd_row">'.
     my $output = '<tr'.$css_class.'>'.                   '<td class="LC_left_item">'.$rowname.'</td><td class="LC_right_item" colspan="2">'."\n".
                  '<td class="LC_left_item">'.$rowname.'</td><td class="LC_left_item" colspan="2">'."\n".  
                  '<table><tr><td>'."\n";                   '<table><tr><td>'."\n";
     foreach my $option ('original','recaptcha','notused') {      foreach my $option ('original','recaptcha','notused') {
         $output .= '<span class="LC_nobreak"><label><input type="radio" name="'.$context.'_captcha" value="'.          $output .= '<span class="LC_nobreak"><label><input type="radio" name="'.$context.'_captcha" value="'.
Line 3501  sub captcha_choice { Line 3395  sub captcha_choice {
 #  #
 # Note: If reCAPTCHA is to be used for LON-CAPA servers in a domain, a domain coordinator should visit:  # Note: If reCAPTCHA is to be used for LON-CAPA servers in a domain, a domain coordinator should visit:
 # https://www.google.com/recaptcha and generate a Public and Private key. For domains with multiple  # https://www.google.com/recaptcha and generate a Public and Private key. For domains with multiple
 # servers a single key pair will be used for all servers, so the internet domain (e.g., yourcollege.edu)  # servers a single key pair will be used for all servers, so the internet domain (e.g., yourcollege.edu) 
 # specified for use with the key should be broad enough to accommodate all servers in the LON-CAPA domain.  # specified for use with the key should be broad enough to accommodate all servers in the LON-CAPA domain.
 #  #  
     $output .= '</td></tr>'."\n".      $output .= '</td></tr>'."\n".
                '<tr><td>'."\n".                 '<tr><td>'."\n".
                '<span class="LC_nobreak"><span id="'.$context.'_recaptchapubtxt">'.$pubtext.'</span>&nbsp;'."\n".                 '<span class="LC_nobreak"><span id="'.$context.'_recaptchapubtxt">'.$pubtext.'</span>&nbsp;'."\n".
Line 4637  sub modify_login { Line 4531  sub modify_login {
         %curr_loginvia,%loginhash,@currlangs,@newlangs,$addedfile,%title,@offon);          %curr_loginvia,%loginhash,@currlangs,@newlangs,$addedfile,%title,@offon);
     %title = ( coursecatalog => 'Display course catalog',      %title = ( coursecatalog => 'Display course catalog',
                adminmail => 'Display administrator E-mail address',                 adminmail => 'Display administrator E-mail address',
                helpdesk  => 'Display "Contact Helpdesk" link',  
                newuser => 'Link for visitors to create a user account',                 newuser => 'Link for visitors to create a user account',
                loginheader => 'Log-in box header');                 loginheader => 'Log-in box header');
     @offon = ('off','on');      @offon = ('off','on');
Line 4650  sub modify_login { Line 4543  sub modify_login {
     }      }
     ($errors,%colchanges) = &modify_colors($r,$dom,$confname,['login'],      ($errors,%colchanges) = &modify_colors($r,$dom,$confname,['login'],
                                            \%domconfig,\%loginhash);                                             \%domconfig,\%loginhash);
     my @toggles = ('coursecatalog','adminmail','helpdesk','newuser');      my @toggles = ('coursecatalog','adminmail','newuser');
     foreach my $item (@toggles) {      foreach my $item (@toggles) {
         $loginhash{login}{$item} = $env{'form.'.$item};          $loginhash{login}{$item} = $env{'form.'.$item};
     }      }
Line 4720  sub modify_login { Line 4613  sub modify_login {
                                 $new = '';                                   $new = ''; 
                             }                              }
                         }                          }
   
                         $loginhash{login}{loginvia}{$lonhost}{$item} = $new;                          $loginhash{login}{loginvia}{$lonhost}{$item} = $new;
                     }                      }
                 }                  }
Line 4812  sub modify_login { Line 4706  sub modify_login {
                     } else {                      } else {
                         my $puberror = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$newfile{$lang},$result);                          my $puberror = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$newfile{$lang},$result);
                         $errors .= '<li><span class="LC_error">'.$puberror.'</span></li>';                          $errors .= '<li><span class="LC_error">'.$puberror.'</span></li>';
                         if ((grep(/^\Q$lang\E$/,@currlangs)) &&                          if ((grep(/^\Q$lang\E$/,@currlangs)) && 
                             (!grep(/^\Q$lang\E$/,@delurls))) {                              (!grep(/^\Q$lang\E$/,@delurls))) {
   
                             $loginhash{'login'}{'helpurl'}{$lang} = $domconfig{'login'}{'helpurl'}{$lang};                              $loginhash{'login'}{'helpurl'}{$lang} = $domconfig{'login'}{'helpurl'}{$lang};
Line 4830  sub modify_login { Line 4724  sub modify_login {
             $errors .= '<li><span class="LC_error">'.$error.'</span></li>';              $errors .= '<li><span class="LC_error">'.$error.'</span></li>';
         }          }
     }      }
     &process_captcha('login',\%changes,$loginhash{'login'},$domconfig{'login'});  
   
     my $defaulthelpfile = '/adm/loginproblems.html';      my $defaulthelpfile = '/adm/loginproblems.html';
     my $defaulttext = &mt('Default in use');      my $defaulttext = &mt('Default in use');
Line 4838  sub modify_login { Line 4731  sub modify_login {
     my $putresult = &Apache::lonnet::put_dom('configuration',\%loginhash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%loginhash,
                                              $dom);                                               $dom);
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         my @toggles = ('coursecatalog','adminmail','helpdesk','newuser');          my @toggles = ('coursecatalog','adminmail','newuser');
         my %defaultchecked = (          my %defaultchecked = (
                     'coursecatalog' => 'on',                      'coursecatalog' => 'on',
                     'helpdesk'      => 'on',  
                     'adminmail'     => 'off',                      'adminmail'     => 'off',
                     'newuser'       => 'off',                      'newuser'       => 'off',
         );          );
Line 4927  sub modify_login { Line 4819  sub modify_login {
                             }                              }
                         }                          }
                     }                      }
                 } elsif ($item eq 'captcha') {  
                     if (ref($loginhash{'login'}) eq 'HASH') {  
                         my $chgtxt;  
                         if ($loginhash{'login'}{$item} eq 'notused') {  
                             $chgtxt .= &mt('No CAPTCHA validation in use for helpdesk form.');  
                         } else {  
                             my %captchas = &captcha_phrases();  
                             if ($captchas{$loginhash{'login'}{$item}}) {  
                                 $chgtxt .= &mt("Validation for helpdesk form set to $captchas{$loginhash{'login'}{$item}}.");  
                             } else {  
                                 $chgtxt .= &mt('Validation for helpdesk form set to unknown type.');  
                             }  
                         }  
                         $resulttext .= '<li>'.$chgtxt.'</li>';  
                     }  
                 } elsif ($item eq 'recaptchakeys') {  
                     if (ref($loginhash{'login'}) eq 'HASH') {  
                         my ($privkey,$pubkey);  
                         if (ref($loginhash{'login'}{$item}) eq 'HASH') {  
                             $pubkey = $loginhash{'login'}{$item}{'public'};  
                             $privkey = $loginhash{'login'}{$item}{'private'};  
                         }  
                         my $chgtxt .= &mt('ReCAPTCHA keys changes').'<ul>';  
                         if (!$pubkey) {  
                             $chgtxt .= '<li>'.&mt('Public key deleted').'</li>';  
                         } else {  
                             $chgtxt .= '<li>'.&mt('Public key set to [_1]',$pubkey).'</li>';  
                         }  
                         if (!$privkey) {  
                             $chgtxt .= '<li>'.&mt('Private key deleted').'</li>';  
                         } else {  
                             $chgtxt .= '<li>'.&mt('Private key set to [_1]',$pubkey).'</li>';  
                         }  
                         $chgtxt .= '</ul>';  
                         $resulttext .= '<li>'.$chgtxt.'</li>';  
                     }  
                 } else {                  } else {
                     $resulttext .= '<li>'.&mt("$title{$item} set to $offon[$env{'form.'.$item}]").'</li>';                      $resulttext .= '<li>'.&mt("$title{$item} set to $offon[$env{'form.'.$item}]").'</li>';
                 }                  }
Line 5407  sub publishlogo { Line 5263  sub publishlogo {
 # See if there is anything left  # See if there is anything left
     unless ($fname) { return ('error: no uploaded file'); }      unless ($fname) { return ('error: no uploaded file'); }
     $fname="$subdir/$fname";      $fname="$subdir/$fname";
     my $docroot=$r->dir_config('lonDocRoot');      my $docroot=$r->dir_config('lonDocRoot'); 
     my $filepath="$docroot/priv";      my $filepath="$docroot/priv";
     my $relpath = "$dom/$confname";      my $relpath = "$dom/$confname";
     my ($fnamepath,$file,$fetchthumb);      my ($fnamepath,$file,$fetchthumb);
Line 5415  sub publishlogo { Line 5271  sub publishlogo {
     if ($fname=~m|/|) {      if ($fname=~m|/|) {
         ($fnamepath,$file) = ($fname =~ m|^(.*)/([^/]+)$|);          ($fnamepath,$file) = ($fname =~ m|^(.*)/([^/]+)$|);
     }      }
     my @parts=split(/\//,"$filepath/$relpath/$fnamepath");        my @parts=split(/\//,"$filepath/$relpath/$fnamepath");
     my $count;      my $count;
     for ($count=5;$count<=$#parts;$count++) {      for ($count=5;$count<=$#parts;$count++) {
         $filepath.="/$parts[$count]";          $filepath.="/$parts[$count]";
Line 5586  sub write_metadata { Line 5442  sub write_metadata {
         print $logfile "\nWrite metadata file for ".$targetdir.'/'.$file;          print $logfile "\nWrite metadata file for ".$targetdir.'/'.$file;
         my $mfh;          my $mfh;
         if (open($mfh,'>'.$targetdir.'/'.$file.'.meta')) {          if (open($mfh,'>'.$targetdir.'/'.$file.'.meta')) {
             foreach (sort(keys(%metadatafields))) {              foreach (sort keys %metadatafields) {
                 unless ($_=~/\./) {                  unless ($_=~/\./) {
                     my $unikey=$_;                      my $unikey=$_;
                     $unikey=~/^([A-Za-z]+)/;                      $unikey=~/^([A-Za-z]+)/;
Line 5670  sub check_switchserver { Line 5526  sub check_switchserver {
     my @ids=&Apache::lonnet::current_machine_ids();      my @ids=&Apache::lonnet::current_machine_ids();
     foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }      foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }
     if (!$allowed) {      if (!$allowed) {
  $switchserver='<a href="/adm/switchserver?otherserver='.$home.'&amp;role=dc./'.$dom.'/&amp;destinationurl=/adm/domainprefs">'.&mt('Switch Server').'</a>';   $switchserver='<a href="/adm/switchserver?otherserver='.$home.'&role=dc./'.$dom.'/">'.&mt('Switch Server').'</a>';
     }      }
     return $switchserver;      return $switchserver;
 }  }
Line 5681  sub modify_quotas { Line 5537  sub modify_quotas {
         %limithash,$toolregexp,%conditions,$resulttext,%changes);          %limithash,$toolregexp,%conditions,$resulttext,%changes);
     if ($action eq 'quotas') {      if ($action eq 'quotas') {
         $context = 'tools';           $context = 'tools'; 
     } else {       } else {
         $context = $action;          $context = $action;
     }      }
     if ($context eq 'requestcourses') {      if ($context eq 'requestcourses') {
Line 5871  sub modify_quotas { Line 5727  sub modify_quotas {
             &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);              &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
   
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             unless (($context eq 'requestcourses') ||              unless (($context eq 'requestcourses') || 
                     ($context eq 'requestauthor')) {                      ($context eq 'requestauthor')) {
                 if (ref($changes{'defaultquota'}) eq 'HASH') {                  if (ref($changes{'defaultquota'}) eq 'HASH') {
                     $resulttext .= '<li>'.&mt('Portfolio default quotas').'<ul>';                      $resulttext .= '<li>'.&mt('Portfolio default quotas').'<ul>';
Line 5892  sub modify_quotas { Line 5748  sub modify_quotas {
                 my (%haschgs,%inconf);                  my (%haschgs,%inconf);
                 if ($context eq 'requestauthor') {                  if ($context eq 'requestauthor') {
                     %haschgs = %changes;                      %haschgs = %changes;
                     %inconf = %confhash;                      %inconf = %confhash; 
                 } else {                  } else {
                     if (ref($changes{$item}) eq 'HASH') {                      if (ref($changes{$item}) eq 'HASH') {
                         %haschgs = %{$changes{$item}};                          %haschgs = %{$changes{$item}};
Line 5906  sub modify_quotas { Line 5762  sub modify_quotas {
                         &Apache::lonnet::usertools_access($env{'user.name'},                          &Apache::lonnet::usertools_access($env{'user.name'},
                                                           $env{'user.domain'},                                                            $env{'user.domain'},
                                                           $item,'reload',$context);                                                            $item,'reload',$context);
                     if (($context eq 'requestcourses') ||                      if (($context eq 'requestcourses') || 
                         ($context eq 'requestauthor')) {                          ($context eq 'requestauthor')) {
                         if ($env{'environment.canrequest.'.$item} ne $newacc) {                          if ($env{'environment.canrequest.'.$item} ne $newacc) {
                             $newenv{'environment.canrequest.'.$item} = $newacc;                              $newenv{'environment.canrequest.'.$item} = $newacc;
Line 5940  sub modify_quotas { Line 5796  sub modify_quotas {
                                         $cond = $conditions{$inconf{$type}};                                          $cond = $conditions{$inconf{$type}};
                                     }                                      }
                                     $resulttext .= '<li>'.&mt('Set to be available to [_1].',$typetitle).' '.$cond.'</li>';                                      $resulttext .= '<li>'.&mt('Set to be available to [_1].',$typetitle).' '.$cond.'</li>';
                                 } elsif ($context eq 'requestauthor') {  
                                     $resulttext .= '<li>'.&mt('Set to "[_1]" for "[_2]".',  
                                                              $titles{$inconf{$type}},$typetitle);  
   
                                 } else {                                  } else {
                                     $resulttext .= '<li>'.&mt('Set to be available to [_1]',$typetitle).'</li>';                                      $resulttext .= '<li>'.&mt('Set to be available to [_1]',$typetitle).'</li>';
                                 }                                  }
Line 6317  sub modify_autocreate { Line 6169  sub modify_autocreate {
             foreach my $item (@types) {              foreach my $item (@types) {
                 if ($changes{$item}) {                  if ($changes{$item}) {
                     my $newtxt = $offon[$newvals{$item}];                      my $newtxt = $offon[$newvals{$item}];
                     $resulttext .= '<li>'.                      $resulttext .= '<li>'.&mt("$title{$item} set to [_1]$newtxt [_2]",'<b>','</b>').'</li>';
                                    &mt("$title{$item} set to [_1]$newtxt [_2]",  
                                        '<b>','</b>').  
                                    '</li>';  
                 }                  }
             }              }
             if ($changes{'xmldc'}) {              if ($changes{'xmldc'}) {
                 my ($dcname,$dcdom) = split(':',$newvals{'xmldc'});                  my ($dcname,$dcdom) = split(':',$newvals{'xmldc'});
                 my $newtxt = &Apache::loncommon::plainname($dcname,$dcdom);                  my $newtxt = &Apache::loncommon::plainname($dcname,$dcdom);
                 $resulttext .= '<li>'.&mt("$title{'xmldc'} set to [_1]",'<b>'.$newtxt.'</b>').'</li>';                   $resulttext .= '<li>'.&mt("$title{'xmldc'} set to [_1]$newtxt [_2]",'<b>','</b>').'</li>'; 
             }              }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
         } else {          } else {
Line 6472  sub modify_directorysrch { Line 6321  sub modify_directorysrch {
                         } else {                          } else {
                             $chgtext =~ s/\; $//;                              $chgtext =~ s/\; $//;
                         }                          }
                         $resulttext .=                          $resulttext .= '<li>'.&mt("Users from domain '<span class=\"LC_cusr_emph\">[_1]</span>' permitted to search the institutional directory set to: [_2]",$dom,$chgtext).'</li>';
                             '<li>'.  
                             &mt("Users from domain '[_1]' permitted to search the institutional directory set to: [_2]",  
                                 '<span class="LC_cusr_emph">'.$dom.'</span>',$chgtext).  
                             '</li>';  
                     }                      }
                 }                  }
             }              }
Line 6504  sub modify_directorysrch { Line 6349  sub modify_directorysrch {
                     }                      }
                 }                  }
                 $chgtext =~ s/\; $//;                  $chgtext =~ s/\; $//;
                 $resulttext .= '<li>'.&mt($title{'searchtypes'}.' set to: "[_1]"',$chgtext).'</li>';                  $resulttext .= '<li>'.&mt("$title{'searchtypes'} set to: \"[_1]\"",$chgtext).'</li>';
             }              }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
         } else {          } else {
Line 6938  sub modify_usercreation { Line 6783  sub modify_usercreation {
                             if ($captchas{$cancreate{$type}}) {                              if ($captchas{$cancreate{$type}}) {
                                 $chgtext .= &mt("Validation for self-creation screen set to $captchas{$cancreate{$type}}.");                                  $chgtext .= &mt("Validation for self-creation screen set to $captchas{$cancreate{$type}}.");
                             } else {                              } else {
                                 $chgtext .= &mt('Validation for self-creation screen set to unknown type.');                                  $chgtext .= &mt('Validation for self-creation screen set to unknown type.'); 
                             }                              }
                         }                          }
                     } elsif ($type eq 'recaptchakeys') {                      } elsif ($type eq 'recaptchakeys') {
Line 7066  sub process_captcha { Line 6911  sub process_captcha {
         $newsettings->{'captcha'} = 'original';          $newsettings->{'captcha'} = 'original';
     }      }
     if ($current->{'captcha'} ne $newsettings->{'captcha'}) {      if ($current->{'captcha'} ne $newsettings->{'captcha'}) {
         if ($container eq 'cancreate') {          if (ref($changes->{'cancreate'}) eq 'ARRAY') {
             if (ref($changes->{'cancreate'}) eq 'ARRAY') {              push(@{$changes->{'cancreate'}},'captcha');
                 push(@{$changes->{'cancreate'}},'captcha');          } elsif (!defined($changes->{'cancreate'})) {
             } elsif (!defined($changes->{'cancreate'})) {              $changes->{'cancreate'} = ['captcha'];
                 $changes->{'cancreate'} = ['captcha'];  
             }  
         } else {  
             $changes->{'captcha'} = 1;  
         }          }
     }      }
     my ($newpub,$newpriv,$currpub,$currpriv);      my ($newpub,$newpriv,$currpub,$currpriv);
     if ($newsettings->{'captcha'} eq 'recaptcha') {      if ($newsettings->{'captcha'} eq 'recaptcha') {
         $newpub = $env{'form.'.$container.'_recaptchapub'};          $newpub = $env{'form.'.$container.'_recaptchapub'};
         $newpriv = $env{'form.'.$container.'_recaptchapriv'};          $newpriv = $env{'form.'.$container.'_recaptchapriv'};
         $newpub =~ s/\W//g;  
         $newpriv =~ s/\W//g;  
         $newsettings->{'recaptchakeys'} = {  
                                              public  => $newpub,  
                                              private => $newpriv,  
                                           };  
     }      }
       $newsettings->{'recaptchakeys'} = {
                                            public  => $newpub,
                                            private => $newpriv,
                                         };
     if (ref($current->{'recaptchakeys'}) eq 'HASH') {      if (ref($current->{'recaptchakeys'}) eq 'HASH') {
         $currpub = $current->{'recaptchakeys'}{'public'};          $currpub = $current->{'recaptchakeys'}{'public'};
         $currpriv = $current->{'recaptchakeys'}{'private'};          $currpriv = $current->{'recaptchakeys'}{'private'};
         unless ($newsettings->{'captcha'} eq 'recaptcha') {  
             $newsettings->{'recaptchakeys'} = {  
                                                  public  => '',  
                                                  private => '',  
                                               }  
         }  
     }      }
     if (($newpub ne $currpub) || ($newpriv ne $currpriv)) {      if (($newpub ne $currpub) || ($newpriv ne $currpriv)) {
         if ($container eq 'cancreate') {          if (ref($changes->{'cancreate'}) eq 'ARRAY') {
             if (ref($changes->{'cancreate'}) eq 'ARRAY') {              push(@{$changes->{'cancreate'}},'recaptchakeys');
                 push(@{$changes->{'cancreate'}},'recaptchakeys');          } elsif (!defined($changes->{'cancreate'})) {
             } elsif (!defined($changes->{'cancreate'})) {              $changes->{'cancreate'} = ['recaptchakeys'];
                 $changes->{'cancreate'} = ['recaptchakeys'];  
             }  
         } else {  
             $changes->{'recaptchakeys'} = 1;  
         }          }
     }      }
     return;      return;
Line 7789  sub modify_helpsettings { Line 7618  sub modify_helpsettings {
                 } elsif ($domconfig{'helpsettings'}{$item} ne $env{'form.'.$item}) {                  } elsif ($domconfig{'helpsettings'}{$item} ne $env{'form.'.$item}) {
                     $changes{$item} = 1;                      $changes{$item} = 1;
                 }                  }
     }              }
             if (($env{'form.'.$item} eq '0') || ($env{'form.'.$item} eq '1')) {              if (($env{'form.'.$item} eq '0') || ($env{'form.'.$item} eq '1')) { 
                 $helphash{'helpsettings'}{$item} = $env{'form.'.$item};                  $helphash{'helpsettings'}{$item} = $env{'form.'.$item};
             }              }
         }          }
Line 8181  sub modify_loadbalancing { Line 8010  sub modify_loadbalancing {
     my @sparestypes = ('primary','default');      my @sparestypes = ('primary','default');
     my %typetitles = &sparestype_titles();      my %typetitles = &sparestype_titles();
     my $resulttext;      my $resulttext;
     my (%currbalancer,%currtargets,%currrules,%existing);      if (keys(%servers) > 1) {
     if (ref($domconfig{'loadbalancing'}) eq 'HASH') {          my ($currbalancer,$currtargets,$currrules);
         %existing = %{$domconfig{'loadbalancing'}};          if (ref($domconfig{'loadbalancing'}) eq 'HASH') {
     }              $currbalancer = $domconfig{'loadbalancing'}{'lonhost'};
     &get_loadbalancers_config(\%servers,\%existing,\%currbalancer,              $currtargets = $domconfig{'loadbalancing'}{'targets'};
                               \%currtargets,\%currrules);              $currrules = $domconfig{'loadbalancing'}{'rules'};
     my ($saveloadbalancing,%defaultshash,%changes);          } else {
     my ($alltypes,$othertypes,$titles) =              ($currbalancer,$currtargets) = 
         &loadbalancing_titles($dom,$intdom,$usertypes,$types);                  &Apache::lonnet::get_lonbalancer_config(\%servers);
     my %ruletitles = &offloadtype_text();          }
     my @deletions = &Apache::loncommon::get_env_multiple('form.loadbalancing_delete');          my ($saveloadbalancing,%defaultshash,%changes);
     for (my $i=0; $i<$env{'form.loadbalancing_total'}; $i++) {          my ($alltypes,$othertypes,$titles) =
         my $balancer = $env{'form.loadbalancing_lonhost_'.$i};              &loadbalancing_titles($dom,$intdom,$usertypes,$types);
         if ($balancer eq '') {          my %ruletitles = &offloadtype_text();
             next;          my $balancer = $env{'form.loadbalancing_lonhost'};
         }          if (!$servers{$balancer}) {
         if (!exists($servers{$balancer})) {              undef($balancer);
             if (exists($currbalancer{$balancer})) {          }
                 push(@{$changes{'delete'}},$balancer);          if ($currbalancer ne $balancer) {
               $changes{'lonhost'} = 1;
           }
           $defaultshash{'loadbalancing'}{'lonhost'} = $balancer;
           if ($balancer ne '') {
               unless (ref($domconfig{'loadbalancing'}) eq 'HASH') {
                   $saveloadbalancing = 1;
             }              }
             next;              foreach my $sparetype (@sparestypes) {
         }                  my @targets = &Apache::loncommon::get_env_multiple('form.loadbalancing_target_'.$sparetype);
         if ((@deletions > 0) && (grep(/^\Q$i\E$/,@deletions))) {                  my @offloadto;
             push(@{$changes{'delete'}},$balancer);                  foreach my $target (@targets) {
             next;                      if (($servers{$target}) && ($target ne $balancer)) {
         }                          if ($sparetype eq 'default') {
         if (!exists($currbalancer{$balancer})) {                              if (ref($defaultshash{'loadbalancing'}{'targets'}{'primary'}) eq 'ARRAY') {
             push(@{$changes{'add'}},$balancer);                                  next if (grep(/^\Q$target\E$/,@{$defaultshash{'loadbalancing'}{'targets'}{'primary'}}));
         }                              }
         $defaultshash{'loadbalancing'}{$balancer}{'targets'}{'primary'} = [];                          }
         $defaultshash{'loadbalancing'}{$balancer}{'targets'}{'default'} = [];                          unless(grep(/^\Q$target\E$/,@offloadto)) {
         $defaultshash{'loadbalancing'}{$balancer}{'rules'} = {};                              push(@offloadto,$target);
         unless (ref($domconfig{'loadbalancing'}) eq 'HASH') {  
             $saveloadbalancing = 1;  
         }  
         foreach my $sparetype (@sparestypes) {  
             my @targets = &Apache::loncommon::get_env_multiple('form.loadbalancing_target_'.$i.'_'.$sparetype);  
             my @offloadto;  
             foreach my $target (@targets) {  
                 if (($servers{$target}) && ($target ne $balancer)) {  
                     if ($sparetype eq 'default') {  
                         if (ref($defaultshash{'loadbalancing'}{$balancer}{'targets'}{'primary'}) eq 'ARRAY') {  
                             next if (grep(/^\Q$target\E$/,@{$defaultshash{'loadbalancing'}{$balancer}{'targets'}{'primary'}}));  
                         }                          }
                     }                      }
                     unless(grep(/^\Q$target\E$/,@offloadto)) {                      $defaultshash{'loadbalancing'}{'targets'}{$sparetype} = \@offloadto;
                         push(@offloadto,$target);  
                     }  
                 }                  }
                 $defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype} = \@offloadto;              }
           } else {
               foreach my $sparetype (@sparestypes) {
                   $defaultshash{'loadbalancing'}{'targets'}{$sparetype} = [];
             }              }
         }          }
         if (ref($currtargets{$balancer}) eq 'HASH') {          if (ref($currtargets) eq 'HASH') {
             foreach my $sparetype (@sparestypes) {              foreach my $sparetype (@sparestypes) {
                 if (ref($currtargets{$balancer}{$sparetype}) eq 'ARRAY') {                  if (ref($currtargets->{$sparetype}) eq 'ARRAY') {
                     my @targetdiffs = &Apache::loncommon::compare_arrays($currtargets{$balancer}{$sparetype},$defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype});                      my @targetdiffs = &Apache::loncommon::compare_arrays($currtargets->{$sparetype},$defaultshash{'loadbalancing'}{'targets'}{$sparetype});
                     if (@targetdiffs > 0) {                      if (@targetdiffs > 0) {
                         $changes{'curr'}{$balancer}{'targets'} = 1;                          $changes{'targets'} = 1;
                     }                      }
                 } elsif (ref($defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}) eq 'ARRAY') {                  } elsif (ref($defaultshash{'loadbalancing'}{'targets'}{$sparetype}) eq 'ARRAY') {
                     if (@{$defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}} > 0) {                      if (@{$defaultshash{'loadbalancing'}{'targets'}{$sparetype}} > 0) {
                         $changes{'curr'}{$balancer}{'targets'} = 1;                          $changes{'targets'} = 1;
                     }                      }
                 }                  }
             }              }
         } else {          } else {
             if (ref($defaultshash{'loadbalancing'}{$balancer}) eq 'HASH') {              foreach my $sparetype (@sparestypes) {
                 foreach my $sparetype (@sparestypes) {                  if (ref($defaultshash{'loadbalancing'}{'targets'}{$sparetype}) eq 'ARRAY') {
                     if (ref($defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}) eq 'ARRAY') {                      if (@{$defaultshash{'loadbalancing'}{'targets'}{$sparetype}} > 0) {
                         if (@{$defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}} > 0) {                          $changes{'targets'} = 1;  
                             $changes{'curr'}{$balancer}{'targets'} = 1;  
                         }  
                     }                      }
                 }                  }
             }              }  
         }          }
         my $ishomedom;          my $ishomedom;
         if (&Apache::lonnet::host_domain($balancer) eq $dom) {          if ($balancer ne '') {
             $ishomedom = 1;              if (&Apache::lonnet::host_domain($balancer) eq $dom) {
                   $ishomedom = 1;
               }
         }          }
         if (ref($alltypes) eq 'ARRAY') {          if (ref($alltypes) eq 'ARRAY') {
             foreach my $type (@{$alltypes}) {              foreach my $type (@{$alltypes}) {
                 my $rule;                  my $rule;
                 unless ((($type eq '_LC_external') || ($type eq '_LC_internetdom')) &&                  if ($balancer ne '') {
                       unless ((($type eq '_LC_external') || ($type eq '_LC_internetdom')) && 
                          (!$ishomedom)) {                           (!$ishomedom)) {
                     $rule = $env{'form.loadbalancing_rules_'.$i.'_'.$type};                          $rule = $env{'form.loadbalancing_rules_'.$type};
                 }                      }
                 if ($rule eq 'specific') {                      if ($rule eq 'specific') {
                     $rule = $env{'form.loadbalancing_singleserver_'.$i.'_'.$type};                          $rule = $env{'form.loadbalancing_singleserver_'.$type};
                       }
                 }                  }
                 $defaultshash{'loadbalancing'}{$balancer}{'rules'}{$type} = $rule;                  $defaultshash{'loadbalancing'}{'rules'}{$type} = $rule;
                 if (ref($currrules{$balancer}) eq 'HASH') {                  if (ref($currrules) eq 'HASH') {
                     if ($rule ne $currrules{$balancer}{$type}) {                      if ($rule ne $currrules->{$type}) {
                         $changes{'curr'}{$balancer}{'rules'}{$type} = 1;                          $changes{'rules'}{$type} = 1;
                     }                      }
                 } elsif ($rule ne '') {                  } elsif ($rule ne '') {
                     $changes{'curr'}{$balancer}{'rules'}{$type} = 1;                      $changes{'rules'}{$type} = 1;
                 }                  }
             }              }
         }          }
     }          my $nochgmsg = &mt('No changes made to Load Balancer settings.');
     my $nochgmsg = &mt('No changes made to Load Balancer settings.');          if ((keys(%changes) > 0) || ($saveloadbalancing)) {
     if ((keys(%changes) > 0) || ($saveloadbalancing)) {              my $putresult = &Apache::lonnet::put_dom('configuration',
         unless (ref($defaultshash{'loadbalancing'}) eq 'HASH') {                                                       \%defaultshash,$dom);
             $defaultshash{'loadbalancing'} = {};              if ($putresult eq 'ok') {
         }                  if (keys(%changes) > 0) {
         my $putresult = &Apache::lonnet::put_dom('configuration',                      if ($changes{'lonhost'}) {
                                                  \%defaultshash,$dom);                          if ($currbalancer ne '') {
                               &Apache::lonnet::remote_devalidate_cache($currbalancer,'loadbalancing',$dom);
         if ($putresult eq 'ok') {                          }
             if (keys(%changes) > 0) {                          if ($balancer eq '') {
                 if (ref($changes{'delete'}) eq 'ARRAY') {                              $resulttext .= '<li>'.&mt('Load Balancing with dedicated server discontinued').'</li>'; 
                     foreach my $balancer (sort(@{$changes{'delete'}})) {                          } else {
                         $resulttext .= '<li>'.&mt('Load Balancing discontinued for: [_1]',$balancer).'</li>';                              &Apache::lonnet::remote_devalidate_cache($balancer,'loadbalancing',$dom);
                               $resulttext .= '<li>'.&mt('Dedicated Load Balancer server set to [_1]',$balancer);
                           }
                       } else {
                         &Apache::lonnet::remote_devalidate_cache($balancer,'loadbalancing',$dom);                          &Apache::lonnet::remote_devalidate_cache($balancer,'loadbalancing',$dom);
                     }                      }
                 }                      if (($changes{'targets'}) && ($balancer ne '')) {
                 if (ref($changes{'add'}) eq 'ARRAY') {                          my %offloadstr;
                     foreach my $balancer (sort(@{$changes{'add'}})) {                          foreach my $sparetype (@sparestypes) {
                         $resulttext .= '<li>'.&mt('Load Balancing enabled for: [_1]',$balancer);                              if (ref($defaultshash{'loadbalancing'}{'targets'}{$sparetype}) eq 'ARRAY') {
                     }                                  if (@{$defaultshash{'loadbalancing'}{'targets'}{$sparetype}} > 0) {
                 }                                      $offloadstr{$sparetype} = join(', ',@{$defaultshash{'loadbalancing'}{'targets'}{$sparetype}});
                 if (ref($changes{'curr'}) eq 'HASH') {  
                     foreach my $balancer (sort(keys(%{$changes{'curr'}}))) {  
                         if (ref($changes{'curr'}{$balancer}) eq 'HASH') {  
                             if ($changes{'curr'}{$balancer}{'targets'}) {  
                                 my %offloadstr;  
                                 foreach my $sparetype (@sparestypes) {  
                                     if (ref($defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}) eq 'ARRAY') {  
                                         if (@{$defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}} > 0) {  
                                             $offloadstr{$sparetype} = join(', ',@{$defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}});  
                                         }  
                                     }  
                                 }                                  }
                                 if (keys(%offloadstr) == 0) {                              }
                                     $resulttext .= '<li>'.&mt("Servers to which Load Balance server offloads set to 'None', by default").'</li>';                          }
                           if (keys(%offloadstr) == 0) {
                               $resulttext .= '<li>'.&mt("Servers to which Load Balance server offloads set to 'None', by default").'</li>';
                           } else {
                               my $showoffload;
                               foreach my $sparetype (@sparestypes) {
                                   $showoffload .= '<i>'.$typetitles{$sparetype}.'</i>:&nbsp;';
                                   if (defined($offloadstr{$sparetype})) {
                                       $showoffload .= $offloadstr{$sparetype};
                                 } else {                                  } else {
                                     my $showoffload;                                      $showoffload .= &mt('None');
                                     foreach my $sparetype (@sparestypes) {  
                                         $showoffload .= '<i>'.$typetitles{$sparetype}.'</i>:&nbsp;';  
                                         if (defined($offloadstr{$sparetype})) {  
                                             $showoffload .= $offloadstr{$sparetype};  
                                         } else {  
                                             $showoffload .= &mt('None');  
                                         }  
                                         $showoffload .= ('&nbsp;'x3);  
                                     }  
                                     $resulttext .= '<li>'.&mt('By default, Load Balancer: [_1] set to offload to - [_2]',$balancer,$showoffload).'</li>';  
                                 }                                  }
                                   $showoffload .= ('&nbsp;'x3);
                             }                              }
                               $resulttext .= '<li>'.&mt('By default, Load Balancer server set to offload to: [_1]',$showoffload).'</li>';
                         }                          }
                         if (ref($changes{'curr'}{$balancer}{'rules'}) eq 'HASH') {                      }
                             if ((ref($alltypes) eq 'ARRAY') && (ref($titles) eq 'HASH')) {                      if ((ref($changes{'rules'}) eq 'HASH') && ($balancer ne '')) {
                                 foreach my $type (@{$alltypes}) {                          if ((ref($alltypes) eq 'ARRAY') && (ref($titles) eq 'HASH')) {
                                     if ($changes{'curr'}{$balancer}{'rules'}{$type}) {                              foreach my $type (@{$alltypes}) {
                                         my $rule = $defaultshash{'loadbalancing'}{$balancer}{'rules'}{$type};                                  if ($changes{'rules'}{$type}) {
                                         my $balancetext;                                      my $rule = $defaultshash{'loadbalancing'}{'rules'}{$type};
                                         if ($rule eq '') {                                      my $balancetext;
                                             $balancetext =  $ruletitles{'default'};                                      if ($rule eq '') {
                                         } elsif (($rule eq 'homeserver') || ($rule eq 'externalbalancer')) {                                          $balancetext =  $ruletitles{'default'};
                                             $balancetext =  $ruletitles{$rule};                                      } elsif (($rule eq 'homeserver') || ($rule eq 'externalbalancer')) {
                                         } else {                                          $balancetext =  $ruletitles{$rule};
                                             $balancetext = &mt('offload to [_1]',$defaultshash{'loadbalancing'}{$balancer}{'rules'}{$type});                                      } else {
                                         }                                          $balancetext = &mt('offload to [_1]',$defaultshash{'loadbalancing'}{'rules'}{$type});
                                         $resulttext .= '<li>'.&mt('Load Balancer: [_1] -- balancing for [_2] set to - "[_3]"',$balancer,$titles->{$type},$balancetext).'</li>';   
                                     }                                      }
                                       $resulttext .= '<li>'.&mt('Load Balancing for [_1] set to: [_2]',$titles->{$type},$balancetext).'</li>';     
                                 }                                  }
                             }                              }
                         }                          }
                         &Apache::lonnet::remote_devalidate_cache($balancer,'loadbalancing',$dom);  
                     }                      }
                 }                      if ($resulttext ne '') {
                 if ($resulttext ne '') {                          $resulttext = &mt('Changes made:').'<ul>'.$resulttext.'</ul>';
                     $resulttext = &mt('Changes made:').'<ul>'.$resulttext.'</ul>';                      } else {
                           $resulttext = $nochgmsg;
                       }
                 } else {                  } else {
                     $resulttext = $nochgmsg;                      $resulttext = $nochgmsg;
                       if ($balancer ne '') {
                           &Apache::lonnet::remote_devalidate_cache($balancer,'loadbalancing',$dom);
                       }
                 }                  }
             } else {              } else {
                 $resulttext = $nochgmsg;                  $resulttext = '<span class="LC_error">'.
                                 &mt('An error occurred: [_1]',$putresult).'</span>';
             }              }
         } else {          } else {
             $resulttext = '<span class="LC_error">'.              $resulttext = $nochgmsg;
                           &mt('An error occurred: [_1]',$putresult).'</span>';  
         }          }
     } else {      } else {
         $resulttext = $nochgmsg;          $resulttext =  &mt('Load Balancing unavailable as this domain only has one server.');
     }      }
     return $resulttext;      return $resulttext;
 }  }
Line 8405  sub recurse_cat_deletes { Line 8228  sub recurse_cat_deletes {
                 delete($coursecategories->{$subitem});                  delete($coursecategories->{$subitem});
                 $deletions->{$subitem} = 1;                  $deletions->{$subitem} = 1;
                 &recurse_cat_deletes($subitem,$coursecategories,$deletions);                  &recurse_cat_deletes($subitem,$coursecategories,$deletions);
             }                }
         }          }
     }      }
     return;      return;
Line 8471  sub active_dc_picker { Line 8294  sub active_dc_picker {
                           '<input type="radio" name="autocreate_xmldc"'.                            '<input type="radio" name="autocreate_xmldc"'.
                           ' value="'.$dcs[$i].'"'.$check.'/>'.                            ' value="'.$dcs[$i].'"'.$check.'/>'.
                           &Apache::loncommon::plainname($dcname,$dcdom).                            &Apache::loncommon::plainname($dcname,$dcdom).
                           ' ('.$dcname.':'.$dcdom.')'.  
                           '</label></span></td>';                            '</label></span></td>';
         }          }
         $datatable .= '</tr></table>';          $datatable .= '</tr></table>';
Line 8523  sub count_servers { Line 8345  sub count_servers {
 }  }
   
 sub lonbalance_targets_js {  sub lonbalance_targets_js {
     my ($dom,$types,$servers,$settings) = @_;      my ($dom,$types,$servers) = @_;
     my $select = &mt('Select');      my $select = &mt('Select');
     my ($alltargets,$allishome,$allinsttypes,@alltypes);      my ($alltargets,$allishome,$allinsttypes,@alltypes);
     if (ref($servers) eq 'HASH') {      if (ref($servers) eq 'HASH') {
Line 8545  sub lonbalance_targets_js { Line 8367  sub lonbalance_targets_js {
     }      }
     push(@alltypes,'default','_LC_adv','_LC_author','_LC_internetdom','_LC_external');      push(@alltypes,'default','_LC_adv','_LC_author','_LC_internetdom','_LC_external');
     $allinsttypes = join("','",@alltypes);      $allinsttypes = join("','",@alltypes);
     my (%currbalancer,%currtargets,%currrules,%existing);  
     if (ref($settings) eq 'HASH') {  
         %existing = %{$settings};  
     }  
     &get_loadbalancers_config($servers,\%existing,\%currbalancer,  
                               \%currtargets,\%currrules);  
     my $balancers = join("','",sort(keys(%currbalancer)));  
     return <<"END";      return <<"END";
   
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
   
 currBalancers = new Array('$balancers');  function toggleTargets() {
       var balancer = document.display.loadbalancing_lonhost.options[document.display.loadbalancing_lonhost.selectedIndex].value;
 function toggleTargets(balnum) {  
     var lonhostitem = document.getElementById('loadbalancing_lonhost_'+balnum);  
     var prevhostitem = document.getElementById('loadbalancing_prevlonhost_'+balnum);  
     var balancer = lonhostitem.options[lonhostitem.selectedIndex].value;  
     var prevbalancer = prevhostitem.value;  
     var baltotal = document.getElementById('loadbalancing_total').value;  
     prevhostitem.value = balancer;  
     if (prevbalancer != '') {  
         var prevIdx = currBalancers.indexOf(prevbalancer);  
         if (prevIdx != -1) {  
             currBalancers.splice(prevIdx,1);  
         }  
     }  
     if (balancer == '') {      if (balancer == '') {
         hideSpares(balnum);          hideSpares();
     } else {      } else {
         var currIdx = currBalancers.indexOf(balancer);  
         if (currIdx == -1) {  
             currBalancers.push(balancer);  
         }  
         var homedoms = new Array('$allishome');          var homedoms = new Array('$allishome');
         var ishomedom = homedoms[lonhostitem.selectedIndex];          var ishomedom = homedoms[document.display.loadbalancing_lonhost.selectedIndex];
         showSpares(balancer,ishomedom,balnum);          showSpares(balancer,ishomedom);
     }      }
     balancerChange(balnum,baltotal,'change',prevbalancer,balancer);  
     return;      return;
 }  }
   
 function showSpares(balancer,ishomedom,balnum) {  function showSpares(balancer,ishomedom) {
     var alltargets = new Array('$alltargets');      var alltargets = new Array('$alltargets');
     var insttypes = new Array('$allinsttypes');      var insttypes = new Array('$allinsttypes');
     var offloadtypes = new Array('primary','default');      var offloadtypes = new Array('primary','default');
   
     document.getElementById('loadbalancing_targets_'+balnum).style.display='block';      document.getElementById('loadbalancing_targets').style.display='block';
     document.getElementById('loadbalancing_disabled_'+balnum).style.display='none';      document.getElementById('loadbalancing_disabled').style.display='none';
     
     for (var i=0; i<offloadtypes.length; i++) {      for (var i=0; i<offloadtypes.length; i++) {
         var count = 0;          var count = 0;
         for (var j=0; j<alltargets.length; j++) {          for (var j=0; j<alltargets.length; j++) {
             if (alltargets[j] != balancer) {              if (alltargets[j] != balancer) {
                 var item = document.getElementById('loadbalancing_target_'+balnum+'_'+offloadtypes[i]+'_'+count);                  document.getElementById('loadbalancing_target_'+offloadtypes[i]+'_'+count).value = alltargets[j];
                 item.value = alltargets[j];                  document.getElementById('loadbalancing_targettxt_'+offloadtypes[i]+'_'+count).style.textAlign='left';
                 item.style.textAlign='left';                  document.getElementById('loadbalancing_targettxt_'+offloadtypes[i]+'_'+count).style.textFace='normal';
                 item.style.textFace='normal';                  document.getElementById('loadbalancing_targettxt_'+offloadtypes[i]+'_'+count).innerHTML = alltargets[j];
                 document.getElementById('loadbalancing_targettxt_'+balnum+'_'+offloadtypes[i]+'_'+count).innerHTML = alltargets[j];  
                 if (currBalancers.indexOf(alltargets[j]) == -1) {  
                     item.disabled = '';  
                 } else {  
                     item.disabled = 'disabled';  
                     item.checked = false;  
                 }  
                 count ++;                  count ++;
             }              }
         }          }
Line 8617  function showSpares(balancer,ishomedom,b Line 8407  function showSpares(balancer,ishomedom,b
     for (var k=0; k<insttypes.length; k++) {      for (var k=0; k<insttypes.length; k++) {
         if ((insttypes[k] == '_LC_external') || (insttypes[k] == '_LC_internetdom')) {          if ((insttypes[k] == '_LC_external') || (insttypes[k] == '_LC_internetdom')) {
             if (ishomedom == 1) {              if (ishomedom == 1) {
                 document.getElementById('balanceruletitle_'+balnum+'_'+insttypes[k]).style.display='block';                  document.getElementById('balanceruletitle_'+insttypes[k]).style.display='block';
                 document.getElementById('balancerule_'+balnum+'_'+insttypes[k]).style.display='block';                  document.getElementById('balancerule_'+insttypes[k]).style.display='block';
             } else {              } else {
                 document.getElementById('balanceruletitle_'+balnum+'_'+insttypes[k]).style.display='none';                  document.getElementById('balanceruletitle_'+insttypes[k]).style.display='none';
                 document.getElementById('balancerule_'+balnum+'_'+insttypes[k]).style.display='none';                  document.getElementById('balancerule_'+insttypes[k]).style.display='none';
   
             }              }
         } else {          } else {
             document.getElementById('balanceruletitle_'+balnum+'_'+insttypes[k]).style.display='block';              document.getElementById('balanceruletitle_'+insttypes[k]).style.display='block';
             document.getElementById('balancerule_'+balnum+'_'+insttypes[k]).style.display='block';              document.getElementById('balancerule_'+insttypes[k]).style.display='block';
         }          }
         if ((insttypes[k] != '_LC_external') &&           if ((insttypes[k] != '_LC_external') && 
             ((insttypes[k] != '_LC_internetdom') ||              ((insttypes[k] != '_LC_internetdom') ||
              ((insttypes[k] == '_LC_internetdom') && (ishomedom == 1)))) {               ((insttypes[k] == '_LC_internetdom') && (ishomedom == 1)))) {
             var item = document.getElementById('loadbalancing_singleserver_'+balnum+'_'+insttypes[k]);              document.getElementById('loadbalancing_singleserver_'+insttypes[k]).options[0] = new Option("","",true,true);
             item.options.length = 0;  
             item.options[0] = new Option("","",true,true);  
             var idx = 0;  
             for (var m=0; m<alltargets.length; m++) {              for (var m=0; m<alltargets.length; m++) {
                 if ((currBalancers.indexOf(alltargets[m]) == -1) && (alltargets[m] != balancer)) {                  var idx = m+1;
                     idx ++;                  if (alltargets[m] != balancer) {
                     item.options[idx] = new Option(alltargets[m],alltargets[m],false,false);                      document.getElementById('loadbalancing_singleserver_'+insttypes[k]).options[idx] = new Option(alltargets[m],alltargets[m],false,false);
   
                 }                  }
             }              }
         }          }
Line 8647  function showSpares(balancer,ishomedom,b Line 8433  function showSpares(balancer,ishomedom,b
     return;      return;
 }  }
   
 function hideSpares(balnum) {  function hideSpares() {
     var alltargets = new Array('$alltargets');      var alltargets = new Array('$alltargets');
     var insttypes = new Array('$allinsttypes');      var insttypes = new Array('$allinsttypes');
     var offloadtypes = new Array('primary','default');      var offloadtypes = new Array('primary','default');
   
     document.getElementById('loadbalancing_targets_'+balnum).style.display='none';      document.getElementById('loadbalancing_targets').style.display='none';
     document.getElementById('loadbalancing_disabled_'+balnum).style.display='block';      document.getElementById('loadbalancing_disabled').style.display='block';
   
     var total = alltargets.length - 1;      var total = alltargets.length - 1;
     for (var i=0; i<offloadtypes; i++) {      for (var i=0; i<offloadtypes; i++) {
         for (var j=0; j<total; j++) {          for (var j=0; j<total; j++) {
            document.getElementById('loadbalancing_target_'+balnum+'_'+offloadtypes[i]+'_'+j).checked = false;             document.getElementById('loadbalancing_target_'+offloadtypes[i]+'_'+j).checked = false;
            document.getElementById('loadbalancing_target_'+balnum+'_'+offloadtypes[i]+'_'+j).value = '';             document.getElementById('loadbalancing_target_'+offloadtypes[i]+'_'+j).value = '';
            document.getElementById('loadbalancing_targettxt_'+balnum+'_'+offloadtypes[i]+'_'+j).innerHTML = '';             document.getElementById('loadbalancing_targettxt_'+offloadtypes[i]+'_'+j).innerHTML = '';
         }          }
     }      }
     for (var k=0; k<insttypes.length; k++) {      for (var k=0; k<insttypes.length; k++) {
         document.getElementById('balanceruletitle_'+balnum+'_'+insttypes[k]).style.display='none';          document.getElementById('balanceruletitle_'+insttypes[k]).style.display='none';
         document.getElementById('balancerule_'+balnum+'_'+insttypes[k]).style.display='none';          document.getElementById('balancerule_'+insttypes[k]).style.display='none';
         if (insttypes[k] != '_LC_external') {          if (insttypes[k] != '_LC_external') {
             document.getElementById('loadbalancing_singleserver_'+balnum+'_'+insttypes[k]).length = 0;              document.getElementById('loadbalancing_singleserver_'+insttypes[k]).length = 0;
             document.getElementById('loadbalancing_singleserver_'+balnum+'_'+insttypes[k]).options[0] = new Option("","",true,true);              document.getElementById('loadbalancing_singleserver_'+insttypes[k]).options[0] = new Option("","",true,true);
         }          }
     }      }
     return;      return;
 }  }
   
 function checkOffloads(item,balnum,type) {  function checkOffloads(item,type) {
     var alltargets = new Array('$alltargets');      var alltargets = new Array('$alltargets');
     var offloadtypes = new Array('primary','default');      var offloadtypes = new Array('primary','default');
     if (item.checked) {      if (item.checked) {
Line 8686  function checkOffloads(item,balnum,type) Line 8472  function checkOffloads(item,balnum,type)
             other = offloadtypes[0];              other = offloadtypes[0];
         }          }
         for (var i=0; i<total; i++) {          for (var i=0; i<total; i++) {
             var server = document.getElementById('loadbalancing_target_'+balnum+'_'+other+'_'+i).value;              var server = document.getElementById('loadbalancing_target_'+other+'_'+i).value;
             if (server == item.value) {              if (server == item.value) {
                 if (document.getElementById('loadbalancing_target_'+balnum+'_'+other+'_'+i).checked) {                  if (document.getElementById('loadbalancing_target_'+other+'_'+i).checked) {
                     document.getElementById('loadbalancing_target_'+balnum+'_'+other+'_'+i).checked = false;                      document.getElementById('loadbalancing_target_'+other+'_'+i).checked = false;
                 }                  }
             }              }
         }          }
Line 8697  function checkOffloads(item,balnum,type) Line 8483  function checkOffloads(item,balnum,type)
     return;      return;
 }  }
   
 function singleServerToggle(balnum,type) {  function singleServerToggle(type) {
     var offloadtoSelIdx = document.getElementById('loadbalancing_singleserver_'+balnum+'_'+type).selectedIndex;      var offloadtoSelIdx = document.getElementById('loadbalancing_singleserver_'+type).selectedIndex;
     if (offloadtoSelIdx == 0) {      if (offloadtoSelIdx == 0) {
         document.getElementById('loadbalancing_rules_'+balnum+'_'+type+'_0').checked = true;          document.getElementById('loadbalancing_rules_'+type+'_0').checked = true;
         document.getElementById('loadbalancing_singleserver_'+balnum+'_'+type).options[0].text = '';          document.getElementById('loadbalancing_singleserver_'+type).options[0].text = '';
   
     } else {      } else {
         document.getElementById('loadbalancing_rules_'+balnum+'_'+type+'_2').checked = true;          document.getElementById('loadbalancing_rules_'+type+'_2').checked = true;
         document.getElementById('loadbalancing_singleserver_'+balnum+'_'+type).options[0].text = '$select';          document.getElementById('loadbalancing_singleserver_'+type).options[0].text = '$select';
     }      }
     return;      return;
 }  }
   
 function balanceruleChange(formname,balnum,type) {  function balanceruleChange(formname,type) {
     if (type == '_LC_external') {      if (type == '_LC_external') {
         return;           return; 
     }      }
     var typesRules = getIndicesByName(formname,'loadbalancing_rules_'+balnum+'_'+type);      var typesRules = getIndicesByName(formname,'loadbalancing_rules_'+type);
     for (var i=0; i<typesRules.length; i++) {      for (var i=0; i<typesRules.length; i++) {
         if (formname.elements[typesRules[i]].checked) {          if (formname.elements[typesRules[i]].checked) {
             if (formname.elements[typesRules[i]].value != 'specific') {              if (formname.elements[typesRules[i]].value != 'specific') {
                 document.getElementById('loadbalancing_singleserver_'+balnum+'_'+type).selectedIndex = 0;                  document.getElementById('loadbalancing_singleserver_'+type).selectedIndex = 0;
                 document.getElementById('loadbalancing_singleserver_'+balnum+'_'+type).options[0].text = '';                  document.getElementById('loadbalancing_singleserver_'+type).options[0].text = '';
             } else {              } else {
                 document.getElementById('loadbalancing_singleserver_'+balnum+'_'+type).options[0].text = '$select';                  document.getElementById('loadbalancing_singleserver_'+type).options[0].text = '$select';
             }  
         }  
     }  
     return;  
 }  
   
 function balancerDeleteChange(balnum) {  
     var hostitem = document.getElementById('loadbalancing_lonhost_'+balnum);  
     var baltotal = document.getElementById('loadbalancing_total').value;  
     var addtarget;  
     var removetarget;  
     var action = 'delete';  
     if (document.getElementById('loadbalancing_delete_'+balnum)) {  
         var lonhost = hostitem.value;  
         var currIdx = currBalancers.indexOf(lonhost);  
         if (document.getElementById('loadbalancing_delete_'+balnum).checked) {  
             if (currIdx != -1) {  
                 currBalancers.splice(currIdx,1);  
             }  
             addtarget = lonhost;  
         } else {  
             if (currIdx == -1) {  
                 currBalancers.push(lonhost);  
             }  
             removetarget = lonhost;  
             action = 'undelete';  
         }  
         balancerChange(balnum,baltotal,action,addtarget,removetarget);  
     }  
     return;  
 }  
   
 function balancerChange(balnum,baltotal,action,addtarget,removetarget) {  
     if (baltotal > 1) {  
         var offloadtypes = new Array('primary','default');  
         var alltargets = new Array('$alltargets');  
         var insttypes = new Array('$allinsttypes');  
         for (var i=0; i<baltotal; i++) {  
             if (i != balnum) {  
                 for (var j=0; j<offloadtypes.length; j++) {  
                     var total = alltargets.length - 1;  
                     for (var k=0; k<total; k++) {  
                         var serveritem = document.getElementById('loadbalancing_target_'+i+'_'+offloadtypes[j]+'_'+k);  
                         var server = serveritem.value;  
                         if ((action == 'delete') || (action == 'change' && addtarget != ''))  {  
                             if (server == addtarget) {  
                                 serveritem.disabled = '';  
                             }  
                         }  
                         if ((action == 'undelete') || (action == 'change' && removetarget != '')) {  
                             if (server == removetarget) {  
                                 serveritem.disabled = 'disabled';  
                                 serveritem.checked = false;  
                             }  
                         }  
                     }  
                 }  
                 for (var j=0; j<insttypes.length; j++) {  
                     if (insttypes[j] != '_LC_external') {  
                         if (document.getElementById('loadbalancing_singleserver_'+i+'_'+insttypes[j])) {  
                             var singleserver = document.getElementById('loadbalancing_singleserver_'+i+'_'+insttypes[j]);  
                             var currSel = singleserver.selectedIndex;  
                             var currVal = singleserver.options[currSel].value;  
                             if ((action == 'delete') || (action == 'change' && addtarget != '')) {  
                                 var numoptions = singleserver.options.length;  
                                 var needsnew = 1;  
                                 for (var k=0; k<numoptions; k++) {  
                                     if (singleserver.options[k] == addtarget) {  
                                         needsnew = 0;  
                                         break;  
                                     }  
                                 }  
                                 if (needsnew == 1) {  
                                     singleserver.options[numoptions] = new Option(addtarget,addtarget,false,false);  
                                 }  
                             }  
                             if ((action == 'undelete') || (action == 'change' && removetarget != '')) {  
                                 singleserver.options.length = 0;  
                                 if ((currVal) && (currVal != removetarget)) {  
                                     singleserver.options[0] = new Option("","",false,false);  
                                 } else {  
                                     singleserver.options[0] = new Option("","",true,true);  
                                 }  
                                 var idx = 0;  
                                 for (var m=0; m<alltargets.length; m++) {  
                                     if (currBalancers.indexOf(alltargets[m]) == -1) {  
                                         idx ++;  
                                         if (currVal == alltargets[m]) {  
                                             singleserver.options[idx] = new Option(alltargets[m],alltargets[m],true,true);  
                                         } else {  
                                             singleserver.options[idx] = new Option(alltargets[m],alltargets[m],false,false);  
                                         }  
                                     }  
                                 }  
                             }  
                         }  
                     }  
                 }  
             }              }
         }          }
     }      }

Removed from v.1.160.6.14  
changed lines
  Added in v.1.168


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>