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

version 1.160.6.13, 2013/01/09 21:37:04 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 1061  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 1193  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 1207  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 1340  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 1369  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 1505  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 1716  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 1861  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 1965  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 2391  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 2758  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 2885  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 2901  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 3121  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 3135  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 3159  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 3180  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 3260  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 3401  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 3457  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 3484  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 3499  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 4717  sub modify_login { Line 4613  sub modify_login {
                                 $new = '';                                   $new = ''; 
                             }                              }
                         }                          }
   
                         $loginhash{login}{loginvia}{$lonhost}{$item} = $new;                          $loginhash{login}{loginvia}{$lonhost}{$item} = $new;
                     }                      }
                 }                  }
Line 4809  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 4827  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 4923  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 5403  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 5411  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 5582  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 5666  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 5677  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 5867  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 5888  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 5902  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 5936  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 6313  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 6468  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 6500  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 6934  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 7062  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 7785  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 8177  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 8401  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 8467  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 8519  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 8541  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 8613  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 8643  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 8682  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 8693  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.13  
changed lines
  Added in v.1.168


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.