Diff for /loncom/interface/domainprefs.pm between versions 1.160.6.26 and 1.186

version 1.160.6.26, 2013/09/29 06:55:58 version 1.186, 2013/01/09 21:30:27
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 94  about default quota sizes for portfolio Line 94  about default quota sizes for portfolio
 institutional affiliation in the domain (e.g., Faculty, Staff, Student etc.),   institutional affiliation in the domain (e.g., Faculty, Staff, Student etc.), 
 but is now also used to manage availability of user tools:   but is now also used to manage availability of user tools: 
 i.e., blogs, aboutme page, and portfolios, and the course request tool,  i.e., blogs, aboutme page, and portfolios, and the course request tool,
 used by course owners to request creation of a course, and to display/store  used by course owners to request creation of a course.
 default quota sizes for authoring spaces.  
   
 Outputs: 1  Outputs: 1
   
Line 211  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','coursedefaults',                  'serverstatuses','requestcourses','helpsettings',
                 'usersessions','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','coursedefaults','usersessions');                         'serverstatuses','helpsettings',
                          'coursedefaults','usersessions');
     my %existing;      my %existing;
     if (ref($domconfig{'loadbalancing'}) eq 'HASH') {      if (ref($domconfig{'loadbalancing'}) eq 'HASH') {
         %existing = %{$domconfig{'loadbalancing'}};          %existing = %{$domconfig{'loadbalancing'}};
Line 253  sub handler { Line 254  sub handler {
                                   col2 => 'Value'}],                                    col2 => 'Value'}],
                     },                      },
         'quotas' =>           'quotas' => 
                     { text => 'Blogs, personal web pages, webDAV/quotas, portfolios',                      { text => 'Blogs, personal web pages, webDAV, portfolios',
                       help => 'Domain_Configuration_Quotas',                        help => 'Domain_Configuration_Quotas',
                       header => [{col1 => 'User affiliation',                        header => [{col1 => 'User affiliation',
                                   col2 => 'Available tools',                                    col2 => 'Available tools',
                                   col3 => 'Quotas, Mb; (Authoring requires role)',}],                                    col3 => 'Portfolio quota',}],
                     },                      },
         'autoenroll' =>          'autoenroll' =>
                    { text => 'Auto-enrollment settings',                     { text => 'Auto-enrollment settings',
Line 354  sub handler { Line 355  sub handler {
                               col3 => 'Specific IPs',                                col3 => 'Specific IPs',
                             }],                              }],
                  },                   },
         'coursedefaults' =>          'helpsettings' =>
                    {text   => 'Help page settings',
                     help   => 'Domain_Configuration_Help_Settings',
                     header => [{col1 => 'Help Settings (logged-in users)',
                                 col2 => 'Value'}],
                    },
           'coursedefaults' => 
                  {text => 'Course/Community defaults',                   {text => 'Course/Community defaults',
                   help => 'Domain_Configuration_Course_Defaults',                    help => 'Domain_Configuration_Course_Defaults',
                   header => [{col1 => 'Defaults which can be overridden for each course by a DC',                    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',},],                                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 392  sub handler { Line 407  sub handler {
                            };                             };
     }      }
   
   
   
     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
