Diff for /loncom/interface/domainprefs.pm between versions 1.37 and 1.76.2.2

version 1.37, 2007/12/21 04:47:24 version 1.76.2.2, 2008/12/17 22:13:22
Line 36  use Apache::lonnet; Line 36  use Apache::lonnet;
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonhtmlcommon();  use Apache::lonhtmlcommon();
 use Apache::lonlocal;  use Apache::lonlocal;
 use LONCAPA();  use Apache::lonmsg();
   use LONCAPA qw(:DEFAULT :match);
 use LONCAPA::Enrollment;  use LONCAPA::Enrollment;
   use LONCAPA::loncgi();
 use File::Copy;  use File::Copy;
   use Locale::Language;
   use DateTime::TimeZone;
   use DateTime::Locale;
   
 sub handler {  sub handler {
     my $r=shift;      my $r=shift;
Line 60  sub handler { Line 65  sub handler {
     }      }
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                             ['phase']);                                              ['phase','actions']);
     my $phase = 'pickactions';      my $phase = 'pickactions';
     if ( exists($env{'form.phase'}) ) {      if ( exists($env{'form.phase'}) ) {
         $phase = $env{'form.phase'};          $phase = $env{'form.phase'};
Line 68  sub handler { Line 73  sub handler {
     my %domconfig =      my %domconfig =
       &Apache::lonnet::get_dom('configuration',['login','rolecolors',        &Apache::lonnet::get_dom('configuration',['login','rolecolors',
                 'quotas','autoenroll','autoupdate','directorysrch',                  'quotas','autoenroll','autoupdate','directorysrch',
                 'usercreation','usermodification','contacts'],$dom);                  'usercreation','usermodification','contacts','defaults',
     my @prefs_order = ('rolecolors','login','quotas','autoenroll',                  'scantron','coursecategories','serverstatuses'],$dom);
       my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll',
                        'autoupdate','directorysrch','contacts',                         'autoupdate','directorysrch','contacts',
                        'usercreation','usermodification');                         'usercreation','usermodification','scantron',
                          'coursecategories','serverstatuses');
     my %prefs = (      my %prefs = (
         'rolecolors' =>          'rolecolors' =>
                    { text => 'Default color schemes',                     { text => 'Default color schemes',
                      help => 'Default_Color_Schemes',                       help => 'Domain_Configuration_Color_Schemes',
                      header => [{col1 => 'Student Settings',                       header => [{col1 => 'Student Settings',
                                  col2 => '',},                                   col2 => '',},
                                 {col1 => 'Coordinator Settings',                                  {col1 => 'Coordinator Settings',
Line 87  sub handler { Line 94  sub handler {
                     },                      },
         'login' =>            'login' =>  
                     { text => 'Log-in page options',                      { text => 'Log-in page options',
                       help => 'Domain_Log-in_Page',                        help => 'Domain_Configuration_Login_Page',
                       header => [{col1 => 'Item',                        header => [{col1 => 'Item',
                                   col2 => '',}],                                    col2 => '',}],
                     },                      },
           'defaults' => 
                       { text => 'Default authentication/language/timezone',
                         help => 'Domain_Configuration_LangTZAuth',
                         header => [{col1 => 'Setting',
                                     col2 => 'Value'}],
                       },
         'quotas' =>           'quotas' => 
                     { text => 'Default quotas for user portfolios',                      { text => 'User blogs, home pages and portfolios',
                       help => 'Default_User_Quota',                        help => 'Domain_Configuration_Quotas',
                       header => [{col1 => 'User type',                        header => [{col1 => 'User type',
                                   col2 => 'Default quota'}],                                    col2 => 'Available tools',
                                     col3 => 'Portfolio quota',}],
                     },                      },
         'autoenroll' =>          'autoenroll' =>
                    { text => 'Auto-enrollment settings',                     { text => 'Auto-enrollment settings',
                      help => 'Domain_Auto_Enrollment',                       help => 'Domain_Configuration_Auto_Enrollment',
                      header => [{col1 => 'Configuration setting',                       header => [{col1 => 'Configuration setting',
                                  col2 => 'Value(s)'}],                                   col2 => 'Value(s)'}],
                    },                     },
         'autoupdate' =>           'autoupdate' => 
                    { text => 'Auto-update settings',                     { text => 'Auto-update settings',
                      help => 'Domain_Auto_Update',                       help => 'Domain_Configuration_Auto_Updates',
                      header => [{col1 => 'Setting',                       header => [{col1 => 'Setting',
                                  col2 => 'Value',},                                   col2 => 'Value',},
                                 {col1 => 'User Population',                                  {col1 => 'User population',
                                  col2 => 'Updataeable user data'}],                                   col2 => 'Updataeable user data'}],
                   },                    },
         'directorysrch' =>           'directorysrch' => 
                   { text => 'Institutional directory searches',                    { text => 'Institutional directory searches',
                     help => 'Domain_Directory_Search',                      help => 'Domain_Configuration_InstDirectory_Search',
                     header => [{col1 => 'Setting',                      header => [{col1 => 'Setting',
                                 col2 => 'Value',}],                                  col2 => 'Value',}],
                   },                    },
         'contacts' =>          'contacts' =>
                   { text => 'Contact Information',                    { text => 'Contact Information',
                     help => 'Domain_Contact_Information',                      help => 'Domain_Configuration_Contact_Info',
                     header => [{col1 => 'Setting',                      header => [{col1 => 'Setting',
                                 col2 => 'Value',}],                                  col2 => 'Value',}],
                   },                    },
   
         'usercreation' =>           'usercreation' => 
                   { text => 'User creation',                    { text => 'User creation',
                     help => 'Domain_User_Creation',                      help => 'Domain_Configuration_User_Creation',
                     header => [{col1 => 'Format Rule Type',                      header => [{col1 => 'Format rule type',
                                 col2 => 'Format Rules in force'},                                  col2 => 'Format rules in force'},
                                {col1 => 'User account creation',                                 {col1 => 'User account creation',
                                 col2 => 'Usernames which may be created',},                                  col2 => 'Usernames which may be created',},
                                {col1 => 'Context',                                 {col1 => 'Context',
                                 col2 => 'Assignable Authentication Types'}],                                  col2 => 'Assignable authentication types'}],
                   },                    },
         'usermodification' =>           'usermodification' =>
                   { text => 'User modification',                    { text => 'User modification',
                     help => 'Domain_User_Modification',                      help => 'Domain_Configuration_User_Modification',
                     header => [{col1 => 'Target user has role',                      header => [{col1 => 'Target user has role',
                                 col2 => 'User information updateable in author context'},                                  col2 => 'User information updateable in author context'},
                                {col1 => 'Target user has role',                                 {col1 => 'Target user has role',
                                 col2 => 'User information updateable in course context'}],                                  col2 => 'User information updateable in course context'},
                                  {col1 => "Status of user",
                                   col2 => 'Information settable when self-creating account (if directory data blank)'}],
                     },
           'scantron' =>
                     { text => 'Scantron format file',
                       help => 'Domain_Configuration_Scantron_Format',
                       header => [ {col1 => 'Item',
                                    col2 => '',
                                 }],
                     },
           'coursecategories' =>
                     { text => 'Cataloging of courses',
                       help => 'Domain_Configuration_Cataloging_Courses',
                       header => [{col1 => 'Category settings',
                                   col2 => '',},
                                  {col1 => 'Categories',
                                   col2 => '',
                                  }],
                   },                    },
           'serverstatuses' =>
                    {text   => 'Access to Server Status Pages',
                     help   => 'Domain_Configuration_Server_Status',
                     header => [{col1 => 'Status Page',
                                 col2 => 'Other named users',
                                 col3 => 'Specific IPs',
                               }],
                    },
     );      );
     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');
Line 231  sub handler { Line 271  sub handler {
             $r->print('<input type="hidden" name="phase" value="" />'.              $r->print('<input type="hidden" name="phase" value="" />'.
                       '<input type="hidden" name="numcols" value="'.                        '<input type="hidden" name="numcols" value="'.
                       $env{'form.numcols'}.'" />'."\n".                        $env{'form.numcols'}.'" />'."\n".
                       '<span clas="LC_error">'.&mt('No settings chosen').                        '<span class="LC_error">'.&mt('No settings chosen').
                       '</span>');                        '</span>');
         }          }
         $r->print('</form>');          $r->print('</form>');
Line 247  sub handler { Line 287  sub handler {
             my @ids=&Apache::lonnet::current_machine_ids();              my @ids=&Apache::lonnet::current_machine_ids();
             if (!grep(/^\Q$primarylibserv\E$/,@ids)) {              if (!grep(/^\Q$primarylibserv\E$/,@ids)) {
                 my %designhash = &Apache::loncommon::get_domainconf($dom);                  my %designhash = &Apache::loncommon::get_domainconf($dom);
                 my @loginimages = ('img','logo','domlogo');                  my @loginimages = ('img','logo','domlogo','login');
                 my $custom_img_count = 0;                  my $custom_img_count = 0;
                 foreach my $img (@loginimages) {                  foreach my $img (@loginimages) {
                     if ($designhash{$dom.'.login.'.$img} ne '') {                      if ($designhash{$dom.'.login.'.$img} ne '') {
Line 276  sub handler { Line 316  sub handler {
         $r->print('<h3>'.&mt('Functionality to display/modify').'</h3>');          $r->print('<h3>'.&mt('Functionality to display/modify').'</h3>');
         $r->print('<script type="text/javascript">'."\n".          $r->print('<script type="text/javascript">'."\n".
               &Apache::loncommon::check_uncheck_jscript()."\n".                &Apache::loncommon::check_uncheck_jscript()."\n".
               '</script>'."\n".'<p><input type="button" value="check all" '.                '</script>'."\n".'<p><input type="button" value="'.&mt('check all').'" '.
               'onclick="javascript:checkAll(document.pickactions.actions)"'.                'onclick="javascript:checkAll(document.pickactions.actions)"'.
               ' />&nbsp;&nbsp;'.                ' />&nbsp;&nbsp;'.
               '<input type="button" value="uncheck all" '.                '<input type="button" value="'.&mt('uncheck all').'" '.
               'onclick="javascript:uncheckAll(document.pickactions.actions)"'.                'onclick="javascript:uncheckAll(document.pickactions.actions)"'.
               ' /></p>');                ' /></p><div class="LC_left_float">');
           my ($numitems,$midpoint,$seconddiv,$count); 
           $numitems = @prefs_order;
           $midpoint = int($numitems/2);
           if ($numitems%2) {
               $midpoint ++;
           }
           $count = 0;
         foreach my $item (@prefs_order) {          foreach my $item (@prefs_order) {
             $r->print('<p><label><input type="checkbox" name="actions" value="'.$item.'" />&nbsp;'.$prefs{$item}->{'text'}.'</label></p>');              $r->print('<h4>'.
                         &Apache::loncommon::help_open_topic($prefs{$item}->{'help'}).
                         '<label><input type="checkbox" name="actions" value="'.$item.
                         '" />&nbsp;'.&mt($prefs{$item}->{'text'}).'</label></h4>');
               $count ++;
               if ((!$seconddiv) && ($count >= $midpoint)) {
                   $r->print('</div>'."\n".'<div class="LC_left_float">'."\n");
                   $seconddiv = 1;
               }
         }          }
         $r->print('<h3>'.&mt('Display options').'</h3>'."\n".          $r->print('</div><div class="LC_clear_float_footer"></div><h3>'.
                     &mt('Display options').'</h3>'."\n".
                   '<p><span class="LC_nobreak">'.&mt('Display using: ')."\n".                    '<p><span class="LC_nobreak">'.&mt('Display using: ')."\n".
                   '<label><input type="radio" name="numcols" value="1">'.                    '<label><input type="radio" name="numcols" value="1" />'.
                   &mt('one column').'</label>&nbsp;&nbsp;'.                    &mt('one column').'</label>&nbsp;&nbsp;<label>'.
                   '<input type="radio" name="numcols" value="2">'.                    '<input type="radio" name="numcols" value="2" />'.
                   &mt('two columns').'</label></span></p>');                    &mt('two columns').'</label></span></p>');
         $r->print(&print_footer($r,$phase,'display','Go'));          $r->print(&print_footer($r,$phase,'display','Go'));
         $r->print('</form>');          $r->print('</form>');
Line 320  sub process_changes { Line 376  sub process_changes {
         $output = &modify_usermodification($dom,%domconfig);          $output = &modify_usermodification($dom,%domconfig);
     } elsif ($action eq 'contacts') {      } elsif ($action eq 'contacts') {
         $output = &modify_contacts($dom,%domconfig);          $output = &modify_contacts($dom,%domconfig);
       } elsif ($action eq 'defaults') {
           $output = &modify_defaults($dom,$r);
       } elsif ($action eq 'scantron') {
           $output = &modify_scantron($r,$dom,$confname,%domconfig);
       } elsif ($action eq 'coursecategories') {
           $output = &modify_coursecategories($dom,%domconfig);
       } elsif ($action eq 'serverstatuses') {
           $output = &modify_serverstatuses($dom,%domconfig);
     }      }
     return $output;      return $output;
 }  }
Line 327  sub process_changes { Line 391  sub process_changes {
 sub print_config_box {  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') {
           $output = &coursecategories_javascript($settings);
       }  
       $output .= 
          '<table class="LC_nested_outer">           '<table class="LC_nested_outer">
           <tr>            <tr>
            <th align="left"><span class="LC_nobreak">'.&mt($item->{text}).             <th align="left" valign="middle"><span class="LC_nobreak">'.
            '&nbsp;</span></th></tr>';             &mt($item->{text}).'&nbsp;'.
 #              &Apache::loncommon::help_open_topic($item->{'help'}).'</span></th>'."\n".
 # FIXME - put the help link back in when the help files exist            '</tr>';
 #           <th>'.&mt($item->{text}).'&nbsp;'.  
 #           &Apache::loncommon::help_open_topic($item->{'help'}).'</th>  
 #          </tr>');  
     $rowtotal ++;      $rowtotal ++;
     if (($action eq 'autoupdate') || ($action eq 'rolecolors') ||       if (($action eq 'autoupdate') || ($action eq 'rolecolors') || 
         ($action eq 'usercreation') || ($action eq 'usermodification')) {          ($action eq 'usercreation') || ($action eq 'usermodification') ||
         my $colspan = ($action eq 'rolecolors')?' colspan="2"':'';          ($action eq 'coursecategories')) {
           my $colspan = '';
           if (($action eq 'rolecolors') || ($action eq 'coursecategories')) {
               $colspan = ' colspan="2"';
           }
         $output .= '          $output .= '
           <tr>            <tr>
            <td>             <td>
             <table class="LC_nested">              <table class="LC_nested">
              <tr class="LC_info_row">               <tr class="LC_info_row">
               <td class="LC_left_item"'.$colspan.'>'.$item->{'header'}->[0]->{'col1'}.'</td>                <td class="LC_left_item"'.$colspan.'>'.&mt($item->{'header'}->[0]->{'col1'}).'</td>
               <td class="LC_right_item">'.$item->{'header'}->[0]->{'col2'}.'</td>                <td class="LC_right_item">'.&mt($item->{'header'}->[0]->{'col2'}).'</td>
              </tr>';               </tr>';
              $rowtotal ++;          $rowtotal ++;
         if ($action eq 'autoupdate') {          if ($action eq 'autoupdate') {
             $output .= &print_autoupdate('top',$dom,$settings,\$rowtotal);              $output .= &print_autoupdate('top',$dom,$settings,\$rowtotal);
         } elsif ($action eq 'usercreation') {          } elsif ($action eq 'usercreation') {
             $output .= &print_usercreation('top',$dom,$settings,\$rowtotal);              $output .= &print_usercreation('top',$dom,$settings,\$rowtotal);
         } elsif ($action eq 'usermodification') {          } elsif ($action eq 'usermodification') {
             $output .= &print_usermodification('top',$dom,$settings,\$rowtotal);              $output .= &print_usermodification('top',$dom,$settings,\$rowtotal);
           } elsif ($action eq 'coursecategories') {
               $output .= &print_coursecategories('top',$dom,$item,$settings,\$rowtotal);
         } else {          } else {
             $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal);              $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal);
         }          }
Line 367  sub print_config_box { Line 438  sub print_config_box {
            <td>             <td>
             <table class="LC_nested">              <table class="LC_nested">
              <tr class="LC_info_row">               <tr class="LC_info_row">
               <td class="LC_left_item"'.$colspan.'>'.$item->{'header'}->[1]->{'col1'}.'</td>                <td class="LC_left_item"'.$colspan.'>'.&mt($item->{'header'}->[1]->{'col1'}).'</td>';
               <td class="LC_right_item">'.$item->{'header'}->[1]->{'col2'}.'</td>          $output .= '
                 <td class="LC_right_item"'.$colspan.'>'.&mt($item->{'header'}->[1]->{'col2'}).'</td>
              </tr>';               </tr>';
             $rowtotal ++;              $rowtotal ++;
         if ($action eq 'autoupdate') {          if ($action eq 'autoupdate') {
Line 382  sub print_config_box { Line 454  sub print_config_box {
            <td>             <td>
             <table class="LC_nested">              <table class="LC_nested">
              <tr class="LC_info_row">               <tr class="LC_info_row">
               <td class="LC_left_item"'.$colspan.'>'.$item->{'header'}->[2]->{'col1'}.'</td>                <td class="LC_left_item"'.$colspan.'>'.&mt($item->{'header'}->[2]->{'col1'}).'</td>
               <td class="LC_right_item">'.$item->{'header'}->[2]->{'col2'}.'</td>             </tr>'.                <td class="LC_right_item">'.&mt($item->{'header'}->[2]->{'col2'}).'</td>             </tr>'.
             &print_usercreation('bottom',$dom,$settings,\$rowtotal);              &print_usercreation('bottom',$dom,$settings,\$rowtotal);
             $rowtotal ++;              $rowtotal ++;
         } elsif ($action eq 'usermodification') {          } elsif ($action eq 'usermodification') {
             $output .= &print_usermodification('bottom',$dom,$settings,\$rowtotal);              $output .= &print_usermodification('middle',$dom,$settings,\$rowtotal).'
              </table>
             </td>
            </tr>
            <tr>
              <td>
               <table class="LC_nested">
                <tr class="LC_info_row">
                 <td class="LC_left_item"'.$colspan.'>'.&mt($item->{'header'}->[2]->{'col1'}).'</td>
                 <td class="LC_right_item">'.&mt($item->{'header'}->[2]->{'col2'}).'</td>      </tr>'.
   
                          &print_usermodification('bottom',$dom,$settings,\$rowtotal);
               $rowtotal ++;
           } elsif ($action eq 'coursecategories') {
               $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal);
         } else {          } else {
             $output .= &print_rolecolors($phase,'coordinator',$dom,$confname,$settings,\$rowtotal).'              $output .= &print_rolecolors($phase,'coordinator',$dom,$confname,$settings,\$rowtotal).'
            </table>             </table>
Line 397  sub print_config_box { Line 483  sub print_config_box {
            <td>             <td>
             <table class="LC_nested">              <table class="LC_nested">
              <tr class="LC_info_row">               <tr class="LC_info_row">
               <td class="LC_left_item"'.$colspan.'>'.$item->{'header'}->[2]->{'col1'}.'</td>                <td class="LC_left_item"'.$colspan.' valign="top">'.
               <td class="LC_right_item">'.$item->{'header'}->[2]->{'col2'}.'</td>                 &mt($item->{'header'}->[2]->{'col1'}).'</td>
                 <td class="LC_right_item" valign="top">'.
                  &mt($item->{'header'}->[2]->{'col2'}).'</td>
              </tr>'.               </tr>'.
             &print_rolecolors($phase,'author',$dom,$confname,$settings,\$rowtotal).'              &print_rolecolors($phase,'author',$dom,$confname,$settings,\$rowtotal).'
            </table>             </table>
Line 408  sub print_config_box { Line 496  sub print_config_box {
            <td>             <td>
             <table class="LC_nested">              <table class="LC_nested">
              <tr class="LC_info_row">               <tr class="LC_info_row">
               <td class="LC_left_item"'.$colspan.'>'.$item->{'header'}->[3]->{'col1'}.'</td>                <td class="LC_left_item"'.$colspan.'>'.&mt($item->{'header'}->[3]->{'col1'}).'</td>
               <td class="LC_right_item">'.$item->{'header'}->[3]->{'col2'}.'</td>                <td class="LC_right_item">'.&mt($item->{'header'}->[3]->{'col2'}).'</td>
              </tr>'.               </tr>'.
             &print_rolecolors($phase,'admin',$dom,$confname,$settings,\$rowtotal);              &print_rolecolors($phase,'admin',$dom,$confname,$settings,\$rowtotal);
             $rowtotal += 2;              $rowtotal += 2;
Line 422  sub print_config_box { Line 510  sub print_config_box {
              <tr class="LC_info_row">';               <tr class="LC_info_row">';
         if (($action eq 'login') || ($action eq 'directorysrch')) {          if (($action eq 'login') || ($action eq 'directorysrch')) {
             $output .= '                $output .= '  
               <td class="LC_left_item" colspan="2">'.$item->{'header'}->[0]->{'col1'}.'</td>';                <td class="LC_left_item" colspan="2">'.&mt($item->{'header'}->[0]->{'col1'}).'</td>';
           } elsif ($action eq 'serverstatuses') {
               $output .= '
                 <td class="LC_left_item" valign="top">'.&mt($item->{'header'}->[0]->{'col1'}).
                 '<br />('.&mt('Automatic access for Dom. Coords.').')</td>';
   
         } else {          } else {
             $output .= '              $output .= '
               <td class="LC_left_item">'.$item->{'header'}->[0]->{'col1'}.'</td>';                <td class="LC_left_item" valign="top">'.&mt($item->{'header'}->[0]->{'col1'}).'</td>';
         }          }
         $output .= '          if (defined($item->{'header'}->[0]->{'col3'})) {
               <td class="LC_right_item">'.$item->{'header'}->[0]->{'col2'}.'</td>              $output .= '<td class="LC_left_item" valign="top">'.
              </tr>';                         &mt($item->{'header'}->[0]->{'col2'});
         $rowtotal ++;                    if ($action eq 'serverstatuses') {
                   $output .= '<br />(<tt>'.&mt('user1:domain1,user2:domain2 etc.').'</tt>)';
               } 
           } else {
               $output .= '<td class="LC_right_item" valign="top">'.
                          &mt($item->{'header'}->[0]->{'col2'});
           }
           $output .= '</td>';
           if ($item->{'header'}->[0]->{'col3'}) {
               $output .= '<td class="LC_right_item" valign="top">'.
                          &mt($item->{'header'}->[0]->{'col3'});
               if ($action eq 'serverstatuses') {
                   $output .= '<br />(<tt>'.&mt('IP1,IP2 etc.').'</tt>)';
               }
               $output .= '</td>';
           }
           $output .= '</tr>';
           $rowtotal ++;
         if ($action eq 'login') {          if ($action eq 'login') {
             $output .= &print_login($dom,$confname,$phase,$settings,\$rowtotal);              $output .= &print_login($dom,$confname,$phase,$settings,\$rowtotal);
         } elsif ($action eq 'quotas') {          } elsif ($action eq 'quotas') {
Line 441  sub print_config_box { Line 551  sub print_config_box {
             $output .= &print_directorysrch($dom,$settings,\$rowtotal);              $output .= &print_directorysrch($dom,$settings,\$rowtotal);
         } elsif ($action eq 'contacts') {          } elsif ($action eq 'contacts') {
             $output .= &print_contacts($dom,$settings,\$rowtotal);              $output .= &print_contacts($dom,$settings,\$rowtotal);
           } elsif ($action eq 'defaults') {
               $output .= &print_defaults($dom,\$rowtotal);
           } elsif ($action eq 'scantron') {
               $output .= &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal);
           } elsif ($action eq 'serverstatuses') {
               $output .= &print_serverstatuses($dom,$settings,\$rowtotal);
         }          }
     }      }
     $output .= '      $output .= '
Line 461  function changePage(formname,newphase) { Line 577  function changePage(formname,newphase) {
     numchecked = 0;      numchecked = 0;
     if (formname == document.pickactions) {      if (formname == document.pickactions) {
         if (formname.actions.length > 0) {          if (formname.actions.length > 0) {
             for (var i = 0; i <formname.actions.length; i++) {              for (var i = 0; i<formname.actions.length; i++) {
                 if (formname.actions[i].checked) {                  if (formname.actions[i].checked) {
                     numchecked ++;                      numchecked ++;
                 }                  }
Line 555  sub print_footer { Line 671  sub print_footer {
 sub print_login {  sub print_login {
     my ($dom,$confname,$phase,$settings,$rowtotal) = @_;      my ($dom,$confname,$phase,$settings,$rowtotal) = @_;
     my %choices = &login_choices();      my %choices = &login_choices();
     my ($catalogon,$catalogoff,$adminmailon,$adminmailoff);      my %defaultchecked = ( 
     $catalogon = ' checked="checked" ';                             'coursecatalog' => 'on',
     $adminmailoff = ' checked="checked" ';                             'adminmail'     => 'off',
     my @images = ('img','logo','domlogo');                             'newuser'       => 'off',
                            );
       my @toggles = ('coursecatalog','adminmail','newuser');
       my (%checkedon,%checkedoff);
       foreach my $item (@toggles) {
           if ($defaultchecked{$item} eq 'on') { 
               $checkedon{$item} = ' checked="checked" ';
               $checkedoff{$item} = ' ';
           } elsif ($defaultchecked{$item} eq 'off') {
               $checkedoff{$item} = ' checked="checked" ';
               $checkedon{$item} = ' ';
           }
       }
       my $loginheader = 'image';
       my @images = ('img','logo','domlogo','login');
       my @logintext = ('textcol','bgcol');
     my @bgs = ('pgbg','mainbg','sidebg');      my @bgs = ('pgbg','mainbg','sidebg');
     my @links = ('link','alink','vlink');      my @links = ('link','alink','vlink');
     my %designhash = &Apache::loncommon::get_domainconf($dom);      my %designhash = &Apache::loncommon::get_domainconf($dom);
Line 569  sub print_login { Line 700  sub print_login {
                    );                     );
     foreach my $item (@images) {      foreach my $item (@images) {
         $defaults{$item} = $defaultdesign{'login.'.$item};          $defaults{$item} = $defaultdesign{'login.'.$item};
           $defaults{'showlogo'}{$item} = 1;
     }      }
     foreach my $item (@bgs) {      foreach my $item (@bgs) {
         $defaults{'bgs'}{$item} = $defaultdesign{'login.'.$item};          $defaults{'bgs'}{$item} = $defaultdesign{'login.'.$item};
     }      }
       foreach my $item (@logintext) {
           $defaults{'logintext'}{$item} = $defaultdesign{'login.'.$item};
       }
     foreach my $item (@links) {      foreach my $item (@links) {
         $defaults{'links'}{$item} = $defaultdesign{'login.'.$item};          $defaults{'links'}{$item} = $defaultdesign{'login.'.$item};
     }      }
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         if ($settings->{'coursecatalog'} eq '0') {          foreach my $item (@toggles) {
             $catalogoff = $catalogon;              if ($settings->{$item} eq '1') {
             $catalogon = ' ';                  $checkedon{$item} =  ' checked="checked" ';
         }                  $checkedoff{$item} = ' ';
         if ($settings->{'adminmail'} eq '1') {              } elsif ($settings->{$item} eq '0') {
             $adminmailon = $adminmailoff;                  $checkedoff{$item} =  ' checked="checked" ';
             $adminmailoff = ' ';                  $checkedon{$item} = ' ';
               }
         }          }
         foreach my $item (@images) {          foreach my $item (@images) {
             if ($settings->{$item} ne '') {              if (defined($settings->{$item})) {
                 $designs{$item} = $settings->{$item};                  $designs{$item} = $settings->{$item};
                 $is_custom{$item} = 1;                  $is_custom{$item} = 1;
             }              }
               if (defined($settings->{'showlogo'}{$item})) {
                   $designs{'showlogo'}{$item} = $settings->{'showlogo'}{$item};
               }
           }
           foreach my $item (@logintext) {
               if ($settings->{$item} ne '') {
                   $designs{'logintext'}{$item} = $settings->{$item};
                   $is_custom{$item} = 1;
               }
           }
           if ($settings->{'loginheader'} ne '') {
               $loginheader = $settings->{'loginheader'};
         }          }
         if ($settings->{'font'} ne '') {          if ($settings->{'font'} ne '') {
             $designs{'font'} = $settings->{'font'};              $designs{'font'} = $settings->{'font'};
Line 633  sub print_login { Line 781  sub print_login {
     }      }
     my %alt_text = &Apache::lonlocal::texthash  ( img => 'Log-in banner',      my %alt_text = &Apache::lonlocal::texthash  ( img => 'Log-in banner',
                                                   logo => 'Institution Logo',                                                    logo => 'Institution Logo',
                                                   domlogo => 'Domain Logo');                                                    domlogo => 'Domain Logo',
                                                     login => 'Login box');
     my $itemcount = 1;      my $itemcount = 1;
     my $css_class = $itemcount%2?' class="LC_odd_row"':'';      my ($css_class,$datatable);
     my $datatable =       foreach my $item (@toggles) {
         '<tr'.$css_class.'><td colspan="2">'.$choices{'coursecatalog'}.          $css_class = $itemcount%2?' class="LC_odd_row"':'';
         '</td><td>'.          $datatable .=  
         '<span class="LC_nobreak"><label><input type="radio" name="coursecatalog"'.              '<tr'.$css_class.'><td colspan="2">'.$choices{$item}.
         $catalogon.' value="1" />'.&mt('Yes').'</label>&nbsp;'.              '</td><td>'.
         '<label><input type="radio" name="coursecatalog"'.              '<span class="LC_nobreak"><label><input type="radio" name="'.
         $catalogoff.'value="0" />'.&mt('No').'</label></span></td>'.              $item.'"'.$checkedon{$item}.' value="1" />'.&mt('Yes').
         '</tr>';              '</label>&nbsp;<label><input type="radio" name="'.$item.'"'.
     $itemcount ++;              $checkedoff{$item}.' value="0" />'.&mt('No').'</label></span></td>'.
     $css_class = $itemcount%2?' class="LC_odd_row"':'';              '</tr>';
     $datatable .= '<tr'.$css_class.'>'.          $itemcount ++;
         '<td colspan="2">'.$choices{'adminmail'}.'</td>'.      }
         '<td><span class="LC_nobreak">'.      $datatable .= &display_color_options($dom,$confname,$phase,'login',$itemcount,\%choices,\%is_custom,\%defaults,\%designs,\@images,\@bgs,\@links,\%alt_text,$rowtotal,\@logintext,$loginheader);
         '<label><input type="radio" name="adminmail"'.  
         $adminmailon.' value="1" />'.&mt('Yes').'</label>&nbsp;'.  
         '<label><input type="radio" name="adminmail"'.  
         $adminmailoff.'value="0" />'.&mt('No').'</label></span></td></tr>';  
     $itemcount ++;  
     $datatable .= &display_color_options($dom,$confname,$phase,'login',$itemcount,\%choices,\%is_custom,\%defaults,\%designs,\@images,\@bgs,\@links,\%alt_text,$rowtotal);  
     $datatable .= '</tr></table></td></tr>';      $datatable .= '</tr></table></td></tr>';
     return $datatable;      return $datatable;
 }  }
Line 664  sub login_choices { Line 807  sub login_choices {
         &Apache::lonlocal::texthash (          &Apache::lonlocal::texthash (
             coursecatalog => 'Display Course Catalog link?',              coursecatalog => 'Display Course Catalog link?',
             adminmail => "Display Administrator's E-mail Address?",              adminmail => "Display Administrator's E-mail Address?",
               newuser   => "Link to create a user account",
             img => "Header",              img => "Header",
             logo => "Main Logo",              logo => "Main Logo",
             domlogo => "Domain Logo",              domlogo => "Domain Logo",
               login => "Log-in Header", 
               textcol => "Text color",
               bgcol   => "Box color",
             bgs => "Background colors",              bgs => "Background colors",
             links => "Link colors",              links => "Link colors",
             font => "Font color",              font => "Font color",
Line 754  sub print_rolecolors { Line 901  sub print_rolecolors {
   
 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) = @_;          $images,$bgs,$links,$alt_text,$rowtotal,$logintext,$loginheader) = @_;
     my $css_class = $itemcount%2?' class="LC_odd_row"':'';      my $css_class = $itemcount%2?' class="LC_odd_row"':'';
     my $datatable = '<tr'.$css_class.'>'.      my $datatable = '<tr'.$css_class.'>'.
         '<td>'.$choices->{'font'}.'</td>';          '<td>'.$choices->{'font'}.'</td>';
Line 775  sub display_color_options { Line 922  sub display_color_options {
  $itemcount ++;   $itemcount ++;
         $css_class = $itemcount%2?' class="LC_odd_row"':'';          $css_class = $itemcount%2?' class="LC_odd_row"':'';
         $datatable .= '<tr'.$css_class.'>'.          $datatable .= '<tr'.$css_class.'>'.
                       '<td>'.$choices->{$img}.'</td>';                        '<td>'.$choices->{$img};
         my ($imgfile, $img_import);          my ($imgfile,$img_import,$login_hdr_pick,$logincolors);
           if ($role eq 'login') {
               if ($img eq 'login') {
                   $login_hdr_pick =
                       &login_header_options($img,$role,$defaults,$is_custom,$choices,
                                             $loginheader);
                   $logincolors =
                       &login_text_colors($img,$role,$logintext,$phase,$choices,
                                               $designs);
               } elsif ($img ne 'domlogo') {
                   $datatable.= &logo_display_options($img,$defaults,$designs);
               }
           }
           $datatable .= '</td>';
         if ($designs->{$img} ne '') {          if ($designs->{$img} ne '') {
             $imgfile = $designs->{$img};              $imgfile = $designs->{$img};
     $img_import = ($imgfile =~ m{^/adm/});      $img_import = ($imgfile =~ m{^/adm/});
Line 823  sub display_color_options { Line 983  sub display_color_options {
                 }                  }
             }              }
             if ($showfile) {              if ($showfile) {
                 $showfile = &Apache::loncommon::lonhttpdurl($showfile);                  if ($showfile =~ m{^/(adm|res)/}) {
                 $fullsize =  &Apache::loncommon::lonhttpdurl($imgfile);                      if ($showfile =~ m{^/res/}) {
                 $datatable.= '<td>';                          my $local_showfile =
                 if (!$is_custom->{$img}) {                              &Apache::lonnet::filelocation('',$showfile);
                     $datatable .= &mt('Default in use:').'<br />';                          &Apache::lonnet::repcopy($local_showfile);
                 }                      }
  if ($img_import) {                      $showfile = &Apache::loncommon::lonhttpdurl($showfile);
     $datatable.= '<input type="hidden" name="'.$role.'_import_'.$img.'" value="'.$imgfile.'" />';                  }
  }                  if ($imgfile) {
                 $datatable.= '<a href="'.$fullsize.'" target="_blank"><img src="'.                      if ($imgfile  =~ m{^/(adm|res)/}) {
                              $showfile.'" alt="'.$alt_text->{$img}.                          if ($imgfile =~ m{^/res/}) {
                              '" border="0" /></a></td>';                              my $local_imgfile =
                 if ($is_custom->{$img}) {                                  &Apache::lonnet::filelocation('',$imgfile);
                     $datatable.='<td><span class="LC_nobreak"><label><input type="checkbox" name="'.                              &Apache::lonnet::repcopy($local_imgfile);
                                 $role.'_del_'.$img.'" value="1" />'.&mt('Delete?').                          }
                                 '</label>&nbsp;'.&mt('Replace:').'</span><br />';                          $fullsize = &Apache::loncommon::lonhttpdurl($imgfile);
                 } else {                      } else {
                     $datatable.='<td valign="bottom">'.&mt('Upload:').'<br />';                          $fullsize = $imgfile;
                       }
                 }                  }
                   $datatable .= '<td>';
                   if ($img eq 'login') {
                       $datatable .= $login_hdr_pick;    
                   }
                   $datatable .= &image_changes($is_custom->{$img},$alt_text->{$img},$img_import,
                                                $showfile,$fullsize,$role,$img,$imgfile,$logincolors);
             } else {              } else {
                 $datatable .= '<td colspan="2" class="LC_right_item"><br />'.                  $datatable .= '<td colspan="2" class="LC_right_item"><br />'.
                               &mt('Upload:');                                &mt('Upload:');
Line 864  sub display_color_options { Line 1031  sub display_color_options {
     my $bgs_def;      my $bgs_def;
     foreach my $item (@{$bgs}) {      foreach my $item (@{$bgs}) {
         if (!$is_custom->{$item}) {          if (!$is_custom->{$item}) {
             $bgs_def .= '<td>'.$choices->{$item}.'&nbsp;<span id="css_default_'.$role.'_'.$item.'" style="background-color: '.$defaults->{'bgs'}{$item}.';">&nbsp;&nbsp;&nbsp;</span><br />'.$defaults->{'bgs'}{$item}.'</td>';              $bgs_def .= '<td><span class="LC_nobreak">'.$choices->{$item}.'</span>&nbsp;<span id="css_default_'.$role.'_'.$item.'" style="background-color: '.$defaults->{'bgs'}{$item}.';">&nbsp;&nbsp;&nbsp;</span><br />'.$defaults->{'bgs'}{$item}.'</td>';
         }          }
     }      }
     if ($bgs_def) {      if ($bgs_def) {
Line 881  sub display_color_options { Line 1048  sub display_color_options {
             $datatable .= '&nbsp;<span id="css_'.$role.'_'.$item.'" style="background-color: '.$designs->{'bgs'}{$item}.';">&nbsp;&nbsp;&nbsp;</span>';              $datatable .= '&nbsp;<span id="css_'.$role.'_'.$item.'" style="background-color: '.$designs->{'bgs'}{$item}.';">&nbsp;&nbsp;&nbsp;</span>';
         }          }
         $datatable .= '<br /><input type="text" size="8" name="'.$role.'_'.$item.'" value="'.$designs->{'bgs'}{$item}.          $datatable .= '<br /><input type="text" size="8" name="'.$role.'_'.$item.'" value="'.$designs->{'bgs'}{$item}.
                       '" onblur = "javascript:document.display.css_'.$role.'_'.$item.'.style.background-color = document.display.'.$role.'_'.$item.'.value;"/></td>';                        '" onblur = "javascript:colchg_span('."'css_".$role.'_'.$item."'".',this);" /></td>';
     }      }
     $datatable .= '</tr></table></td></tr>';      $datatable .= '</tr></table></td></tr>';
     $itemcount ++;      $itemcount ++;
Line 915  sub display_color_options { Line 1082  sub display_color_options {
     return $datatable;      return $datatable;
 }  }
   
   sub logo_display_options {
       my ($img,$defaults,$designs) = @_;
       my $checkedon;
       if (ref($defaults) eq 'HASH') {
           if (ref($defaults->{'showlogo'}) eq 'HASH') {
               if ($defaults->{'showlogo'}{$img}) {
                   $checkedon = 'checked="checked" ';     
               }
           } 
       }
       if (ref($designs) eq 'HASH') {
           if (ref($designs->{'showlogo'}) eq 'HASH') {
               if (defined($designs->{'showlogo'}{$img})) {
                   if ($designs->{'showlogo'}{$img} == 0) {
                       $checkedon = '';
                   } elsif ($designs->{'showlogo'}{$img} == 1) {
                       $checkedon = 'checked="checked" ';
                   }
               }
           }
       }
       return '<br /><label>&nbsp;&nbsp;<input type="checkbox" name="'.
              'login_showlogo_'.$img.'" value="1" '.$checkedon.'/>'.
              &mt('show').'</label>'."\n";
   }
   
   sub login_header_options  {
       my ($img,$role,$defaults,$is_custom,$choices,$loginheader) = @_;
       my $image_checked = ' checked="checked" ';
       my $text_checked = ' ';
       if ($loginheader eq 'text') {
           $image_checked = ' ';
           $text_checked = ' checked="checked" ';
       }
       my $output = '<span class="LC_nobreak"><label><input type="radio" name="'.
                 'loginheader" value="image" '.$image_checked.'/>'.
                 &mt('use image').'</label>&nbsp;&nbsp;&nbsp;'.
                 '<label><input type="radio" name="loginheader" value="text"'.
                 $text_checked.'/>'.&mt('use text').'</label><br />'."\n";
       if ((!$is_custom->{'textcol'}) || (!$is_custom->{'bgcol'})) {
           $output .= &mt('Text default(s)').':<br />';
           if (!$is_custom->{'textcol'}) {
               $output .= $choices->{'textcol'}.':&nbsp;'.$defaults->{'logintext'}{'textcol'}.
                          '&nbsp;&nbsp;&nbsp;';
           }
           if (!$is_custom->{'bgcol'}) {
               $output .= $choices->{'bgcol'}.':&nbsp;'.
                          '<span id="css_'.$role.'_font" style="background-color: '.
                          $defaults->{'logintext'}{'bgcol'}.';">&nbsp;&nbsp;&nbsp;</span>';
           }
           $output .= '<br />';
       }
       $output .='<br />';
       return $output;
   }
   
   sub login_text_colors {
       my ($img,$role,$logintext,$phase,$choices,$designs) = @_;
       my $color_menu = '<table border="0"><tr>';
       foreach my $item (@{$logintext}) {
           my $link = &color_pick($phase,$role,$item,$choices->{$item},$designs->{'logintext'}{$item});
           $color_menu .= '<td align="center">'.$link;
           if ($designs->{'logintext'}{$item}) {
               $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 />';
       return $color_menu;
   }
   
   sub image_changes {
       my ($is_custom,$alt_text,$img_import,$showfile,$fullsize,$role,$img,$imgfile,$logincolors) = @_;
       my $output;
       if (!$is_custom) {
           if ($img ne 'domlogo') {
               $output .= &mt('Default image:').'<br />';
           } else {
               $output .= &mt('Default in use:').'<br />';
           }
       }
       if ($img_import) {
           $output .= '<input type="hidden" name="'.$role.'_import_'.$img.'" value="'.$imgfile.'" />';
       }
       $output .= '<a href="'.$fullsize.'" target="_blank"><img src="'.
                  $showfile.'" alt="'.$alt_text.'" border="0" /></a></td>';
       if ($is_custom) {
           $output .= '<td>'.$logincolors.'<span class="LC_nobreak"><label>'.
                      '<input type="checkbox" name="'.
                      $role.'_del_'.$img.'" value="1" />'.&mt('Delete?').
                      '</label>&nbsp;'.&mt('Replace:').'</span><br />';
       } else {
           $output .= '<td valign="bottom">'.$logincolors.&mt('Upload:').'<br />';
       }
       return $output;
   }
   
 sub color_pick {  sub color_pick {
     my ($phase,$role,$item,$desc,$curcol) = @_;      my ($phase,$role,$item,$desc,$curcol) = @_;
     my $link = '<a href="javascript:pjump('."'color_custom','".$desc.      my $link = '<a href="javascript:pjump('."'color_custom','".$desc.
Line 946  sub color_pick_js { Line 1212  sub color_pick_js {
             document.parmform.pres_marker.value='';              document.parmform.pres_marker.value='';
         }          }
     }      }
   
       function get_id (span_id) {
    if (document.getElementById) {
               return document.getElementById(span_id);
           }
    if (document.all) {
               return document.all[span_id];
           } 
    return false;
       }
   
       function colchg_span (span_id_str,new_color_item) {
    var span_ref = get_id(span_id_str);
    if (span_ref.style) { span_ref = span_ref.style; }
    span_ref.background = new_color_item.value;
    span_ref.backgroundColor = new_color_item.value;
    span_ref.bgColor = new_color_item.value;
       }
   
 ENDCOL  ENDCOL
     return $output;      return $output;
 }  }
Line 953  ENDCOL Line 1238  ENDCOL
 sub print_quotas {  sub print_quotas {
     my ($dom,$settings,$rowtotal) = @_;      my ($dom,$settings,$rowtotal) = @_;
     my $datatable;      my $datatable;
     my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);      my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
     my $typecount = 0;      my $typecount = 0;
     my $css_class;      my $css_class;
       my @usertools = ('aboutme','blog','portfolio');
       my %titles = &tool_titles();
     if (ref($types) eq 'ARRAY') {      if (ref($types) eq 'ARRAY') {
         foreach my $type (@{$types}) {          foreach my $type (@{$types}) {
               my $currdefquota;
               if (ref($settings) eq 'HASH') {
                   if (ref($settings->{defaultquota}) eq 'HASH') {
                       $currdefquota = $settings->{defaultquota}->{$type}; 
                   } else {
                       $currdefquota = $settings->{$type};
                   }
               }
             if (defined($usertypes->{$type})) {              if (defined($usertypes->{$type})) {
                 $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>'.$usertypes->{$type}.'</td>'.                                '<td>'.$usertypes->{$type}.'</td>'.
                               '<td class="LC_right_item"><span class="LC_nobreak">'.                                '<td class="LC_left_item">';
                   foreach my $item (@usertools) {
                       my $checked = 'checked="checked" ';
                       if (ref($settings) eq 'HASH') {
                           if (ref($settings->{$item}) eq 'HASH') {
                               if ($settings->{$item}->{$type} == 0) {
                                   $checked = '';
                               }
                           }
                       }
                       $datatable .= '<span class="LC_nobreak"><label>'.
                                     '<input type="checkbox" name="tools_'.$item.
                                     '" value="'.$type.'" '.$checked.'/>'.$titles{$item}.
                                     '</label></span>&nbsp; ';
                   }
                   $datatable .= '</td><td class="LC_right_item"><span class="LC_nobreak">'.
                               '<input type="text" name="quota_'.$type.                                '<input type="text" name="quota_'.$type.
                               '" value="'.$settings->{$type}.                                '" value="'.$currdefquota.
                               '" size="5" /> Mb</span></td></tr>';                                '" size="5" /> Mb</span></td></tr>';
             }              }
         }          }
     }      }
     my $defaultquota = '20';      my $defaultquota = '20';
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         if (defined($settings->{'default'})) {          if (ref($settings->{'defaultquota'}) eq 'HASH') {
               $defaultquota = $settings->{'defaultquota'}->{'default'};
           } elsif (defined($settings->{'default'})) {
             $defaultquota = $settings->{'default'};              $defaultquota = $settings->{'default'};
         }          }
     }      }
Line 980  sub print_quotas { Line 1292  sub print_quotas {
     $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>'.$othertitle.'</td>'.                    '<td>'.$othertitle.'</td>'.
                   '<td class="LC_right_item"><span class="LC_nobreak">'.                    '<td class="LC_left_item">';
       foreach my $item (@usertools) {
           my $checked = 'checked="checked" ';
           if (ref($settings) eq 'HASH') {
               if (ref($settings->{$item}) eq 'HASH') {
                   if ($settings->{$item}->{'default'} == 0) {
                       $checked = '';
                   }
               }
           }
           $datatable .= '<span class="LC_nobreak"><label>'.
                         '<input type="checkbox" name="tools_'.$item.
                         '" value="default" '.$checked.'/>'.$titles{$item}.
                         '</label></span>&nbsp; ';
       }
       $datatable .= '</td><td class="LC_right_item"><span class="LC_nobreak">'.
                   '<input type="text" name="defaultquota" value="'.                    '<input type="text" name="defaultquota" value="'.
                   $defaultquota.'" size="5" /> Mb</span></td></tr>';                    $defaultquota.'" size="5" /> Mb</span></td></tr>';
       $typecount ++;
       $css_class = $typecount%2?' class="LC_odd_row"':'';
       $datatable .= '<tr'.$css_class.'>'.
                     '<td><br/>'.&mt('LON-CAPA Advanced Users').'</td>'.
                     '<td class="LC_left_item" colspan="2"><br />';
       foreach my $item (@usertools) {
           my $checked = 'checked="checked" ';
           if (ref($settings) eq 'HASH') {
               if (ref($settings->{$item}) eq 'HASH') {
                   if ($settings->{$item}->{'_LC_adv'} == 0) {
                       $checked = '';
                   }
               }
           }
           $datatable .= '<span class="LC_nobreak"><label>'.
                         '<input type="checkbox" name="tools_'.$item.
                         '" value="_LC_adv" '.$checked.'/>'.$titles{$item}.
                         '</label></span>&nbsp; ';
       }
       $datatable .= '('.&mt('overrides affiliation').')</td></tr>';
     $$rowtotal += $typecount;      $$rowtotal += $typecount;
     return $datatable;      return $datatable;
 }  }
Line 1022  sub print_autoenroll { Line 1369  sub print_autoenroll {
         }          }
     }      }
     my $domform = &Apache::loncommon::select_dom_form($defdom,'sender_domain',1);      my $domform = &Apache::loncommon::select_dom_form($defdom,'sender_domain',1);
       my $notif_sender;
       if (ref($settings) eq 'HASH') {
           $notif_sender = $settings->{'sender_uname'};
       }
     my $datatable='<tr class="LC_odd_row">'.      my $datatable='<tr class="LC_odd_row">'.
                   '<td>'.&mt('Auto-enrollment active?').'</td>'.                    '<td>'.&mt('Auto-enrollment active?').'</td>'.
                   '<td class="LC_right_item"><span class="LC_nobreak"><label>'.                    '<td class="LC_right_item"><span class="LC_nobreak"><label>'.
Line 1034  sub print_autoenroll { Line 1385  sub print_autoenroll {
                   '</td><td class="LC_right_item"><span class="LC_nobreak">'.                    '</td><td class="LC_right_item"><span class="LC_nobreak">'.
                   &mt('username').':&nbsp;'.                    &mt('username').':&nbsp;'.
                   '<input type="text" name="sender_uname" value="'.                    '<input type="text" name="sender_uname" value="'.
                   $settings->{'sender_uname'}.                    $notif_sender.'" size="10" />&nbsp;&nbsp;'.&mt('domain').
                   '" size="10" />&nbsp;&nbsp;'.&mt('domain').  
                   ':&nbsp;'.$domform.'</span></td></tr>';                    ':&nbsp;'.$domform.'</span></td></tr>';
     $$rowtotal += 2;      $$rowtotal += 2;
     return $datatable;      return $datatable;
Line 1080  sub print_autoupdate { Line 1430  sub print_autoupdate {
                   '</tr>';                    '</tr>';
         $$rowtotal += 2;          $$rowtotal += 2;
     } else {      } else {
         my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);          my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
         my @fields = ('lastname','firstname','middlename','gen',          my @fields = ('lastname','firstname','middlename','gen',
                       'permanentemail','id');                        'permanentemail','id');
         my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();          my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
Line 1140  sub print_directorysrch { Line 1490  sub print_directorysrch {
         }          }
     }      }
     my ($searchtitles,$titleorder) = &sorted_searchtitles();      my ($searchtitles,$titleorder) = &sorted_searchtitles();
     my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);      my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
   
     my $numinrow = 4;      my $numinrow = 4;
     my $cansrchrow = 0;      my $cansrchrow = 0;
Line 1178  sub print_directorysrch { Line 1528  sub print_directorysrch {
     foreach my $title (@{$titleorder}) {      foreach my $title (@{$titleorder}) {
         if (defined($searchtitles->{$title})) {          if (defined($searchtitles->{$title})) {
             my $check = ' ';              my $check = ' ';
             if (ref($settings->{'searchby'}) eq 'ARRAY') {              if (ref($settings) eq 'HASH') { 
                 if (grep(/^\Q$title\E$/,@{$settings->{'searchby'}})) {                  if (ref($settings->{'searchby'}) eq 'ARRAY') {
                     $check = ' checked="checked" ';                      if (grep(/^\Q$title\E$/,@{$settings->{'searchby'}})) {
                           $check = ' checked="checked" ';
                       }
                 }                  }
             }              }
             $datatable .= '<td class="LC_left_item">'.              $datatable .= '<td class="LC_left_item">'.
Line 1251  sub print_contacts { Line 1603  sub print_contacts {
     my $rownum = 0;      my $rownum = 0;
     my $css_class;      my $css_class;
     foreach my $item (@contacts) {      foreach my $item (@contacts) {
         if ($rownum%2) {          $rownum ++;
             $css_class = '';          $css_class = $rownum%2?' class="LC_odd_row"':'';
         } else {  
             $css_class = ' 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) {
         if ($rownum%2) {          $rownum ++;
             $css_class = '';          $css_class = $rownum%2?' class="LC_odd_row"':'';
         } else {  
             $css_class = ' class="LC_odd_row" ';  
         }  
         $datatable .= '<tr'.$css_class.'>'.          $datatable .= '<tr'.$css_class.'>'.
                       '<td><span class="LC_nobreak">'.                        '<td><span class="LC_nobreak">'.
                       $titles->{$type}.': </span></td>'.                        $titles->{$type}.': </span></td>'.
Line 1285  sub print_contacts { Line 1630  sub print_contacts {
                       '<input type="text" name="'.$type.'_others" '.                        '<input type="text" name="'.$type.'_others" '.
                       'value="'.$otheremails{$type}.'"  />'.                        'value="'.$otheremails{$type}.'"  />'.
                       '</td></tr>'."\n";                        '</td></tr>'."\n";
         $rownum ++;  
     }      }
     $$rowtotal += $rownum;      $$rowtotal += $rownum;
     return $datatable;      return $datatable;
Line 1294  sub print_contacts { Line 1638  sub print_contacts {
 sub contact_titles {  sub contact_titles {
     my %titles = &Apache::lonlocal::texthash (      my %titles = &Apache::lonlocal::texthash (
                    'supportemail' => 'Support E-mail address',                     'supportemail' => 'Support E-mail address',
                    'adminemail'    => 'Default Server Admin E-mail address',                     'adminemail'   => 'Default Server Admin E-mail address',
                    'errormail'    => 'Error reports to be e-mailed to',                     'errormail'    => 'Error reports to be e-mailed to',
                    'packagesmail' => 'Package update alerts to be e-mailed to',                     'packagesmail' => 'Package update alerts to be e-mailed to',
                    'helpdeskmail' => 'Helpdesk requests to be e-mailed to'                     'helpdeskmail' => 'Helpdesk requests to be e-mailed to'
Line 1306  sub contact_titles { Line 1650  sub contact_titles {
     return (\%titles,\%short_titles);      return (\%titles,\%short_titles);
 }  }
   
   sub tool_titles {
       my %titles = &Apache::lonlocal::texthash (
                                                 aboutme   => 'Personal Home Page',
                                                 blog      => 'Blog',
                                                 portfolio => 'Portfolio',
                                                );
       return %titles;
   }
   
 sub print_usercreation {  sub print_usercreation {
     my ($position,$dom,$settings,$rowtotal) = @_;      my ($position,$dom,$settings,$rowtotal) = @_;
     my $numinrow = 4;      my $numinrow = 4;
Line 1331  sub print_usercreation { Line 1684  sub print_usercreation {
                 $rowcount ++;                  $rowcount ++;
             }              }
         }          }
           my ($emailrules,$emailruleorder) = 
               &Apache::lonnet::inst_userrules($dom,'email');
           if (ref($emailrules) eq 'HASH') {
               if (keys(%{$emailrules}) > 0) {
                   $datatable .= &user_formats_row('email',$settings,$emailrules,
                                                   $emailruleorder,$numinrow,$rowcount);
                   $$rowtotal ++;
                   $rowcount ++;
               }
           }
           if ($rowcount == 0) {
               $datatable .= '<tr><td colspan="2">'.&mt('No format rules have been defined for usernames or IDs in this domain.').'</td></tr>';  
               $$rowtotal ++;
               $rowcount ++;
           }
     } elsif ($position eq 'middle') {      } elsif ($position eq 'middle') {
         my @creators = ('author','course');          my @creators = ('author','course','selfcreate');
         my ($rules,$ruleorder) =          my ($rules,$ruleorder) =
             &Apache::lonnet::inst_userrules($dom,'username');              &Apache::lonnet::inst_userrules($dom,'username');
         my %lt = &usercreation_types();          my %lt = &usercreation_types();
         my %checked;          my %checked;
           my @selfcreate; 
         if (ref($settings) eq 'HASH') {          if (ref($settings) eq 'HASH') {
             if (ref($settings->{'cancreate'}) eq 'HASH') {              if (ref($settings->{'cancreate'}) eq 'HASH') {
                 foreach my $item (@creators) {                  foreach my $item (@creators) {
                     $checked{$item} = $settings->{'cancreate'}{$item};                      $checked{$item} = $settings->{'cancreate'}{$item};
                 }                  }
                   if (ref($settings->{'cancreate'}{'selfcreate'}) eq 'ARRAY') {
                       @selfcreate = @{$settings->{'cancreate'}{'selfcreate'}};
                   } elsif ($settings->{'cancreate'}{'selfcreate'} ne '') {
                       if ($settings->{'cancreate'}{'selfcreate'} eq 'any') {
                           @selfcreate = ('email','login','sso');
                       } elsif ($settings->{'cancreate'}{'selfcreate'} ne 'none') {
                           @selfcreate = ($settings->{'cancreate'}{'selfcreate'});
                       }
                   }
             } elsif (ref($settings->{'cancreate'}) eq 'ARRAY') {              } elsif (ref($settings->{'cancreate'}) eq 'ARRAY') {
                 foreach my $item (@creators) {                  foreach my $item (@creators) {
                     if (grep(/^\Q$item\E$/,@{$settings->{'cancreate'}})) {                      if (grep(/^\Q$item\E$/,@{$settings->{'cancreate'}})) {
Line 1353  sub print_usercreation { Line 1731  sub print_usercreation {
         my $rownum = 0;          my $rownum = 0;
         foreach my $item (@creators) {          foreach my $item (@creators) {
             $rownum ++;              $rownum ++;
             if ($checked{$item} eq '') {              if ($item ne 'selfcreate') {  
                 $checked{$item} = 'any';                  if ($checked{$item} eq '') {
                       $checked{$item} = 'any';
                   }
             }              }
             my $css_class;              my $css_class;
             if ($rownum%2) {              if ($rownum%2) {
Line 1365  sub print_usercreation { Line 1745  sub print_usercreation {
             $datatable .= '<tr'.$css_class.'>'.              $datatable .= '<tr'.$css_class.'>'.
                          '<td><span class="LC_nobreak">'.$lt{$item}.                           '<td><span class="LC_nobreak">'.$lt{$item}.
                          '</span></td><td align="right">';                           '</span></td><td align="right">';
             my @options = ('any');              my @options;
             if (ref($rules) eq 'HASH') {              if ($item eq 'selfcreate') {
                 if (keys(%{$rules}) > 0) {                  push(@options,('email','login','sso'));
                     push(@options,('official','unofficial'));              } else {
                   @options = ('any');
                   if (ref($rules) eq 'HASH') {
                       if (keys(%{$rules}) > 0) {
                           push(@options,('official','unofficial'));
                       }
                 }                  }
                   push(@options,'none');
             }              }
             push(@options,'none');  
             foreach my $option (@options) {              foreach my $option (@options) {
                   my $type = 'radio';
                 my $check = ' ';                  my $check = ' ';
                 if ($checked{$item} eq $option) {                  if ($item eq 'selfcreate') {
                     $check = ' checked="checked" ';                      $type = 'checkbox';
                       if (grep(/^\Q$option\E$/,@selfcreate)) {
                           $check = ' checked="checked" ';
                       }
                   } else {
                       if ($checked{$item} eq $option) {
                           $check = ' checked="checked" ';
                       }
                 }                   } 
                 $datatable .= '<span class="LC_nobreak"><label>'.                  $datatable .= '<span class="LC_nobreak"><label>'.
                               '<input type="radio" name="can_createuser_'.                                '<input type="'.$type.'" name="can_createuser_'.
                               $item.'" value="'.$option.'"'.$check.'/>&nbsp;'.                                $item.'" value="'.$option.'"'.$check.'/>&nbsp;'.
                               $lt{$option}.'</label>&nbsp;&nbsp;</span>';                                $lt{$option}.'</label>&nbsp;&nbsp;</span>';
             }              }
Line 1441  sub user_formats_row { Line 1834  sub user_formats_row {
     my %text = (      my %text = (
                    'username' => 'new usernames',                     'username' => 'new usernames',
                    'id'       => 'IDs',                     'id'       => 'IDs',
                      'email'    => 'self-created accounts (e-mail)',
                );                 );
     my $css_class = $rowcount%2?' class="LC_odd_row"':'';      my $css_class = $rowcount%2?' class="LC_odd_row"':'';
     $output = '<tr '.$css_class.'>'.      $output = '<tr '.$css_class.'>'.
               '<td><span class="LC_nobreak">'.                '<td><span class="LC_nobreak">';
               &mt("Format rules to check for $text{$type}: ").      if ($type eq 'email') {
               '</span></td>'.          $output .= &mt("Formats disallowed for $text{$type}: ");
               '<td class="LC_left_item" colspan="2"><table>';      } else {
           $output .= &mt("Format rules to check for $text{$type}: ");
       }
       $output .= '</span></td>'.
                  '<td class="LC_left_item" colspan="2"><table>';
     my $rem;      my $rem;
     if (ref($ruleorder) eq 'ARRAY') {      if (ref($ruleorder) eq 'ARRAY') {
         for (my $i=0; $i<@{$ruleorder}; $i++) {          for (my $i=0; $i<@{$ruleorder}; $i++) {
Line 1460  sub user_formats_row { Line 1858  sub user_formats_row {
                     $output .= '<tr>';                      $output .= '<tr>';
                 }                  }
                 my $check = ' ';                  my $check = ' ';
                 if (ref($settings->{$type.'_rule'}) eq 'ARRAY') {                  if (ref($settings) eq 'HASH') {
                     if (grep(/^\Q$ruleorder->[$i]\E$/,@{$settings->{$type.'_rule'}})) {                      if (ref($settings->{$type.'_rule'}) eq 'ARRAY') {
                         $check = ' checked="checked" ';                          if (grep(/^\Q$ruleorder->[$i]\E$/,@{$settings->{$type.'_rule'}})) {
                               $check = ' checked="checked" ';
                           }
                     }                      }
                 }                  }
                 $output .= '<td class="LC_left_item">'.                  $output .= '<td class="LC_left_item">'.
Line 1489  sub usercreation_types { Line 1889  sub usercreation_types {
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                     author     => 'When adding a co-author',                      author     => 'When adding a co-author',
                     course     => 'When adding a user to a course',                      course     => 'When adding a user to a course',
                       selfcreate => 'User creates own account', 
                     any        => 'Any',                      any        => 'Any',
                     official   => 'Institutional only ',                      official   => 'Institutional only ',
                     unofficial => 'Non-institutional only',                      unofficial => 'Non-institutional only',
                       email      => 'Email address',
                       login      => 'Institutional Login',
                       sso        => 'SSO', 
                     none       => 'None',                      none       => 'None',
     );      );
     return %lt;      return %lt;
 }   }
   
 sub authtype_names {  sub authtype_names {
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
Line 1529  sub print_usermodification { Line 1933  sub print_usermodification {
             $$rowtotal ++;              $$rowtotal ++;
             $rowcount ++;              $rowcount ++;
         }          }
     } else {      } elsif ($position eq 'middle') {
         $context = 'course';          $context = 'course';
         $rowcount = 0;          $rowcount = 0;
         foreach my $role ('st','ep','ta','in','cr') {          foreach my $role ('st','ep','ta','in','cr') {
Line 1538  sub print_usermodification { Line 1942  sub print_usermodification {
             $$rowtotal ++;              $$rowtotal ++;
             $rowcount ++;              $rowcount ++;
         }          }
       } elsif ($position eq 'bottom') {
           $context = 'selfcreate';
           my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
           $usertypes->{'default'} = $othertitle;
           if (ref($types) eq 'ARRAY') {
               push(@{$types},'default');
               $usertypes->{'default'} = $othertitle;
               foreach my $status (@{$types}) {
                   $datatable .= &modifiable_userdata_row($context,$status,$settings,
                                                          $numinrow,$rowcount,$usertypes);
                   $$rowtotal ++;
                   $rowcount ++;
               }
           }
       }
       return $datatable;
   }
   
   sub print_defaults {
       my ($dom,$rowtotal) = @_;
       my @items = ('auth_def','auth_arg_def','lang_def','timezone_def',
                    'datelocale_def');
       my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
       my $titles = &defaults_titles();
       my $rownum = 0;
       my ($datatable,$css_class);
       foreach my $item (@items) {
           if ($rownum%2) {
               $css_class = '';
           } else {
               $css_class = ' class="LC_odd_row" ';
           }
           $datatable .= '<tr'.$css_class.'>'.
                     '<td><span class="LC_nobreak">'.$titles->{$item}.
                     '</span></td><td class="LC_right_item">';
           if ($item eq 'auth_def') {
               my @authtypes = ('internal','krb4','krb5','localauth');
               my %shortauth = (
                                internal => 'int',
                                krb4 => 'krb4',
                                krb5 => 'krb5',
                                localauth  => 'loc'
                              );
               my %authnames = &authtype_names();
               foreach my $auth (@authtypes) {
                   my $checked = ' ';
                   if ($domdefaults{$item} eq $auth) {
                       $checked = ' checked="checked" ';
                   }
                   $datatable .= '<label><input type="radio" name="'.$item.
                                 '" value="'.$auth.'"'.$checked.'/>'.
                                 $authnames{$shortauth{$auth}}.'</label>&nbsp;&nbsp;';
               }
           } elsif ($item eq 'timezone_def') {
               my $includeempty = 1;
               $datatable .= &Apache::loncommon::select_timezone($item,$domdefaults{$item},undef,$includeempty);
           } elsif ($item eq 'datelocale_def') {
               my $includeempty = 1;
               $datatable .= &Apache::loncommon::select_datelocale($item,$domdefaults{$item},undef,$includeempty);
           } else {
               $datatable .= '<input type="text" name="'.$item.'" value="'.
                             $domdefaults{$item}.'" />';
           }
           $datatable .= '</td></tr>';
           $rownum ++;
     }      }
       $$rowtotal += $rownum;
     return $datatable;      return $datatable;
 }  }
   
   sub defaults_titles {
       my %titles = &Apache::lonlocal::texthash (
                      'auth_def'      => 'Default authentication type',
                      'auth_arg_def'  => 'Default authentication argument',
                      'lang_def'      => 'Default language',
                      'timezone_def'  => 'Default timezone',
                      'datelocale_def' => 'Default locale for dates',
                    );
       return (\%titles);
   }
   
   sub print_scantronformat {
       my ($r,$dom,$confname,$settings,$rowtotal) = @_;
       my $itemcount = 1;
       my ($datatable,$css_class,$scantronurl,$is_custom,%error,%scantronurls,
           %confhash);
       my $switchserver = &check_switchserver($dom,$confname);
       my %lt = &Apache::lonlocal::texthash (
                   default => 'Default scantron format file error',
                   custom  => 'Custom scantron format file error',
                );
       my %scantronfiles = (
           default => 'default.tab',
           custom => 'custom.tab',
       );
       foreach my $key (keys(%scantronfiles)) {
           $scantronurls{$key} = '/res/'.$dom.'/'.$confname.'/scantron/'
                                 .$scantronfiles{$key};
       }
       my @defaultinfo = &Apache::lonnet::stat_file($scantronurls{'default'});
       if ((!@defaultinfo) || ($defaultinfo[0] eq 'no_such_dir')) {
           if (!$switchserver) {
               my $servadm = $r->dir_config('lonAdmEMail');
               my ($configuserok,$author_ok) = &config_check($dom,$confname,$servadm);
               if ($configuserok eq 'ok') {
                   if ($author_ok eq 'ok') {
                       my %legacyfile = (
    default => $Apache::lonnet::perlvar{'lonTabDir'}.'/default_scantronformat.tab', 
    custom  => $Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab', 
                       );
                       my %md5chk;
                       foreach my $type (keys(%legacyfile)) {
                           ($md5chk{$type}) = split(/ /,`md5sum $legacyfile{$type}`);
                           chomp($md5chk{$type});
                       }
                       if ($md5chk{'default'} ne $md5chk{'custom'}) {
                           foreach my $type (keys(%legacyfile)) {
                               ($scantronurls{$type},my $error) = 
                                   &legacy_scantronformat($r,$dom,$confname,
                                                    $type,$legacyfile{$type},
                                                    $scantronurls{$type},
                                                    $scantronfiles{$type});
                               if ($error ne '') {
                                   $error{$type} = $error;
                               }
                           }
                           if (keys(%error) == 0) {
                               $is_custom = 1;
                               $confhash{'scantron'}{'scantronformat'} = 
                                   $scantronurls{'custom'};
                               my $putresult = 
                                   &Apache::lonnet::put_dom('configuration',
                                                            \%confhash,$dom);
                               if ($putresult ne 'ok') {
                                   $error{'custom'} = 
                                       '<span class="LC_error">'.
                                       &mt('An error occurred updating the domain configuration: [_1]',$putresult).'</span>';
                               }
                           }
                       } else {
                           ($scantronurls{'default'},my $error) =
                               &legacy_scantronformat($r,$dom,$confname,
                                             'default',$legacyfile{'default'},
                                             $scantronurls{'default'},
                                             $scantronfiles{'default'});
                           if ($error eq '') {
                               $confhash{'scantron'}{'scantronformat'} = ''; 
                               my $putresult =
                                   &Apache::lonnet::put_dom('configuration',
                                                            \%confhash,$dom);
                               if ($putresult ne 'ok') {
                                   $error{'default'} =
                                       '<span class="LC_error">'.
                                       &mt('An error occurred updating the domain configuration: [_1]',$putresult).'</span>';
                               }
                           } else {
                               $error{'default'} = $error;
                           }
                       }
                   }
               }
           } else {
               $error{'default'} = &mt("Unable to copy default scantron formatfile to domain's RES space: [_1]",$switchserver);
           }
       }
       if (ref($settings) eq 'HASH') {
           if ($settings->{'scantronformat'} eq "/res/$dom/$confname/scantron/custom.tab") {
               my @info = &Apache::lonnet::stat_file($settings->{'scantronformat'});
               if ((!@info) || ($info[0] eq 'no_such_dir')) {
                   $scantronurl = '';
               } else {
                   $scantronurl = $settings->{'scantronformat'};
               }
               $is_custom = 1;
           } else {
               $scantronurl = $scantronurls{'default'};
           }
       } else {
           if ($is_custom) {
               $scantronurl = $scantronurls{'custom'};
           } else {
               $scantronurl = $scantronurls{'default'};
           }
       }
       $css_class = $itemcount%2?' class="LC_odd_row"':'';
       $datatable .= '<tr'.$css_class.'>';
       if (!$is_custom) {
           $datatable .= '<td>'.&mt('Default in use:').'<br />'.
                         '<span class="LC_nobreak">';
           if ($scantronurl) {
               $datatable .= '<a href="'.$scantronurl.'" target="_blank">'.
                             &mt('Default scantron format file').'</a>';
           } else {
               $datatable = &mt('File unavailable for display');
           }
           $datatable .= '</span></td>';
           if (keys(%error) == 0) { 
               $datatable .= '<td valign="bottom">';
               if (!$switchserver) {
                   $datatable .= &mt('Upload:').'<br />';
               }
           } else {
               my $errorstr;
               foreach my $key (sort(keys(%error))) {
                   $errorstr .= $lt{$key}.': '.$error{$key}.'<br />';
               }
               $datatable .= '<td>'.$errorstr;
           }
       } else {
           if (keys(%error) > 0) {
               my $errorstr;
               foreach my $key (sort(keys(%error))) {
                   $errorstr .= $lt{$key}.': '.$error{$key}.'<br />';
               } 
               $datatable .= '<td>'.$errorstr.'</td><td>&nbsp;';
           } elsif ($scantronurl) {
               $datatable .= '<td><span class="LC_nobreak">'.
                             '<a href="'.$scantronurl.'" target="_blank">'.
                             &mt('Custom scantron format file').'</a><label>'.
                             '<input type="checkbox" name="scantronformat_del"'.
                             '" value="1" />'.&mt('Delete?').'</label></span></td>'.
                             '<td><span class="LC_nobreak">&nbsp;'.
                             &mt('Replace:').'</span><br />';
           }
       }
       if (keys(%error) == 0) {
           if ($switchserver) {
               $datatable .= &mt('Upload to library server: [_1]',$switchserver);
           } else {
               $datatable .='<span class="LC_nobreak">&nbsp;'.
                            '<input type="file" name="scantronformat" /></span>';
           }
       }
       $datatable .= '</td></tr>';
       $$rowtotal ++;
       return $datatable;
   }
   
   sub legacy_scantronformat {
       my ($r,$dom,$confname,$file,$legacyfile,$newurl,$newfile) = @_;
       my ($url,$error);
       my @statinfo = &Apache::lonnet::stat_file($newurl);
       if ((!@statinfo) || ($statinfo[0] eq 'no_such_dir')) {
           (my $result,$url) =
               &publishlogo($r,'copy',$legacyfile,$dom,$confname,'scantron',
                            '','',$newfile);
           if ($result ne 'ok') {
               $error = &mt("An error occurred publishing the [_1] scantron format file in RES space. Error was: [_2].",$newfile,$result);
           }
       }
       return ($url,$error);
   }
   
   sub print_coursecategories {
       my ($position,$dom,$hdritem,$settings,$rowtotal) = @_;
       my $datatable;
       if ($position eq 'top') {
           my $toggle_cats_crs = ' ';
           my $toggle_cats_dom = ' checked="checked" ';
           my $can_cat_crs = ' ';
           my $can_cat_dom = ' checked="checked" ';
           if (ref($settings) eq 'HASH') {
               if ($settings->{'togglecats'} eq 'crs') {
                   $toggle_cats_crs = $toggle_cats_dom;
                   $toggle_cats_dom = ' ';
               }
               if ($settings->{'categorize'} eq 'crs') {
                   $can_cat_crs = $can_cat_dom;
                   $can_cat_dom = ' ';
               }
           }
           my %title = &Apache::lonlocal::texthash (
                        togglecats => 'Show/Hide a course in the catalog',
                        categorize    => 'Assign a category to a course',
                       );
           my %level = &Apache::lonlocal::texthash (
                        dom => 'Set in "Modify Course" (Domain)',
                        crs => 'Set in "Modify Parameters" (Course)',   
                       );
           $datatable = '<tr class="LC_odd_row">'.
                     '<td>'.$title{'togglecats'}.'</td>'.
                     '<td class="LC_right_item"><span class="LC_nobreak"><label>'.
                     '<input type="radio" name="togglecats"'.
                     $toggle_cats_dom.' value="dom" />'.$level{'dom'}.'</label>&nbsp;'.
                     '<label><input type="radio" name="togglecats"'.
                     $toggle_cats_crs.' value="crs" />'.$level{'crs'}.'</label></span></td>'.
                     '</tr><tr>'.
                     '<td>'.$title{'categorize'}.'</td>'.
                     '<td class="LC_right_item"><span class="LC_nobreak">'.
                     '<label><input type="radio" name="categorize"'.
                     $can_cat_dom.' value="dom" />'.$level{'dom'}.'</label>&nbsp;'.
                     '<label><input type="radio" name="categorize"'.
                     $can_cat_crs.'value="crs" />'.$level{'crs'}.'</label></span></td>'.
                     '</tr>';
           $$rowtotal += 2;
       } else {
           my $css_class;
           my $itemcount = 1;
           my $cathash; 
           if (ref($settings) eq 'HASH') {
               $cathash = $settings->{'cats'};
           }
           if (ref($cathash) eq 'HASH') {
               my (@cats,@trails,%allitems,%idx,@jsarray);
               &Apache::loncommon::extract_categories($cathash,\@cats,\@trails,
                                                      \%allitems,\%idx,\@jsarray);
               my $maxdepth = scalar(@cats);
               my $colattrib = '';
               if ($maxdepth > 2) {
                   $colattrib = ' colspan="2" ';
               }
               my @path;
               if (@cats > 0) {
                   if (ref($cats[0]) eq 'ARRAY') {
                       my $numtop = @{$cats[0]};
                       my $maxnum = $numtop;
                       if ((!grep(/^instcode$/,@{$cats[0]})) || ($cathash->{'instcode::0'} eq '')) {
                           $maxnum ++;
                       }
                       my $lastidx;
                       for (my $i=0; $i<$numtop; $i++) {
                           my $parent = $cats[0][$i];
                           $css_class = $itemcount%2?' class="LC_odd_row"':'';
                           my $item = &escape($parent).'::0';
                           my $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','$item','$idx{$item}'".');"';
                           $lastidx = $idx{$item};
                           $datatable .= '<tr '.$css_class.'><td><span class="LC_nobreak">'
                                         .'<select name="'.$item.'"'.$chgstr.'>';
                           for (my $k=0; $k<=$maxnum; $k++) {
                               my $vpos = $k+1;
                               my $selstr;
                               if ($k == $i) {
                                   $selstr = ' selected="selected" ';
                               }
                               $datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>';
                           }
                           $datatable .= '</select></td><td>';
                           if ($parent eq 'instcode') {
                               $datatable .=  '<span class="LC_nobreak">'.&mt('Official courses')
                                              .'</span><br /><span class="LC_nobreak">('
                                              .&mt('with institutional codes').')</span></td>'
                                              .'<td'.$colattrib.'><span class="LC_nobreak"><label><input type="radio" name="instcode" value="1" checked="checked" />'
                                               .&mt('Display').'</label>&nbsp;'
                                               .'<label><input type="radio" name="instcode" value="0" />'
                                               .&mt('Do not display').'</label></span></td>';
                           } else {
                               $datatable .= $parent
                                             .'&nbsp;<label><input type="checkbox" name="deletecategory" '
                                             .'value="'.$item.'" />'.&mt('Delete').'</label></span></td>';
                           }
                           my $depth = 1;
                           push(@path,$parent);
                           $datatable .= &build_category_rows($itemcount,\@cats,$depth,$parent,\@path,\%idx);
                           pop(@path);
                           $datatable .= '</tr><tr><td colspan="'.$maxdepth.'" class="LC_row_separator"></td></tr>';
                           $itemcount ++;
                       }
                       $css_class = $itemcount%2?' class="LC_odd_row"':'';
                       my $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','addcategory_pos','$lastidx'".');"';
                       $datatable .= '<tr '.$css_class.'><td><span class="LC_nobreak"><select name="addcategory_pos"'.$chgstr.'>';
                       for (my $k=0; $k<=$maxnum; $k++) {
                           my $vpos = $k+1;
                           my $selstr;
                           if ($k == $numtop) {
                               $selstr = ' selected="selected" ';
                           }
                           $datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>';
                       }
                       $datatable .= '</select></span></td><td colspan="2">'.&mt('Add category:').'&nbsp;'
                                     .'<input type="text" size="20" name="addcategory_name" value="" /></td>'
                                     .'</tr>'."\n";
                       $itemcount ++;
                       if ((!grep(/^instcode$/,@{$cats[0]})) || ($cathash->{'instcode::0'} eq '')) {
                           $css_class = $itemcount%2?' class="LC_odd_row"':'';
                           my $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','instcode_pos','$lastidx'".');"';
                           $datatable .= '<tr><td colspan="'.$maxdepth.'" class="LC_row_separator"></td></tr><tr '.$css_class.'><td>'.
                                         '<span class="LC_nobreak"><select name="instcode_pos"'.$chgstr.'>';
                           for (my $k=0; $k<=$maxnum; $k++) {
                               my $vpos = $k+1;
                               my $selstr;
                               if ($k == $maxnum) {
                                   $selstr = ' selected="selected" ';
                               }
                               $datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>';
                           }
                           $datatable .= '</select></span></td><td><span class="LC_nobreak">'
                                         .&mt('Official courses').'</span>'.'<br /><span class="LC_nobreak">('
                                         .&mt('with institutional codes').')</span></td>'
                                         .'<td><span class="LC_nobreak"><label><input type="radio" name="instcode" value="1" />'
                                         .&mt('Display').'</label>&nbsp;'
                                         .'<label><input type="radio" name="instcode" value="0" checked="checked"/>'
                                         .&mt('Do not display').'</label></span></td></tr>';
                       }
                   }
               } else {
                   $datatable .= &initialize_categories($itemcount);
               }
           } else {
               $datatable .= '<td class="LC_right_item">'.$hdritem->{'header'}->[0]->{'col2'}.'</td>'
                             .&initialize_categories($itemcount);
           }
           $$rowtotal += $itemcount;
       }
       return $datatable;
   }
   
   sub print_serverstatuses {
       my ($dom,$settings,$rowtotal) = @_;
       my $datatable;
       my @pages = &serverstatus_pages();
       my (%namedaccess,%machineaccess);
       foreach my $type (@pages) {
           $namedaccess{$type} = '';
           $machineaccess{$type}= '';
       }
       if (ref($settings) eq 'HASH') {
           foreach my $type (@pages) {
               if (exists($settings->{$type})) {
                   if (ref($settings->{$type}) eq 'HASH') {
                       foreach my $key (keys(%{$settings->{$type}})) {
                           if ($key eq 'namedusers') {
                               $namedaccess{$type} = $settings->{$type}->{$key};
                           } elsif ($key eq 'machines') {
                               $machineaccess{$type} = $settings->{$type}->{$key};
                           }
                       }
                   }
               }
           }
       }
       my $titles= &LONCAPA::loncgi::serverstatus_titles();
       my $rownum = 0;
       my $css_class;
       foreach my $type (@pages) {
           $rownum ++;
           $css_class = $rownum%2?' class="LC_odd_row"':'';
           $datatable .= '<tr'.$css_class.'>'.
                         '<td><span class="LC_nobreak">'.
                         $titles->{$type}.'</span></td>'.
                         '<td class="LC_left_item">'.
                         '<input type="text" name="'.$type.'_namedusers" '.
                         'value="'.$namedaccess{$type}.'" size="30" /></td>'.
                         '<td class="LC_right_item">'.
                         '<span class="LC_nobreak">'.
                         '<input type="text" name="'.$type.'_machines" '.
                         'value="'.$machineaccess{$type}.'" size="10" />'.
                         '</td></tr>'."\n";
       }
       $$rowtotal += $rownum;
       return $datatable;
   }
   
   sub serverstatus_pages {
       return ('userstatus','lonstatus','loncron','server-status','codeversions',
               'clusterstatus','metadata_keywords','metadata_harvest',
               'takeoffline','takeonline','showenv');
   }
   
   sub coursecategories_javascript {
       my ($settings) = @_;
       my ($output,$jstext,$cathash);
       if (ref($settings) eq 'HASH') {
           $cathash = $settings->{'cats'};
       }
       if (ref($cathash) eq 'HASH') {
           my (@cats,@jsarray,%idx);
           &Apache::loncommon::gather_categories($cathash,\@cats,\%idx,\@jsarray);
           if (@jsarray > 0) {
               $jstext = '    var categories = Array('.scalar(@jsarray).');'."\n";
               for (my $i=0; $i<@jsarray; $i++) {
                   if (ref($jsarray[$i]) eq 'ARRAY') {
                       my $catstr = join('","',@{$jsarray[$i]});
                       $jstext .= '    categories['.$i.'] = Array("'.$catstr.'");'."\n";
                   }
               }
           }
       } else {
           $jstext  = '    var categories = Array(1);'."\n".
                      '    categories[0] = Array("instcode_pos");'."\n"; 
       }
       $output = <<"ENDSCRIPT";
   <script type="text/javascript">
   function reorderCats(form,parent,item,idx) {
       var changedVal;
   $jstext
       var newpos = 'addcategory_pos';
       var current = new Array;
       if (parent == '') {
           var has_instcode = 0;
           var maxtop = categories[idx].length;
           for (var j=0; j<maxtop; j++) {
               if (categories[idx][j] == 'instcode::0') {
                   has_instcode == 1;
               }
           }
           if (has_instcode == 0) {
               categories[idx][maxtop] = 'instcode_pos';
           }
       } else {
           newpos += '_'+parent;
       }
       var maxh = 1 + categories[idx].length;
       var current = new Array;
       var newitemVal = form.elements[newpos].options[form.elements[newpos].selectedIndex].value;
       if (item == newpos) {
           changedVal = newitemVal;
       } else {
           changedVal = form.elements[item].options[form.elements[item].selectedIndex].value;
           current[newitemVal] = newpos;
       }
       for (var i=0; i<categories[idx].length; i++) {
           var elementName = categories[idx][i];
           if (elementName != item) {
               if (form.elements[elementName]) {
                   var currVal = form.elements[elementName].options[form.elements[elementName].selectedIndex].value;
                   current[currVal] = elementName;
               }
           }
       }
       var oldVal;
       for (var j=0; j<maxh; j++) {
           if (current[j] == undefined) {
               oldVal = j;
           }
       }
       if (oldVal < changedVal) {
           for (var k=oldVal+1; k<=changedVal ; k++) {
              var elementName = current[k];
              form.elements[elementName].selectedIndex = form.elements[elementName].selectedIndex - 1;
           }
       } else {
           for (var k=changedVal; k<oldVal; k++) {
               var elementName = current[k];
               form.elements[elementName].selectedIndex = form.elements[elementName].selectedIndex + 1;
           }
       }
       return;
   }
   </script>
   
   ENDSCRIPT
       return $output;
   }
   
   sub initialize_categories {
       my ($itemcount) = @_;
       my $datatable;
       my $css_class = $itemcount%2?' class="LC_odd_row"':'';
       my $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','instcode_pos','0'".');"';
   
       $datatable = '<tr '.$css_class.'><td><span class="LC_nobreak">'
                    .'<select name="instcode_pos"><option value="0" selected="selected">1</option>'
                    .'<option value="1">2</option></select>&nbsp;'
                    .&mt('Official courses (with institutional codes)')
                    .'</span></td><td><span class="LC_nobreak">'
                    .'<label><input type="radio" name="instcode" value="1" checked="checked" />'
                    .&mt('Display').'</label>&nbsp;<label>'
                    .'<input type="radio" name="instcode" value="0" />'.&mt('Do not display')
                    .'</label></span></td></tr>';
       $itemcount ++;
       $css_class = $itemcount%2?' class="LC_odd_row"':'';
       $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','addcategory_pos','0'".');"';
       $datatable .= '<tr '.$css_class.'><td><span class="LC_nobreak">'
                     .'<select name="addcategory_pos"'.$chgstr.'><option value="0">1</option>'
                     .'<option value="1" selected="selected">2</option></select>&nbsp;'
                     .&mt('Add category').'</td><td>'.&mt('Name:')
                     .'&nbsp;<input type="text" size="20" name="addcategory_name" value="" /></td></tr>';
       return $datatable;
   }
   
   sub build_category_rows {
       my ($itemcount,$cats,$depth,$parent,$path,$idx) = @_;
       my ($text,$name,$item,$chgstr);
       if (ref($cats) eq 'ARRAY') {
           my $maxdepth = scalar(@{$cats});
           if (ref($cats->[$depth]) eq 'HASH') {
               if (ref($cats->[$depth]{$parent}) eq 'ARRAY') {
                   my $numchildren = @{$cats->[$depth]{$parent}};
                   my $css_class = $itemcount%2?' class="LC_odd_row"':'';
                   $text .= '<td><table class="LC_datatable">';
                   my ($idxnum,$parent_name,$parent_item);
                   my $higher = $depth - 1;
                   if ($higher == 0) {
                       $parent_name = &escape($parent).'::'.$higher;
                   } else {
                       if (ref($path) eq 'ARRAY') {
                           $parent_name = &escape($parent).':'.&escape($path->[-2]).':'.$higher;
                       }
                   }
                   $parent_item = 'addcategory_pos_'.$parent_name;
                   for (my $j=0; $j<=$numchildren; $j++) {
                       if ($j < $numchildren) {
                           $name = $cats->[$depth]{$parent}[$j];
                           $item = &escape($name).':'.&escape($parent).':'.$depth;
                           $idxnum = $idx->{$item};
                       } else {
                           $name = $parent_name;
                           $item = $parent_item;
                       }
                       $chgstr = ' onchange="javascript:reorderCats(this.form,'."'$parent_name','$item','$idxnum'".');"';
                       $text .= '<tr '.$css_class.'><td><span class="LC_nobreak"><select name="'.$item.'"'.$chgstr.'>';
                       for (my $i=0; $i<=$numchildren; $i++) {
                           my $vpos = $i+1;
                           my $selstr;
                           if ($j == $i) {
                               $selstr = ' selected="selected" ';
                           }
                           $text .= '<option value="'.$i.'"'.$selstr.'>'.$vpos.'</option>';
                       }
                       $text .= '</select>&nbsp;';
                       if ($j < $numchildren) {
                           my $deeper = $depth+1;
                           $text .= $name.'&nbsp;'
                                    .'<label><input type="checkbox" name="deletecategory" value="'
                                    .$item.'" />'.&mt('Delete').'</label></span></td><td>';
                           if(ref($path) eq 'ARRAY') {
                               push(@{$path},$name);
                               $text .= &build_category_rows($itemcount,$cats,$deeper,$name,$path,$idx);
                               pop(@{$path});
                           }
                       } else {
                           $text .= &mt('Add subcategory:').'&nbsp;</span><input type="textbox" size="20" name="addcategory_name_';
                           if ($j == $numchildren) {
                               $text .= $name;
                           } else {
                               $text .= $item;
                           }
                           $text .= '" value="" />';
                       }
                       $text .= '</td></tr>';
                   }
                   $text .= '</table></td>';
               } else {
                   my $higher = $depth-1;
                   if ($higher == 0) {
                       $name = &escape($parent).'::'.$higher;
                   } else {
                       if (ref($path) eq 'ARRAY') {
                           $name = &escape($parent).':'.&escape($path->[-2]).':'.$higher;
                       }
                   }
                   my $colspan;
                   if ($parent ne 'instcode') {
                       $colspan = $maxdepth - $depth - 1;
                       $text .= '<td colspan="'.$colspan.'">'.&mt('Add subcategory:').'<input type="textbox" size="20" name="subcat_'.$name.'" value="" /></td>';
                   }
               }
           }
       }
       return $text;
   }
   
 sub modifiable_userdata_row {  sub modifiable_userdata_row {
     my ($context,$role,$settings,$numinrow,$rowcount) = @_;      my ($context,$role,$settings,$numinrow,$rowcount,$usertypes) = @_;
     my $rolename;      my $rolename;
     if ($role eq 'cr') {      if ($context eq 'selfcreate') {
         $rolename = &mt('Custom role');          if (ref($usertypes) eq 'HASH') {
               $rolename = $usertypes->{$role};
           } else {
               $rolename = $role;
           }
     } else {      } else {
         $rolename = &Apache::lonnet::plaintext($role);          if ($role eq 'cr') {
               $rolename = &mt('Custom role');
           } else {
               $rolename = &Apache::lonnet::plaintext($role);
           }
     }      }
     my @fields = ('lastname','firstname','middlename','generation',      my @fields = ('lastname','firstname','middlename','generation',
                   'permanentemail','id');                    'permanentemail','id');
Line 1659  sub users_cansearch_row { Line 2719  sub users_cansearch_row {
     return $output;      return $output;
 }  }
   
 sub sorted_inst_types {  
     my ($dom) = @_;  
     my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom);  
     my $othertitle = &mt('All users');  
     my @types;  
     if (ref($order) eq 'ARRAY') {  
         @types = @{$order};  
     }  
     if (@types == 0) {  
         if (ref($usertypes) eq 'HASH') {  
             @types = sort(keys(%{$usertypes}));  
         }  
     }  
     if (keys(%{$usertypes}) > 0) {  
         $othertitle = &mt('Other users');  
     }  
     return ($othertitle,$usertypes,\@types);  
 }  
   
 sub sorted_searchtitles {  sub sorted_searchtitles {
     my %searchtitles = &Apache::lonlocal::texthash(      my %searchtitles = &Apache::lonlocal::texthash(
                          'uname' => 'username',                           'uname' => 'username',
Line 1717  sub usertype_update_row { Line 2758  sub usertype_update_row {
                     $datatable .= '<tr>';                      $datatable .= '<tr>';
                 }                  }
                 my $check = ' ';                  my $check = ' ';
                 if (ref($settings->{'fields'}) eq 'HASH') {                  if (ref($settings) eq 'HASH') {
                     if (ref($settings->{'fields'}{$type}) eq 'ARRAY') {                      if (ref($settings->{'fields'}) eq 'HASH') {
                         if (grep(/^\Q$fields->[$i]\E$/,@{$settings->{'fields'}{$type}})) {                          if (ref($settings->{'fields'}{$type}) eq 'ARRAY') {
                             $check = ' checked="checked" ';                              if (grep(/^\Q$fields->[$i]\E$/,@{$settings->{'fields'}{$type}})) {
                                   $check = ' checked="checked" ';
                               }
                         }                          }
                     }                      }
                 }                  }
Line 1750  sub modify_login { Line 2793  sub modify_login {
     my ($r,$dom,$confname,%domconfig) = @_;      my ($r,$dom,$confname,%domconfig) = @_;
     my ($resulttext,$errors,$colchgtext,%changes,%colchanges);      my ($resulttext,$errors,$colchgtext,%changes,%colchanges);
     my %title = ( coursecatalog => 'Display course catalog',      my %title = ( coursecatalog => 'Display course catalog',
                   adminmail => 'Display administrator E-mail address');                    adminmail => 'Display administrator E-mail address',
                     newuser => 'Link for visitors to create a user account',
                     loginheader => 'Log-in box header');
     my @offon = ('off','on');      my @offon = ('off','on');
     my %loginhash;      my %loginhash;
     ($errors,%colchanges) = &modify_colors($r,$dom,$confname,['login'],      ($errors,%colchanges) = &modify_colors($r,$dom,$confname,['login'],
                                            \%domconfig,\%loginhash);                                             \%domconfig,\%loginhash);
     $loginhash{login}{coursecatalog} = $env{'form.coursecatalog'};      my @toggles = ('coursecatalog','adminmail','newuser');
     $loginhash{login}{adminmail} = $env{'form.adminmail'};      foreach my $item (@toggles) {
           $loginhash{login}{$item} = $env{'form.'.$item};
       }
       $loginhash{login}{loginheader} = $env{'form.loginheader'};
     if (ref($colchanges{'login'}) eq 'HASH') {        if (ref($colchanges{'login'}) eq 'HASH') {  
         $colchgtext = &display_colorchgs($dom,\%colchanges,['login'],          $colchgtext = &display_colorchgs($dom,\%colchanges,['login'],
                                          \%loginhash);                                           \%loginhash);
Line 1764  sub modify_login { Line 2812  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') {
         if (($domconfig{'login'}{'coursecatalog'} eq '0') &&          my @toggles = ('coursecatalog','adminmail','newuser');
             ($env{'form.coursecatalog'} eq '1')) {          my %defaultchecked = (
             $changes{'coursecatalog'} = 1;                      'coursecatalog' => 'on',
         } elsif (($domconfig{'login'}{'coursecatalog'} eq '' ||                      'adminmail'     => 'off',
                  $domconfig{'login'}{'coursecatalog'} eq '1') &&                      'newuser'       => 'off',
                  ($env{'form.coursecatalog'} eq '0')) {          );
             $changes{'coursecatalog'} = 1;          if (ref($domconfig{'login'}) eq 'HASH') {
         }              foreach my $item (@toggles) {
         if (($domconfig{'login'}{'adminmail'} eq '1') &&                  if ($defaultchecked{$item} eq 'on') { 
                 ($env{'form.adminmail'} eq '0')) {                      if (($domconfig{'login'}{$item} eq '0') &&
             $changes{'adminmail'} = 1;                          ($env{'form.'.$item} eq '1')) {
         } elsif (($domconfig{'login'}{'adminmail'} eq '' ||                          $changes{$item} = 1;
                  $domconfig{'login'}{'adminmail'} eq '0') &&                      } elsif (($domconfig{'login'}{$item} eq '' ||
                  ($env{'form.adminmail'} eq '1')) {                                $domconfig{'login'}{$item} eq '1') &&
             $changes{'adminmail'} = 1;                               ($env{'form.'.$item} eq '0')) {
                           $changes{$item} = 1;
                       }
                   } elsif ($defaultchecked{$item} eq 'off') {
                       if (($domconfig{'login'}{$item} eq '1') &&
                           ($env{'form.'.$item} eq '0')) {
                           $changes{$item} = 1;
                       } elsif (($domconfig{'login'}{$item} eq '' ||
                                 $domconfig{'login'}{$item} eq '0') &&
                                ($env{'form.'.$item} eq '1')) {
                           $changes{$item} = 1;
                       }
                   }
               }
               if (($domconfig{'login'}{'loginheader'} eq 'text') && 
                   ($env{'form.loginheader'} eq 'image')) {
                   $changes{'loginheader'} = 1;
               } elsif (($domconfig{'login'}{'loginheader'} eq '' ||
                         $domconfig{'login'}{'loginheader'} eq 'image') &&
                        ($env{'form.loginheader'} eq 'text')) {
                   $changes{'loginheader'} = 1;
               }
         }          }
         if (keys(%changes) > 0 || $colchgtext) {          if (keys(%changes) > 0 || $colchgtext) {
               &Apache::loncommon::devalidate_domconfig_cache($dom);
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             foreach my $item (sort(keys(%changes))) {              foreach my $item (sort(keys(%changes))) {
                 $resulttext .= '<li>'.&mt("$title{$item} set to $offon[$env{'form.'.$item}]").'</li>';                  if ($item eq 'loginheader') {
                       $resulttext .= '<li>'.&mt("$title{$item} set to $env{'form.loginheader'}").'</li>';
                   } else {
                       $resulttext .= '<li>'.&mt("$title{$item} set to $offon[$env{'form.'.$item}]").'</li>';
                   }
             }              }
             $resulttext .= $colchgtext.'</ul>';              $resulttext .= $colchgtext.'</ul>';
         } else {          } else {
Line 1806  sub color_font_choices { Line 2880  sub color_font_choices {
             img => "Header",              img => "Header",
             bgs => "Background colors",              bgs => "Background colors",
             links => "Link colors",              links => "Link colors",
               images => "Images",
             font => "Font color",              font => "Font color",
             pgbg => "Page",              pgbg => "Page",
             tabbg => "Header",              tabbg => "Header",
Line 1821  sub modify_rolecolors { Line 2896  sub modify_rolecolors {
     my ($r,$dom,$confname,$roles,%domconfig) = @_;      my ($r,$dom,$confname,$roles,%domconfig) = @_;
     my ($resulttext,%rolehash);      my ($resulttext,%rolehash);
     $rolehash{'rolecolors'} = {};      $rolehash{'rolecolors'} = {};
       if (ref($domconfig{'rolecolors'}) ne 'HASH') {
           if ($domconfig{'rolecolors'} eq '') {
               $domconfig{'rolecolors'} = {};
           }
       }
     my ($errors,%changes) = &modify_colors($r,$dom,$confname,$roles,      my ($errors,%changes) = &modify_colors($r,$dom,$confname,$roles,
                          $domconfig{'rolecolors'},$rolehash{'rolecolors'});                           $domconfig{'rolecolors'},$rolehash{'rolecolors'});
     my $putresult = &Apache::lonnet::put_dom('configuration',\%rolehash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%rolehash,
                                              $dom);                                               $dom);
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
               &Apache::loncommon::devalidate_domconfig_cache($dom);
             $resulttext = &display_colorchgs($dom,\%changes,$roles,              $resulttext = &display_colorchgs($dom,\%changes,$roles,
                                              $rolehash{'rolecolors'});                                               $rolehash{'rolecolors'});
         } else {          } else {
Line 1846  sub modify_rolecolors { Line 2927  sub modify_rolecolors {
 sub modify_colors {  sub modify_colors {
     my ($r,$dom,$confname,$roles,$domconfig,$confhash) = @_;      my ($r,$dom,$confname,$roles,$domconfig,$confhash) = @_;
     my (%changes,%choices);      my (%changes,%choices);
     my @bgs = ('pgbg','mainbg','sidebg');      my @bgs;
     my @links = ('link','alink','vlink');      my @links = ('link','alink','vlink');
       my @logintext;
     my @images;      my @images;
     my $servadm = $r->dir_config('lonAdmEMail');      my $servadm = $r->dir_config('lonAdmEMail');
     my $errors;      my $errors;
     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');
         } else {          } else {
             %choices = &color_font_choices();              %choices = &color_font_choices();
         }          }
         if ($role eq 'login') {          if ($role eq 'login') {
             @images = ('img','logo','domlogo');              @images = ('img','logo','domlogo','login');
               @bgs = ('pgbg','mainbg','sidebg');
         } else {          } else {
             @images = ('img');              @images = ('img');
               @bgs = ('pgbg','tabbg','sidebg'); 
         }          }
         $confhash->{$role}{'font'} = $env{'form.'.$role.'_font'};          $confhash->{$role}{'font'} = $env{'form.'.$role.'_font'};
         foreach my $item (@bgs,@links) {          foreach my $item (@bgs,@links,@logintext) {
             $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item};              $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item};
         }          }
         my ($configuserok,$author_ok,$switchserver,%currroles);          my ($configuserok,$author_ok,$switchserver) = 
         my $uhome = &Apache::lonnet::homeserver($confname,$dom,1);              &config_check($dom,$confname,$servadm);
         ($configuserok,%currroles) = &check_configuser($uhome,$dom,  
                                                        $confname,$servadm);  
         if ($configuserok eq 'ok') {  
             $switchserver = &check_switchserver($dom,$confname);  
             if ($switchserver eq '') {  
                 $author_ok = &check_authorstatus($dom,$confname,%currroles);  
             }  
         }  
         my ($width,$height) = &thumb_dimensions();          my ($width,$height) = &thumb_dimensions();
           if (ref($domconfig->{$role}) ne 'HASH') {
               $domconfig->{$role} = {};
           }
         foreach my $img (@images) {          foreach my $img (@images) {
               if (($role eq 'login') && (($img eq 'img') || ($img eq 'logo'))) {  
                   if (defined($env{'form.login_showlogo_'.$img})) {
                       $confhash->{$role}{'showlogo'}{$img} = 1;
                   } else { 
                       $confhash->{$role}{'showlogo'}{$img} = 0;
                   }
               } 
     if ( ! $env{'form.'.$role.'_'.$img.'.filename'}       if ( ! $env{'form.'.$role.'_'.$img.'.filename'} 
  && !defined($domconfig->{$role}{$img})   && !defined($domconfig->{$role}{$img})
  && !$env{'form.'.$role.'_del_'.$img}   && !$env{'form.'.$role.'_del_'.$img}
Line 1904  sub modify_colors { Line 2991  sub modify_colors {
                                 $error = &mt("Upload of [_1] image for $role page(s) failed because an error occurred publishing the file in RES space. Error was: [_2].",$choices{img},$result);                                  $error = &mt("Upload of [_1] image for $role page(s) failed because an error occurred publishing the file in RES space. Error was: [_2].",$choices{img},$result);
                             }                              }
                         } else {                          } else {
                             $error = &mt("Upload of [_1] image for $role page(s) failed because an author role could not be assigned to a Domain Configuation user ([_2]) in domain: [_3].  Error was: [_4].",$choices{$img},$confname,$dom,$author_ok);                              $error = &mt("Upload of [_1] image for $role page(s) failed because an author role could not be assigned to a Domain Configuration user ([_2]) in domain: [_3].  Error was: [_4].",$choices{$img},$confname,$dom,$author_ok);
                         }                          }
                     }                      }
                 } else {                  } else {
                     $error = &mt("Upload of [_1] image for $role page(s) failed because a Domain Configuation user ([_2]) could not be created in domain: [_3].  Error was: [_4].",$choices{$img},$confname,$dom,$configuserok);                      $error = &mt("Upload of [_1] image for $role page(s) failed because a Domain Configuration user ([_2]) could not be created in domain: [_3].  Error was: [_4].",$choices{$img},$confname,$dom,$configuserok);
                 }                  }
                 if ($error) {                  if ($error) {
                     &Apache::lonnet::logthis($error);                      &Apache::lonnet::logthis($error);
Line 1952  sub modify_colors { Line 3039  sub modify_colors {
                             $changes{$role}{'images'}{$img} = 1;                              $changes{$role}{'images'}{$img} = 1;
                         }                           } 
                     }                      }
                 }                        if (($role eq 'login') && (($img eq 'logo') || ($img eq 'img'))) {
                           if (ref($domconfig->{'login'}{'showlogo'}) eq 'HASH') {
                               if ($confhash->{$role}{'showlogo'}{$img} ne 
                                   $domconfig->{$role}{'showlogo'}{$img}) {
                                   $changes{$role}{'showlogo'}{$img} = 1; 
                               }
                           } else {
                               if ($confhash->{$role}{'showlogo'}{$img} == 0) {
                                   $changes{$role}{'showlogo'}{$img} = 1;
                               }
                           }
                       }
                   }
                 if ($domconfig->{$role}{'font'} ne '') {                  if ($domconfig->{$role}{'font'} ne '') {
                     if ($confhash->{$role}{'font'} ne $domconfig->{$role}{'font'}) {                      if ($confhash->{$role}{'font'} ne $domconfig->{$role}{'font'}) {
                         $changes{$role}{'font'} = 1;                          $changes{$role}{'font'} = 1;
Line 1984  sub modify_colors { Line 3083  sub modify_colors {
                         }                          }
                     }                      }
                 }                  }
                   foreach my $item (@logintext) {
                       if ($domconfig->{$role}{$item} ne '') {
                           if ($confhash->{$role}{$item} ne $domconfig->{$role}{$item}) {
                               $changes{$role}{'logintext'}{$item} = 1;
                           }
                       } else {
                           if ($confhash->{$role}{$item}) {
                               $changes{$role}{'logintext'}{$item} = 1;
                           }
                       }
                   }
             } else {              } else {
                 &default_change_checker($role,\@images,\@links,\@bgs,                  &default_change_checker($role,\@images,\@links,\@bgs,
                                         $confhash,\%changes);                                           \@logintext,$confhash,\%changes); 
             }              }
         } else {          } else {
             &default_change_checker($role,\@images,\@links,\@bgs,              &default_change_checker($role,\@images,\@links,\@bgs,
                                     $confhash,\%changes);                                       \@logintext,$confhash,\%changes); 
         }          }
     }      }
     return ($errors,%changes);      return ($errors,%changes);
 }  }
   
   sub config_check {
       my ($dom,$confname,$servadm) = @_;
       my ($configuserok,$author_ok,$switchserver,%currroles);
       my $uhome = &Apache::lonnet::homeserver($confname,$dom,1);
       ($configuserok,%currroles) = &check_configuser($uhome,$dom,
                                                      $confname,$servadm);
       if ($configuserok eq 'ok') {
           $switchserver = &check_switchserver($dom,$confname);
           if ($switchserver eq '') {
               $author_ok = &check_authorstatus($dom,$confname,%currroles);
           }
       }
       return ($configuserok,$author_ok,$switchserver);
   }
   
 sub default_change_checker {  sub default_change_checker {
     my ($role,$images,$links,$bgs,$confhash,$changes) = @_;      my ($role,$images,$links,$bgs,$logintext,$confhash,$changes) = @_;
     foreach my $item (@{$links}) {      foreach my $item (@{$links}) {
         if ($confhash->{$role}{$item}) {          if ($confhash->{$role}{$item}) {
             $changes->{$role}{'links'}{$item} = 1;              $changes->{$role}{'links'}{$item} = 1;
Line 2008  sub default_change_checker { Line 3133  sub default_change_checker {
             $changes->{$role}{'bgs'}{$item} = 1;              $changes->{$role}{'bgs'}{$item} = 1;
         }          }
     }      }
       foreach my $item (@{$logintext}) {
           if ($confhash->{$role}{$item}) {
               $changes->{$role}{'logintext'}{$item} = 1;
           }
       }
     foreach my $img (@{$images}) {      foreach my $img (@{$images}) {
         if ($env{'form.'.$role.'_del_'.$img}) {          if ($env{'form.'.$role.'_del_'.$img}) {
             $confhash->{$role}{$img} = '';              $confhash->{$role}{$img} = '';
             $changes->{$role}{'images'}{$img} = 1;              $changes->{$role}{'images'}{$img} = 1;
         }          }
           if ($role eq 'login') {
               if ($confhash->{$role}{'showlogo'}{$img} == 0) {
                   $changes->{$role}{'showlogo'}{$img} = 1;
               }
           }
     }      }
     if ($confhash->{$role}{'font'}) {      if ($confhash->{$role}{'font'}) {
         $changes->{$role}{'font'} = 1;          $changes->{$role}{'font'} = 1;
     }      }
 }   }
   
 sub display_colorchgs {  sub display_colorchgs {
     my ($dom,$changes,$roles,$confhash) = @_;      my ($dom,$changes,$roles,$confhash) = @_;
     my (%choices,$resulttext);      my (%choices,$resulttext);
     &Apache::loncommon::devalidate_domconfig_cache($dom);  
     if (!grep(/^login$/,@{$roles})) {      if (!grep(/^login$/,@{$roles})) {
         $resulttext = &mt('Changes made:').'<br />';          $resulttext = &mt('Changes made:').'<br />';
     }      }
Line 2045  sub display_colorchgs { Line 3179  sub display_colorchgs {
                         $resulttext .= '<li>'.&mt($choices{$key}).':<ul>';                          $resulttext .= '<li>'.&mt($choices{$key}).':<ul>';
                     }                      }
                     foreach my $item (sort(keys(%{$changes->{$role}{$key}}))) {                      foreach my $item (sort(keys(%{$changes->{$role}{$key}}))) {
                         if ($confhash->{$role}{$item} eq '') {                          if (($role eq 'login') && ($key eq 'showlogo')) {
                               if ($confhash->{$role}{$key}{$item}) {
                                   $resulttext .= '<li>'.&mt("$choices{$item} set to be displayed").'</li>';
                               } else {
                                   $resulttext .= '<li>'.&mt("$choices{$item} set to not be displayed").'</li>';
                               }
                           } elsif ($confhash->{$role}{$item} eq '') {
                             $resulttext .= '<li>'.&mt("$choices{$item} set to default").'</li>';                              $resulttext .= '<li>'.&mt("$choices{$item} set to default").'</li>';
                         } else {                          } else {
                             my $newitem = $confhash->{$role}{$item};                              my $newitem = $confhash->{$role}{$item};
Line 2118  sub check_configuser { Line 3258  sub check_configuser {
 sub check_authorstatus {  sub check_authorstatus {
     my ($dom,$confname,%currroles) = @_;      my ($dom,$confname,%currroles) = @_;
     my $author_ok;      my $author_ok;
     if (!$currroles{$confname.':'.$dom.':au'}) {      if (!$currroles{':'.$dom.':au'}) {
         my $start = time;          my $start = time;
         my $end = 0;          my $end = 0;
         $author_ok =           $author_ok = 
             &Apache::lonnet::assignrole($dom,$confname,'/'.$dom.'/',              &Apache::lonnet::assignrole($dom,$confname,'/'.$dom.'/',
                                         'au',$end,$start);                                          'au',$end,$start,'','','domconfig');
     } else {      } else {
         $author_ok = 'ok';          $author_ok = 'ok';
     }      }
Line 2131  sub check_authorstatus { Line 3271  sub check_authorstatus {
 }  }
   
 sub publishlogo {  sub publishlogo {
     my ($r,$action,$formname,$dom,$confname,$subdir,$thumbwidth,$thumbheight) = @_;      my ($r,$action,$formname,$dom,$confname,$subdir,$thumbwidth,$thumbheight,$savefileas) = @_;
     my ($output,$fname,$logourl);      my ($output,$fname,$logourl);
     if ($action eq 'upload') {      if ($action eq 'upload') {
         $fname=$env{'form.'.$formname.'.filename'};          $fname=$env{'form.'.$formname.'.filename'};
Line 2139  sub publishlogo { Line 3279  sub publishlogo {
     } else {      } else {
         ($fname) = ($formname =~ /([^\/]+)$/);          ($fname) = ($formname =~ /([^\/]+)$/);
     }      }
       if ($savefileas ne '') {
           $fname = $savefileas;
       }
     $fname=&Apache::lonnet::clean_filename($fname);      $fname=&Apache::lonnet::clean_filename($fname);
 # 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'); }
Line 2166  sub publishlogo { Line 3309  sub publishlogo {
         !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('File name not allowed a 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('File name 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 {
Line 2361  END Line 3504  END
   
 sub modify_quotas {  sub modify_quotas {
     my ($dom,%domconfig) = @_;      my ($dom,%domconfig) = @_;
       my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
     my ($resulttext,%changes);      my ($resulttext,%changes);
     my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);      my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
     my %formhash;      my @usertools = ('aboutme','blog','portfolio');
       my %titles = &tool_titles();
       my (%confhash,%toolshash);
     foreach my $key (keys(%env)) {      foreach my $key (keys(%env)) {
         if ($key =~ /^form\.quota_(.+)$/) {          if ($key =~ /^form\.quota_(.+)$/) {
             $formhash{$1} = $env{$key};              $confhash{'defaultquota'}{$1} = $env{$key};
           } elsif ($key =~ /^form\.tools_(.+)$/) {
               @{$toolshash{$1}} = &Apache::loncommon::get_env_multiple($key);
         }          }
     }      }
     $formhash{'default'} = $env{'form.defaultquota'};      $confhash{'defaultquota'}{'default'} = $env{'form.defaultquota'};
     if (ref($domconfig{'quotas'}) eq 'HASH') {      foreach my $item (@usertools) {
         foreach my $key (keys(%{$domconfig{'quotas'}})) {          foreach my $type (@{$types},'default','_LC_adv') {
             if (exists($formhash{$key})) {              if (grep(/^\Q$type\E$/,@{$toolshash{$item}})) {
                 if ($formhash{$key} ne $domconfig{'quotas'}{$key}) {                  $confhash{$item}{$type} = 1;
                     $changes{$key} = 1;              } else {
                   $confhash{$item}{$type} = 0;
               }
               if (ref($domconfig{'quotas'}) eq 'HASH') {
                   if (ref($domconfig{'quotas'}{$item}) eq 'HASH') {
                       if ($domconfig{'quotas'}{$item}{$type} ne $confhash{$item}{$type}) {
                           $changes{$item}{$type} = 1;
                       }
                   } else {
                       if (!$confhash{$item}{$type}) {
                           $changes{$item}{$type} = 1;
                       }
                 }                  }
             } else {              } else {
                 $formhash{$key} = $domconfig{'quotas'}{$key};                  if (!$confhash{$item}{$type}) {
                       $changes{$item}{$type} = 1;
                   }
             }              }
         }          }
     }      }
     foreach my $key (keys(%formhash)) {      if (ref($domconfig{'quotas'}) eq 'HASH') {
         if ($formhash{$key} ne '') {          if (ref($domconfig{'quotas'}{'defaultquota'}) eq 'HASH') {
             if (!exists($domconfig{'quotas'}{$key})) {              foreach my $key (keys(%{$domconfig{'quotas'}{'defaultquota'}})) {
                 $changes{$key} = 1;                  if (exists($confhash{'defaultquota'}{$key})) {
                       if ($confhash{'defaultquota'}{$key} ne $domconfig{'quotas'}{'defaultquota'}{$key}) {
                           $changes{'defaultquota'}{$key} = 1;
                       }
                   } else {
                       $confhash{'defaultquota'}{$key} = $domconfig{'quotas'}{'defaultquota'}{$key};
                   }
               }
           } else {
               foreach my $key (keys(%{$domconfig{'quotas'}})) {
                   if (exists($confhash{'defaultquota'}{$key})) {
                       if ($confhash{'defaultquota'}{$key} ne $domconfig{'quotas'}{$key}) {
                           $changes{'defaultquota'}{$key} = 1;
                       }
                   } else {
                       $confhash{'defaultquota'}{$key} = $domconfig{'quotas'}{$key};
                   }
             }              }
         }          }
     }      }
       if (ref($confhash{'defaultquota'}) eq 'HASH') {
           foreach my $key (keys(%{$confhash{'defaultquota'}})) {
               if (ref($domconfig{'quotas'}) eq 'HASH') {
                   if (ref($domconfig{'quotas'}{'defaultquota'}) eq 'HASH') {
                       if (!exists($domconfig{'quotas'}{'defaultquota'}{$key})) {
                           $changes{'defaultquota'}{$key} = 1;
                       }
                   } else {
                       if (!exists($domconfig{'quotas'}{$key})) {
                           $changes{'defaultquota'}{$key} = 1;
                       }
                   }
               } else {
                   $changes{'defaultquota'}{$key} = 1;
               }
           }
       }
   
       foreach my $key (keys(%confhash)) {
           $domdefaults{$key} = $confhash{$key};
       }
      
     my %quotahash = (      my %quotahash = (
                       quotas => {%formhash},                        quotas => { %confhash }
                     );                      );
     my $putresult = &Apache::lonnet::put_dom('configuration',\%quotahash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%quotahash,
                                              $dom);                                               $dom);
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
               my $cachetime = 24*60*60;
               &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
   
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             foreach my $type (@{$types},'default') {              if (ref($changes{'defaultquota'}) eq 'HASH') {
                 if (defined($changes{$type})) {                   $resulttext .= '<li>'.&mt('Portfolio default quotas').'<ul>';
                     my $typetitle = $usertypes->{$type};                  foreach my $type (@{$types},'default') {
                     if ($type eq 'default') {                      if (defined($changes{'defaultquota'}{$type})) {
                         $typetitle = $othertitle;                          my $typetitle = $usertypes->{$type};
                           if ($type eq 'default') {
                               $typetitle = $othertitle;
                           }
                           $resulttext .= '<li>'.&mt('[_1] set to [_2] Mb',$typetitle,$confhash{'defaultquota'}{$type}).'</li>';
                     }                      }
                     $resulttext .= '<li>'.&mt('[_1] set to [_2] Mb',$typetitle,$formhash{$type}).'</li>';                  }
                   $resulttext .= '</ul></li>';
               }
               foreach my $item (@usertools) {
                   if (ref($changes{$item}) eq 'HASH') {
                       my $hashid = $env{'user.name'}.':'.$env{'user.domain'};
                       &Apache::lonnet::devalidate_cache_new('usertools.'.$item,$hashid);
                       $resulttext .= '<li>'.$titles{$item}.'<ul>';
                       foreach my $type (@{$types},'default','_LC_adv') {
                           if ($changes{$item}{$type}) {
                               my $typetitle = $usertypes->{$type};
                               if ($type eq 'default') {
                                   $typetitle = $othertitle;
                               } elsif ($type eq '_LC_adv') {
                                   $typetitle = 'LON-CAPA Advanced Users'; 
                               }
                               if ($confhash{$item}{$type}) {
                                   $resulttext .= '<li>'.&mt('Set to be available to [_1]',$typetitle).'</li>';
                               } else {
                                   $resulttext .= '<li>'.&mt('Set to be unavailable to [_1]',$typetitle).'</li>';
                               }
                           }
                       }
                       $resulttext .= '</ul></li>';
                 }                  }
             }              }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
         } else {          } else {
             $resulttext = &mt('No changes made to default quotas');              $resulttext = &mt('No changes made to availability of home pages, blogs, portfolios or default quotas');
         }          }
     } else {      } else {
         $resulttext = '<span class="LC_error">'.          $resulttext = '<span class="LC_error">'.
Line 2497  sub modify_autoupdate { Line 3726  sub modify_autoupdate {
                    run => 'Auto-update:',                     run => 'Auto-update:',
                    classlists => 'Updates to user information in classlists?'                     classlists => 'Updates to user information in classlists?'
                 );                  );
     my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);      my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
     my %fieldtitles = &Apache::lonlocal::texthash (      my %fieldtitles = &Apache::lonlocal::texthash (
                         id => 'Student/Employee ID',                          id => 'Student/Employee ID',
                         permanentemail => 'E-mail address',                          permanentemail => 'E-mail address',
Line 2626  sub modify_directorysrch { Line 3855  sub modify_directorysrch {
     my @cansearch = &Apache::loncommon::get_env_multiple('form.cansearch');      my @cansearch = &Apache::loncommon::get_env_multiple('form.cansearch');
     my @searchby = &Apache::loncommon::get_env_multiple('form.searchby');      my @searchby = &Apache::loncommon::get_env_multiple('form.searchby');
   
     my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);      my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
     if (keys(%{$usertypes}) == 0) {      if (keys(%{$usertypes}) == 0) {
         @cansearch = ('default');          @cansearch = ('default');
     } else {      } else {
Line 2892  sub modify_contacts { Line 4121  sub modify_contacts {
 sub modify_usercreation {  sub modify_usercreation {
     my ($dom,%domconfig) = @_;      my ($dom,%domconfig) = @_;
     my ($resulttext,%curr_usercreation,%changes,%authallowed,%cancreate);      my ($resulttext,%curr_usercreation,%changes,%authallowed,%cancreate);
       my $warningmsg;
     if (ref($domconfig{'usercreation'}) eq 'HASH') {      if (ref($domconfig{'usercreation'}) eq 'HASH') {
         foreach my $key (keys(%{$domconfig{'usercreation'}})) {          foreach my $key (keys(%{$domconfig{'usercreation'}})) {
             $curr_usercreation{$key} = $domconfig{'usercreation'}{$key};              $curr_usercreation{$key} = $domconfig{'usercreation'}{$key};
         }          }
     }      }
     my %title = &Apache::lonlocal::texthash (  
                    author => 'adding co-authors/assistant authors',  
                    course => 'adding users to a course',  
                 );  
     my @username_rule = &Apache::loncommon::get_env_multiple('form.username_rule');      my @username_rule = &Apache::loncommon::get_env_multiple('form.username_rule');
     my @id_rule = &Apache::loncommon::get_env_multiple('form.id_rule');      my @id_rule = &Apache::loncommon::get_env_multiple('form.id_rule');
     my @contexts = ('author','course');      my @email_rule = &Apache::loncommon::get_env_multiple('form.email_rule');
       my @contexts = ('author','course','selfcreate');
     foreach my $item(@contexts) {      foreach my $item(@contexts) {
         $cancreate{$item} = $env{'form.can_createuser_'.$item};          if ($item eq 'selfcreate') {
               @{$cancreate{$item}} = &Apache::loncommon::get_env_multiple('form.can_createuser_'.$item);
               my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
               if (!((($domdefaults{'auth_def'} =~/^krb/) && ($domdefaults{'auth_arg_def'} ne '')) || ($domdefaults{'auth_def'} eq 'localauth'))) {
                   if (ref($cancreate{$item}) eq 'ARRAY') { 
                       if (grep(/^login$/,@{$cancreate{$item}})) {
                           $warningmsg = &mt('Although account creation has been set to be available for institutional logins, currently default authentication in this domain has not been set to support this.').' '.&mt('You need to set the default authentication type to Kerberos 4 or 5 (with a Kerberos domain specified), or to Local authentication, if the localauth module has been customized in your domain to authenticate institutional logins.');   
                       }
                   }
               }
           } else {
               $cancreate{$item} = $env{'form.can_createuser_'.$item};
           }
     }      }
     if (ref($curr_usercreation{'cancreate'}) eq 'HASH') {      if (ref($curr_usercreation{'cancreate'}) eq 'HASH') {
         foreach my $item (@contexts) {          foreach my $item (@contexts) {
             if ($curr_usercreation{'cancreate'}{$item} ne $cancreate{$item}) {              if ($item eq 'selfcreate') {
                 push(@{$changes{'cancreate'}},$item);                  if (ref($curr_usercreation{'cancreate'}{$item}) eq 'ARRAY') { 
             }                       foreach my $curr (@{$curr_usercreation{'cancreate'}{$item}}) {
                           if (!grep(/^$curr$/,@{$cancreate{$item}})) {
                               if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                   push(@{$changes{'cancreate'}},$item);
                               }
                           }
                       }
                   } else {
                       if ($curr_usercreation{'cancreate'}{$item} eq '') {
                           if (@{$cancreate{$item}} > 0) {
                               if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                   push(@{$changes{'cancreate'}},$item);
                               }
                           }
                       } else {
                           if ($curr_usercreation{'cancreate'}{$item} eq 'any') {
                               if (@{$cancreate{$item}} < 3) {
                                   if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                       push(@{$changes{'cancreate'}},$item);
                                   }
                               }
                           } elsif ($curr_usercreation{'cancreate'}{$item} eq 'none') {
                               if (@{$cancreate{$item}} > 0) {
                                   if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                       push(@{$changes{'cancreate'}},$item);
                                   }
                               }
                           } elsif (!grep(/^$curr_usercreation{'cancreate'}{$item}$/,@{$cancreate{$item}})) {
                               if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                   push(@{$changes{'cancreate'}},$item);
                               }
                           }
                       }
                   }
                   if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                       foreach my $type (@{$cancreate{$item}}) {
                           if (ref($curr_usercreation{'cancreate'}{$item}) eq 'ARRAY') {
                               if (!grep(/^$type$/,@{$curr_usercreation{'cancreate'}{$item}})) {
                                   if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                       push(@{$changes{'cancreate'}},$item);
                                   }
                               }
                           } elsif (($curr_usercreation{'cancreate'}{$item} ne 'any') &&
                                    ($curr_usercreation{'cancreate'}{$item} ne 'none')) {
                               if ($curr_usercreation{'cancreate'}{$item} ne $type) {
                                   if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                       push(@{$changes{'cancreate'}},$item);
                                   }
                               }
                           }
                       }
                   }
               } else {
                   if ($curr_usercreation{'cancreate'}{$item} ne $cancreate{$item}) {
                       push(@{$changes{'cancreate'}},$item);
                   }
               }
         }          }
     } elsif (ref($curr_usercreation{'cancreate'}) eq 'ARRAY') {      } elsif (ref($curr_usercreation{'cancreate'}) eq 'ARRAY') {
         foreach my $item (@contexts) {          foreach my $item (@contexts) {
             if (grep(/^\Q$item\E$/,@{$curr_usercreation{'cancreate'}})) {              if (!grep(/^\Q$item\E$/,@{$curr_usercreation{'cancreate'}})) {
                 if ($cancreate{$item} ne 'any') {                  if ($cancreate{$item} ne 'any') {
                     push(@{$changes{'cancreate'}},$item);                      push(@{$changes{'cancreate'}},$item);
                 }                  }
Line 2926  sub modify_usercreation { Line 4221  sub modify_usercreation {
             }              }
         }          }
     } else {      } else {
         foreach my $item ('author','course') {          foreach my $item (@contexts)  {
             push(@{$changes{'cancreate'}},$item);              push(@{$changes{'cancreate'}},$item);
         }          }
     }      }
Line 2961  sub modify_usercreation { Line 4256  sub modify_usercreation {
         push(@{$changes{'id_rule'}},@id_rule);          push(@{$changes{'id_rule'}},@id_rule);
     }      }
   
     my @contexts = ('author','course','domain');      if (ref($curr_usercreation{'email_rule'}) eq 'ARRAY') {
           foreach my $type (@{$curr_usercreation{'email_rule'}}) {
               if (!grep(/^\Q$type\E$/,@email_rule)) {
                   push(@{$changes{'email_rule'}},$type);
               }
           }
           foreach my $type (@email_rule) {
               if (!grep(/^\Q$type\E$/,@{$curr_usercreation{'email_rule'}})) {
                   push(@{$changes{'email_rule'}},$type);
               }
           }
       } else {
           push(@{$changes{'email_rule'}},@email_rule);
       }
   
       my @authen_contexts = ('author','course','domain');
     my @authtypes = ('int','krb4','krb5','loc');      my @authtypes = ('int','krb4','krb5','loc');
     my %authhash;      my %authhash;
     foreach my $item (@contexts) {      foreach my $item (@authen_contexts) {
         my @authallowed =  &Apache::loncommon::get_env_multiple('form.'.$item.'_auth');          my @authallowed =  &Apache::loncommon::get_env_multiple('form.'.$item.'_auth');
         foreach my $auth (@authtypes) {          foreach my $auth (@authtypes) {
             if (grep(/^\Q$auth\E$/,@authallowed)) {              if (grep(/^\Q$auth\E$/,@authallowed)) {
Line 2975  sub modify_usercreation { Line 4285  sub modify_usercreation {
         }          }
     }      }
     if (ref($curr_usercreation{'authtypes'}) eq 'HASH') {      if (ref($curr_usercreation{'authtypes'}) eq 'HASH') {
         foreach my $item (@contexts) {          foreach my $item (@authen_contexts) {
             if (ref($curr_usercreation{'authtypes'}{$item}) eq 'HASH') {              if (ref($curr_usercreation{'authtypes'}{$item}) eq 'HASH') {
                 foreach my $auth (@authtypes) {                  foreach my $auth (@authtypes) {
                     if ($authhash{$item}{$auth} ne $curr_usercreation{'authtypes'}{$item}{$auth}) {                      if ($authhash{$item}{$auth} ne $curr_usercreation{'authtypes'}{$item}{$auth}) {
Line 2986  sub modify_usercreation { Line 4296  sub modify_usercreation {
             }              }
         }          }
     } else {      } else {
         foreach my $item (@contexts) {          foreach my $item (@authen_contexts) {
             push(@{$changes{'authtypes'}},$item);              push(@{$changes{'authtypes'}},$item);
         }          }
     }      }
Line 2996  sub modify_usercreation { Line 4306  sub modify_usercreation {
                               cancreate     => \%cancreate,                                cancreate     => \%cancreate,
                               username_rule => \@username_rule,                                username_rule => \@username_rule,
                               id_rule       => \@id_rule,                                id_rule       => \@id_rule,
                                 email_rule    => \@email_rule,
                               authtypes     => \%authhash,                                authtypes     => \%authhash,
                             }                              }
             );              );
   
     my $putresult = &Apache::lonnet::put_dom('configuration',\%usercreation_hash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%usercreation_hash,
                                              $dom);                                               $dom);
   
       my %selfcreatetypes = (
                                sso   => 'users authenticated by institutional single sign on',
                                login => 'users authenticated by institutional log-in',
                                email => 'users who provide a valid e-mail address for use as the username',
                             );
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             if (ref($changes{'cancreate'}) eq 'ARRAY') {              if (ref($changes{'cancreate'}) eq 'ARRAY') {
                 my %lt = &usercreation_types();                  my %lt = &usercreation_types();
                 foreach my $type (@{$changes{'cancreate'}}) {                  foreach my $type (@{$changes{'cancreate'}}) {
                     my $chgtext;                       my $chgtext =  $lt{$type}.', ';
                     if ($cancreate{$type} eq 'none') {                      if ($type eq 'selfcreate') {
                         $chgtext = $lt{$type}.' '.&mt('creation of new users is not permitted, except by a Domain Coordinator.');                          if (@{$cancreate{$type}} == 0) {
                     } elsif ($cancreate{$type} eq 'any') {                              $chgtext .= &mt('creation of a new user account is not permitted.');
                         $chgtext = $lt{$type}.' '.&mt('creation of new users is permitted for both institutional and non-institutional usernames.');                           } else {
                     } elsif ($cancreate{$type} eq 'official') {                              $chgtext .= &mt('creation of a new account is permitted for:<ul>');
                         $chgtext = $lt{$type}.' '.&mt('creation of new users is only permitted for institutional usernames.',$lt{$type});                              foreach my $case (@{$cancreate{$type}}) {
                     } elsif ($cancreate{$type} eq 'unofficial') {                                  $chgtext .= '<li>'.$selfcreatetypes{$case}.'</li>';
                         $chgtext = $lt{$type}.' '.&mt('creation of new users is only permitted for non-institutional usernames.',$lt{$type});                              }
                               $chgtext .= '</ul>';
                           }
                       } else {
                           if ($cancreate{$type} eq 'none') {
                               $chgtext .= &mt('creation of new users is not permitted, except by a Domain Coordinator.');
                           } elsif ($cancreate{$type} eq 'any') {
                               $chgtext .= &mt('creation of new users is permitted for both institutional and non-institutional usernames.');
                           } elsif ($cancreate{$type} eq 'official') {
                               $chgtext .= &mt('creation of new users is only permitted for institutional usernames.');
                           } elsif ($cancreate{$type} eq 'unofficial') {
                               $chgtext .= &mt('creation of new users is only permitted for non-institutional usernames.');
                           }
                     }                      }
                     $resulttext .= '<li>'.$chgtext.'</li>';                      $resulttext .= '<li>'.$chgtext.'</li>';
                 }                  }
Line 3053  sub modify_usercreation { Line 4382  sub modify_usercreation {
                     $resulttext .= '<li>'.&mt('There are now no ID formats restricted to verified users in the institutional directory.').'</li>';                      $resulttext .= '<li>'.&mt('There are now no ID formats restricted to verified users in the institutional directory.').'</li>';
                 }                  }
             }              }
               if (ref($changes{'email_rule'}) eq 'ARRAY') {
                   my ($emailrules,$emailruleorder) =
                       &Apache::lonnet::inst_userrules($dom,'email');
                   my $chgtext = '<ul>';
                   foreach my $type (@email_rule) {
                       if (ref($emailrules->{$type}) eq 'HASH') {
                           $chgtext .= '<li>'.$emailrules->{$type}{'name'}.'</li>';
                       }
                   }
                   $chgtext .= '</ul>';
                   if (@email_rule > 0) {
                       $resulttext .= '<li>'.&mt('Accounts may not be created by users self-enrolling with e-mail addresses of the following types: ').$chgtext.'</li>';
                   } else {
                       $resulttext .= '<li>'.&mt('There are now no restrictions on e-mail addresses which may be used as a username when self-enrolling.').'</li>';
                   }
               }
   
             my %authname = &authtype_names();              my %authname = &authtype_names();
             my %context_title = &context_names();              my %context_title = &context_names();
             if (ref($changes{'authtypes'}) eq 'ARRAY') {              if (ref($changes{'authtypes'}) eq 'ARRAY') {
Line 3065  sub modify_usercreation { Line 4411  sub modify_usercreation {
                             push(@allowed,$authname{$auth});                              push(@allowed,$authname{$auth});
                         }                          }
                     }                      }
                     $chgtext .= join(', ',@allowed).'</li>';                      if (@allowed > 0) {
                           $chgtext .= join(', ',@allowed).'</li>';
                       } else {
                           $chgtext .= &mt('none').'</li>';
                       }
                 }                  }
                 $chgtext .= '</ul>';                  $chgtext .= '</ul>';
                 $resulttext .= '<li>'.&mt('Authentication types available for assignment to new users').'<br />'.$chgtext;                  $resulttext .= '<li>'.&mt('Authentication types available for assignment to new users').'<br />'.$chgtext;
Line 3079  sub modify_usercreation { Line 4429  sub modify_usercreation {
         $resulttext = '<span class="LC_error">'.          $resulttext = '<span class="LC_error">'.
             &mt('An error occurred: [_1]',$putresult).'</span>';              &mt('An error occurred: [_1]',$putresult).'</span>';
     }      }
       if ($warningmsg ne '') {
           $resulttext .= '<br /><span class="LC_warning">'.$warningmsg.'</span><br />';
       }
     return $resulttext;      return $resulttext;
 }  }
   
Line 3090  sub modify_usermodification { Line 4443  sub modify_usermodification {
             $curr_usermodification{$key} = $domconfig{'usermodification'}{$key};              $curr_usermodification{$key} = $domconfig{'usermodification'}{$key};
         }          }
     }      }
     my @contexts = ('author','course');      my @contexts = ('author','course','selfcreate');
     my %context_title = (      my %context_title = (
                            author => 'In author context',                             author => 'In author context',
                            course => 'In course context',                             course => 'In course context',
                              selfcreate => 'When self creating account', 
                         );                          );
     my @fields = ('lastname','firstname','middlename','generation',      my @fields = ('lastname','firstname','middlename','generation',
                   'permanentemail','id');                    'permanentemail','id');
Line 3101  sub modify_usermodification { Line 4455  sub modify_usermodification {
                   author => ['ca','aa'],                    author => ['ca','aa'],
                   course => ['st','ep','ta','in','cr'],                    course => ['st','ep','ta','in','cr'],
                 );                  );
       my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
       if (ref($types) eq 'ARRAY') {
           push(@{$types},'default');
           $usertypes->{'default'} = $othertitle;
       }
       $roles{'selfcreate'} = $types;  
     my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();      my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
     my %modifyhash;      my %modifyhash;
     foreach my $context (@contexts) {      foreach my $context (@contexts) {
Line 3148  sub modify_usermodification { Line 4508  sub modify_usermodification {
                     if (ref($changes{$context}) eq 'ARRAY') {                      if (ref($changes{$context}) eq 'ARRAY') {
                         foreach my $role (@{$changes{$context}}) {                          foreach my $role (@{$changes{$context}}) {
                             my $rolename;                              my $rolename;
                             if ($role eq 'cr') {                              if ($context eq 'selfcreate') {
                                 $rolename = &mt('Custom');                                  $rolename = $role;
                                   if (ref($usertypes) eq 'HASH') {
                                       if ($usertypes->{$role} ne '') {
                                           $rolename = $usertypes->{$role};
                                       }
                                   }
                             } else {                              } else {
                                 $rolename = &Apache::lonnet::plaintext($role);                                  if ($role eq 'cr') {
                                       $rolename = &mt('Custom');
                                   } else {
                                       $rolename = &Apache::lonnet::plaintext($role);
                                   }
                             }                              }
                             my @modifiable;                              my @modifiable;
                             $resulttext .= '<li><span class="LC_cusr_emph">'.&mt('Target user with [_1] role',$rolename).'</span> - '.&mt('modifiable fields: ');                              if ($context eq 'selfcreate') {
                                   $resulttext .= '<li><span class="LC_cusr_emph">'.&mt('Self-creation of account by users with status: [_1]  ',$rolename).'</span> - '.&mt('modifiable fields (if institutional data blank): ');
                               } else {
                                   $resulttext .= '<li><span class="LC_cusr_emph">'.&mt('Target user with [_1] role',$rolename).'</span> - '.&mt('modifiable fields: ');
                               }
                             foreach my $field (@fields) {                              foreach my $field (@fields) {
                                 if ($modifyhash{$context}{$role}{$field}) {                                  if ($modifyhash{$context}{$role}{$field}) {
                                     push(@modifiable,$fieldtitles{$field});                                      push(@modifiable,$fieldtitles{$field});
Line 3182  sub modify_usermodification { Line 4555  sub modify_usermodification {
     return $resulttext;      return $resulttext;
 }  }
   
   sub modify_defaults {
       my ($dom,$r) = @_;
       my ($resulttext,$mailmsgtxt,%newvalues,%changes,@errors);
       my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
       my @items = ('auth_def','auth_arg_def','lang_def','timezone_def','datelocale_def');
       my @authtypes = ('internal','krb4','krb5','localauth');
       foreach my $item (@items) {
           $newvalues{$item} = $env{'form.'.$item};
           if ($item eq 'auth_def') {
               if ($newvalues{$item} ne '') {
                   if (!grep(/^\Q$newvalues{$item}\E$/,@authtypes)) {
                       push(@errors,$item);
                   }
               }
           } elsif ($item eq 'lang_def') {
               if ($newvalues{$item} ne '') {
                   if ($newvalues{$item} =~ /^(\w+)/) {
                       my $langcode = $1;
                       if (code2language($langcode) eq '') {
                           push(@errors,$item);
                       }
                   } else {
                       push(@errors,$item);
                   }
               }
           } elsif ($item eq 'timezone_def') {
               if ($newvalues{$item} ne '') {
                   if (!DateTime::TimeZone->is_valid_name($newvalues{$item})) {
                       push(@errors,$item);   
                   }
               }
           } elsif ($item eq 'datelocale_def') {
               if ($newvalues{$item} ne '') {
                   my @datelocale_ids = DateTime::Locale->ids();
                   if (!grep(/^\Q$newvalues{$item}\E$/,@datelocale_ids)) {
                       push(@errors,$item);
                   }
               }
           }
           if (grep(/^\Q$item\E$/,@errors)) {
               $newvalues{$item} = $domdefaults{$item};
           } elsif ($domdefaults{$item} ne $newvalues{$item}) {
               $changes{$item} = 1;
           }
           $domdefaults{$item} = $newvalues{$item};
       }
       my %defaults_hash = (
                            defaults => \%newvalues,
                           );
       my $title = &defaults_titles();
       my $putresult = &Apache::lonnet::put_dom('configuration',\%defaults_hash,
                                                $dom);
       if ($putresult eq 'ok') {
           if (keys(%changes) > 0) {
               $resulttext = &mt('Changes made:').'<ul>';
               my $version = $r->dir_config('lonVersion');
               my $mailmsgtext = "Changes made to domain settings in a LON-CAPA installation - domain: $dom (running version: $version) - dns_domain.tab needs to be updated with the following changes, to support legacy 2.4, 2.5 and 2.6 versions of LON-CAPA.\n\n";
               foreach my $item (sort(keys(%changes))) {
                   my $value = $env{'form.'.$item};
                   if ($value eq '') {
                       $value = &mt('none');
                   } elsif ($item eq 'auth_def') {
                       my %authnames = &authtype_names();
                       my %shortauth = (
                                internal => 'int',
                                krb4 => 'krb4',
                                krb5 => 'krb5',
                                localauth  => 'loc',
                       );
                       $value = $authnames{$shortauth{$value}};
                   }
                   $resulttext .= '<li>'.&mt('[_1] set to "[_2]"',$title->{$item},$value).'</li>';
                   $mailmsgtext .= "$title->{$item} set to $value\n";  
               }
               $resulttext .= '</ul>';
               $mailmsgtext .= "\n";
               my $cachetime = 24*60*60;
               &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
               if ($changes{'auth_def'} || $changes{'auth_arg_def'} || $changes{'lang_def'} || $changes{'datelocale_def'}) {
                   my $sysmail = $r->dir_config('lonSysEMail');
                   &Apache::lonmsg::sendemail($sysmail,"LON-CAPA Domain Settings Change - $dom",$mailmsgtext);
               }
           } else {
               $resulttext = &mt('No changes made to default authentication/language/timezone settings');
           }
       } else {
           $resulttext = '<span class="LC_error">'.
               &mt('An error occurred: [_1]',$putresult).'</span>';
       }
       if (@errors > 0) {
           $resulttext .= '<br />'.&mt('The following were left unchanged because the values entered were invalid:');
           foreach my $item (@errors) {
               $resulttext .= ' "'.$title->{$item}.'",';
           }
           $resulttext =~ s/,$//;
       }
       return $resulttext;
   }
   
   sub modify_scantron {
       my ($r,$dom,$confname,%domconfig) = @_;
       my ($resulttext,%confhash,%changes,$errors);
       my $custom = 'custom.tab';
       my $default = 'default.tab';
       my $servadm = $r->dir_config('lonAdmEMail');
       my ($configuserok,$author_ok,$switchserver) = 
           &config_check($dom,$confname,$servadm);
       if ($env{'form.scantronformat.filename'} ne '') {
           my $error;
           if ($configuserok eq 'ok') {
               if ($switchserver) {
                   $error = &mt("Upload of scantron format file is not permitted to this server: [_1]",$switchserver);
               } else {
                   if ($author_ok eq 'ok') {
                       my ($result,$scantronurl) =
                           &publishlogo($r,'upload','scantronformat',$dom,
                                        $confname,'scantron','','',$custom);
                       if ($result eq 'ok') {
                           $confhash{'scantron'}{'scantronformat'} = $scantronurl;
                           $changes{'scantronformat'} = 1;
                       } else {
                           $error = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$custom,$result);
                       }
                   } else {
                       $error = &mt("Upload of [_1] failed because an author role could not be assigned to a Domain Configuration user ([_2]) in domain: [_3].  Error was: [_4].",$custom,$confname,$dom,$author_ok);
                   }
               }
           } else {
               $error = &mt("Upload of [_1] failed because a Domain Configuration user ([_2]) could not be created in domain: [_3].  Error was: [_4].",$custom,$confname,$dom,$configuserok);
           }
           if ($error) {
               &Apache::lonnet::logthis($error);
               $errors .= '<li><span class="LC_error">'.$error.'</span></li>';
           }
       }
       if (ref($domconfig{'scantron'}) eq 'HASH') {
           if ($domconfig{'scantron'}{'scantronformat'} ne '') {
               if ($env{'form.scantronformat_del'}) {
                   $confhash{'scantron'}{'scantronformat'} = '';
                   $changes{'scantronformat'} = 1;
               }
           }
       }
       if (keys(%confhash) > 0) {
           my $putresult = &Apache::lonnet::put_dom('configuration',\%confhash,
                                                    $dom);
           if ($putresult eq 'ok') {
               if (keys(%changes) > 0) {
                   if (ref($confhash{'scantron'}) eq 'HASH') {
                       $resulttext = &mt('Changes made:').'<ul>';
                       if ($confhash{'scantron'}{'scantronformat'} eq '') {
                           $resulttext .= '<li>'.&mt('[_1] scantron format file removed; [_2] file will be used for courses in this domain.',$custom,$default).'</li>';
                       } else {
                           $resulttext .= '<li>'.&mt('Custom scantron format file ([_1]) uploaded for use with courses in this domain.',$custom).'</li>';
                       }
                       $resulttext .= '</ul>';
                   } else {
                       $resulttext = &mt('Changes made to scantron format file.');
                   }
                   $resulttext .= '</ul>';
                   &Apache::loncommon::devalidate_domconfig_cache($dom);
               } else {
                   $resulttext = &mt('No changes made to scantron format file');
               }
           } else {
               $resulttext = '<span class="LC_error">'.
                   &mt('An error occurred: [_1]',$putresult).'</span>';
           }
       } else {
           $resulttext = &mt('No changes made to scantron format file'); 
       }
       if ($errors) {
           $resulttext .= &mt('The following errors occurred: ').'<ul>'.
                          $errors.'</ul>';
       }
       return $resulttext;
   }
   
   sub modify_coursecategories {
       my ($dom,%domconfig) = @_;
       my ($resulttext,%deletions,%reorderings,%needreordering,%adds,%changes,$errors,
           $cathash);
       my @deletecategory = &Apache::loncommon::get_env_multiple('form.deletecategory');
       if (ref($domconfig{'coursecategories'}) eq 'HASH') {
           $cathash = $domconfig{'coursecategories'}{'cats'};
           if ($domconfig{'coursecategories'}{'togglecats'} ne $env{'form.togglecats'}) {
               $changes{'togglecats'} = 1;
               $domconfig{'coursecategories'}{'togglecats'} = $env{'form.togglecats'};
           }
           if ($domconfig{'coursecategories'}{'categorize'} ne $env{'form.categorize'}) {
               $changes{'categorize'} = 1;
               $domconfig{'coursecategories'}{'categorize'} = $env{'form.categorize'};
           }
       } else {
           $changes{'togglecats'} = 1;
           $changes{'categorize'} = 1;
           $domconfig{'coursecategories'}{'togglecats'} = $env{'form.togglecats'};
           $domconfig{'coursecategories'}{'categorize'} = $env{'form.categorize'};
       }
       if (ref($cathash) eq 'HASH') {
           if (($domconfig{'coursecategories'}{'cats'}{'instcode::0'} ne '')  && ($env{'form.instcode'} == 0)) {
               push (@deletecategory,'instcode::0');
           }
       }
       my (@predelcats,@predeltrails,%predelallitems,%sort_by_deltrail);
       if (ref($cathash) eq 'HASH') {
           if (@deletecategory > 0) {
               #FIXME Need to remove category from all courses using a deleted category 
               &Apache::loncommon::extract_categories($cathash,\@predelcats,\@predeltrails,\%predelallitems);
               foreach my $item (@deletecategory) {
                   if ($domconfig{'coursecategories'}{'cats'}{$item} ne '') {
                       delete($domconfig{'coursecategories'}{'cats'}{$item});
                       $deletions{$item} = 1;
                       &recurse_cat_deletes($item,$cathash,\%deletions);
                   }
               }
           }
           foreach my $item (keys(%{$cathash})) {
               my ($cat,$container,$depth) = map { &unescape($_); } split(/:/,$item);
               if ($cathash->{$item} ne $env{'form.'.$item}) {
                   $reorderings{$item} = 1;
                   $domconfig{'coursecategories'}{'cats'}{$item} = $env{'form.'.$item};
               }
               if ($env{'form.addcategory_name_'.$item} ne '') {
                   my $newcat = $env{'form.addcategory_name_'.$item};
                   my $newdepth = $depth+1;
                   my $newitem = &escape($newcat).':'.&escape($cat).':'.$newdepth;
                   $domconfig{'coursecategories'}{'cats'}{$newitem} = $env{'form.addcategory_pos_'.$item};
                   $adds{$newitem} = 1; 
               }
               if ($env{'form.subcat_'.$item} ne '') {
                   my $newcat = $env{'form.subcat_'.$item};
                   my $newdepth = $depth+1;
                   my $newitem = &escape($newcat).':'.&escape($cat).':'.$newdepth;
                   $domconfig{'coursecategories'}{'cats'}{$newitem} = 0;
                   $adds{$newitem} = 1;
               }
           }
       }
       if ($env{'form.instcode'} eq '1') {
           if (ref($cathash) eq 'HASH') {
               my $newitem = 'instcode::0';
               if ($cathash->{$newitem} eq '') {  
                   $domconfig{'coursecategories'}{'cats'}{$newitem} = $env{'form.instcode_pos'};
                   $adds{$newitem} = 1;
               }
           } else {
               my $newitem = 'instcode::0';
               $domconfig{'coursecategories'}{'cats'}{$newitem} = $env{'form.instcode_pos'};
               $adds{$newitem} = 1;
           }
       }
       if ($env{'form.addcategory_name'} ne '') {
           my $newitem = &escape($env{'form.addcategory_name'}).'::0';
           $domconfig{'coursecategories'}{'cats'}{$newitem} = $env{'form.addcategory_pos'};
           $adds{$newitem} = 1;
       }
       my $putresult;
       if ((keys(%deletions) > 0) || (keys(%reorderings) > 0) || (keys(%adds) > 0)) {
           if (keys(%deletions) > 0) {
               foreach my $key (keys(%deletions)) {
                   if ($predelallitems{$key} ne '') {
                       $sort_by_deltrail{$predelallitems{$key}} = $predeltrails[$predelallitems{$key}];
                   }
               }
           }
           my (@chkcats,@chktrails,%chkallitems);
           &Apache::loncommon::extract_categories($domconfig{'coursecategories'}{'cats'},\@chkcats,\@chktrails,\%chkallitems);
           if (ref($chkcats[0]) eq 'ARRAY') {
               my $depth = 0;
               my $chg = 0;
               for (my $i=0; $i<@{$chkcats[0]}; $i++) {
                   my $name = $chkcats[0][$i];
                   my $item;
                   if ($name eq '') {
                       $chg ++;
                   } else {
                       $item = &escape($name).'::0';
                       if ($chg) {
                           $domconfig{'coursecategories'}{'cats'}{$item} -= $chg;
                       }
                       $depth ++; 
                       &recurse_check(\@chkcats,$domconfig{'coursecategories'}{'cats'},$depth,$name);
                       $depth --;
                   }
               }
           }
       }
       if ((keys(%changes) > 0) || (keys(%deletions) > 0) || (keys(%reorderings) > 0) || (keys(%adds) > 0)) {
           $putresult = &Apache::lonnet::put_dom('configuration',\%domconfig,$dom);
           if ($putresult eq 'ok') {
               my %title = (
                            togglecats  => 'Show/Hide a course in the catalog',
                            categorize     => 'Category assigned to course',
                           );
               my %level = (
                            dom => 'set from "Modify Course" (Domain)',
                            crs => 'set from "Parameters" (Course)',
                           );
               $resulttext = &mt('Changes made:').'<ul>';
               if ($changes{'togglecats'}) {
                   $resulttext .= '<li>'.&mt("$title{'togglecats'} $level{$env{'form.togglecats'}}").'</li>'; 
               }
               if ($changes{'categorize'}) {
                   $resulttext .= '<li>'.&mt("$title{'categorize'} $level{$env{'form.categorize'}}").'</li>';
               }
               if ((keys(%deletions) > 0) || (keys(%reorderings) > 0) || (keys(%adds) > 0)) {
                   my $cathash;
                   if (ref($domconfig{'coursecategories'}) eq 'HASH') {
                       $cathash = $domconfig{'coursecategories'}{'cats'};
                   } else {
                       $cathash = {};
                   } 
                   my (@cats,@trails,%allitems);
                       &Apache::loncommon::extract_categories($cathash,\@cats,\@trails,\%allitems);
                   if (keys(%deletions) > 0) {
                       $resulttext .= '<li>'.&mt('Deleted categories:').'<ul>';
                       foreach my $predeltrail (sort {$a <=> $b } (keys(%sort_by_deltrail))) { 
                           $resulttext .= '<li>'.$predeltrails[$predeltrail].'</li>';
                       }
                       $resulttext .= '</ul></li>';
                   }
                   if (keys(%reorderings) > 0) {
                       my %sort_by_trail;
                       $resulttext .= '<li>'.&mt('Reordered categories:').'<ul>';
                       foreach my $key (keys(%reorderings)) {
                           if ($allitems{$key} ne '') {
                               $sort_by_trail{$allitems{$key}} = $trails[$allitems{$key}];
                           }
                       }
                       foreach my $trail (sort {$a <=> $b } (keys(%sort_by_trail))) {
                           $resulttext .= '<li>'.$trails[$trail].'</li>';
                       }
                       $resulttext .= '</ul></li>';
                   }
                   if (keys(%adds) > 0) {
                       my %sort_by_trail;
                       $resulttext .= '<li>'.&mt('Added categories:').'<ul>';
                       foreach my $key (keys(%adds)) {
                           if ($allitems{$key} ne '') {
                               $sort_by_trail{$allitems{$key}} = $trails[$allitems{$key}];
                           }
                       }
                       foreach my $trail (sort {$a <=> $b } (keys(%sort_by_trail))) {
                           $resulttext .= '<li>'.$trails[$trail].'</li>';
                       }
                       $resulttext .= '</ul></li>';
                   }
               }
               $resulttext .= '</ul>';
           } else {
               $resulttext = '<span class="LC_error">'.
                             &mt('An error occurred: [_1]',$putresult).'</span>';
           }
       } else {
           $resulttext = &mt('No changes made to course categories');
       }
       return $resulttext;
   }
   
   sub modify_serverstatuses {
       my ($dom,%domconfig) = @_;
       my ($resulttext,%changes,%currserverstatus,%newserverstatus);
       if (ref($domconfig{'serverstatuses'}) eq 'HASH') {
           %currserverstatus = %{$domconfig{'serverstatuses'}};
       }
       my @pages = &serverstatus_pages();
       foreach my $type (@pages) {
           $newserverstatus{$type}{'namedusers'} = '';
           $newserverstatus{$type}{'machines'} = '';
           if (defined($env{'form.'.$type.'_namedusers'})) {
               my @users = split(/,/,$env{'form.'.$type.'_namedusers'});
               my @okusers;
               foreach my $user (@users) {
                   my ($uname,$udom) = split(/:/,$user);
                   if (($udom =~ /^$match_domain$/) &&   
                       (&Apache::lonnet::domain($udom)) &&
                       ($uname =~ /^$match_username$/)) {
                       if (!grep(/^\Q$user\E/,@okusers)) {
                           push(@okusers,$user);
                       }
                   }
               }
               if (@okusers > 0) {
                    @okusers = sort(@okusers);
                    $newserverstatus{$type}{'namedusers'} = join(',',@okusers);
               }
           }
           if (defined($env{'form.'.$type.'_machines'})) {
               my @machines = split(/,/,$env{'form.'.$type.'_machines'});
               my @okmachines;
               foreach my $ip (@machines) {
                   my @parts = split(/\./,$ip);
                   next if (@parts < 4);
                   my $badip = 0;
                   for (my $i=0; $i<4; $i++) {
                       if (!(($parts[$i] >= 0) && ($parts[$i] <= 255))) {
                           $badip = 1;
                           last;
                       }
                   }
                   if (!$badip) {
                       push(@okmachines,$ip);     
                   }
               }
               @okmachines = sort(@okmachines);
               $newserverstatus{$type}{'machines'} = join(',',@okmachines);
           }
       }
       my %serverstatushash =  (
                                   serverstatuses => \%newserverstatus,
                               );
       my $putresult = &Apache::lonnet::put_dom('configuration',\%serverstatushash,
                                                $dom);
       my %changes;
       foreach my $type (@pages) {
           if (ref($currserverstatus{$type}) eq 'HASH') {
               my @currnamed = split(/,/,$currserverstatus{$type}{'namedusers'});
               my @newusers = split(/,/,$newserverstatus{$type}{'namedusers'});
               foreach my $item (@currnamed) {
                   if (!grep(/^\Q$item\E$/,@newusers)) {
                       $changes{$type}{'namedusers'} = 1;
                       last;
                   }
               }
               foreach my $item (@newusers) {
                   if (!grep(/^\Q$item\E$/,@currnamed)) {
                       $changes{$type}{'namedusers'} = 1;
                       last;
                   }
               }
               my @currmachines = split(/,/,$currserverstatus{$type}{'machines'});
               my @newmachines = split(/,/,$newserverstatus{$type}{'machines'});
               foreach my $item (@currmachines) {
                   if (!grep(/^\Q$item\E$/,@newmachines)) {
                       $changes{$type}{'machines'} = 1;
                       last;
                   }
               }
               foreach my $item (@newmachines) {
                   if (!grep(/^\Q$item\E$/,@currmachines)) {
                       $changes{$type}{'machines'} = 1;
                       last;
                   }
               }
   
           }
       }
       if (keys(%changes) > 0) {
           my $titles= &LONCAPA::loncgi::serverstatus_titles();
           my $putresult = &Apache::lonnet::put_dom('configuration',
                                                    \%serverstatushash,$dom);
           if ($putresult eq 'ok') {
               $resulttext .= &mt('Changes made:').'<ul>';
               foreach my $type (@pages) {
                   if (defined($changes{$type})) {
                       $resulttext .= '<li>'.$titles->{$type}.'<ul>';
                       if (defined($changes{$type}{'namedusers'})) {
                           if ($newserverstatus{$type}{'namedusers'} eq '') {
                               $resulttext .= '<li>'.&mt("Access terminated for all specific (named) users").'</li>'."\n";
                           } else {
                               $resulttext .= '<li>'.&mt("Access available for the following specified users: ").$newserverstatus{$type}{'namedusers'}.'</li>'."\n";
                           }
                       } elsif (defined($changes{$type}{'machines'})) {
                           if ($newserverstatus{$type}{'machines'} eq '') {
                               $resulttext .= '<li>'.&mt("Access terminated for all specific IP addresses").'</li>'."\n";
                           } else {
                               $resulttext .= '<li>'.&mt("Access available for the following specified IP addresses: ").$newserverstatus{$type}{'machines'}.'</li>'."\n";
                           }
   
                       }
                       $resulttext .= '</ul></li>';
                   }
               }
               $resulttext .= '</ul>';
           } else {
               $resulttext = '<span class="LC_error">'.
                             &mt('An error occurred saving access settings for server status pages: [_1].',$putresult).'</span>';
   
           }
       } else {
           $resulttext = &mt('No changes made to access to server status pages');
       }
       return $resulttext;
   }
   
   sub recurse_check {
       my ($chkcats,$categories,$depth,$name) = @_;
       if (ref($chkcats->[$depth]{$name}) eq 'ARRAY') {
           my $chg = 0;
           for (my $j=0; $j<@{$chkcats->[$depth]{$name}}; $j++) {
               my $category = $chkcats->[$depth]{$name}[$j];
               my $item;
               if ($category eq '') {
                   $chg ++;
               } else {
                   my $deeper = $depth + 1;
                   $item = &escape($category).':'.&escape($name).':'.$depth;
                   if ($chg) {
                       $categories->{$item} -= $chg;
                   }
                   &recurse_check($chkcats,$categories,$deeper,$category);
                   $deeper --;
               }
           }
       }
       return;
   }
   
   sub recurse_cat_deletes {
       my ($item,$coursecategories,$deletions) = @_;
       my ($deleted,$container,$depth) = map { &unescape($_); } split(/:/,$item);
       my $subdepth = $depth + 1;
       if (ref($coursecategories) eq 'HASH') {
           foreach my $subitem (keys(%{$coursecategories})) {
               my ($child,$parent,$itemdepth) = map { &unescape($_); } split(/:/,$subitem);
               if (($parent eq $deleted) && ($itemdepth == $subdepth)) {
                   delete($coursecategories->{$subitem});
                   $deletions->{$subitem} = 1;
                   &recurse_cat_deletes($subitem,$coursecategories,$deletions);
               }  
           }
       }
       return;
   }
   
 1;  1;

Removed from v.1.37  
changed lines
  Added in v.1.76.2.2


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