Line 400  sub handler { Line 417  sub handler {
     my $confname = $dom.'-domainconfig';      my $confname = $dom.'-domainconfig';
   
     if ($phase eq 'process') {      if ($phase eq 'process') {
         if (&Apache::lonconfigsettings::make_changes($r,$dom,$phase,$context,\@prefs_order,          &Apache::lonconfigsettings::make_changes($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,\@roles);
                                                      \%prefs,\%domconfig,$confname,\@roles) eq 'update') {  
             $r->rflush();  
             &devalidate_remote_domconfs($dom);  
         }  
     } elsif ($phase eq 'display') {      } elsif ($phase eq 'display') {
         my $js = &recaptcha_js().          my $js = &recaptcha_js();
                  &credits_js();  
         if ((keys(%servers) > 1) || (keys(%existing) > 0)) {          if ((keys(%servers) > 1) || (keys(%existing) > 0)) {
             my ($othertitle,$usertypes,$types) =              my ($othertitle,$usertypes,$types) =
                 &Apache::loncommon::sorted_inst_types($dom);                  &Apache::loncommon::sorted_inst_types($dom);
Line 426  sub handler { Line 438  sub handler {
         unless ($configuserok eq 'ok') {          unless ($configuserok eq 'ok') {
             &Apache::lonconfigsettings::print_header($r,$phase,$context);              &Apache::lonconfigsettings::print_header($r,$phase,$context);
             $r->print(&mt('The domain configuration user "[_1]" has yet to be created.',              $r->print(&mt('The domain configuration user "[_1]" has yet to be created.',
                           $confname).                             $confname).
                       '<br />'                        '<br />'
             );              );
             if ($switchserver) {              if ($switchserver) {
Line 480  sub handler { Line 492  sub handler {
                 }                  }
             }              }
         }          }
   
         &Apache::lonconfigsettings::display_choices($r,$phase,$context,\@prefs_order,\%prefs);          &Apache::lonconfigsettings::display_choices($r,$phase,$context,\@prefs_order,\%prefs);
     }      }
     return OK;      return OK;
 }  }
   
 sub process_changes {  sub process_changes {
     my ($r,$dom,$confname,$action,$roles,$values,$lastactref) = @_;      my ($r,$dom,$confname,$action,$roles,$values) = @_;
     my %domconfig;      my %domconfig;
     if (ref($values) eq 'HASH') {      if (ref($values) eq 'HASH') {
         %domconfig = %{$values};          %domconfig = %{$values};
     }      }
     my $output;      my $output;
     if ($action eq 'login') {      if ($action eq 'login') {
         $output = &modify_login($r,$dom,$confname,$lastactref,%domconfig);          $output = &modify_login($r,$dom,$confname,%domconfig);
     } elsif ($action eq 'rolecolors') {      } elsif ($action eq 'rolecolors') {
         $output = &modify_rolecolors($r,$dom,$confname,$roles,          $output = &modify_rolecolors($r,$dom,$confname,$roles,
                                      $lastactref,%domconfig);                                       %domconfig);
     } elsif ($action eq 'quotas') {      } elsif ($action eq 'quotas') {
         $output = &modify_quotas($dom,$action,%domconfig);          $output = &modify_quotas($dom,$action,%domconfig);
     } elsif ($action eq 'autoenroll') {      } elsif ($action eq 'autoenroll') {
         $output = &modify_autoenroll($dom,$lastactref,%domconfig);          $output = &modify_autoenroll($dom,%domconfig);
     } elsif ($action eq 'autoupdate') {      } elsif ($action eq 'autoupdate') {
         $output = &modify_autoupdate($dom,%domconfig);          $output = &modify_autoupdate($dom,%domconfig);
     } elsif ($action eq 'autocreate') {      } elsif ($action eq 'autocreate') {
Line 512  sub process_changes { Line 525  sub process_changes {
     } elsif ($action eq 'usermodification') {      } elsif ($action eq 'usermodification') {
         $output = &modify_usermodification($dom,%domconfig);          $output = &modify_usermodification($dom,%domconfig);
     } elsif ($action eq 'contacts') {      } elsif ($action eq 'contacts') {
         $output = &modify_contacts($dom,$lastactref,%domconfig);          $output = &modify_contacts($dom,%domconfig);
     } elsif ($action eq 'defaults') {      } elsif ($action eq 'defaults') {
         $output = &modify_defaults($dom,$r,%domconfig);          $output = &modify_defaults($dom,$r);
     } elsif ($action eq 'scantron') {      } elsif ($action eq 'scantron') {
         $output = &modify_scantron($r,$dom,$confname,$lastactref,%domconfig);          $output = &modify_scantron($r,$dom,$confname,%domconfig);
     } elsif ($action eq 'coursecategories') {      } elsif ($action eq 'coursecategories') {
         $output = &modify_coursecategories($dom,%domconfig);          $output = &modify_coursecategories($dom,%domconfig);
     } elsif ($action eq 'serverstatuses') {      } elsif ($action eq 'serverstatuses') {
Line 525  sub process_changes { Line 538  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') {      } elsif ($action eq 'coursedefaults') {
         $output = &modify_coursedefaults($dom,%domconfig);          $output = &modify_coursedefaults($dom,%domconfig);
     } elsif ($action eq 'usersessions') {      } elsif ($action eq 'usersessions') {
Line 539  sub print_config_box { Line 554  sub print_config_box {
     my ($r,$dom,$confname,$phase,$action,$item,$settings) = @_;      my ($r,$dom,$confname,$phase,$action,$item,$settings) = @_;
     my $rowtotal = 0;      my $rowtotal = 0;
     my $output;      my $output;
   
     if ($action eq 'coursecategories') {      if ($action eq 'coursecategories') {
         $output = &coursecategories_javascript($settings);          $output = &coursecategories_javascript($settings);
     }      }
Line 557  sub print_config_box { Line 573  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 596  sub print_config_box { Line 612  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 685  sub print_config_box { Line 703  sub print_config_box {
               <td class="LC_right_item">'.&mt($item->{'header'}->[2]->{'col2'}).'</td>      </tr>'.                <td class="LC_right_item">'.&mt($item->{'header'}->[2]->{'col2'}).'</td>      </tr>'.
                        &print_usersessions('bottom',$dom,$settings,\$rowtotal);                         &print_usersessions('bottom',$dom,$settings,\$rowtotal);
             $rowtotal ++;              $rowtotal ++;
           } elsif ($action eq 'coursedefaults') {
               $output .= &print_coursedefaults('bottom',$dom,$settings,\$rowtotal);
         } elsif ($action eq 'rolecolors') {          } elsif ($action eq 'rolecolors') {
             $output .= &print_rolecolors($phase,'coordinator',$dom,$confname,$settings,\$rowtotal).'              $output .= &print_rolecolors($phase,'coordinator',$dom,$confname,$settings,\$rowtotal).'
            </table>             </table>
Line 781  sub print_config_box { Line 801  sub print_config_box {
             $output .= &print_helpsettings($dom,$confname,$settings,\$rowtotal);              $output .= &print_helpsettings($dom,$confname,$settings,\$rowtotal);
         } elsif ($action eq 'loadbalancing') {          } elsif ($action eq 'loadbalancing') {
             $output .= &print_loadbalancing($dom,$settings,\$rowtotal);              $output .= &print_loadbalancing($dom,$settings,\$rowtotal);
         } elsif ($action eq 'coursedefaults') {  
             $output .= &print_coursedefaults('bottom',$dom,$settings,\$rowtotal);  
         }          }
     }      }
     $output .= '      $output .= '
Line 868  sub print_login { Line 886  sub print_login {
     } elsif ($caller eq 'page') {      } elsif ($caller eq 'page') {
         my %defaultchecked = (           my %defaultchecked = ( 
                                'coursecatalog' => 'on',                                 'coursecatalog' => 'on',
                                'helpdesk'      => 'on',  
                                'adminmail'     => 'off',                                 'adminmail'     => 'off',
                                'newuser'       => 'off',                                 'newuser'       => 'off',
                              );                               );
         my @toggles = ('coursecatalog','adminmail','helpdesk','newuser');          my @toggles = ('coursecatalog','adminmail','newuser');
         my (%checkedon,%checkedoff);          my (%checkedon,%checkedoff);
         foreach my $item (@toggles) {          foreach my $item (@toggles) {
             if ($defaultchecked{$item} eq 'on') {               if ($defaultchecked{$item} eq 'on') { 
Line 1088  sub login_choices { Line 1105  sub login_choices {
         &Apache::lonlocal::texthash (          &Apache::lonlocal::texthash (
             coursecatalog => 'Display Course/Community Catalog link?',              coursecatalog => 'Display Course/Community Catalog link?',
             adminmail     => "Display Administrator's E-mail Address?",              adminmail     => "Display Administrator's E-mail Address?",
             helpdesk      => 'Display "Contact Helpdesk" link',  
             disallowlogin => "Login page requests redirected",              disallowlogin => "Login page requests redirected",
             hostid        => "Server",              hostid        => "Server",
             server        => "Redirect to:",              server        => "Redirect to:",
Line 1126  sub print_rolecolors { Line 1142  sub print_rolecolors {
     my %designhash = &Apache::loncommon::get_domainconf($dom);      my %designhash = &Apache::loncommon::get_domainconf($dom);
     my %defaultdesign = %Apache::loncommon::defaultdesign;      my %defaultdesign = %Apache::loncommon::defaultdesign;
     my (%is_custom,%designs);      my (%is_custom,%designs);
     my %defaults = &role_defaults($role,\@bgs,\@links,\@images);      my %defaults = (
                      img => $defaultdesign{$role.'.img'},
                      font => $defaultdesign{$role.'.font'},
      fontmenu => $defaultdesign{$role.'.fontmenu'},
                      );
       foreach my $item (@bgs) {
           $defaults{'bgs'}{$item} = $defaultdesign{$role.'.'.$item};
       }
       foreach my $item (@links) {
           $defaults{'links'}{$item} = $defaultdesign{$role.'.'.$item};
       }
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         if (ref($settings->{$role}) eq 'HASH') {          if (ref($settings->{$role}) eq 'HASH') {
             if ($settings->{$role}->{'img'} ne '') {              if ($settings->{$role}->{'img'} ne '') {
Line 1187  sub print_rolecolors { Line 1213  sub print_rolecolors {
     return $datatable;      return $datatable;
 }  }
   
 sub role_defaults {  
     my ($role,$bgs,$links,$images,$logintext) = @_;  
     my %defaults;  
     unless ((ref($bgs) eq 'ARRAY') && (ref($links) eq 'ARRAY') && (ref($images) eq 'ARRAY')) {  
         return %defaults;  
     }  
     my %defaultdesign = %Apache::loncommon::defaultdesign;  
     if ($role eq 'login') {  
         %defaults = (  
                        font => $defaultdesign{$role.'.font'},  
                     );  
         if (ref($logintext) eq 'ARRAY') {  
             foreach my $item (@{$logintext}) {  
                 $defaults{'logintext'}{$item} = $defaultdesign{$role.'.'.$item};  
             }  
         }  
         foreach my $item (@{$images}) {  
             $defaults{'showlogo'}{$item} = 1;  
         }  
     } else {  
         %defaults = (  
                        img => $defaultdesign{$role.'.img'},  
                        font => $defaultdesign{$role.'.font'},  
                        fontmenu => $defaultdesign{$role.'.fontmenu'},  
                     );  
     }  
     foreach my $item (@{$bgs}) {  
         $defaults{'bgs'}{$item} = $defaultdesign{$role.'.'.$item};  
     }  
     foreach my $item (@{$links}) {  
         $defaults{'links'}{$item} = $defaultdesign{$role.'.'.$item};  
     }  
     foreach my $item (@{$images}) {  
         $defaults{$item} = $defaultdesign{$role.'.'.$item};  
     }  
     return %defaults;  
 }  
   
 sub display_color_options {  sub display_color_options {
     my ($dom,$confname,$phase,$role,$itemcount,$choices,$is_custom,$defaults,$designs,      my ($dom,$confname,$phase,$role,$itemcount,$choices,$is_custom,$defaults,$designs,
         $images,$bgs,$links,$alt_text,$rowtotal,$logintext) = @_;          $images,$bgs,$links,$alt_text,$rowtotal,$logintext) = @_;
Line 1241  sub display_color_options { Line 1229  sub display_color_options {
   
     $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" class="colorchooser" size="10" name="'.$role.'_font"'.
                   ' value="'.$current_color.'" />&nbsp;'.                    ' value="'.$current_color.'" />&nbsp;'. 
                   '&nbsp;</td></tr>';                    '&nbsp;</td></tr>';
     unless ($role eq 'login') {       unless ($role eq 'login') { 
         $datatable .= '<tr'.$css_class.'>'.          $datatable .= '<tr'.$css_class.'>'.
Line 1251  sub display_color_options { Line 1239  sub display_color_options {
         } else {          } else {
             $datatable .= '<td>&nbsp;</td>';              $datatable .= '<td>&nbsp;</td>';
         }          }
  $current_color = $designs->{'fontmenu'} ?   $current_color = $designs->{'fontmenu'} ? 
     $designs->{'fontmenu'} : $defaults->{'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 class="colorchooser" type="text" size="10" name="'
Line 1272  sub display_color_options { Line 1260  sub display_color_options {
                     &login_header_options($img,$role,$defaults,$is_custom,$choices);                      &login_header_options($img,$role,$defaults,$is_custom,$choices);
                 $logincolors =                  $logincolors =
                     &login_text_colors($img,$role,$logintext,$phase,$choices,                      &login_text_colors($img,$role,$logintext,$phase,$choices,
                                        $designs,$defaults);                                              $designs);
             } elsif ($img ne 'domlogo') {              } elsif ($img ne 'domlogo') {
                 $datatable.= &logo_display_options($img,$defaults,$designs);                  $datatable.= &logo_display_options($img,$defaults,$designs);
             }              }
Line 1351  sub display_color_options { Line 1339  sub display_color_options {
                 $datatable .= &image_changes($is_custom->{$img},$alt_text->{$img},$img_import,                  $datatable .= &image_changes($is_custom->{$img},$alt_text->{$img},$img_import,
                                              $showfile,$fullsize,$role,$img,$imgfile,$logincolors);                                               $showfile,$fullsize,$role,$img,$imgfile,$logincolors);
             } else {              } else {
                 $datatable .= '<td>&nbsp;</td><td class="LC_left_item">'.                  $datatable .= '<td colspan="2" class="LC_right_item"><br />'.
                               &mt('Upload:').'<br />';                                &mt('Upload:');
             }              }
         } else {          } else {
             $datatable .= '<td>&nbsp;</td><td class="LC_left_item">'.              $datatable .= '<td colspan="2" class="LC_right_item"><br />'.
                           &mt('Upload:').'<br />';                            &mt('Upload:');
         }          }
         if ($switchserver) {          if ($switchserver) {
             $datatable .= &mt('Upload to library server: [_1]',$switchserver);              $datatable .= &mt('Upload to library server: [_1]',$switchserver);
Line 1386  sub display_color_options { Line 1374  sub display_color_options {
                   '<table border="0"><tr>';                    '<table border="0"><tr>';
   
     foreach my $item (@{$bgs}) {      foreach my $item (@{$bgs}) {
         $datatable .= '<td align="center">'.$choices->{$item};          $datatable .= '<td align="center">';
  my $color = $designs->{'bgs'}{$item} ? $designs->{'bgs'}{$item} : $defaults->{'bgs'}{$item};   my $color = $designs->{'bgs'}{$item} ? $designs->{'bgs'}{$item} : $defaults->{'bgs'}{$item};
         if ($designs->{'bgs'}{$item}) {          if ($designs->{'bgs'}{$item}) {
             $datatable .= '&nbsp;';              $datatable .= '&nbsp;';
Line 1414  sub display_color_options { Line 1402  sub display_color_options {
                   '<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};   my $color = $designs->{'link'}{$item} ? $designs->{'link'}{$item} : $defaults->{'links'}{$item};
         $datatable .= '<td align="center">'.$choices->{$item}."\n";          $datatable .= '<td align="center">'."\n";
   
         if ($designs->{'links'}{$item}) {          if ($designs->{'links'}{$item}) {
             $datatable.='&nbsp;';              $datatable.='&nbsp;';
         }          }
Line 1472  sub login_header_options  { Line 1461  sub login_header_options  {
 }  }
   
 sub login_text_colors {  sub login_text_colors {
     my ($img,$role,$logintext,$phase,$choices,$designs,$defaults) = @_;      my ($img,$role,$logintext,$phase,$choices,$designs) = @_;
     my $color_menu = '<table border="0"><tr>';      my $color_menu = '<table border="0"><tr>';
     foreach my $item (@{$logintext}) {      foreach my $item (@{$logintext}) {
         $color_menu .= '<td align="center">'.$choices->{$item};          my $link = &color_pick($phase,$role,$item,$choices->{$item},$designs->{'logintext'}{$item});
         my $color = $designs->{'logintext'}{$item} ? $designs->{'logintext'}{$item} : $defaults->{'logintext'}{$item};          $color_menu .= '<td align="center">'.$link;
         $color_menu .= '<br /><input type="text" class="colorchooser" size="8" name="'.$role.'_'.$item.'" value="'.$color.          if ($designs->{'logintext'}{$item}) {
                       '" onblur = "javascript:colchg_span('."'css_".$role.'_'.$item."'".',this);" /></td>';              $color_menu .= '&nbsp;<span id="css_'.$role.'_'.$item.'" style="background-color: '.$designs->{'logintext'}{$item}.';">&nbsp;&nbsp;&nbsp;</span>';
           }
           $color_menu .= '<br /><input type="text" size="8" name="'.$role.'_'.$item.'" value="'.
                          $designs->{'logintext'}{$item}.'" onblur = "javascript:colchg_span('."'css_".$role.'_'.$item."'".',this);" /></td>'.
                          '<td>&nbsp;</td>';
     }      }
     $color_menu .= '</tr></table><br />';      $color_menu .= '</tr></table><br />';
     return $color_menu;      return $color_menu;
Line 1510  sub image_changes { Line 1503  sub image_changes {
                        $role.'_del_'.$img.'" value="1" />'.&mt('Delete?').                         $role.'_del_'.$img.'" value="1" />'.&mt('Delete?').
                        '</label>&nbsp;'.&mt('Replace:').'</span><br />';                         '</label>&nbsp;'.&mt('Replace:').'</span><br />';
         } else {          } else {
             $output .= '<td valign="middle">'.$logincolors.&mt('Upload:').'<br />';              $output .= '<td valign="bottom">'.$logincolors.&mt('Upload:').'<br />';
         }          }
     }      }
     return $output;      return $output;
 }  }
   
   sub color_pick {
       my ($phase,$role,$item,$desc,$curcol) = @_;
       my $link = '<a href="javascript:pjump('."'color_custom','".$desc.
                  "','".$curcol."','".$role.'_'.$item."','parmform.pres','psub'".
                  ');">'.$desc.'</a>';
       return $link;
   }
   
 sub print_quotas {  sub print_quotas {
     my ($dom,$settings,$rowtotal,$action) = @_;      my ($dom,$settings,$rowtotal,$action) = @_;
     my $context;      my $context;
Line 1524  sub print_quotas { Line 1525  sub print_quotas {
     } else {      } else {
         $context = $action;          $context = $action;
     }      }
     my ($datatable,$defaultquota,$authorquota,@usertools,@options,%validations);      my ($datatable,$defaultquota,@usertools,@options,%validations);
     my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);      my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
     my $typecount = 0;      my $typecount = 0;
     my ($css_class,%titles);      my ($css_class,%titles);
Line 1536  sub print_quotas { Line 1537  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();
     }      }
     if (ref($types) eq 'ARRAY') {      if (ref($types) eq 'ARRAY') {
         foreach my $type (@{$types}) {          foreach my $type (@{$types}) {
             my ($currdefquota,$currauthorquota);              my $currdefquota;
             unless (($context eq 'requestcourses') ||              unless (($context eq 'requestcourses') ||
                     ($context eq 'requestauthor')) {                      ($context eq 'requestauthor')) {
                 if (ref($settings) eq 'HASH') {                  if (ref($settings) eq 'HASH') {
                     if (ref($settings->{defaultquota}) eq 'HASH') {                      if (ref($settings->{defaultquota}) eq 'HASH') {
                         $currdefquota = $settings->{defaultquota}->{$type};                          $currdefquota = $settings->{defaultquota}->{$type}; 
                     } else {                      } else {
                         $currdefquota = $settings->{$type};                          $currdefquota = $settings->{$type};
                     }                      }
                     if (ref($settings->{authorquota}) eq 'HASH') {  
                         $currauthorquota = $settings->{authorquota}->{$type};  
                     }  
                 }                  }
             }              }
             if (defined($usertypes->{$type})) {              if (defined($usertypes->{$type})) {
Line 1668  sub print_quotas { Line 1666  sub print_quotas {
                 unless (($context eq 'requestcourses') ||                  unless (($context eq 'requestcourses') ||
                         ($context eq 'requestauthor')) {                          ($context eq 'requestauthor')) {
                     $datatable .=                       $datatable .= 
                               '<td class="LC_right_item">'.                                '<td class="LC_right_item"><span class="LC_nobreak">'.
                               '<span class="LC_nobreak">'.&mt('Portfolio').':&nbsp;'.  
                               '<input type="text" name="quota_'.$type.                                '<input type="text" name="quota_'.$type.
                               '" value="'.$currdefquota.                                '" value="'.$currdefquota.
                               '" size="5" /></span>'.('&nbsp;' x 2).                                '" size="5" /> Mb</span></td>';
                               '<span class="LC_nobreak">'.&mt('Authoring').':&nbsp;'.  
                               '<input type="text" name="authorquota_'.$type.  
                               '" value="'.$currauthorquota.  
                               '" size="5" /></span></td>';  
                 }                  }
                 $datatable .= '</tr>';                  $datatable .= '</tr>';
             }              }
Line 1684  sub print_quotas { Line 1677  sub print_quotas {
     }      }
     unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) {      unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) {
         $defaultquota = '20';          $defaultquota = '20';
         $authorquota = '500';  
         if (ref($settings) eq 'HASH') {          if (ref($settings) eq 'HASH') {
             if (ref($settings->{'defaultquota'}) eq 'HASH') {              if (ref($settings->{'defaultquota'}) eq 'HASH') {
                 $defaultquota = $settings->{'defaultquota'}->{'default'};                  $defaultquota = $settings->{'defaultquota'}->{'default'};
             } elsif (defined($settings->{'default'})) {              } elsif (defined($settings->{'default'})) {
                 $defaultquota = $settings->{'default'};                  $defaultquota = $settings->{'default'};
             }              }
             if (ref($settings->{'authorquota'}) eq 'HASH') {  
                 $authorquota = $settings->{'authorquota'}->{'default'};  
             }  
         }          }
     }      }
     $typecount ++;      $typecount ++;
Line 1804  sub print_quotas { Line 1793  sub print_quotas {
     }      }
     $datatable .= '</td>';      $datatable .= '</td>';
     unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) {      unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) {
         $datatable .= '<td class="LC_right_item">'.          $datatable .= '<td class="LC_right_item"><span class="LC_nobreak">'.
                       '<span class="LC_nobreak">'.&mt('Portfolio').':&nbsp;'.  
                       '<input type="text" name="defaultquota" value="'.                        '<input type="text" name="defaultquota" value="'.
                       $defaultquota.'" size="5" /></span>'.('&nbsp;' x2).                        $defaultquota.'" size="5" /> Mb</span></td>';
                       '<span class="LC_nobreak">'.&mt('Authoring').':&nbsp;'.  
                       '<input type="text" name="authorquota" value="'.  
                       $authorquota.'" size="5" /></span></td>';  
     }      }
     $datatable .= '</tr>';      $datatable .= '</tr>';
     $typecount ++;      $typecount ++;
     $css_class = $typecount%2?' class="LC_odd_row"':'';      $css_class = $typecount%2?' class="LC_odd_row"':'';
     $datatable .= '<tr'.$css_class.'>'.      $datatable .= '<tr'.$css_class.'>'.
                   '<td>'.&mt('LON-CAPA Advanced Users').'<br />';                    '<td>'.&mt('LON-CAPA Advanced Users').' ';
     if ($context eq 'requestcourses') {      if ($context eq 'requestcourses') {
         $datatable .= &mt('(overrides affiliation, if set)').          $datatable .= &mt('(overrides affiliation, if set)').
                       '</td>'.                        '</td>'.
Line 1943  sub print_quotas { Line 1928  sub print_quotas {
   
 sub print_requestmail {  sub print_requestmail {
     my ($dom,$action,$settings,$rowtotal) = @_;      my ($dom,$action,$settings,$rowtotal) = @_;
     my ($now,$datatable,%currapp);      my ($now,$datatable,%dompersonnel,@domcoord,@currapproval,$rows);
     $now = time;      $now = time;
       $rows = 0;
       %dompersonnel = &Apache::lonnet::get_domain_roles($dom,['dc'],$now,$now);
       foreach my $server (keys(%dompersonnel)) {
           foreach my $user (sort(keys(%{$dompersonnel{$server}}))) {
               my ($trole,$uname,$udom,$runame,$rudom,$rsec) = split(/:/,$user);
               if (!grep(/^$uname:$udom$/,@domcoord)) {
                   push(@domcoord,$uname.':'.$udom);
               }
           }
       }
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         if (ref($settings->{'notify'}) eq 'HASH') {          if (ref($settings->{'notify'}) eq 'HASH') {
             if ($settings->{'notify'}{'approval'} ne '') {              if ($settings->{'notify'}{'approval'} ne '') {
                map {$currapp{$_}=1;} split(/,/,$settings->{'notify'}{'approval'});                 @currapproval = split(',',$settings->{'notify'}{'approval'});
             }              }
         }          }
     }      }
     my $numinrow = 2;      if (@currapproval) {
           foreach my $dc (@currapproval) {
               unless (grep(/^\Q$dc\E$/,@domcoord)) {
                   push(@domcoord,$dc);
               }
           }
       }
       @domcoord = sort(@domcoord);
       my $numinrow = 4;
       my $numdc = @domcoord;
     my $css_class = 'class="LC_odd_row"';      my $css_class = 'class="LC_odd_row"';
     my $text;      my $text;
     if ($action eq 'requestcourses') {      if ($action eq 'requestcourses') {
Line 1963  sub print_requestmail { Line 1967  sub print_requestmail {
     $datatable = '<tr '.$css_class.'>'.      $datatable = '<tr '.$css_class.'>'.
                  ' <td>'.$text.'</td>'.                   ' <td>'.$text.'</td>'.
                  ' <td class="LC_left_item">';                   ' <td class="LC_left_item">';
     my ($numdc,$table,$rows) = &active_dc_picker($dom,$numinrow,'checkbox',      if (@domcoord > 0) {
                                                  'reqapprovalnotify',%currapp);          $datatable .= '<table>';
     if ($numdc > 0) {          for (my $i=0; $i<$numdc; $i++) {
         $datatable .= $table;              my $rem = $i%($numinrow);
               if ($rem == 0) {
                   if ($i > 0) {
                       $datatable .= '</tr>';
                   }
                   $datatable .= '<tr>';
                   $rows ++;
               }
               my $check = ' ';
               if (grep(/^\Q$domcoord[$i]\E$/,@currapproval)) {
                   $check = ' checked="checked" ';
               }
               my ($uname,$udom) = split(':',$domcoord[$i]);
               my $fullname = &Apache::loncommon::plainname($uname,$udom);
               if ($i == $numdc-1) {
                   my $colsleft = $numinrow-$rem;
                   if ($colsleft > 1) {
                       $datatable .= '<td colspan="'.$colsleft.'" class="LC_left_item">';
                   } else {
                       $datatable .= '<td class="LC_left_item">';
                   }
               } else {
                   $datatable .= '<td class="LC_left_item">';
               }
               $datatable .= '<span class="LC_nobreak"><label>'.
                             '<input type="checkbox" name="reqapprovalnotify" '.
                             'value="'.$domcoord[$i].'"'.$check.'/>'.
                             $fullname.' ('.$uname.':'.$udom.')</label></span></td>';
           }
           $datatable .= '</tr></table>';
     } else {      } else {
         $datatable .= &mt('There are no active Domain Coordinators');          $datatable .= &mt('There are no active Domain Coordinators');
           $rows ++;
     }      }
     $datatable .='</td></tr>';      $datatable .='</td></tr>';
     $$rowtotal += $rows;      $$rowtotal += $rows;
Line 2123  sub print_autoupdate { Line 2157  sub print_autoupdate {
   
 sub print_autocreate {  sub print_autocreate {
     my ($dom,$settings,$rowtotal) = @_;      my ($dom,$settings,$rowtotal) = @_;
     my (%createon,%createoff,%currhash);      my (%createon,%createoff);
       my $curr_dc;
     my @types = ('xml','req');      my @types = ('xml','req');
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         foreach my $item (@types) {          foreach my $item (@types) {
Line 2136  sub print_autocreate { Line 2171  sub print_autocreate {
                 }                  }
             }              }
         }          }
         if ($settings->{'xmldc'} ne '') {          $curr_dc = $settings->{'xmldc'};
             $currhash{$settings->{'xmldc'}} = 1;  
         }  
     } else {      } else {
         foreach my $item (@types) {          foreach my $item (@types) {
             $createoff{$item} = ' checked="checked" ';              $createoff{$item} = ' checked="checked" ';
Line 2146  sub print_autocreate { Line 2179  sub print_autocreate {
         }          }
     }      }
     $$rowtotal += 2;      $$rowtotal += 2;
     my $numinrow = 2;  
     my $datatable='<tr class="LC_odd_row">'.      my $datatable='<tr class="LC_odd_row">'.
                   '<td>'.&mt('Create pending official courses from XML files').'</td>'.                    '<td>'.&mt('Create pending official courses from XML files').'</td>'.
                   '<td class="LC_right_item"><span class="LC_nobreak"><label>'.                    '<td class="LC_right_item"><span class="LC_nobreak"><label>'.
Line 2161  sub print_autocreate { Line 2193  sub print_autocreate {
                   $createon{'req'}.' value="1" />'.&mt('Yes').'</label>&nbsp;'.                    $createon{'req'}.' value="1" />'.&mt('Yes').'</label>&nbsp;'.
                   '<label><input type="radio" name="autocreate_req"'.                    '<label><input type="radio" name="autocreate_req"'.
                   $createoff{'req'}.' value="0" />'.&mt('No').'</label></span>';                    $createoff{'req'}.' value="0" />'.&mt('No').'</label></span>';
     my ($numdc,$dctable,$rows) = &active_dc_picker($dom,$numinrow,'radio',      my ($numdc,$dctable) = &active_dc_picker($dom,$curr_dc);
                                                    'autocreate_xmldc',%currhash);  
     if ($numdc > 1) {      if ($numdc > 1) {
         $datatable .= '</td></tr><tr class="LC_odd_row"><td>'.          $datatable .= '</td></tr><tr class="LC_odd_row"><td>'.
                       &mt('Course creation processed as: (choose Dom. Coord.)').                        &mt('Course creation processed as: (choose Dom. Coord.)').
                       '</td><td class="LC_left_item">'.$dctable.'</td></tr>';                        '</td><td class="LC_left_item">'.$dctable.'</td></tr>';
           $$rowtotal ++ ;
     } else {      } else {
         $datatable .= $dctable.'</td></tr>';          $datatable .= $dctable.'</td></tr>';
     }      }
     $$rowtotal += $rows;  
     return $datatable;      return $datatable;
 }  }
   
Line 2293  sub print_contacts { Line 2324  sub print_contacts {
     my @contacts = ('adminemail','supportemail');      my @contacts = ('adminemail','supportemail');
     my (%checked,%to,%otheremails,%bccemails);      my (%checked,%to,%otheremails,%bccemails);
     my @mailings = ('errormail','packagesmail','lonstatusmail','helpdeskmail',      my @mailings = ('errormail','packagesmail','lonstatusmail','helpdeskmail',
                     'requestsmail','updatesmail','idconflictsmail');                      'requestsmail');
     foreach my $type (@mailings) {      foreach my $type (@mailings) {
         $otheremails{$type} = '';          $otheremails{$type} = '';
     }      }
Line 2329  sub print_contacts { Line 2360  sub print_contacts {
         $checked{'helpdeskmail'}{'supportemail'} = ' checked="checked" ';          $checked{'helpdeskmail'}{'supportemail'} = ' checked="checked" ';
         $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" ';           $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; 
         $checked{'requestsmail'}{'adminemail'} = ' checked="checked" ';          $checked{'requestsmail'}{'adminemail'} = ' checked="checked" ';
         $checked{'updatesmail'}{'adminemail'} = ' checked="checked" ';  
         $checked{'idconflictsmail'}{'adminemail'} = ' checked="checked" ';  
     }      }
     my ($titles,$short_titles) = &contact_titles();      my ($titles,$short_titles) = &contact_titles();
     my $rownum = 0;      my $rownum = 0;
     my $css_class;      my $css_class;
     foreach my $item (@contacts) {      foreach my $item (@contacts) {
           $rownum ++;
         $css_class = $rownum%2?' class="LC_odd_row"':'';          $css_class = $rownum%2?' class="LC_odd_row"':'';
         $datatable .= '<tr'.$css_class.'>'.           $datatable .= '<tr'.$css_class.'>'. 
                   '<td><span class="LC_nobreak">'.$titles->{$item}.                    '<td><span class="LC_nobreak">'.$titles->{$item}.
                   '</span></td><td class="LC_right_item">'.                    '</span></td><td class="LC_right_item">'.
                   '<input type="text" name="'.$item.'" value="'.                    '<input type="text" name="'.$item.'" value="'.
                   $to{$item}.'" /></td></tr>';                    $to{$item}.'" /></td></tr>';
         $rownum ++;  
     }      }
     foreach my $type (@mailings) {      foreach my $type (@mailings) {
           $rownum ++;
         $css_class = $rownum%2?' class="LC_odd_row"':'';          $css_class = $rownum%2?' class="LC_odd_row"':'';
         $datatable .= '<tr'.$css_class.'>'.          $datatable .= '<tr'.$css_class.'>'.
                       '<td><span class="LC_nobreak">'.                        '<td><span class="LC_nobreak">'.
Line 2367  sub print_contacts { Line 2397  sub print_contacts {
                           'value="'.$bccemails{$type}.'"  />';                            'value="'.$bccemails{$type}.'"  />';
         }          }
         $datatable .= '</td></tr>'."\n";          $datatable .= '</td></tr>'."\n";
         $rownum ++;  
     }      }
     my %choices;  
     $choices{'reporterrors'} = &mt('E-mail error reports to [_1]',  
                                    &Apache::loncommon::modal_link('http://loncapa.org/core.html',  
                                    &mt('LON-CAPA core group - MSU'),600,500));  
     $choices{'reportupdates'} = &mt('E-mail record of completed LON-CAPA updates to [_1]',  
                                     &Apache::loncommon::modal_link('http://loncapa.org/core.html',  
                                     &mt('LON-CAPA core group - MSU'),600,500));  
     my @toggles = ('reporterrors','reportupdates');  
     my %defaultchecked = ('reporterrors'  => 'on',  
                           'reportupdates' => 'on');  
     (my $reports,$rownum) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked,  
                                                \%choices,$rownum);  
     $datatable .= $reports;  
     $$rowtotal += $rownum;      $$rowtotal += $rownum;
     return $datatable;      return $datatable;
 }  }
Line 2403  sub print_helpsettings { Line 2419  sub print_helpsettings {
 }  }
   
 sub radiobutton_prefs {  sub radiobutton_prefs {
     my ($settings,$toggles,$defaultchecked,$choices,$itemcount,$onclick,      my ($settings,$toggles,$defaultchecked,$choices,$itemcount) = @_;
         $additional) = @_;  
     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'));
   
Line 2430  sub radiobutton_prefs { Line 2445  sub radiobutton_prefs {
             }              }
         }          }
     }      }
     if ($onclick) {  
         $onclick = ' onclick="'.$onclick.'"';  
     }  
     foreach my $item (@{$toggles}) {      foreach my $item (@{$toggles}) {
         $css_class = $itemcount%2?' class="LC_odd_row"':'';          $css_class = $itemcount%2?' class="LC_odd_row"':'';
         $datatable .=          $datatable .=
             '<tr'.$css_class.'><td valign="top">'.              '<tr'.$css_class.'><td><span class="LC_nobreak">'.$choices->{$item}.
             '<span class="LC_nobreak">'.$choices->{$item}.  
             '</span></td>'.              '</span></td>'.
             '<td class="LC_right_item"><span class="LC_nobreak">'.              '<td class="LC_right_item"><span class="LC_nobreak">'.
             '<label><input type="radio" name="'.              '<label><input type="radio" name="'.
             $item.'" '.$checkedon{$item}.' value="1"'.$onclick.' />'.&mt('Yes').              $item.'" '.$checkedon{$item}.' value="1" />'.&mt('Yes').
             '</label>&nbsp;<label><input type="radio" name="'.$item.'" '.              '</label>&nbsp;<label><input type="radio" name="'.$item.'" '.
             $checkedoff{$item}.' value="0"'.$onclick.' />'.&mt('No').'</label>'.              $checkedoff{$item}.' value="0" />'.&mt('No').'</label>'.
             '</span>'.$additional.              '</span></td>'.
             '</td>'.  
             '</tr>';              '</tr>';
         $itemcount ++;          $itemcount ++;
     }      }
Line 2454  sub radiobutton_prefs { Line 2464  sub radiobutton_prefs {
   
 sub print_coursedefaults {  sub print_coursedefaults {
     my ($position,$dom,$settings,$rowtotal) = @_;      my ($position,$dom,$settings,$rowtotal) = @_;
     my ($css_class,$datatable,%checkedon,%checkedoff,%defaultchecked,@toggles);      my ($css_class,$datatable);
     my $itemcount = 1;      my $itemcount = 1;
     my %choices =  &Apache::lonlocal::texthash (  
         canuse_pdfforms      => 'Course/Community users can create/upload PDF forms',  
         uploadquota          => 'Default quota for files uploaded directly to course/community using Course Editor (MB)',  
         anonsurvey_threshold => 'Responder count needed before showing submissions for anonymous surveys',  
         coursecredits        => 'Credits can be specified for courses',  
     );  
     my %staticdefaults = (  
                            anonsurvey_threshold => 10,  
                            uploadquota          => 500,  
                          );  
     if ($position eq 'top') {      if ($position eq 'top') {
           my (%checkedon,%checkedoff,%choices,%defaultchecked,@toggles);
           %choices =
               &Apache::lonlocal::texthash (
                   canuse_pdfforms => 'Course/Community users can create/upload PDF forms',
           );
         %defaultchecked = ('canuse_pdfforms' => 'off');          %defaultchecked = ('canuse_pdfforms' => 'off');
         @toggles = ('canuse_pdfforms');          @toggles = ('canuse_pdfforms',);
         ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked,          ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked,
                                                  \%choices,$itemcount);                                                   \%choices,$itemcount);
           $$rowtotal += $itemcount;
     } else {      } else {
         $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';          $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';
         my ($currdefresponder,$def_official_credits,$def_unofficial_credits,%curruploadquota);          my %choices =
         my $currusecredits = 0;              &Apache::lonlocal::texthash (
         my @types = ('official','unofficial','community');                  anonsurvey_threshold => 'Responder count needed before showing submissions for anonymous surveys',
           );
           my $currdefresponder;
         if (ref($settings) eq 'HASH') {          if (ref($settings) eq 'HASH') {
             $currdefresponder = $settings->{'anonsurvey_threshold'};              $currdefresponder = $settings->{'anonsurvey_threshold'};
             if (ref($settings->{'uploadquota'}) eq 'HASH') {  
                 foreach my $type (keys(%{$settings->{'uploadquota'}})) {  
                     $curruploadquota{$type} = $settings->{'uploadquota'}{$type};  
                 }  
             }  
             if (ref($settings->{'coursecredits'}) eq 'HASH') {  
                 $def_official_credits = $settings->{'coursecredits'}->{'official'};  
                 $def_unofficial_credits = $settings->{'coursecredits'}->{'unofficial'};  
                 if (($def_official_credits ne '') || ($def_unofficial_credits ne '')) {  
                     $currusecredits = 1;  
                 }  
             }  
         }          }
         if (!$currdefresponder) {          if (!$currdefresponder) {
             $currdefresponder = $staticdefaults{'anonsurvey_threshold'};              $currdefresponder = 10;
         } elsif ($currdefresponder < 1) {          } elsif ($currdefresponder < 1) {
             $currdefresponder = 1;              $currdefresponder = 1;
         }          }
         foreach my $type (@types) {  
             if ($curruploadquota{$type} eq '') {  
                 $curruploadquota{$type} = $staticdefaults{'uploadquota'};  
             }  
         }  
         $datatable .=          $datatable .=
                 '<tr'.$css_class.'><td><span class="LC_nobreak">'.                 '<tr'.$css_class.'><td><span class="LC_nobreak">'.$choices{'anonsurvey_threshold'}.
                 $choices{'anonsurvey_threshold'}.  
                 '</span></td>'.                  '</span></td>'.
                 '<td class="LC_right_item"><span class="LC_nobreak">'.                  '<td class="LC_right_item"><span class="LC_nobreak">'.
                 '<input type="text" name="anonsurvey_threshold"'.                  '<input type="text" name="anonsurvey_threshold"'.
                 ' value="'.$currdefresponder.'" size="5" /></span>'.                  ' value="'.$currdefresponder.'" size="5" /></span>'.
                 '</td></tr>'."\n".                  '</td></tr>';
                 '<tr><td><span class="LC_nobreak">'.  
                 $choices{'uploadquota'}.  
                 '</span></td>'.  
                 '<td align="right" class="LC_right_item">'.  
                 '<table><tr>';  
         foreach my $type (@types) {  
             $datatable .= '<td align="center">'.&mt($type).'<br />'.  
                            '<input type="text" name="uploadquota_'.$type.'"'.  
                            ' value="'.$curruploadquota{$type}.'" size="5" /></td>';  
         }  
         $datatable .= '</tr></table></td></tr>'."\n";  
         $itemcount += 2;  
         my $onclick = 'toggleCredits(this.form);';  
         my $display = 'none';  
         if ($currusecredits) {  
             $display = 'block';  
         }  
         my $additional = '<div id="credits" style="display: '.$display.'">'.  
                          '<span class="LC_nobreak">'.  
                          &mt('Default credits for official courses [_1]',  
                          '<input type="text" name="official_credits" value="'.  
                          $def_official_credits.'" size="3" />').  
                          '</span><br />'.  
                          '<span class="LC_nobreak">'.  
                          &mt('Default credits for unofficial courses [_1]',  
                          '<input type="text" name="unofficial_credits" value="'.  
                          $def_unofficial_credits.'" size="3" />').  
                          '</span></div>'."\n";  
         %defaultchecked = ('coursecredits' => 'off');  
         @toggles = ('coursecredits');  
         my $current = {  
                         'coursecredits' => $currusecredits,  
                       };  
         (my $table,$itemcount) =  
             &radiobutton_prefs($current,\@toggles,\%defaultchecked,  
                                \%choices,$itemcount,$onclick,$additional);  
         $datatable .= $table;  
     }      }
     $$rowtotal += $itemcount;  
     return $datatable;      return $datatable;
 }  }
   
Line 2977  sub print_loadbalancing { Line 2929  sub print_loadbalancing {
     }      }
     my ($othertitle,$usertypes,$types) =      my ($othertitle,$usertypes,$types) =
         &Apache::loncommon::sorted_inst_types($dom);          &Apache::loncommon::sorted_inst_types($dom);
     my $rownum = 8;      my $rownum = 6;
     if (ref($types) eq 'ARRAY') {      if (ref($types) eq 'ARRAY') {
         $rownum += scalar(@{$types});          $rownum += scalar(@{$types});
     }      }
Line 3008  sub print_loadbalancing { Line 2960  sub print_loadbalancing {
                       '<td rowspan="'.$rownum.'" valign="top">'.                        '<td rowspan="'.$rownum.'" valign="top">'.
                       '<p>';                        '<p>';
         if ($lonhost eq '') {          if ($lonhost eq '') {
             $datatable .= '<span class="LC_nobreak">';              $datatable .= '<span class="LC_nobreak">'; 
             if (keys(%currbalancer) > 0) {              if (keys(%currbalancer) > 0) {
                 $datatable .= &mt('Add balancer:');                  $datatable .= &mt('Add balancer:');
             } else {              } else {
Line 3024  sub print_loadbalancing { Line 2976  sub print_loadbalancing {
                 next if ($currbalancer{$server});                  next if ($currbalancer{$server});
                 $datatable .= '<option value="'.$server.'">'.$server.'</option>'."\n";                  $datatable .= '<option value="'.$server.'">'.$server.'</option>'."\n";
             }              }
             $datatable .=              $datatable .= 
                 '</select>'."\n".                  '</select>'."\n".
                 '<input type="hidden" name="loadbalancing_prevlonhost_'.$balnum.'" id="loadbalancing_prevlonhost_'.$balnum.'" value="" />&nbsp;</span>'."\n";                  '<input type="hidden" name="loadbalancing_prevlonhost_'.$balnum.'" id="loadbalancing_prevlonhost_'.$balnum.'" value="" />&nbsp;</span>'."\n";
         } else {          } else {
Line 3063  sub print_loadbalancing { Line 3015  sub print_loadbalancing {
                 if (exists($currbalancer{$spares[$i]})) {                  if (exists($currbalancer{$spares[$i]})) {
                     $disabled = ' disabled="disabled"';                      $disabled = ' disabled="disabled"';
                 }                  }
                 $targettable .=                  $targettable .= 
                     '<td><label><input type="checkbox" name="loadbalancing_target_'.$balnum.'_'.$sparetype.'"'.                      '<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.                      $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>';                      '</span></label></td>';
Line 3147  sub loadbalancing_rules { Line 3099  sub loadbalancing_rules {
         $css_class,$balnum,$islast) = @_;          $css_class,$balnum,$islast) = @_;
     my $output;      my $output;
     my $num = 0;      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}) {
Line 3156  sub loadbalancing_rules { Line 3108  sub loadbalancing_rules {
             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') || ($type eq '_LC_ipchange')) {              if (($type eq '_LC_external') || ($type eq '_LC_internetdom')) {
                 if ($dom ne &Apache::lonnet::host_domain($lonhost)) {                  if ($dom ne &Apache::lonnet::host_domain($lonhost)) {
                     $current = '';                      $current = '';
                 }                  }
Line 3177  sub loadbalancing_titles { Line 3129  sub loadbalancing_titles {
            '_LC_author'      => &mt('Users from [_1] with author role',$dom),             '_LC_author'      => &mt('Users from [_1] with author role',$dom),
            '_LC_internetdom' => &mt('Users not from [_1], but from [_2]',$dom,$intdom),             '_LC_internetdom' => &mt('Users not from [_1], but from [_2]',$dom,$intdom),
            '_LC_external'    => &mt('Users not from [_1]',$intdom),             '_LC_external'    => &mt('Users not from [_1]',$intdom),
            '_LC_ipchangesso' => &mt('SSO users from [_1], with IP mismatch',$dom),  
            '_LC_ipchange'    => &mt('Non-SSO users with IP mismatch'),  
                      );                       );
     my @alltypes = ('_LC_adv','_LC_author','_LC_internetdom','_LC_external','_LC_ipchangesso','_LC_ipchange');      my @alltypes = ('_LC_adv','_LC_author','_LC_internetdom','_LC_external');
     if (ref($types) eq 'ARRAY') {      if (ref($types) eq 'ARRAY') {
         unshift(@alltypes,@{$types},'default');          unshift(@alltypes,@{$types},'default');
     }      }
Line 3205  sub loadbalancing_titles { Line 3155  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,$lonhost,$dom,
         $targets_div_style,$homedom_div_style,$css_class,$balnum,$num,$islast) = @_;          $targets_div_style,$homedom_div_style,$css_class,$balnum,$num,$islast) = @_;
     my @rulenames;      my @rulenames = ('default','homeserver');
     my %ruletitles = &offloadtype_text();      my %ruletitles = &offloadtype_text();
     if (($type eq '_LC_ipchangesso') || ($type eq '_LC_ipchange')) {      if ($type eq '_LC_external') {
         @rulenames = ('balancer','offloadedto');          push(@rulenames,'externalbalancer');
     } else {      } else {
         @rulenames = ('default','homeserver');          push(@rulenames,'specific');
         if ($type eq '_LC_external') {  
             push(@rulenames,'externalbalancer');  
         } else {  
             push(@rulenames,'specific');  
         }  
         push(@rulenames,'none');  
     }      }
       push(@rulenames,'none');
     my $style = $targets_div_style;      my $style = $targets_div_style;
     if (($type eq '_LC_external') || ($type eq '_LC_internetdom') || ($type eq '_LC_ipchange')) {      if (($type eq '_LC_external') || ($type eq '_LC_internetdom')) {
         $style = $homedom_div_style;          $style = $homedom_div_style;
     }      }
     my $space;      my $space;
     if ($islast && $num == 1) {      if ($islast && $num == 1) {
         $space = '<div display="inline-block">&nbsp;</div>';          $space = '<div display="inline-block">&nbsp;</div>';
     }      }
     my $output =      my $output = 
         '<tr class="'.$css_class.'" id="balanceruletr_'.$balnum.'_'.$num.'"><td valign="top">'.$space.          '<tr class="'.$css_class.'" id="balanceruletr_'.$balnum.'_'.$num.'"><td valign="top">'.$space.
         '<div id="balanceruletitle_'.$balnum.'_'.$type.'" style="'.$style.'">'.$title.'</div></td>'."\n".          '<div id="balanceruletitle_'.$balnum.'_'.$type.'" style="'.$style.'">'.$title.'</div></td>'."\n".
         '<td valaign="top">'.$space.          '<td valaign="top">'.$space.
Line 3246  sub loadbalance_rule_row { Line 3191  sub loadbalance_rule_row {
                 unless ($checked) {                  unless ($checked) {
                     $default = ' selected="selected"';                      $default = ' selected="selected"';
                 }                  }
                 $extra =                  $extra = 
                     ':&nbsp;<select name="loadbalancing_singleserver_'.$balnum.'_'.$type.                      ':&nbsp;<select name="loadbalancing_singleserver_'.$balnum.'_'.$type.
                     '" id="loadbalancing_singleserver_'.$balnum.'_'.$type.                      '" id="loadbalancing_singleserver_'.$balnum.'_'.$type.
                     '" onchange="singleServerToggle('."'$balnum','$type'".')">'."\n".                      '" onchange="singleServerToggle('."'$balnum','$type'".')">'."\n".
Line 3284  sub offloadtype_text { Line 3229  sub offloadtype_text {
            'externalbalancer' => "Offloads to Load Balancer in user's domain",             'externalbalancer' => "Offloads to Load Balancer in user's domain",
            'specific'         => 'Offloads to specific server',             'specific'         => 'Offloads to specific server',
            'none'             => 'No offload',             'none'             => 'No offload',
            'balancer'         => 'Session hosted on Load Balancer, after re-authentication',  
            'offloadedto'      => 'Session hosted on offload server, after re-authentication',  
     );      );
     return %ruletitles;      return %ruletitles;
 }  }
Line 3307  sub contact_titles { Line 3250  sub contact_titles {
                    'helpdeskmail' => 'Helpdesk requests to be e-mailed to',                     'helpdeskmail' => 'Helpdesk requests to be e-mailed to',
                    'lonstatusmail' => 'E-mail from nightly status check (warnings/errors)',                     'lonstatusmail' => 'E-mail from nightly status check (warnings/errors)',
                    'requestsmail' => 'E-mail from course requests requiring approval',                     'requestsmail' => 'E-mail from course requests requiring approval',
                    'updatesmail'  => 'E-mail from nightly check of LON-CAPA module integrity/updates',  
                    'idconflictsmail' => 'E-mail from bi-nightly check for multiple users sharing same student/employee ID',  
                  );                   );
     my %short_titles = &Apache::lonlocal::texthash (      my %short_titles = &Apache::lonlocal::texthash (
                            adminemail   => 'Admin E-mail address',                             adminemail   => 'Admin E-mail address',
Line 3351  sub authorrequest_titles { Line 3292  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 (
        approval    => '(Processing of request subject to approval by Domain Coordinator).',         approval    => '(Processing of request subject to approval by Domain Coordinator).',
        validate   => '(Processing of request subject to institutional validation).',         validate   => '(Processing of request subject to instittutional validation).',
                  );                   );
     return %conditions;      return %conditions;
 }  }
Line 3590  sub captcha_choice { Line 3531  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 3943  sub print_scantronformat { Line 3884  sub print_scantronformat {
         $datatable .= '<td>'.&mt('Default in use:').'<br />'.          $datatable .= '<td>'.&mt('Default in use:').'<br />'.
                       '<span class="LC_nobreak">';                        '<span class="LC_nobreak">';
         if ($scantronurl) {          if ($scantronurl) {
             $datatable .= &Apache::loncommon::modal_link($scantronurl,&mt('Default bubblesheet format file'),600,500,              $datatable .= '<a href="'.$scantronurl.'" target="_blank">'.
                                                          undef,undef,undef,undef,'background-color:#ffffff');                            &mt('Default bubblesheet format file').'</a>';
         } else {          } else {
             $datatable = &mt('File unavailable for display');              $datatable = &mt('File unavailable for display');
         }          }
Line 3969  sub print_scantronformat { Line 3910  sub print_scantronformat {
             }               } 
             $datatable .= '<td>'.$errorstr.'</td><td>&nbsp;';              $datatable .= '<td>'.$errorstr.'</td><td>&nbsp;';
         } elsif ($scantronurl) {          } elsif ($scantronurl) {
             my $link =  &Apache::loncommon::modal_link($scantronurl,&mt('Custom bubblesheet format file'),600,500,  
                                                        undef,undef,undef,undef,'background-color:#ffffff');  
             $datatable .= '<td><span class="LC_nobreak">'.              $datatable .= '<td><span class="LC_nobreak">'.
                           $link.                            '<a href="'.$scantronurl.'" target="_blank">'.
                           '<label><input type="checkbox" name="scantronformat_del"'.                            &mt('Custom bubblesheet format file').'</a><label>'.
                           ' value="1" />'.&mt('Delete?').'</label></span></td>'.                            '<input type="checkbox" name="scantronformat_del"'.
                             '" value="1" />'.&mt('Delete?').'</label></span></td>'.
                           '<td><span class="LC_nobreak">&nbsp;'.                            '<td><span class="LC_nobreak">&nbsp;'.
                           &mt('Replace:').'</span><br />';                            &mt('Replace:').'</span><br />';
         }          }
Line 4272  sub print_serverstatuses { Line 4212  sub print_serverstatuses {
   
 sub serverstatus_pages {  sub serverstatus_pages {
     return ('userstatus','lonstatus','loncron','server-status','codeversions',      return ('userstatus','lonstatus','loncron','server-status','codeversions',
             'checksums','clusterstatus','metadata_keywords','metadata_harvest',              'clusterstatus','metadata_keywords','metadata_harvest',
             'takeoffline','takeonline','showenv','toggledebug','ping','domconf');              'takeoffline','takeonline','showenv','toggledebug','ping','domconf');
 }  }
   
Line 4430  sub build_category_rows { Line 4370  sub build_category_rows {
             if (ref($cats->[$depth]{$parent}) eq 'ARRAY') {              if (ref($cats->[$depth]{$parent}) eq 'ARRAY') {
                 my $numchildren = @{$cats->[$depth]{$parent}};                  my $numchildren = @{$cats->[$depth]{$parent}};
                 my $css_class = $itemcount%2?' class="LC_odd_row"':'';                  my $css_class = $itemcount%2?' class="LC_odd_row"':'';
                 $text .= '<td><table class="LC_data_table">';                  $text .= '<td><table class="LC_datatable">';
                 my ($idxnum,$parent_name,$parent_item);                  my ($idxnum,$parent_name,$parent_item);
                 my $higher = $depth - 1;                  my $higher = $depth - 1;
                 if ($higher == 0) {                  if ($higher == 0) {
Line 4722  sub usertype_update_row { Line 4662  sub usertype_update_row {
 }  }
   
 sub modify_login {  sub modify_login {
     my ($r,$dom,$confname,$lastactref,%domconfig) = @_;      my ($r,$dom,$confname,%domconfig) = @_;
     my ($resulttext,$errors,$colchgtext,%changes,%colchanges,%newfile,%newurl,      my ($resulttext,$errors,$colchgtext,%changes,%colchanges,%newfile,%newurl,
         %curr_loginvia,%loginhash,@currlangs,@newlangs,$addedfile,%title,@offon);          %curr_loginvia,%loginhash,@currlangs,@newlangs,$addedfile,%title,@offon);
     %title = ( coursecatalog => 'Display course catalog',      %title = ( coursecatalog => 'Display course catalog',
                adminmail => 'Display administrator E-mail address',                 adminmail => 'Display administrator E-mail address',
                helpdesk  => 'Display "Contact Helpdesk" link',  
                newuser => 'Link for visitors to create a user account',                 newuser => 'Link for visitors to create a user account',
                loginheader => 'Log-in box header');                 loginheader => 'Log-in box header');
     @offon = ('off','on');      @offon = ('off','on');
Line 4740  sub modify_login { Line 4679  sub modify_login {
     }      }
     ($errors,%colchanges) = &modify_colors($r,$dom,$confname,['login'],      ($errors,%colchanges) = &modify_colors($r,$dom,$confname,['login'],
                                            \%domconfig,\%loginhash);                                             \%domconfig,\%loginhash);
     my @toggles = ('coursecatalog','adminmail','helpdesk','newuser');      my @toggles = ('coursecatalog','adminmail','newuser');
     foreach my $item (@toggles) {      foreach my $item (@toggles) {
         $loginhash{login}{$item} = $env{'form.'.$item};          $loginhash{login}{$item} = $env{'form.'.$item};
     }      }
Line 4902  sub modify_login { Line 4841  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 4928  sub modify_login { Line 4867  sub modify_login {
     my $putresult = &Apache::lonnet::put_dom('configuration',\%loginhash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%loginhash,
                                              $dom);                                               $dom);
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         my @toggles = ('coursecatalog','adminmail','helpdesk','newuser');          my @toggles = ('coursecatalog','adminmail','newuser');
         my %defaultchecked = (          my %defaultchecked = (
                     'coursecatalog' => 'on',                      'coursecatalog' => 'on',
                     'helpdesk'      => 'on',  
                     'adminmail'     => 'off',                      'adminmail'     => 'off',
                     'newuser'       => 'off',                      'newuser'       => 'off',
         );          );
Line 4960  sub modify_login { Line 4898  sub modify_login {
         }          }
         if (keys(%changes) > 0 || $colchgtext) {          if (keys(%changes) > 0 || $colchgtext) {
             &Apache::loncommon::devalidate_domconfig_cache($dom);              &Apache::loncommon::devalidate_domconfig_cache($dom);
             $$lastactref = 'update';  
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             foreach my $item (sort(keys(%changes))) {              foreach my $item (sort(keys(%changes))) {
                 if ($item eq 'loginvia') {                  if ($item eq 'loginvia') {
Line 5020  sub modify_login { Line 4957  sub modify_login {
                     }                      }
                 } elsif ($item eq 'captcha') {                  } elsif ($item eq 'captcha') {
                     if (ref($loginhash{'login'}) eq 'HASH') {                      if (ref($loginhash{'login'}) eq 'HASH') {
                         my $chgtxt;                          my $chgtxt; 
                         if ($loginhash{'login'}{$item} eq 'notused') {                          if ($loginhash{'login'}{$item} eq 'notused') {
                             $chgtxt .= &mt('No CAPTCHA validation in use for helpdesk form.');                              $chgtxt .= &mt('No CAPTCHA validation in use for helpdesk form.');
                         } else {                          } else {
Line 5081  sub color_font_choices { Line 5018  sub color_font_choices {
             links => "Link colors",              links => "Link colors",
             images => "Images",              images => "Images",
             font => "Font color",              font => "Font color",
             fontmenu => "Font menu",              fontmenu => "Font Menu",
             pgbg => "Page",              pgbg => "Page",
             tabbg => "Header",              tabbg => "Header",
             sidebg => "Border",              sidebg => "Border",
Line 5093  sub color_font_choices { Line 5030  sub color_font_choices {
 }  }
   
 sub modify_rolecolors {  sub modify_rolecolors {
     my ($r,$dom,$confname,$roles,$lastactref,%domconfig) = @_;      my ($r,$dom,$confname,$roles,%domconfig) = @_;
     my ($resulttext,%rolehash);      my ($resulttext,%rolehash);
     $rolehash{'rolecolors'} = {};      $rolehash{'rolecolors'} = {};
     if (ref($domconfig{'rolecolors'}) ne 'HASH') {      if (ref($domconfig{'rolecolors'}) ne 'HASH') {
Line 5108  sub modify_rolecolors { Line 5045  sub modify_rolecolors {
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             &Apache::loncommon::devalidate_domconfig_cache($dom);              &Apache::loncommon::devalidate_domconfig_cache($dom);
             $$lastactref = 'update';  
             $resulttext = &display_colorchgs($dom,\%changes,$roles,              $resulttext = &display_colorchgs($dom,\%changes,$roles,
                                              $rolehash{'rolecolors'});                                               $rolehash{'rolecolors'});
         } else {          } else {
Line 5134  sub modify_colors { Line 5070  sub modify_colors {
     my @images;      my @images;
     my $servadm = $r->dir_config('lonAdmEMail');      my $servadm = $r->dir_config('lonAdmEMail');
     my $errors;      my $errors;
     my %defaults;  
     foreach my $role (@{$roles}) {      foreach my $role (@{$roles}) {
         if ($role eq 'login') {          if ($role eq 'login') {
             %choices = &login_choices();              %choices = &login_choices();
             @logintext = ('textcol','bgcol');              @logintext = ('textcol','bgcol');
         } else {          } else {
             %choices = &color_font_choices();              %choices = &color_font_choices();
               $confhash->{$role}{'fontmenu'} = $env{'form.'.$role.'_fontmenu'};
         }          }
         if ($role eq 'login') {          if ($role eq 'login') {
             @images = ('img','logo','domlogo','login');              @images = ('img','logo','domlogo','login');
             @bgs = ('pgbg','mainbg','sidebg');              @bgs = ('pgbg','mainbg','sidebg');
         } else {          } else {
             @images = ('img');              @images = ('img');
             @bgs = ('pgbg','tabbg','sidebg');              @bgs = ('pgbg','tabbg','sidebg'); 
         }          }
         my %defaults = &role_defaults($role,\@bgs,\@links,\@images,\@logintext);          $confhash->{$role}{'font'} = $env{'form.'.$role.'_font'};
         unless ($env{'form.'.$role.'_font'} eq $defaults{'font'}) {          foreach my $item (@bgs,@links,@logintext) {
             $confhash->{$role}{'font'} = $env{'form.'.$role.'_font'};              $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item};
         }  
         if ($role eq 'login') {  
             foreach my $item (@logintext) {  
                 unless ($env{'form.'.$role.'_'.$item} eq  $defaults{'logintext'}{$item}) {  
                     $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item};  
                 }  
             }  
         } else {  
             unless($env{'form.'.$role.'_fontmenu'} eq $defaults{'fontmenu'}) {  
                 $confhash->{$role}{'fontmenu'} = $env{'form.'.$role.'_fontmenu'};  
             }  
         }  
         foreach my $item (@bgs) {  
             unless ($env{'form.'.$role.'_'.$item} eq $defaults{'bgs'}{$item} ) {  
                 $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item};  
             }  
         }  
         foreach my $item (@links) {  
             unless ($env{'form.'.$role.'_'.$item} eq  $defaults{'links'}{$item}) {  
                 $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item};  
             }  
         }          }
         my ($configuserok,$author_ok,$switchserver) =           my ($configuserok,$author_ok,$switchserver) = 
             &config_check($dom,$confname,$servadm);              &config_check($dom,$confname,$servadm);
Line 5520  sub publishlogo { Line 5435  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 5540  sub publishlogo { Line 5455  sub publishlogo {
     if ($file=~/\.(\w+)$/ &&      if ($file=~/\.(\w+)$/ &&
         (&Apache::loncommon::fileembstyle($1) eq 'hdn')) {          (&Apache::loncommon::fileembstyle($1) eq 'hdn')) {
         $output =           $output = 
             &mt('Invalid file extension ([_1]) - reserved for internal use.',$1);               &mt('Invalid file extension ([_1]) - reserved for LONCAPA use.',$1); 
     } elsif ($file=~/\.(\w+)$/ &&      } elsif ($file=~/\.(\w+)$/ &&
         !defined(&Apache::loncommon::fileembstyle($1))) {          !defined(&Apache::loncommon::fileembstyle($1))) {
         $output = &mt('Unrecognized file extension ([_1]) - rename the file with a proper extension and re-upload.',$1);          $output = &mt('Unrecognized file extension ([_1]) - rename the file with a proper extension and re-upload.',$1);
     } elsif ($file=~/\.(\d+)\.(\w+)$/) {      } elsif ($file=~/\.(\d+)\.(\w+)$/) {
         $output = &mt('Filename not allowed - rename the file to remove the number immediately before the file extension([_1]) and re-upload.',$2);          $output = &mt('File name not allowed - rename the file to remove the number immediately before the file extension([_1]) and re-upload.',$2);
     } elsif (-d "$filepath/$file") {      } elsif (-d "$filepath/$file") {
         $output = &mt('Filename is a directory name - rename the file and re-upload');          $output = &mt('File name is a directory name - rename the file and re-upload');
     } else {      } else {
         my $source = $filepath.'/'.$file;          my $source = $filepath.'/'.$file;
         my $logfile;          my $logfile;
         if (!open($logfile,">>$source".'.log')) {          if (!open($logfile,">>$source".'.log')) {
             return (&mt('No write permission to Authoring Space'));              return (&mt('No write permission to Construction Space'));
         }          }
         print $logfile          print $logfile
 "\n================= Publish ".localtime()." ================\n".  "\n================= Publish ".localtime()." ================\n".
Line 5831  sub modify_quotas { Line 5746  sub modify_quotas {
         } else {          } else {
             if ($key =~ /^form\.quota_(.+)$/) {              if ($key =~ /^form\.quota_(.+)$/) {
                 $confhash{'defaultquota'}{$1} = $env{$key};                  $confhash{'defaultquota'}{$1} = $env{$key};
             } elsif ($key =~ /^form\.authorquota_(.+)$/) {              }
                 $confhash{'authorquota'}{$1} = $env{$key};              if ($key =~ /^form\.\Q$context\E_(.+)$/) {
             } elsif ($key =~ /^form\.\Q$context\E_(.+)$/) {  
                 @{$toolshash{$1}} = &Apache::loncommon::get_env_multiple($key);                  @{$toolshash{$1}} = &Apache::loncommon::get_env_multiple($key);
             }              }
         }          }
Line 5859  sub modify_quotas { Line 5773  sub modify_quotas {
         }          }
     } else {      } else {
         $confhash{'defaultquota'}{'default'} = $env{'form.defaultquota'};          $confhash{'defaultquota'}{'default'} = $env{'form.defaultquota'};
         $confhash{'authorquota'}{'default'} = $env{'form.authorquota'};  
     }      }
     foreach my $item (@usertools) {      foreach my $item (@usertools) {
         foreach my $type (@{$types},'default','_LC_adv') {          foreach my $type (@{$types},'default','_LC_adv') {
Line 5947  sub modify_quotas { Line 5860  sub modify_quotas {
                     }                      }
                 }                  }
             }              }
             if (ref($domconfig{'quotas'}{'authorquota'}) eq 'HASH') {  
                 foreach my $key (keys(%{$domconfig{'quotas'}{'authorquota'}})) {  
                     if (exists($confhash{'authorquota'}{$key})) {  
                         if ($confhash{'authorquota'}{$key} ne $domconfig{'quotas'}{'authorquota'}{$key}) {  
                             $changes{'authorquota'}{$key} = 1;  
                         }  
                     } else {  
                         $confhash{'authorquota'}{$key} = $domconfig{'quotas'}{'authorquota'}{$key};  
                     }  
                 }  
             }  
         }          }
         if (ref($confhash{'defaultquota'}) eq 'HASH') {          if (ref($confhash{'defaultquota'}) eq 'HASH') {
             foreach my $key (keys(%{$confhash{'defaultquota'}})) {              foreach my $key (keys(%{$confhash{'defaultquota'}})) {
Line 5976  sub modify_quotas { Line 5878  sub modify_quotas {
                 }                  }
             }              }
         }          }
         if (ref($confhash{'authorquota'}) eq 'HASH') {  
             foreach my $key (keys(%{$confhash{'authorquota'}})) {  
                 if (ref($domconfig{'quotas'}) eq 'HASH') {  
                     if (ref($domconfig{'quotas'}{'authorquota'}) eq 'HASH') {  
                         if (!exists($domconfig{'quotas'}{'authorquota'}{$key})) {  
                             $changes{'authorquota'}{$key} = 1;  
                         }  
                     } else {  
                         $changes{'authorquota'}{$key} = 1;  
                     }  
                 } else {  
                     $changes{'authorquota'}{$key} = 1;  
                 }  
             }  
         }  
     }      }
   
     if ($context eq 'requestauthor') {      if ($context eq 'requestauthor') {
Line 6012  sub modify_quotas { Line 5899  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 6027  sub modify_quotas { Line 5914  sub modify_quotas {
                     }                      }
                     $resulttext .= '</ul></li>';                      $resulttext .= '</ul></li>';
                 }                  }
                 if (ref($changes{'authorquota'}) eq 'HASH') {  
                     $resulttext .= '<li>'.&mt('Authoring space default quotas').'<ul>';  
                     foreach my $type (@{$types},'default') {  
                         if (defined($changes{'authorquota'}{$type})) {  
                             my $typetitle = $usertypes->{$type};  
                             if ($type eq 'default') {  
                                 $typetitle = $othertitle;  
                             }  
                             $resulttext .= '<li>'.&mt('[_1] set to [_2] Mb',$typetitle,$confhash{'authorquota'}{$type}).'</li>';  
                         }  
                     }  
                     $resulttext .= '</ul></li>';  
                 }  
             }              }
             my %newenv;              my %newenv;
             foreach my $item (@usertools) {              foreach my $item (@usertools) {
                 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 6060  sub modify_quotas { Line 5934  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 6153  sub modify_quotas { Line 6027  sub modify_quotas {
 }  }
   
 sub modify_autoenroll {  sub modify_autoenroll {
     my ($dom,$lastactref,%domconfig) = @_;      my ($dom,%domconfig) = @_;
     my ($resulttext,%changes);      my ($resulttext,%changes);
     my %currautoenroll;      my %currautoenroll;
     if (ref($domconfig{'autoenroll'}) eq 'HASH') {      if (ref($domconfig{'autoenroll'}) eq 'HASH') {
Line 6221  sub modify_autoenroll { Line 6095  sub modify_autoenroll {
             if ($changes{'coowners'}) {              if ($changes{'coowners'}) {
                 $resulttext .= '<li>'.&mt("$title{'coowners'} set to $offon[$env{'form.autoassign_coowners'}]").'</li>';                  $resulttext .= '<li>'.&mt("$title{'coowners'} set to $offon[$env{'form.autoassign_coowners'}]").'</li>';
                 &Apache::loncommon::devalidate_domconfig_cache($dom);                  &Apache::loncommon::devalidate_domconfig_cache($dom);
                 $$lastactref = 'update';  
             }              }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
         } else {          } else {
Line 6627  sub modify_directorysrch { Line 6500  sub modify_directorysrch {
                         } else {                          } else {
                             $chgtext =~ s/\; $//;                              $chgtext =~ s/\; $//;
                         }                          }
                         $resulttext .=                          $resulttext .= 
                             '<li>'.                              '<li>'.
                             &mt("Users from domain '[_1]' permitted to search the institutional directory set to: [_2]",                              &mt("Users from domain '[_1]' permitted to search the institutional directory set to: [_2]",
                                 '<span class="LC_cusr_emph">'.$dom.'</span>',$chgtext).                                  '<span class="LC_cusr_emph">'.$dom.'</span>',$chgtext).
Line 6673  sub modify_directorysrch { Line 6546  sub modify_directorysrch {
 }  }
   
 sub modify_contacts {  sub modify_contacts {
     my ($dom,$lastactref,%domconfig) = @_;      my ($dom,%domconfig) = @_;
     my ($resulttext,%currsetting,%newsetting,%changes,%contacts_hash);      my ($resulttext,%currsetting,%newsetting,%changes,%contacts_hash);
     if (ref($domconfig{'contacts'}) eq 'HASH') {      if (ref($domconfig{'contacts'}) eq 'HASH') {
         foreach my $key (keys(%{$domconfig{'contacts'}})) {          foreach my $key (keys(%{$domconfig{'contacts'}})) {
Line 6683  sub modify_contacts { Line 6556  sub modify_contacts {
     my (%others,%to,%bcc);      my (%others,%to,%bcc);
     my @contacts = ('supportemail','adminemail');      my @contacts = ('supportemail','adminemail');
     my @mailings = ('errormail','packagesmail','helpdeskmail','lonstatusmail',      my @mailings = ('errormail','packagesmail','helpdeskmail','lonstatusmail',
                     'requestsmail','updatesmail','idconflictsmail');                      'requestsmail');
     my @toggles = ('reporterrors','reportupdates');  
     foreach my $type (@mailings) {      foreach my $type (@mailings) {
         @{$newsetting{$type}} =           @{$newsetting{$type}} = 
             &Apache::loncommon::get_env_multiple('form.'.$type);              &Apache::loncommon::get_env_multiple('form.'.$type);
Line 6706  sub modify_contacts { Line 6578  sub modify_contacts {
         $to{$item} = $env{'form.'.$item};          $to{$item} = $env{'form.'.$item};
         $contacts_hash{'contacts'}{$item} = $to{$item};          $contacts_hash{'contacts'}{$item} = $to{$item};
     }      }
     foreach my $item (@toggles) {  
         if ($env{'form.'.$item} =~ /^(0|1)$/) {  
             $contacts_hash{'contacts'}{$item} = $env{'form.'.$item};  
         }  
     }  
     if (keys(%currsetting) > 0) {      if (keys(%currsetting) > 0) {
         foreach my $item (@contacts) {          foreach my $item (@contacts) {
             if ($to{$item} ne $currsetting{$item}) {              if ($to{$item} ne $currsetting{$item}) {
Line 6745  sub modify_contacts { Line 6612  sub modify_contacts {
         $default{'helpdeskmail'} = 'supportemail';          $default{'helpdeskmail'} = 'supportemail';
         $default{'lonstatusmail'} = 'adminemail';          $default{'lonstatusmail'} = 'adminemail';
         $default{'requestsmail'} = 'adminemail';          $default{'requestsmail'} = 'adminemail';
         $default{'updatesmail'} = 'adminemail';  
         foreach my $item (@contacts) {          foreach my $item (@contacts) {
            if ($to{$item} ne $default{$item}) {             if ($to{$item} ne $default{$item}) {
               $changes{$item} = 1;                $changes{$item} = 1;
            }             } 
         }          }
         foreach my $type (@mailings) {          foreach my $type (@mailings) {
             if ((@{$newsetting{$type}} != 1) || ($newsetting{$type}[0] ne $default{$type})) {              if ((@{$newsetting{$type}} != 1) || ($newsetting{$type}[0] ne $default{$type})) {
Line 6766  sub modify_contacts { Line 6632  sub modify_contacts {
             }              }
         }          }
     }      }
     foreach my $item (@toggles) {  
         if (($env{'form.'.$item} == 1) && ($currsetting{$item} == 0)) {  
             $changes{$item} = 1;  
         } elsif ((!$env{'form.'.$item}) &&  
                  (($currsetting{$item} eq '') || ($currsetting{$item} == 1))) {  
             $changes{$item} = 1;  
         }  
     }  
     my $putresult = &Apache::lonnet::put_dom('configuration',\%contacts_hash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%contacts_hash,
                                              $dom);                                               $dom);
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             &Apache::loncommon::devalidate_domconfig_cache($dom);  
             $$lastactref = 'update';  
             my ($titles,$short_titles)  = &contact_titles();              my ($titles,$short_titles)  = &contact_titles();
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             foreach my $item (@contacts) {              foreach my $item (@contacts) {
Line 6810  sub modify_contacts { Line 6666  sub modify_contacts {
                     $resulttext .= '</li>';                      $resulttext .= '</li>';
                 }                  }
             }              }
             my @offon = ('off','on');  
             if ($changes{'reporterrors'}) {  
                 $resulttext .= '<li>'.  
                                &mt('E-mail error reports to [_1] set to "'.  
                                    $offon[$env{'form.reporterrors'}].'".',  
                                    &Apache::loncommon::modal_link('http://loncapa.org/core.html',  
                                        &mt('LON-CAPA core group - MSU'),600,500)).  
                                '</li>';  
             }  
             if ($changes{'reportupdates'}) {  
                 $resulttext .= '<li>'.  
                                 &mt('E-mail record of completed LON-CAPA updates to [_1] set to "'.  
                                     $offon[$env{'form.reportupdates'}].'".',  
                                     &Apache::loncommon::modal_link('http://loncapa.org/core.html',  
                                         &mt('LON-CAPA core group - MSU'),600,500)).  
                                 '</li>';  
             }  
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
         } else {          } else {
             $resulttext = &mt('No changes made to contact information');              $resulttext = &mt('No changes made to contact information');
Line 7127  sub modify_usercreation { Line 6966  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 7255  sub process_captcha { Line 7094  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 ($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'})) {
Line 7294  sub process_captcha { Line 7133  sub process_captcha {
                 $changes->{'cancreate'} = ['recaptchakeys'];                  $changes->{'cancreate'} = ['recaptchakeys'];
             }              }
         } else {          } else {
             $changes->{'recaptchakeys'} = 1;              $changes->{'recaptchakeys'} = 1; 
         }          }
     }      }
     return;      return;
Line 7421  sub modify_usermodification { Line 7260  sub modify_usermodification {
 }  }
   
 sub modify_defaults {  sub modify_defaults {
     my ($dom,$r,%domconfig) = @_;      my ($dom,$r) = @_;
     my ($resulttext,$mailmsgtxt,%newvalues,%changes,@errors);      my ($resulttext,$mailmsgtxt,%newvalues,%changes,@errors);
     my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);      my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
     my @items = ('auth_def','auth_arg_def','lang_def','timezone_def','datelocale_def','portal_def');      my @items = ('auth_def','auth_arg_def','lang_def','timezone_def','datelocale_def','portal_def');
Line 7507  sub modify_defaults { Line 7346  sub modify_defaults {
             my $cachetime = 24*60*60;              my $cachetime = 24*60*60;
             &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);              &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
             if ($changes{'auth_def'} || $changes{'auth_arg_def'} || $changes{'lang_def'} || $changes{'datelocale_def'}) {              if ($changes{'auth_def'} || $changes{'auth_arg_def'} || $changes{'lang_def'} || $changes{'datelocale_def'}) {
                 my $notify = 1;                  my $sysmail = $r->dir_config('lonSysEMail');
                 if (ref($domconfig{'contacts'}) eq 'HASH') {                  &Apache::lonmsg::sendemail($sysmail,"LON-CAPA Domain Settings Change - $dom",$mailmsgtext);
                     if ($domconfig{'contacts'}{'reportupdates'} == 0) {  
                         $notify = 0;  
                     }  
                 }  
                 if ($notify) {  
                     &Apache::lonmsg::sendemail('installrecord@loncapa.org',  
                                                "LON-CAPA Domain Settings Change - $dom",  
                                                $mailmsgtext);  
                 }  
             }              }
         } else {          } else {
             $resulttext = &mt('No changes made to default authentication/language/timezone settings');              $resulttext = &mt('No changes made to default authentication/language/timezone settings');
Line 7537  sub modify_defaults { Line 7367  sub modify_defaults {
 }  }
   
 sub modify_scantron {  sub modify_scantron {
     my ($r,$dom,$confname,$lastactref,%domconfig) = @_;      my ($r,$dom,$confname,%domconfig) = @_;
     my ($resulttext,%confhash,%changes,$errors);      my ($resulttext,%confhash,%changes,$errors);
     my $custom = 'custom.tab';      my $custom = 'custom.tab';
     my $default = 'default.tab';      my $default = 'default.tab';
Line 7598  sub modify_scantron { Line 7428  sub modify_scantron {
                 }                  }
                 $resulttext .= '</ul>';                  $resulttext .= '</ul>';
                 &Apache::loncommon::devalidate_domconfig_cache($dom);                  &Apache::loncommon::devalidate_domconfig_cache($dom);
                 $$lastactref = 'update';  
             } else {              } else {
                 $resulttext = &mt('No changes made to bubblesheet format file');                  $resulttext = &mt('No changes made to bubblesheet format file');
             }              }
Line 7989  sub modify_helpsettings { Line 7818  sub modify_helpsettings {
                     $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 8025  sub modify_coursedefaults { Line 7854  sub modify_coursedefaults {
     my ($dom,%domconfig) = @_;      my ($dom,%domconfig) = @_;
     my ($resulttext,$errors,%changes,%defaultshash);      my ($resulttext,$errors,%changes,%defaultshash);
     my %defaultchecked = ('canuse_pdfforms' => 'off');      my %defaultchecked = ('canuse_pdfforms' => 'off');
       my @offon = ('off','on');
     my @toggles = ('canuse_pdfforms');      my @toggles = ('canuse_pdfforms');
     my @numbers = ('anonsurvey_threshold','uploadquota_official','uploadquota_unofficial',  
                    'uploadquota_community');  
     my @types = ('official','unofficial','community');  
     my %staticdefaults = (  
                            anonsurvey_threshold => 10,  
                            uploadquota          => 500,  
                          );  
   
     $defaultshash{'coursedefaults'} = {};      $defaultshash{'coursedefaults'} = {};
   
Line 8048  sub modify_coursedefaults { Line 7871  sub modify_coursedefaults {
                 if (($domconfig{'coursedefaults'}{$item} eq '') &&                  if (($domconfig{'coursedefaults'}{$item} eq '') &&
                     ($env{'form.'.$item} eq '0')) {                      ($env{'form.'.$item} eq '0')) {
                     $changes{$item} = 1;                      $changes{$item} = 1;
                 } elsif ($domconfig{'coursedefaults'}{$item} ne $env{'form.'.$item}) {                  } elsif ($domconfig{'coursdefaults'}{$item} ne $env{'form.'.$item}) {
                     $changes{$item} = 1;                      $changes{$item} = 1;
                 }                  }
             } elsif ($defaultchecked{$item} eq 'off') {              } elsif ($defaultchecked{$item} eq 'off') {
Line 8061  sub modify_coursedefaults { Line 7884  sub modify_coursedefaults {
             }              }
             $defaultshash{'coursedefaults'}{$item} = $env{'form.'.$item};              $defaultshash{'coursedefaults'}{$item} = $env{'form.'.$item};
         }          }
         foreach my $item (@numbers) {          my $currdefresponder = $domconfig{'coursedefaults'}{'anonsurvey_threshold'};
             my ($currdef,$newdef);          my $newdefresponder = $env{'form.anonsurvey_threshold'};
             $newdef = $env{'form.'.$item};          $newdefresponder =~ s/\D//g;
             if ($item eq 'anonsurvey_threshold') {          if ($newdefresponder eq '' || $newdefresponder < 1) {
                 $currdef = $domconfig{'coursedefaults'}{$item};              $newdefresponder = 1;
                 $newdef =~ s/\D//g;          }
                 if ($newdef eq '' || $newdef < 1) {          $defaultshash{'coursedefaults'}{'anonsurvey_threshold'} = $newdefresponder;
                     $newdef = 1;          if ($currdefresponder ne $newdefresponder) {
                 }              unless ($currdefresponder eq '' && $newdefresponder == 10) {
                 $defaultshash{'coursedefaults'}{$item} = $newdef;                  $changes{'anonsurvey_threshold'} = 1;
             } else {  
                 my ($type) = ($item =~ /^\Quploadquota_\E(\w+)$/);  
                 if (ref($domconfig{'coursedefaults'}{'uploadquota'}) eq 'HASH') {  
                     $currdef = $domconfig{'coursedefaults'}{'uploadquota'}{$type};  
                 }  
                 $newdef =~ s/[^\w.\-]//g;  
                 $defaultshash{'coursedefaults'}{'uploadquota'}{$type} = $newdef;  
             }  
             if ($currdef ne $newdef) {  
                 my $staticdef;  
                 if ($item eq 'anonsurvey_threshold') {  
                     unless (($currdef eq '') && ($newdef == $staticdefaults{$item})) {  
                         $changes{$item} = 1;  
                     }  
                 } else {  
                     unless (($currdef eq '') && ($newdef == $staticdefaults{'uploadquota'})) {  
                         $changes{'uploadquota'} = 1;  
                     }  
                 }  
             }  
         }  
         my $officialcreds = $env{'form.official_credits'};  
         $officialcreds =~ s/^[^\d\.]//g;  
         my $unofficialcreds = $env{'form.unofficial_credits'};  
         $unofficialcreds =~ s/^[^\d\.]//g;  
         if (ref($domconfig{'coursedefaults'}{'coursecredits'} ne 'HASH') &&  
                 ($env{'form.coursecredits'} eq '1')) {  
                 $changes{'coursecredits'} = 1;  
         } else {  
             if (($domconfig{'coursedefaults'}{'coursecredits'}{'official'} ne $officialcreds)  ||  
                 ($domconfig{'coursedefaults'}{'coursecredits'}{'unofficial'} ne $unofficialcreds)) {  
                 $changes{'coursecredits'} = 1;  
             }              }
         }          }
         $defaultshash{'coursedefaults'}{'coursecredits'} = {  
             official   => $officialcreds,  
             unofficial => $unofficialcreds,  
         }  
     }      }
     my $putresult = &Apache::lonnet::put_dom('configuration',\%defaultshash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%defaultshash,
                                              $dom);                                               $dom);
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         my %domdefaults;  
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             if (($changes{'canuse_pdfforms'}) || ($changes{'coursecredits'}) || ($changes{'uploadquota'})) {              if ($changes{'canuse_pdfforms'}) {
                 %domdefaults = &Apache::lonnet::get_domain_defaults($dom);                  my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
                 if ($changes{'canuse_pdfforms'}) {                  $domdefaults{'canuse_pdfforms'}=$defaultshash{'coursedefaults'}{'canuse_pdfforms'};
                     $domdefaults{'canuse_pdfforms'}=$defaultshash{'coursedefaults'}{'canuse_pdfforms'};  
                 }  
                 if ($changes{'coursecredits'}) {  
                     if (ref($defaultshash{'coursedefaults'}{'coursecredits'}) eq 'HASH') {  
                         $domdefaults{'officialcredits'} =  
                             $defaultshash{'coursedefaults'}{'coursecredits'}{'official'};  
                         $domdefaults{'unofficialcredits'} =  
                             $defaultshash{'coursedefaults'}{'coursecredits'}{'unofficial'};  
                     }  
                 }  
                 if ($changes{'uploadquota'}) {  
                     if (ref($defaultshash{'coursedefaults'}{'uploadquota'}) eq 'HASH') {  
                         foreach my $type (@types) {  
                             $domdefaults{$type.'quota'}=$defaultshash{'coursedefaults'}{'uploadquota'}{$type};  
                         }  
                     }  
                 }  
                 my $cachetime = 24*60*60;                  my $cachetime = 24*60*60;
                 &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);                  &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
             }              }
Line 8147  sub modify_coursedefaults { Line 7916  sub modify_coursedefaults {
                         $resulttext .= '<li>'.&mt('Course/Community users can create/upload PDF forms set to "off"').'</li>';                          $resulttext .= '<li>'.&mt('Course/Community users can create/upload PDF forms set to "off"').'</li>';
                     }                      }
                 } elsif ($item eq 'anonsurvey_threshold') {                  } elsif ($item eq 'anonsurvey_threshold') {
                     $resulttext .= '<li>'.&mt('Responder count required for display of anonymous survey submissions set to [_1].',$defaultshash{'coursedefaults'}{'anonsurvey_threshold'}).'</li>';                          $resulttext .= '<li>'.&mt('Responder count required for display of anonymous survey submissions set to [_1].',$defaultshash{'coursedefaults'}{'anonsurvey_threshold'}).'</li>';
                 } elsif ($item eq 'uploadquota') {  
                     if (ref($defaultshash{'coursedefaults'}{'uploadquota'}) eq 'HASH') {  
                         $resulttext .= '<li>'.&mt('Default quota for content uploaded to a course/community via Course Editor set as follows:').'<ul>'.  
                                        '<li>'.&mt('Official courses: [_1] MB','<b>'.$defaultshash{'coursedefaults'}{'uploadquota'}{'official'}.'</b>').'</li>'.  
                                        '<li>'.&mt('Unofficial courses: [_1] MB','<b>'.$defaultshash{'coursedefaults'}{'uploadquota'}{'unofficial'}.'</b>').'</li>'.  
                                        '<li>'.&mt('Communities: [_1] MB','<b>'.$defaultshash{'coursedefaults'}{'uploadquota'}{'community'}.'</b>').'</li>'.  
                                        '</ul>'.  
                                        '</li>';  
                     } else {  
                         $resulttext .= '<li>'.&mt('Default quota for content uploaded via Course Editor remains default: [_1] MB',$staticdefaults{'uploadquota'}).'</li>';  
                     }  
                 } elsif ($item eq 'coursecredits') {  
                     if (ref($defaultshash{'coursedefaults'}{'coursecredits'}) eq 'HASH') {  
                         if (($domdefaults{'officialcredits'} eq '') &&  
                             ($domdefaults{'unofficialcredits'} eq '')) {  
                             $resulttext .= '<li>'.&mt('Student credits not in use for courses in this domain').'</li>';  
                         } else {  
                             $resulttext .= '<li>'.&mt('Student credits can be set per course by a Domain Coordinator, with the following defaults applying:').'<ul>'.  
                                            '<li>'.&mt('Official courses: [_1]',$defaultshash{'coursedefaults'}{'coursecredits'}{'official'}).'</li>'.  
                                            '<li>'.&mt('Unofficial courses: [_1]',$defaultshash{'coursedefaults'}{'coursecredits'}{'unofficial'}).'</li>'.  
                                            '</ul>'.  
                                            '</li>';  
                         }  
                     } else {  
                         $resulttext .= '<li>'.&mt('Student credits not in use for courses in this domain').'</li>';  
                     }  
                 }                  }
             }              }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
Line 8482  sub modify_loadbalancing { Line 8225  sub modify_loadbalancing {
         if ($balancer eq '') {          if ($balancer eq '') {
             next;              next;
         }          }
         if (!exists($servers{$balancer})) {          if (!exists($servers{$balancer})) { 
             if (exists($currbalancer{$balancer})) {              if (exists($currbalancer{$balancer})) {
                 push(@{$changes{'delete'}},$balancer);                  push(@{$changes{'delete'}},$balancer);
             }              }
Line 8533  sub modify_loadbalancing { Line 8276  sub modify_loadbalancing {
             }              }
         } else {          } else {
             if (ref($defaultshash{'loadbalancing'}{$balancer}) eq 'HASH') {              if (ref($defaultshash{'loadbalancing'}{$balancer}) eq 'HASH') {
                 foreach my $sparetype (@sparestypes) {                  foreach my $sparetype (@sparestypes) { 
                     if (ref($defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}) eq 'ARRAY') {                      if (ref($defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}) eq 'ARRAY') {
                         if (@{$defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}} > 0) {                          if (@{$defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}} > 0) {
                             $changes{'curr'}{$balancer}{'targets'} = 1;                              $changes{'curr'}{$balancer}{'targets'} = 1;
                         }                          }
                     }                      }
                 }                  }
             }              }  
         }          }
         my $ishomedom;          my $ishomedom;
         if (&Apache::lonnet::host_domain($balancer) eq $dom) {          if (&Apache::lonnet::host_domain($balancer) eq $dom) {
Line 8549  sub modify_loadbalancing { Line 8292  sub modify_loadbalancing {
         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')) &&                  unless ((($type eq '_LC_external') || ($type eq '_LC_internetdom')) && 
                          (!$ishomedom)) {                           (!$ishomedom)) {
                     $rule = $env{'form.loadbalancing_rules_'.$i.'_'.$type};                      $rule = $env{'form.loadbalancing_rules_'.$i.'_'.$type};
                 }                  }
Line 8574  sub modify_loadbalancing { Line 8317  sub modify_loadbalancing {
         }          }
         my $putresult = &Apache::lonnet::put_dom('configuration',          my $putresult = &Apache::lonnet::put_dom('configuration',
                                                  \%defaultshash,$dom);                                                   \%defaultshash,$dom);
    
         if ($putresult eq 'ok') {          if ($putresult eq 'ok') {
             if (keys(%changes) > 0) {              if (keys(%changes) > 0) {
                 if (ref($changes{'delete'}) eq 'ARRAY') {                  if (ref($changes{'delete'}) eq 'ARRAY') {
Line 8583  sub modify_loadbalancing { Line 8327  sub modify_loadbalancing {
                     }                      }
                 }                  }
                 if (ref($changes{'add'}) eq 'ARRAY') {                  if (ref($changes{'add'}) eq 'ARRAY') {
                     foreach my $balancer (sort(@{$changes{'add'}})) {                      foreach my $balancer (sort(@{$changes{'add'}})) {   
                         $resulttext .= '<li>'.&mt('Load Balancing enabled for: [_1]',$balancer);                          $resulttext .= '<li>'.&mt('Load Balancing enabled for: [_1]',$balancer);
                     }                      }
                 }                  }
Line 8624  sub modify_loadbalancing { Line 8368  sub modify_loadbalancing {
                                         my $balancetext;                                          my $balancetext;
                                         if ($rule eq '') {                                          if ($rule eq '') {
                                             $balancetext =  $ruletitles{'default'};                                              $balancetext =  $ruletitles{'default'};
                                         } elsif (($rule eq 'homeserver') || ($rule eq 'externalbalancer') ||                                          } elsif (($rule eq 'homeserver') || ($rule eq 'externalbalancer')) {
                                                  ($rule eq 'balancer') || ($rule eq 'offloadedto')) {  
                                             $balancetext =  $ruletitles{$rule};                                              $balancetext =  $ruletitles{$rule};
                                         } else {                                          } else {
                                             $balancetext = &mt('offload to [_1]',$defaultshash{'loadbalancing'}{$balancer}{'rules'}{$type});                                              $balancetext = &mt('offload to [_1]',$defaultshash{'loadbalancing'}{$balancer}{'rules'}{$type});
                                         }                                          }
                                         $resulttext .= '<li>'.&mt('Load Balancer: [_1] -- balancing for [_2] set to - "[_3]"',$balancer,$titles->{$type},$balancetext).'</li>';                                          $resulttext .= '<li>'.&mt('Load Balancer: [_1] -- balancing for [_2] set to - "[_3]"',$balancer,$titles->{$type},$balancetext).'</li>';     
                                     }                                      }
                                 }                                  }
                             }                              }
Line 8698  sub recurse_cat_deletes { Line 8441  sub recurse_cat_deletes {
   
 sub get_active_dcs {  sub get_active_dcs {
     my ($dom) = @_;      my ($dom) = @_;
     my $now = time;      my %dompersonnel = &Apache::lonnet::get_domain_roles($dom,['dc']);
     my %dompersonnel = &Apache::lonnet::get_domain_roles($dom,['dc'],$now,$now);  
     my %domcoords;      my %domcoords;
     my $numdcs = 0;      my $numdcs = 0;
       my $now = time;
     foreach my $server (keys(%dompersonnel)) {      foreach my $server (keys(%dompersonnel)) {
         foreach my $user (sort(keys(%{$dompersonnel{$server}}))) {          foreach my $user (sort(keys(%{$dompersonnel{$server}}))) {
             my ($trole,$uname,$udom,$runame,$rudom,$rsec) = split(/:/,$user);              my ($trole,$uname,$udom,$runame,$rudom,$rsec) = split(/:/,$user);
             $domcoords{$uname.':'.$udom} = $dompersonnel{$server}{$user};              my ($end,$start) = split(':',$dompersonnel{$server}{$user});
               if (($end eq '') || ($end == 0) || ($end > $now)) {
                   if ($start <= $now) {
                       $domcoords{$uname.':'.$udom} = $dompersonnel{$server}{$user};
                   }
               }
         }          }
     }      }
     return %domcoords;      return %domcoords;
 }  }
   
 sub active_dc_picker {  sub active_dc_picker {
     my ($dom,$numinrow,$inputtype,$name,%currhash) = @_;      my ($dom,$curr_dc) = @_;
     my %domcoords = &get_active_dcs($dom);       my %domcoords = &get_active_dcs($dom); 
     my @domcoord = keys(%domcoords);      my @dcs = sort(keys(%domcoords));
     if (keys(%currhash)) {      my $numdcs = scalar(@dcs); 
         foreach my $dc (keys(%currhash)) {      my $datatable;
             unless (exists($domcoords{$dc})) {      my $numinrow = 2;
                 push(@domcoord,$dc);  
             }  
         }  
     }  
     @domcoord = sort(@domcoord);  
     my $numdcs = scalar(@domcoord);  
     my $rows = 0;  
     my $table;  
     if ($numdcs > 1) {      if ($numdcs > 1) {
         $table = '<table>';          $datatable = '<table>';
         for (my $i=0; $i<@domcoord; $i++) {          for (my $i=0; $i<@dcs; $i++) {
             my $rem = $i%($numinrow);              my $rem = $i%($numinrow);
             if ($rem == 0) {              if ($rem == 0) {
                 if ($i > 0) {                  if ($i > 0) {
                     $table .= '</tr>';                      $datatable .= '</tr>';
                 }                  }
                 $table .= '<tr>';                  $datatable .= '<tr>';
                 $rows ++;  
             }              }
             my $check = '';              my $check = ' ';
             if ($inputtype eq 'radio') {              if ($curr_dc eq '') {
                 if (keys(%currhash) == 0) {                  if (!$i) { 
                     if (!$i) {                      $check = ' checked="checked" ';
                         $check = ' checked="checked"';  
                     }  
                 } elsif (exists($currhash{$domcoord[$i]})) {  
                     $check = ' checked="checked"';  
                 }  
             } else {  
                 if (exists($currhash{$domcoord[$i]})) {  
                     $check = ' checked="checked"';  
                 }                  }
               } elsif ($dcs[$i] eq $curr_dc) {
                   $check = ' checked="checked" ';
             }              }
             if ($i == @domcoord - 1) {              if ($i == @dcs - 1) {
                 my $colsleft = $numinrow - $rem;                  my $colsleft = $numinrow - $rem;
                 if ($colsleft > 1) {                  if ($colsleft > 1) {
                     $table .= '<td class="LC_left_item" colspan="'.$colsleft.'">';                      $datatable .= '<td colspan="'.$colsleft.'">';
                 } else {                  } else {
                     $table .= '<td class="LC_left_item">';                      $datatable .= '<td>';
                 }                  }
             } else {              } else {
                 $table .= '<td class="LC_left_item">';                  $datatable .= '<td>';
             }  
             my ($dcname,$dcdom) = split(':',$domcoord[$i]);  
             my $user = &Apache::loncommon::plainname($dcname,$dcdom);  
             $table .= '<span class="LC_nobreak"><label>'.  
                       '<input type="'.$inputtype.'" name="'.$name.'"'.  
                       ' value="'.$domcoord[$i].'"'.$check.' />'.$user;  
             if ($user ne $dcname.':'.$dcdom) {  
                 $table .=  ' ('.$dcname.':'.$dcdom.')'.  
                            '</label></span></td>';  
             }  
         }  
         $table .= '</tr></table>';  
     } elsif ($numdcs == 1) {  
         if ($inputtype eq 'radio') {  
             $table .= '<input type="hidden" name="'.$name.'" value="'.$domcoord[0].'" />';  
         } else {  
             my $check;  
             if (exists($currhash{$domcoord[0]})) {  
                 $check = ' checked="checked"';  
             }              }
             $table .= '<input type="checkbox" name="'.$name.'" '.              my ($dcname,$dcdom) = split(':',$dcs[$i]);
                       'value="'.$domcoord[0].'"'.$check.' />';              $datatable .= '<span class="LC_nobreak"><label>'.
             $rows ++;                            '<input type="radio" name="autocreate_xmldc"'.
                             ' value="'.$dcs[$i].'"'.$check.'/>'.
                             &Apache::loncommon::plainname($dcname,$dcdom).
                             ' ('.$dcname.':'.$dcdom.')'.
                             '</label></span></td>';
         }          }
           $datatable .= '</tr></table>';
       } elsif (@dcs) {
           $datatable .= '<input type="hidden" name="autocreate_dc" value="'.
                         $dcs[0].'" />';
     }      }
     return ($numdcs,$table,$rows);      return ($numdcs,$datatable);
 }  }
   
 sub usersession_titles {  sub usersession_titles {
Line 8857  sub lonbalance_targets_js { Line 8579  sub lonbalance_targets_js {
     }      }
     &get_loadbalancers_config($servers,\%existing,\%currbalancer,      &get_loadbalancers_config($servers,\%existing,\%currbalancer,
                               \%currtargets,\%currrules);                                \%currtargets,\%currrules);
     my $balancers = join("','",sort(keys(%currbalancer)));      my $balancers = join("','",sort(keys(%currbalancer))); 
     return <<"END";      return <<"END";
   
 <script type="text/javascript">  <script type="text/javascript">
Line 8928  function showSpares(balancer,ishomedom,b Line 8650  function showSpares(balancer,ishomedom,b
             } else {              } else {
                 document.getElementById('balanceruletitle_'+balnum+'_'+insttypes[k]).style.display='none';                  document.getElementById('balanceruletitle_'+balnum+'_'+insttypes[k]).style.display='none';
                 document.getElementById('balancerule_'+balnum+'_'+insttypes[k]).style.display='none';                  document.getElementById('balancerule_'+balnum+'_'+insttypes[k]).style.display='none';
   
             }              }
         } else {          } else {
             document.getElementById('balanceruletitle_'+balnum+'_'+insttypes[k]).style.display='block';              document.getElementById('balanceruletitle_'+balnum+'_'+insttypes[k]).style.display='block';
Line 8939  function showSpares(balancer,ishomedom,b Line 8662  function showSpares(balancer,ishomedom,b
             var item = document.getElementById('loadbalancing_singleserver_'+balnum+'_'+insttypes[k]);              var item = document.getElementById('loadbalancing_singleserver_'+balnum+'_'+insttypes[k]);
             item.options.length = 0;              item.options.length = 0;
             item.options[0] = new Option("","",true,true);              item.options[0] = new Option("","",true,true);
             var idx = 0;              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)) {                  if ((currBalancers.indexOf(alltargets[m]) == -1) && (alltargets[m] != balancer)) {
                     idx ++;                      idx ++;
                     item.options[idx] = new Option(alltargets[m],alltargets[m],false,false);                      item.options[idx] = new Option(alltargets[m],alltargets[m],false,false);
                       
                 }                  }
             }              }
         }          }
Line 9312  END Line 9036  END
   
 }  }
   
 sub credits_js {  
     return <<"END";  
   
 <script type="text/javascript">  
 // <![CDATA[  
   
 function toggleCredits(domForm) {  
     if (document.getElementById('credits')) {  
         creditsitem = document.getElementById('credits');  
         var creditsLength = domForm.coursecredits.length;  
         if (creditsLength) {  
             var currval;  
             for (var i=0; i<creditsLength; i++) {  
                 if (domForm.coursecredits[i].checked) {  
                    currval = domForm.coursecredits[i].value;  
                 }  
             }  
             if (currval == 1) {  
                 creditsitem.style.display = 'block';  
             } else {  
                 creditsitem.style.display = 'none';  
             }  
         }  
     }  
     return;  
 }  
   
 // ]]>  
 </script>  
   
 END  
   
 }  
   
 sub captcha_phrases {  sub captcha_phrases {
     return &Apache::lonlocal::texthash (      return &Apache::lonlocal::texthash (
                  priv => 'Private key',                   priv => 'Private key',
Line 9356  sub captcha_phrases { Line 9046  sub captcha_phrases {
     );      );
 }  }
   
 sub devalidate_remote_domconfs {  
     my ($dom) = @_;  
     my $primary_id = &Apache::lonnet::domain($dom,'primary');  
     my $intdom = &Apache::lonnet::internet_dom($primary_id);  
     my %servers = &Apache::lonnet::internet_dom_servers($dom);  
     my %thismachine;  
     map { $thismachine{$_} = 1; } &Apache::lonnet::current_machine_ids();  
     if (keys(%servers) > 1) {  
         foreach my $server (keys(%servers)) {  
             next if ($thismachine{$server});  
             &Apache::lonnet::remote_devalidate_cache($server,'domainconfig',$dom);  
         }  
     }  
     return;  
 }  
   
 1;  1;

Removed from v.1.160.6.26  
changed lines
  Added in v.1.186


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