Diff for /loncom/interface/domainprefs.pm between versions 1.76.4.1 and 1.138.2.8

version 1.76.4.1, 2009/09/14 15:47:17 version 1.138.2.8, 2011/03/10 23:39:22
Line 28 Line 28
 ###############################################################  ###############################################################
 ##############################################################  ##############################################################
   
   =pod
   
   =head1 NAME
   
   Apache::domainprefs.pm
   
   =head1 SYNOPSIS
   
   Handles configuration of a LON-CAPA domain.  
   
   This is part of the LearningOnline Network with CAPA project
   described at http://www.lon-capa.org.
   
   
   =head1 OVERVIEW
   
   Each institution using LON-CAPA will typically have a single domain designated 
   for use by individuals affliated with the institution.  Accordingly, each domain
   may define a default set of logos and a color scheme which can be used to "brand"
   the LON-CAPA instance. In addition, an institution will typically have a language
   and timezone which are used for the majority of courses.
   
   LON-CAPA provides a mechanism to display and modify these defaults, as well as a 
   host of other domain-wide settings which determine the types of functionality
   available to users and courses in the domain.
   
   There is also a mechanism to configure cataloging of courses in the domain, and
   controls on the operation of automated processes which govern such things as
   roster updates, user directory updates and processing of course requests.
   
   The domain coordination manual which is built dynamically on install/update of 
   LON-CAPA from the relevant help items provides more information about domain 
   configuration.
   
   Most of the domain settings are stored in the configuration.db GDBM file which is
   housed on the primary library server for the domain in /home/httpd/lonUsers/$dom,
   where $dom is the domain.  The configuration.db stores settings in a number of 
   frozen hashes of hashes.  In a few cases, domain information must be uploaded to
   the domain as files (e.g., image files for logos etc., or plain text files for
   bubblesheet formats).  In this case the domainprefs.pm must be running in a user
   session hosted on the primary library server in the domain, as these files are 
   stored in author space belonging to a special $dom-domainconfig user.   
   
   domainprefs.pm in combination with lonconfigsettings.pm will retrieve and display
   the current settings, and provides an interface to make modifications.
   
   =head1 SUBROUTINES
   
   =over
   
   =item print_quotas()
   
   Inputs: 4 
   
   $dom,$settings,$rowtotal,$action.
   
   $dom is the domain, $settings is a reference to a hash of current settings for
   the current context, $rowtotal is a reference to the scalar used to record the 
   number of rows displayed on the page, and $action is the context (either quotas 
   or requestcourses).
   
   The print_quotas routine was orginally created to display/store information
   about default quota sizes for portfolio spaces for the different types of 
   institutional affiliation in the domain (e.g., Faculty, Staff, Student etc.), 
   but is now also used to manage availability of user tools: 
   i.e., blogs, aboutme page, and portfolios, and the course request tool,
   used by course owners to request creation of a course.
   
   Outputs: 1
   
   $datatable  - HTML containing form elements which allow settings to be changed. 
   
   In the case of course requests, radio buttons are displayed for each institutional
   affiliate type (and also default, and _LC_adv) for each of the course types 
   (official, unofficial and community).  In each case the radio buttons allow the 
   selection of one of four values:
   
   0, approval, validate, autolimit=N (where N is blank, or a positive integer).
   which have the following effects:
   
   0
   
   =over
   
   - course requests are not allowed for this course types/affiliation
   
   =back
   
   approval 
   
   =over 
   
   - course requests must be approved by a Doman Coordinator in the 
   course's domain
   
   =back
   
   validate 
   
   =over
   
   - an institutional validation (e.g., check requestor is instructor
   of record) needs to be passed before the course will be created.  The required
   validation is in localenroll.pm on the primary library server for the course 
   domain.
   
   =back
   
   autolimit 
   
   =over
    
   - course requests will be processed automatically up to a limit of
   N requests for the course type for the particular requestor.
   If N is undefined, there is no limit to the number of course requests
   which a course owner may submit and have processed automatically. 
   
   =back
   
   =item modify_quotas() 
   
   =back
   
   =cut
   
 package Apache::domainprefs;  package Apache::domainprefs;
   
 use strict;  use strict;
Line 37  use Apache::loncommon(); Line 162  use Apache::loncommon();
 use Apache::lonhtmlcommon();  use Apache::lonhtmlcommon();
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonmsg();  use Apache::lonmsg();
   use Apache::lonconfigsettings;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
 use LONCAPA::Enrollment;  use LONCAPA::Enrollment;
 use LONCAPA::lonauthcgi();  use LONCAPA::lonauthcgi();
Line 53  sub handler { Line 179  sub handler {
         return OK;          return OK;
     }      }
   
       my $context = 'domain';
     my $dom = $env{'request.role.domain'};      my $dom = $env{'request.role.domain'};
     my $domdesc = &Apache::lonnet::domain($dom,'description');      my $domdesc = &Apache::lonnet::domain($dom,'description');
     if (&Apache::lonnet::allowed('mau',$dom)) {      if (&Apache::lonnet::allowed('mau',$dom)) {
Line 72  sub handler { Line 199  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','autocreate',
                 'usercreation','usermodification','contacts','defaults',                  'directorysrch','usercreation','usermodification',
                 'scantron','coursecategories','serverstatuses'],$dom);                  'contacts','defaults','scantron','coursecategories',
                   'serverstatuses','requestcourses','coursedefaults',
                   'usersessions'],$dom);
     my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll',      my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll',
                        'autoupdate','directorysrch','contacts',                         'autoupdate','autocreate','directorysrch','contacts',
                        'usercreation','usermodification','scantron',                         'usercreation','usermodification','scantron',
                        'coursecategories','serverstatuses');                         'requestcourses','coursecategories','serverstatuses',
                          'coursedefaults','usersessions');
     my %prefs = (      my %prefs = (
         'rolecolors' =>          'rolecolors' =>
                    { text => 'Default color schemes',                     { text => 'Default color schemes',
Line 92  sub handler { Line 222  sub handler {
                                 {col1 => 'Administrator Settings',                                  {col1 => 'Administrator Settings',
                                  col2 => '',}],                                   col2 => '',}],
                     },                      },
         'login' =>            'login' =>
                     { text => 'Log-in page options',                      { text => 'Log-in page options',
                       help => 'Domain_Configuration_Login_Page',                        help => 'Domain_Configuration_Login_Page',
                       header => [{col1 => 'Item',                        header => [{col1 => 'Item',
                                   col2 => '',}],                                    col2 => '',}],
                     },                      },
   
         'defaults' =>           'defaults' => 
                     { text => 'Default authentication/language/timezone',                      { text => 'Default authentication/language/timezone/portal',
                       help => 'Domain_Configuration_LangTZAuth',                        help => 'Domain_Configuration_LangTZAuth',
                       header => [{col1 => 'Setting',                        header => [{col1 => 'Setting',
                                   col2 => 'Value'}],                                    col2 => 'Value'}],
                     },                      },
         'quotas' =>           'quotas' => 
                     { text => 'User blogs, home pages and portfolios',                      { text => 'User blogs, personal information pages, portfolios',
                       help => 'Domain_Configuration_Quotas',                        help => 'Domain_Configuration_Quotas',
                       header => [{col1 => 'User type',                        header => [{col1 => 'User affiliation',
                                   col2 => 'Available tools',                                    col2 => 'Available tools',
                                   col3 => 'Portfolio quota',}],                                    col3 => 'Portfolio quota',}],
                     },                      },
Line 122  sub handler { Line 253  sub handler {
                      help => 'Domain_Configuration_Auto_Updates',                       help => 'Domain_Configuration_Auto_Updates',
                      header => [{col1 => 'Setting',                       header => [{col1 => 'Setting',
                                  col2 => 'Value',},                                   col2 => 'Value',},
                                   {col1 => 'Setting',
                                    col2 => 'Affiliation'},
                                 {col1 => 'User population',                                  {col1 => 'User population',
                                  col2 => 'Updataeable user data'}],                                   col2 => 'Updateable user data'}],
                     },
           'autocreate' => 
                     { text => 'Auto-course creation settings',
                        help => 'Domain_Configuration_Auto_Creation',
                        header => [{col1 => 'Configuration Setting',
                                    col2 => 'Value',}],
                   },                    },
         'directorysrch' =>           'directorysrch' => 
                   { text => 'Institutional directory searches',                    { text => 'Institutional directory searches',
Line 159  sub handler { Line 298  sub handler {
                                 col2 => 'Information settable when self-creating account (if directory data blank)'}],                                  col2 => 'Information settable when self-creating account (if directory data blank)'}],
                   },                    },
         'scantron' =>          'scantron' =>
                   { text => 'Scantron format file',                    { text => 'Bubblesheet format file',
                     help => 'Domain_Configuration_Scantron_Format',                      help => 'Domain_Configuration_Scantron_Format',
                     header => [ {col1 => 'Item',                      header => [ {col1 => 'Item',
                                  col2 => '',                                   col2 => '',
                               }],                                }],
                   },                    },
           'requestcourses' => 
                    {text => 'Request creation of courses',
                     help => 'Domain_Configuration_Request_Courses',
                     header => [{col1 => 'User affiliation',
                                 col2 => 'Availability/Processing of requests',},
                                {col1 => 'Setting',
                                 col2 => 'Value'}],
                    },
         'coursecategories' =>          'coursecategories' =>
                   { text => 'Cataloging of courses',                    { text => 'Cataloging of courses/communities',
                     help => 'Domain_Configuration_Cataloging_Courses',                      help => 'Domain_Configuration_Cataloging_Courses',
                     header => [{col1 => 'Category settings',                      header => [{col1 => 'Category settings',
                                 col2 => '',},                                  col2 => '',},
Line 175  sub handler { Line 322  sub handler {
                                }],                                 }],
                   },                    },
         'serverstatuses' =>          'serverstatuses' =>
                  {text   => 'Access to Server Status Pages',                   {text   => 'Access to server status pages',
                   help   => 'Domain_Configuration_Server_Status',                    help   => 'Domain_Configuration_Server_Status',
                   header => [{col1 => 'Status Page',                    header => [{col1 => 'Status Page',
                               col2 => 'Other named users',                                col2 => 'Other named users',
                               col3 => 'Specific IPs',                                col3 => 'Specific IPs',
                             }],                              }],
                  },                   },
           'helpsettings' =>
                    {text   => 'Help page settings',
                     help   => 'Domain_Configuration_Help_Settings',
                     header => [{col1 => 'Authenticated Help Settings',
                                 col2 => ''},
                                {col1 => 'Unauthenticated Help Settings',
                                 col2 => ''}],
                    },
           'coursedefaults' =>
                    {text => 'Course/Community defaults',
                     help => 'Domain_Configuration_Course_Defaults',
                     header => [{col1 => 'Defaults which can be overridden for each course by a DC',
                                 col2 => 'Value',}],
                    },
           'privacy' => 
                    {text   => 'User Privacy',
                     help   => 'Domain_Configuration_User_Privacy',
                     header => [{col1 => 'Setting',
                                 col2 => 'Value',}],
                    },
            'usersessions' =>
                    {text  => 'User session hosting',
                     help  => 'Domain_Configuration_User_Sessions',
                     header => [{col1 => 'Hosting of users from other domains',
                                 col2 => 'Rules'},
                                {col1 => "Hosting domain's own users elsewhere",
                                 col2 => 'Rules'}],
                    },
     );      );
       my %servers = &dom_servers($dom);
       if (keys(%servers) > 1) {
           $prefs{'login'}  = { text   => 'Log-in page options',
                                help   => 'Domain_Configuration_Login_Page',
                               header => [{col1 => 'Log-in Service',
                                           col2 => 'Server Setting',},
                                          {col1 => 'Log-in Page Items',
                                           col2 => ''}],
                              };
       }
     my @roles = ('student','coordinator','author','admin');      my @roles = ('student','coordinator','author','admin');
     my @actions = &Apache::loncommon::get_env_multiple('form.actions');      my @actions = &Apache::loncommon::get_env_multiple('form.actions');
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
     ({href=>"javascript:changePage(document.$phase,'pickactions')",      ({href=>"javascript:changePage(document.$phase,'pickactions')",
       text=>"Pick functionality"});        text=>"Settings to display/modify"});
     my $confname = $dom.'-domainconfig';      my $confname = $dom.'-domainconfig';
     if ($phase eq 'process') {      if ($phase eq 'process') {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonconfigsettings::make_changes($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,\@roles);
           ({href=>"javascript:changePage(document.$phase,'display')",  
             text=>"Domain Configuration"},  
            {href=>"javascript:changePage(document.$phase,'$phase')",  
             text=>"Updated"});  
         &print_header($r,$phase);  
         foreach my $item (@prefs_order) {  
             if (grep(/^\Q$item\E$/,@actions)) {  
                 $r->print('<h3>'.&mt($prefs{$item}{'text'}).'</h3>'.  
                           &process_changes($r,$dom,$confname,$item,  
                           \@roles,%domconfig));  
             }  
         }  
         $r->print('<p>');  
         &print_footer($r,$phase,'display','Back to configuration display',  
                       \@actions);  
         $r->print('</p>');  
     } elsif ($phase eq 'display') {      } elsif ($phase eq 'display') {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname);
             ({href=>"javascript:changePage(document.$phase,'display')",  
               text=>"Domain Configuration"});  
         &print_header($r,$phase);  
         if (@actions > 0) {  
             my $rowsum = 0;  
             my (%output,%rowtotal,@items);  
             my $halfway = @actions/2;  
             foreach my $item (@prefs_order) {  
                 if (grep(/^\Q$item\E$/,@actions)) {  
                     push(@items,$item);  
                     ($output{$item},$rowtotal{$item}) =   
                         &print_config_box($r,$dom,$confname,$phase,  
                                           $item,$prefs{$item},  
                                           $domconfig{$item});  
                     $rowsum += $rowtotal{$item};  
                 }  
             }  
             my $colend;  
             my $halfway = $rowsum/2;  
             my $aggregate = 0;  
             my $sumleft = 0;  
             my $sumright = 0;  
             my $crossover;  
             for (my $i=0; $i<@items; $i++) {  
                 $aggregate += $rowtotal{$items[$i]};  
                 if ($aggregate > $halfway) {  
                     $crossover = $i;  
                     last;  
                 }  
             }  
             for (my $i=0; $i<$crossover; $i++) {  
                 $sumleft += $rowtotal{$items[$i]};   
             }  
             for (my $i=$crossover+1; $i<@items; $i++) {  
                 $sumright += $rowtotal{$items[$i]};  
             }  
             if ((@items > 1) && ($env{'form.numcols'} == 2)) {  
                 my $sumdiff = $sumright - $sumleft;  
                 if ($sumdiff > 0) {  
                     $colend = $crossover + 1;  
                 } else {  
                     $colend = $crossover;  
                 }  
             } else {  
                 $colend = @items;  
             }  
             $r->print('<p><table class="LC_double_column"><tr><td class="LC_left_col">');  
             for (my $i=0; $i<$colend; $i++) {  
                 $r->print($output{$items[$i]});  
             }  
             $r->print('</td><td></td><td class="LC_right_col">');  
             if ($colend < @items) {  
                 for (my $i=$colend; $i<@items; $i++) {   
                     $r->print($output{$items[$i]});  
                 }  
             }  
             $r->print('</td></tr></table></p>');  
             $r->print(&print_footer($r,$phase,'process','Save',\@actions));  
         } else {  
             $r->print('<input type="hidden" name="phase" value="" />'.  
                       '<input type="hidden" name="numcols" value="'.  
                       $env{'form.numcols'}.'" />'."\n".  
                       '<span class="LC_error">'.&mt('No settings chosen').  
                       '</span>');  
         }  
         $r->print('</form>');  
         $r->print(&Apache::loncommon::end_page());  
     } else {      } else {
         if ($phase eq '') {  
             $phase = 'pickactions';  
         }  
         my %helphash;  
         &print_header($r,$phase);  
         if (keys(%domconfig) == 0) {          if (keys(%domconfig) == 0) {
             my $primarylibserv = &Apache::lonnet::domain($dom,'primary');              my $primarylibserv = &Apache::lonnet::domain($dom,'primary');
             my @ids=&Apache::lonnet::current_machine_ids();              my @ids=&Apache::lonnet::current_machine_ids();
Line 300  sub handler { Line 397  sub handler {
                     }                      }
                 }                  }
                 if ($custom_img_count > 0) {                  if ($custom_img_count > 0) {
                       &Apache::lonconfigsettings::print_header($r,$phase,$context);
                     my $switch_server = &check_switchserver($dom,$confname);                      my $switch_server = &check_switchserver($dom,$confname);
                     $r->print(                      $r->print(
     &mt('Domain configuration settings have yet to be saved for this domain via the web-based domain preferences interface.').'<br />'.      &mt('Domain configuration settings have yet to be saved for this domain via the web-based domain preferences interface.').'<br />'.
Line 309  sub handler { Line 407  sub handler {
                     if ($switch_server) {                      if ($switch_server) {
                         $r->print($switch_server.' '.&mt('to primary library server for domain: [_1]',$dom));                          $r->print($switch_server.' '.&mt('to primary library server for domain: [_1]',$dom));
                     }                      }
                       $r->print(&Apache::loncommon::end_page());
                     return OK;                      return OK;
                 }                  }
             }              }
         }          }
         $r->print('<h3>'.&mt('Functionality to display/modify').'</h3>');          &Apache::lonconfigsettings::display_choices($r,$phase,$context,\@prefs_order,\%prefs);
         $r->print('<script type="text/javascript">'."\n".  
               &Apache::loncommon::check_uncheck_jscript()."\n".  
               '</script>'."\n".'<p><input type="button" value="'.&mt('check all').'" '.  
               'onclick="javascript:checkAll(document.pickactions.actions)"'.  
               ' />&nbsp;&nbsp;'.  
               '<input type="button" value="'.&mt('uncheck all').'" '.  
               'onclick="javascript:uncheckAll(document.pickactions.actions)"'.  
               ' /></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) {  
             $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('</div><div class="LC_clear_float_footer"></div><h3>'.  
                   &mt('Display options').'</h3>'."\n".  
                   '<p><span class="LC_nobreak">'.&mt('Display using: ')."\n".  
                   '<label><input type="radio" name="numcols" value="1" />'.  
                   &mt('one column').'</label>&nbsp;&nbsp;<label>'.  
                   '<input type="radio" name="numcols" value="2" />'.  
                   &mt('two columns').'</label></span></p>');  
         $r->print(&print_footer($r,$phase,'display','Go'));  
         $r->print('</form>');  
         $r->print(&Apache::loncommon::end_page());  
     }      }
     return OK;      return OK;
 }  }
   
 sub process_changes {  sub process_changes {
     my ($r,$dom,$confname,$action,$roles,%domconfig) = @_;      my ($r,$dom,$confname,$action,$roles,$values) = @_;
       my %domconfig;
       if (ref($values) eq 'HASH') {
           %domconfig = %{$values};
       }
     my $output;      my $output;
     if ($action eq 'login') {      if ($action eq 'login') {
         $output = &modify_login($r,$dom,$confname,%domconfig);          $output = &modify_login($r,$dom,$confname,%domconfig);
Line 363  sub process_changes { Line 430  sub process_changes {
         $output = &modify_rolecolors($r,$dom,$confname,$roles,          $output = &modify_rolecolors($r,$dom,$confname,$roles,
                                      %domconfig);                                       %domconfig);
     } elsif ($action eq 'quotas') {      } elsif ($action eq 'quotas') {
         $output = &modify_quotas($dom,%domconfig);          $output = &modify_quotas($dom,$action,%domconfig);
     } elsif ($action eq 'autoenroll') {      } elsif ($action eq 'autoenroll') {
         $output = &modify_autoenroll($dom,%domconfig);          $output = &modify_autoenroll($dom,%domconfig);
     } elsif ($action eq 'autoupdate') {      } elsif ($action eq 'autoupdate') {
         $output = &modify_autoupdate($dom,%domconfig);          $output = &modify_autoupdate($dom,%domconfig);
       } elsif ($action eq 'autocreate') {
           $output = &modify_autocreate($dom,%domconfig);
     } elsif ($action eq 'directorysrch') {      } elsif ($action eq 'directorysrch') {
         $output = &modify_directorysrch($dom,%domconfig);          $output = &modify_directorysrch($dom,%domconfig);
     } elsif ($action eq 'usercreation') {      } elsif ($action eq 'usercreation') {
Line 384  sub process_changes { Line 453  sub process_changes {
         $output = &modify_coursecategories($dom,%domconfig);          $output = &modify_coursecategories($dom,%domconfig);
     } elsif ($action eq 'serverstatuses') {      } elsif ($action eq 'serverstatuses') {
         $output = &modify_serverstatuses($dom,%domconfig);          $output = &modify_serverstatuses($dom,%domconfig);
       } elsif ($action eq 'requestcourses') {
           $output = &modify_quotas($dom,$action,%domconfig);
       } elsif ($action eq 'coursedefaults') {
           $output = &modify_coursedefaults($dom,%domconfig);
       } elsif ($action eq 'usersessions') {
           $output = &modify_usersessions($dom,%domconfig);
     }      }
     return $output;      return $output;
 }  }
Line 394  sub print_config_box { Line 469  sub print_config_box {
     my $output;      my $output;
     if ($action eq 'coursecategories') {      if ($action eq 'coursecategories') {
         $output = &coursecategories_javascript($settings);          $output = &coursecategories_javascript($settings);
     }        }
     $output .=       $output .= 
          '<table class="LC_nested_outer">           '<table class="LC_nested_outer">
           <tr>            <tr>
Line 403  sub print_config_box { Line 478  sub print_config_box {
            &Apache::loncommon::help_open_topic($item->{'help'}).'</span></th>'."\n".             &Apache::loncommon::help_open_topic($item->{'help'}).'</span></th>'."\n".
           '</tr>';            '</tr>';
     $rowtotal ++;      $rowtotal ++;
     if (($action eq 'autoupdate') || ($action eq 'rolecolors') ||       my $numheaders = 1;
         ($action eq 'usercreation') || ($action eq 'usermodification') ||      if (ref($item->{'header'}) eq 'ARRAY') {
         ($action eq 'coursecategories')) {          $numheaders = scalar(@{$item->{'header'}});
       }
       if ($numheaders > 1) {
         my $colspan = '';          my $colspan = '';
         if (($action eq 'rolecolors') || ($action eq 'coursecategories')) {          if (($action eq 'rolecolors') || ($action eq 'coursecategories') || ($action eq 'helpsettings')) {
             $colspan = ' colspan="2"';              $colspan = ' colspan="2"';
         }          }
         $output .= '          $output .= '
Line 427  sub print_config_box { Line 504  sub print_config_box {
             $output .= &print_usermodification('top',$dom,$settings,\$rowtotal);              $output .= &print_usermodification('top',$dom,$settings,\$rowtotal);
         } elsif ($action eq 'coursecategories') {          } elsif ($action eq 'coursecategories') {
             $output .= &print_coursecategories('top',$dom,$item,$settings,\$rowtotal);              $output .= &print_coursecategories('top',$dom,$item,$settings,\$rowtotal);
         } else {          } elsif ($action eq 'login') {
               $output .= &print_login('top',$dom,$confname,$phase,$settings,\$rowtotal);
               $colspan = ' colspan="2"';
           } elsif ($action eq 'requestcourses') {
               $output .= &print_quotas($dom,$settings,\$rowtotal,$action);
           } elsif ($action eq 'helpsettings') {
               $output .= &print_helpsettings('top',$dom,$confname,$settings,\$rowtotal);
           } elsif ($action eq 'usersessions') {
               $output .= &print_usersessions('top',$dom,$settings,\$rowtotal);
           } elsif ($action eq 'rolecolors') {
             $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal);              $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal);
         }          }
         $output .= '          $output .= '
Line 444  sub print_config_box { Line 530  sub print_config_box {
              </tr>';               </tr>';
             $rowtotal ++;              $rowtotal ++;
         if ($action eq 'autoupdate') {          if ($action eq 'autoupdate') {
             $output .= &print_autoupdate('bottom',$dom,$settings,\$rowtotal);              $output .= &print_autoupdate('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_autoupdate('bottom',$dom,$settings,\$rowtotal);
               $rowtotal ++;
         } elsif ($action eq 'usercreation') {          } elsif ($action eq 'usercreation') {
             $output .= &print_usercreation('middle',$dom,$settings,\$rowtotal).'              $output .= &print_usercreation('middle',$dom,$settings,\$rowtotal).'
            </table>             </table>
Line 469  sub print_config_box { Line 566  sub print_config_box {
              <tr class="LC_info_row">               <tr class="LC_info_row">
               <td class="LC_left_item"'.$colspan.'>'.&mt($item->{'header'}->[2]->{'col1'}).'</td>                <td class="LC_left_item"'.$colspan.'>'.&mt($item->{'header'}->[2]->{'col1'}).'</td>
               <td class="LC_right_item">'.&mt($item->{'header'}->[2]->{'col2'}).'</td>      </tr>'.                <td class="LC_right_item">'.&mt($item->{'header'}->[2]->{'col2'}).'</td>      </tr>'.
   
                        &print_usermodification('bottom',$dom,$settings,\$rowtotal);                         &print_usermodification('bottom',$dom,$settings,\$rowtotal);
             $rowtotal ++;              $rowtotal ++;
         } elsif ($action eq 'coursecategories') {          } elsif ($action eq 'coursecategories') {
             $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal);              $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal);
         } else {          } elsif ($action eq 'login') {
               $output .= &print_login('bottom',$dom,$confname,$phase,$settings,\$rowtotal);
           } elsif ($action eq 'requestcourses') {
               $output .= &print_courserequestmail($dom,$settings,\$rowtotal);
           } elsif ($action eq 'helpsettings') {
               $output .= &print_helpsettings('bottom',$dom,$confname,$settings,\$rowtotal);
           } elsif ($action eq 'usersessions') {
               $output .= &print_usersessions('bottom',$dom,$settings,\$rowtotal);
           } elsif ($action eq 'rolecolors') {
             $output .= &print_rolecolors($phase,'coordinator',$dom,$confname,$settings,\$rowtotal).'              $output .= &print_rolecolors($phase,'coordinator',$dom,$confname,$settings,\$rowtotal).'
            </table>             </table>
           </td>            </td>
Line 542  sub print_config_box { Line 646  sub print_config_box {
         $output .= '</tr>';          $output .= '</tr>';
         $rowtotal ++;          $rowtotal ++;
         if ($action eq 'login') {          if ($action eq 'login') {
             $output .= &print_login($dom,$confname,$phase,$settings,\$rowtotal);              $output .= &print_login('bottom',$dom,$confname,$phase,$settings,
                                       \$rowtotal);
         } elsif ($action eq 'quotas') {          } elsif ($action eq 'quotas') {
             $output .= &print_quotas($dom,$settings,\$rowtotal);              $output .= &print_quotas($dom,$settings,\$rowtotal,$action);
         } elsif ($action eq 'autoenroll') {          } elsif ($action eq 'autoenroll') {
             $output .= &print_autoenroll($dom,$settings,\$rowtotal);              $output .= &print_autoenroll($dom,$settings,\$rowtotal);
           } elsif ($action eq 'autocreate') {
               $output .= &print_autocreate($dom,$settings,\$rowtotal);
         } elsif ($action eq 'directorysrch') {          } elsif ($action eq 'directorysrch') {
             $output .= &print_directorysrch($dom,$settings,\$rowtotal);              $output .= &print_directorysrch($dom,$settings,\$rowtotal);
         } elsif ($action eq 'contacts') {          } elsif ($action eq 'contacts') {
Line 557  sub print_config_box { Line 664  sub print_config_box {
             $output .= &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal);              $output .= &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal);
         } elsif ($action eq 'serverstatuses') {          } elsif ($action eq 'serverstatuses') {
             $output .= &print_serverstatuses($dom,$settings,\$rowtotal);              $output .= &print_serverstatuses($dom,$settings,\$rowtotal);
           } elsif ($action eq 'coursedefaults') {
               $output .= &print_coursedefaults('bottom',$dom,$settings,\$rowtotal);
         }          }
     }      }
     $output .= '      $output .= '
Line 567  sub print_config_box { Line 676  sub print_config_box {
     return ($output,$rowtotal);      return ($output,$rowtotal);
 }  }
   
 sub print_header {  sub print_login {
     my ($r,$phase) = @_;      my ($position,$dom,$confname,$phase,$settings,$rowtotal) = @_;
     my $alert = &mt('You must select at least one functionality type to display.');       my ($css_class,$datatable);
     my $js = '      my %choices = &login_choices();
 <script type="text/javascript">  
 function changePage(formname,newphase) {  
     formname.phase.value = newphase;  
     numchecked = 0;  
     if (formname == document.pickactions) {  
         if (formname.actions.length > 0) {  
             for (var i = 0; i<formname.actions.length; i++) {  
                 if (formname.actions[i].checked) {  
                     numchecked ++;  
                 }  
             }  
         } else {  
             if (formname.actions.checked) {  
                 numchecked ++;  
             }  
         }  
         if (numchecked > 0) {  
             formname.submit();  
         } else {  
             alert("'.$alert.'");  
             return;  
         }  
     }  
     formname.submit();  
 }'."\n";  
     if ($phase eq 'pickactions') {  
         $js .=   
             &Apache::lonhtmlcommon::set_form_elements({actions => 'checkbox',numcols => 'radio',})."\n".  
             &javascript_set_colnums();  
     } elsif ($phase eq 'display') {  
         $js .= &color_pick_js()."\n";  
     }  
     $js .= &Apache::loncommon::viewport_size_js().'  
 </script>  
 ';  
     my $additem;  
     if ($phase eq 'pickactions') {  
         my %loaditems = (  
                     'onload' => "javascript:getViewportDims(document.$phase.width,document.$phase.height);setDisplayColumns();setFormElements(document.pickactions);",  
                         );  
         $additem = {'add_entries' => \%loaditems,};  
     } else {  
         my %loaditems = (  
                     'onload' => "javascript:getViewportDims(document.$phase.width,document.$phase.height);",  
                         );  
         $additem = {'add_entries' => \%loaditems,};  
     }  
     $r->print(&Apache::loncommon::start_page('View/Modify Domain Settings',  
                                            $js,$additem));  
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Domain Settings'));  
     $r->print('  
 <form name="parmform" action="">  
 <input type="hidden" name="pres_marker" />  
 <input type="hidden" name="pres_type" />  
 <input type="hidden" name="pres_value" />  
 </form>  
 ');  
     $r->print('<form method="post" name="'.$phase.'" action="/adm/domainprefs"'.  
               ' enctype="multipart/form-data">');  
     return;  
 }  
   
 sub print_footer {      if ($position eq 'top') {
     my ($r,$phase,$newphase,$button_text,$actions) = @_;          my %servers = &dom_servers($dom);
     $button_text = &mt($button_text);          my $choice = $choices{'disallowlogin'};
     $r->print('<input type="hidden" name="phase" value="" />'.          $css_class = ' class="LC_odd_row"';
               '<input type="hidden" name="width" value="'.          $datatable .= '<tr'.$css_class.'><td>'.$choice.'</td>'.
               $env{'form.width'}.'" />'.                        '<td align="right"><table><tr><th>'.$choices{'hostid'}.'</th>'.
               '<input type="hidden" name="height" value="'.                        '<th>'.$choices{'server'}.'</th>'.
               $env{'form.height'}.'" />');                        '<th>'.$choices{'serverpath'}.'</th>'.
     if (($phase eq 'display') || ($phase eq 'process')) {                        '<th>'.$choices{'custompath'}.'</th>'.
         if (ref($actions) eq 'ARRAY') {                        '<th><span class="LC_nobreak">'.$choices{'exempt'}.'</span></th></tr>'."\n";
             foreach my $item (@{$actions}) {          my %disallowed;
                 $r->print('<input type="hidden" name="actions" value="'.$item.'" />')."\n";          if (ref($settings) eq 'HASH') {
               if (ref($settings->{'loginvia'}) eq 'HASH') {
                  %disallowed = %{$settings->{'loginvia'}};
             }              }
         }          }
         $r->print('<input type="hidden" name="numcols" value="'.$env{'form.numcols'}.'" />');          foreach my $lonhost (sort(keys(%servers))) {
     }              my $direct = 'selected="selected"';
     my $dest='"javascript:changePage(document.'.$phase.','."'$newphase'".')"';              if (ref($disallowed{$lonhost}) eq 'HASH') {
     if ($phase eq 'process') {                  if ($disallowed{$lonhost}{'server'} ne '') {
         $r->print('<p><a href='.$dest.'>'.$button_text.'</a></p>');                      $direct = '';
     } else {                  }
         my $onclick;              }
         if ($phase eq 'display') {              $datatable .= '<tr><td>'.$servers{$lonhost}.'</td>'.
             $onclick = '"javascript:changePage(document.'.$phase.','."'$newphase'".')"';                            '<td><select name="'.$lonhost.'_server">'.
         } else {                            '<option value=""'.$direct.'>'.$choices{'directlogin'}.
             $onclick = '"javascript:changePage(document.'.$phase.','."'$newphase'".')"';                            '</option>';
         }               foreach my $hostid (keys(%servers)) {
         $r->print('<p><input type="button" name="store" value="'.                  next if ($servers{$hostid} eq $servers{$lonhost});
                   $button_text.'" onclick='.$onclick.' /></p>');                  my $selected = '';
     }                  if (ref($disallowed{$lonhost}) eq 'HASH') {
     if ($phase eq 'process') {                      if ($hostid eq $disallowed{$lonhost}{'server'}) {
         $r->print('</form>'.&Apache::loncommon::end_page());                          $selected = 'selected="selected"';
                       }
                   }
                   $datatable .= '<option value="'.$hostid.'"'.$selected.'>'.
                                 $servers{$hostid}.'</option>';
               }
               $datatable .= '</select></td>'.
                             '<td><select name="'.$lonhost.'_serverpath">';
               foreach my $path ('','/','/adm/login','/adm/roles','custom') {
                   my $pathname = $path;
                   if ($path eq 'custom') {
                       $pathname = &mt('Custom Path').' ->';
                   }
                   my $selected = '';
                   if (ref($disallowed{$lonhost}) eq 'HASH') {
                       if ($path eq $disallowed{$lonhost}{'serverpath'}) {
                           $selected = 'selected="selected"';
                       }
                   } elsif ($path eq '') {
                       $selected = 'selected="selected"';
                   }
                   $datatable .= '<option value="'.$path.'"'.$selected.'>'.$pathname.'</option>';
               }
               $datatable .= '</select></td>';
               my ($custom,$exempt);
               if (ref($disallowed{$lonhost}) eq 'HASH') {
                   $custom = $disallowed{$lonhost}{'custompath'};
                   $exempt = $disallowed{$lonhost}{'exempt'};
               }
               $datatable .= '<td><input type="text" name="'.$lonhost.'_custompath" size="6" value="'.$custom.'" /></td>'.
                             '<td><input type="text" name="'.$lonhost.'_exempt" size="8" value="'.$exempt.'" /></td>'.
                             '</tr>';
           }
           $datatable .= '</table></td></tr>';
           return $datatable;
     }      }
     return;  
 }  
   
 sub print_login {  
     my ($dom,$confname,$phase,$settings,$rowtotal) = @_;  
     my %choices = &login_choices();  
     my %defaultchecked = (       my %defaultchecked = ( 
                            'coursecatalog' => 'on',                             'coursecatalog' => 'on',
                            'adminmail'     => 'off',                             'adminmail'     => 'off',
Line 687  sub print_login { Line 766  sub print_login {
             $checkedon{$item} = ' ';              $checkedon{$item} = ' ';
         }          }
     }      }
     my $loginheader = 'image';  
     my @images = ('img','logo','domlogo','login');      my @images = ('img','logo','domlogo','login');
     my @logintext = ('textcol','bgcol');      my @logintext = ('textcol','bgcol');
     my @bgs = ('pgbg','mainbg','sidebg');      my @bgs = ('pgbg','mainbg','sidebg');
Line 736  sub print_login { Line 814  sub print_login {
                 $is_custom{$item} = 1;                  $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'};
             $is_custom{'font'} = 1;              $is_custom{'font'} = 1;
Line 784  sub print_login { Line 859  sub print_login {
                                                   domlogo => 'Domain Logo',                                                    domlogo => 'Domain Logo',
                                                   login => 'Login box');                                                    login => 'Login box');
     my $itemcount = 1;      my $itemcount = 1;
     my ($css_class,$datatable);  
     foreach my $item (@toggles) {      foreach my $item (@toggles) {
         $css_class = $itemcount%2?' class="LC_odd_row"':'';          $css_class = $itemcount%2?' class="LC_odd_row"':'';
         $datatable .=            $datatable .=  
Line 797  sub print_login { Line 871  sub print_login {
             '</tr>';              '</tr>';
         $itemcount ++;          $itemcount ++;
     }      }
     $datatable .= &display_color_options($dom,$confname,$phase,'login',$itemcount,\%choices,\%is_custom,\%defaults,\%designs,\@images,\@bgs,\@links,\%alt_text,$rowtotal,\@logintext,$loginheader);      $datatable .= &display_color_options($dom,$confname,$phase,'login',$itemcount,\%choices,\%is_custom,\%defaults,\%designs,\@images,\@bgs,\@links,\%alt_text,$rowtotal,\@logintext);
     $datatable .= '</tr></table></td></tr>';      $datatable .= '</tr></table></td></tr>';
     return $datatable;      return $datatable;
 }  }
Line 805  sub print_login { Line 879  sub print_login {
 sub login_choices {  sub login_choices {
     my %choices =      my %choices =
         &Apache::lonlocal::texthash (          &Apache::lonlocal::texthash (
             coursecatalog => 'Display Course Catalog link?',              coursecatalog => 'Display Course/Community Catalog link?',
             adminmail => "Display Administrator's E-mail Address?",              adminmail     => "Display Administrator's E-mail Address?",
             newuser   => "Link to create a user account",              disallowlogin => "Login page requests redirected",
             img => "Header",              hostid        => "Server",
             logo => "Main Logo",              server        => "Redirect to:",
             domlogo => "Domain Logo",              serverpath    => "Path",
             login => "Log-in Header",               custompath    => "Custom", 
             textcol => "Text color",              exempt        => "Exempt IP(s)",
             bgcol   => "Box color",              directlogin   => "No redirect",
             bgs => "Background colors",              newuser       => "Link to create a user account",
             links => "Link colors",              img           => "Header",
             font => "Font color",              logo          => "Main Logo",
             pgbg => "Page",              domlogo       => "Domain Logo",
             mainbg => "Main panel",              login         => "Log-in Header", 
             sidebg => "Side panel",              textcol       => "Text color",
             link => "Link",              bgcol         => "Box color",
             alink => "Active link",              bgs           => "Background colors",
             vlink => "Visited link",              links         => "Link colors",
               font          => "Font color",
               pgbg          => "Header",
               mainbg        => "Page",
               sidebg        => "Login box",
               link          => "Link",
               alink         => "Active link",
               vlink         => "Visited link",
         );          );
     return %choices;      return %choices;
 }  }
Line 840  sub print_rolecolors { Line 921  sub print_rolecolors {
     my %defaults = (      my %defaults = (
                    img => $defaultdesign{$role.'.img'},                     img => $defaultdesign{$role.'.img'},
                    font => $defaultdesign{$role.'.font'},                     font => $defaultdesign{$role.'.font'},
      fontmenu => $defaultdesign{$role.'.fontmenu'},
                    );                     );
     foreach my $item (@bgs) {      foreach my $item (@bgs) {
         $defaults{'bgs'}{$item} = $defaultdesign{$role.'.'.$item};          $defaults{'bgs'}{$item} = $defaultdesign{$role.'.'.$item};
Line 857  sub print_rolecolors { Line 939  sub print_rolecolors {
                 $designs{'font'} = $settings->{$role}->{'font'};                  $designs{'font'} = $settings->{$role}->{'font'};
                 $is_custom{'font'} = 1;                  $is_custom{'font'} = 1;
             }              }
               if ($settings->{$role}->{'fontmenu'} ne '') {
                   $designs{'fontmenu'} = $settings->{$role}->{'fontmenu'};
                   $is_custom{'fontmenu'} = 1;
               }
             foreach my $item (@bgs) {              foreach my $item (@bgs) {
                 if ($settings->{$role}->{$item} ne '') {                  if ($settings->{$role}->{$item} ne '') {
                     $designs{'bgs'}{$item} = $settings->{$role}->{$item};                      $designs{'bgs'}{$item} = $settings->{$role}->{$item};
Line 875  sub print_rolecolors { Line 961  sub print_rolecolors {
             $designs{img} = $designhash{$dom.'.'.$role.'.img'};              $designs{img} = $designhash{$dom.'.'.$role.'.img'};
             $is_custom{'img'} = 1;              $is_custom{'img'} = 1;
         }          }
           if ($designhash{$dom.'.'.$role.'.fontmenu'} ne '') {
               $designs{fontmenu} = $designhash{$dom.'.'.$role.'.fontmenu'};
               $is_custom{'fontmenu'} = 1; 
           }
         if ($designhash{$dom.'.'.$role.'.font'} ne '') {          if ($designhash{$dom.'.'.$role.'.font'} ne '') {
             $designs{font} = $designhash{$dom.'.'.$role.'.font'};              $designs{font} = $designhash{$dom.'.'.$role.'.font'};
             $is_custom{'font'} = 1;              $is_custom{'font'} = 1;
Line 901  sub print_rolecolors { Line 991  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,$logintext,$loginheader) = @_;          $images,$bgs,$links,$alt_text,$rowtotal,$logintext) = @_;
     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 917  sub display_color_options { Line 1007  sub display_color_options {
                   '&nbsp;<span id="css_'.$role.'_font" style="background-color: '.                    '&nbsp;<span id="css_'.$role.'_font" style="background-color: '.
                   $designs->{'font'}.';">&nbsp;&nbsp;&nbsp;</span>'.                    $designs->{'font'}.';">&nbsp;&nbsp;&nbsp;</span>'.
                   '</span></td></tr>';                    '</span></td></tr>';
       unless ($role eq 'login') { 
           $datatable .= '<tr'.$css_class.'>'.
                         '<td>'.$choices->{'fontmenu'}.'</td>';
           if (!$is_custom->{'fontmenu'}) {
               $datatable .=  '<td>'.&mt('Default in use:').'&nbsp;<span id="css_default_'.$role.'_font" style="color: '.$defaults->{'fontmenu'}.';">'.$defaults->{'fontmenu'}.'</span></td>';
           } else {
               $datatable .= '<td>&nbsp;</td>';
           }
           $fontlink = &color_pick($phase,$role,'fontmenu',$choices->{'fontmenu'},$designs->{'fontmenu'});
           $datatable .= '<td><span class="LC_nobreak">'.
                         '<input type="text" size="10" name="'.$role.'_fontmenu"'.
                         ' value="'.$designs->{'fontmenu'}.'" />&nbsp;'.$fontlink.
                         '&nbsp;<span id="css_'.$role.'_fontmenu" style="background-color: '.
                         $designs->{'fontmenu'}.';">&nbsp;&nbsp;&nbsp;</span>'.
                         '</span></td></tr>';
       }
     my $switchserver = &check_switchserver($dom,$confname);      my $switchserver = &check_switchserver($dom,$confname);
     foreach my $img (@{$images}) {      foreach my $img (@{$images}) {
  $itemcount ++;   $itemcount ++;
Line 927  sub display_color_options { Line 1033  sub display_color_options {
         if ($role eq 'login') {          if ($role eq 'login') {
             if ($img eq 'login') {              if ($img eq 'login') {
                 $login_hdr_pick =                  $login_hdr_pick =
                     &login_header_options($img,$role,$defaults,$is_custom,$choices,                      &login_header_options($img,$role,$defaults,$is_custom,$choices);
                                           $loginheader);  
                 $logincolors =                  $logincolors =
                     &login_text_colors($img,$role,$logintext,$phase,$choices,                      &login_text_colors($img,$role,$logintext,$phase,$choices,
                                             $designs);                                              $designs);
Line 1005  sub display_color_options { Line 1110  sub display_color_options {
                 }                  }
                 $datatable .= '<td>';                  $datatable .= '<td>';
                 if ($img eq 'login') {                  if ($img eq 'login') {
                     $datatable .= $login_hdr_pick;                          $datatable .= $login_hdr_pick;
                 }                  } 
                 $datatable .= &image_changes($is_custom->{$img},$alt_text->{$img},$img_import,                  $datatable .= &image_changes($is_custom->{$img},$alt_text->{$img},$img_import,
                                              $showfile,$fullsize,$role,$img,$imgfile,$logincolors);                                               $showfile,$fullsize,$role,$img,$imgfile,$logincolors);
             } else {              } else {
Line 1020  sub display_color_options { Line 1125  sub display_color_options {
         if ($switchserver) {          if ($switchserver) {
             $datatable .= &mt('Upload to library server: [_1]',$switchserver);              $datatable .= &mt('Upload to library server: [_1]',$switchserver);
         } else {          } else {
             $datatable .='&nbsp;<input type="file" name="'.$role.'_'.$img.'" />';              if ($img ne 'login') { # suppress file selection for Log-in header
                   $datatable .='&nbsp;<input type="file" name="'.$role.'_'.$img.'" />';
               }
         }          }
         $datatable .= '</td></tr>';          $datatable .= '</td></tr>';
     }      }
Line 1109  sub logo_display_options { Line 1216  sub logo_display_options {
 }  }
   
 sub login_header_options  {  sub login_header_options  {
     my ($img,$role,$defaults,$is_custom,$choices,$loginheader) = @_;      my ($img,$role,$defaults,$is_custom,$choices) = @_;
     my $image_checked = ' checked="checked" ';      my $output = '';
     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'})) {      if ((!$is_custom->{'textcol'}) || (!$is_custom->{'bgcol'})) {
         $output .= &mt('Text default(s)').':<br />';          $output .= &mt('Text default(s):').'<br />';
         if (!$is_custom->{'textcol'}) {          if (!$is_custom->{'textcol'}) {
             $output .= $choices->{'textcol'}.':&nbsp;'.$defaults->{'logintext'}{'textcol'}.              $output .= $choices->{'textcol'}.':&nbsp;'.$defaults->{'logintext'}{'textcol'}.
                        '&nbsp;&nbsp;&nbsp;';                         '&nbsp;&nbsp;&nbsp;';
Line 1158  sub login_text_colors { Line 1255  sub login_text_colors {
 sub image_changes {  sub image_changes {
     my ($is_custom,$alt_text,$img_import,$showfile,$fullsize,$role,$img,$imgfile,$logincolors) = @_;      my ($is_custom,$alt_text,$img_import,$showfile,$fullsize,$role,$img,$imgfile,$logincolors) = @_;
     my $output;      my $output;
     if (!$is_custom) {      if ($img eq 'login') {
               # suppress image for Log-in header
       } elsif (!$is_custom) {
         if ($img ne 'domlogo') {          if ($img ne 'domlogo') {
             $output .= &mt('Default image:').'<br />';              $output .= &mt('Default image:').'<br />';
         } else {          } else {
             $output .= &mt('Default in use:').'<br />';              $output .= &mt('Default in use:').'<br />';
         }          }
     }      }
     if ($img_import) {      if ($img eq 'login') { # suppress image for Log-in header
         $output .= '<input type="hidden" name="'.$role.'_import_'.$img.'" value="'.$imgfile.'" />';          $output .= '<td>'.$logincolors;
     }  
     $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 {      } else {
         $output .= '<td valign="bottom">'.$logincolors.&mt('Upload:').'<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;      return $output;
 }  }
Line 1189  sub color_pick { Line 1292  sub color_pick {
     return $link;      return $link;
 }  }
   
 sub color_pick_js {  
     my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();  
     my $output = <<"ENDCOL";  
     function pclose() {  
         parmwin=window.open("/adm/rat/empty.html","LONCAPAparms","height=350,width=350,scrollbars=no,menubar=no");  
         parmwin.close();  
     }  
   
     $pjump_def  
   
     function psub() {  
         pclose();  
         if (document.parmform.pres_marker.value!='') {  
             if (document.parmform.pres_type.value!='') {  
                 eval('document.display.'+  
                      document.parmform.pres_marker.value+  
                      '.value=document.parmform.pres_value.value;');  
             }  
         } else {  
             document.parmform.pres_value.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  
     return $output;  
 }  
   
 sub print_quotas {  sub print_quotas {
     my ($dom,$settings,$rowtotal) = @_;      my ($dom,$settings,$rowtotal,$action) = @_;
     my $datatable;      my $context;
       if ($action eq 'quotas') {
           $context = 'tools';
       } else {
           $context = $action;
       }
       my ($datatable,$defaultquota,@usertools,@options,%validations);
     my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);      my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
     my $typecount = 0;      my $typecount = 0;
     my $css_class;      my ($css_class,%titles);
     my @usertools = ('aboutme','blog','portfolio');      if ($context eq 'requestcourses') {
     my %titles = &tool_titles();          @usertools = ('official','unofficial','community');
           @options =('norequest','approval','validate','autolimit');
           %validations = &Apache::lonnet::auto_courserequest_checks($dom);
           %titles = &courserequest_titles();
       } else {
           @usertools = ('aboutme','blog','portfolio');
           %titles = &tool_titles();
       }
     if (ref($types) eq 'ARRAY') {      if (ref($types) eq 'ARRAY') {
         foreach my $type (@{$types}) {          foreach my $type (@{$types}) {
             my $currdefquota;              my $currdefquota;
             if (ref($settings) eq 'HASH') {              unless ($context eq 'requestcourses') {
                 if (ref($settings->{defaultquota}) eq 'HASH') {                  if (ref($settings) eq 'HASH') {
                     $currdefquota = $settings->{defaultquota}->{$type};                       if (ref($settings->{defaultquota}) eq 'HASH') {
                 } else {                          $currdefquota = $settings->{defaultquota}->{$type}; 
                     $currdefquota = $settings->{$type};                      } else {
                           $currdefquota = $settings->{$type};
                       }
                 }                  }
             }              }
             if (defined($usertypes->{$type})) {              if (defined($usertypes->{$type})) {
Line 1259  sub print_quotas { Line 1331  sub print_quotas {
                 $datatable .= '<tr'.$css_class.'>'.                  $datatable .= '<tr'.$css_class.'>'.
                               '<td>'.$usertypes->{$type}.'</td>'.                                '<td>'.$usertypes->{$type}.'</td>'.
                               '<td class="LC_left_item">';                                '<td class="LC_left_item">';
                   if ($context eq 'requestcourses') {
                       $datatable .= '<table><tr>';
                   }
                   my %cell;  
                 foreach my $item (@usertools) {                  foreach my $item (@usertools) {
                     my $checked = 'checked="checked" ';                      if ($context eq 'requestcourses') {
                     if (ref($settings) eq 'HASH') {                          my ($curroption,$currlimit);
                         if (ref($settings->{$item}) eq 'HASH') {                          if (ref($settings) eq 'HASH') {
                             if ($settings->{$item}->{$type} == 0) {                              if (ref($settings->{$item}) eq 'HASH') {
                                 $checked = '';                                  $curroption = $settings->{$item}->{$type};
                                   if ($curroption =~ /^autolimit=(\d*)$/) {
                                       $currlimit = $1; 
                                   }
                             }                              }
                         }                          }
                     }                          if (!$curroption) {
                     $datatable .= '<span class="LC_nobreak"><label>'.                              $curroption = 'norequest';
                                   '<input type="checkbox" name="tools_'.$item.                          }
                                   '" value="'.$type.'" '.$checked.'/>'.$titles{$item}.                          $datatable .= '<th>'.$titles{$item}.'</th>';
                                   '</label></span>&nbsp; ';                          foreach my $option (@options) {
                 }                              my $val = $option;
                 $datatable .= '</td><td class="LC_right_item"><span class="LC_nobreak">'.                              if ($option eq 'norequest') {
                                   $val = 0;  
                               }
                               if ($option eq 'validate') {
                                   my $canvalidate = 0;
                                   if (ref($validations{$item}) eq 'HASH') { 
                                       if ($validations{$item}{$type}) {
                                           $canvalidate = 1;
                                       }
                                   }
                                   next if (!$canvalidate);
                               }
                               my $checked = '';
                               if ($option eq $curroption) {
                                   $checked = ' checked="checked"';
                               } elsif ($option eq 'autolimit') {
                                   if ($curroption =~ /^autolimit/) {
                                       $checked = ' checked="checked"';
                                   }                       
                               } 
                               $cell{$item} .= '<span class="LC_nobreak"><label>'.
                                     '<input type="radio" name="crsreq_'.$item.
                                     '_'.$type.'" value="'.$val.'"'.$checked.' />'.
                                     $titles{$option}.'</label>';
                               if ($option eq 'autolimit') {
                                   $cell{$item} .= '&nbsp;<input type="text" name="crsreq_'.
                                                   $item.'_limit_'.$type.'" size="1" '.
                                                   'value="'.$currlimit.'" />';
                               }
                               $cell{$item} .= '</span> ';
                               if ($option eq 'autolimit') {
                                   $cell{$item} .= $titles{'unlimited'};
                               }
                           }
                       } else {
                           my $checked = 'checked="checked" ';
                           if (ref($settings) eq 'HASH') {
                               if (ref($settings->{$item}) eq 'HASH') {
                                   if ($settings->{$item}->{$type} == 0) {
                                       $checked = '';
                                   } elsif ($settings->{$item}->{$type} == 1) {
                                       $checked =  'checked="checked" ';
                                   }
                               }
                           }
                           $datatable .= '<span class="LC_nobreak"><label>'.
                                         '<input type="checkbox" name="'.$context.'_'.$item.
                                         '" value="'.$type.'" '.$checked.'/>'.$titles{$item}.
                                         '</label></span>&nbsp; ';
                       }
                   }
                   if ($context eq 'requestcourses') {
                       $datatable .= '</tr><tr>';
                       foreach my $item (@usertools) {
                           $datatable .= '<td style="vertical-align: top">'.$cell{$item}.'</td>';  
                       }
                       $datatable .= '</tr></table>';
                   }
                   $datatable .= '</td>';
                   unless ($context eq 'requestcourses') {
                       $datatable .= 
                                 '<td class="LC_right_item"><span class="LC_nobreak">'.
                               '<input type="text" name="quota_'.$type.                                '<input type="text" name="quota_'.$type.
                               '" value="'.$currdefquota.                                '" value="'.$currdefquota.
                               '" size="5" /> Mb</span></td></tr>';                                '" size="5" /> Mb</span></td>';
                   }
                   $datatable .= '</tr>';
             }              }
         }          }
     }      }
     my $defaultquota = '20';      unless ($context eq 'requestcourses') {
     if (ref($settings) eq 'HASH') {          $defaultquota = '20';
         if (ref($settings->{'defaultquota'}) eq 'HASH') {          if (ref($settings) eq 'HASH') {
             $defaultquota = $settings->{'defaultquota'}->{'default'};              if (ref($settings->{'defaultquota'}) eq 'HASH') {
         } elsif (defined($settings->{'default'})) {                  $defaultquota = $settings->{'defaultquota'}->{'default'};
             $defaultquota = $settings->{'default'};              } elsif (defined($settings->{'default'})) {
                   $defaultquota = $settings->{'default'};
               }
         }          }
     }      }
     $typecount ++;      $typecount ++;
Line 1293  sub print_quotas { Line 1437  sub print_quotas {
     $datatable .= '<tr'.$css_class.'>'.      $datatable .= '<tr'.$css_class.'>'.
                   '<td>'.$othertitle.'</td>'.                    '<td>'.$othertitle.'</td>'.
                   '<td class="LC_left_item">';                    '<td class="LC_left_item">';
       if ($context eq 'requestcourses') {
           $datatable .= '<table><tr>';
       }
       my %defcell;
     foreach my $item (@usertools) {      foreach my $item (@usertools) {
         my $checked = 'checked="checked" ';          if ($context eq 'requestcourses') {
         if (ref($settings) eq 'HASH') {              my ($curroption,$currlimit);
             if (ref($settings->{$item}) eq 'HASH') {              if (ref($settings) eq 'HASH') {
                 if ($settings->{$item}->{'default'} == 0) {                  if (ref($settings->{$item}) eq 'HASH') {
                     $checked = '';                      $curroption = $settings->{$item}->{'default'};
                       if ($curroption =~ /^autolimit=(\d*)$/) {
                           $currlimit = $1;
                       }
                   }
               }
               if (!$curroption) {
                   $curroption = 'norequest';
               }
               $datatable .= '<th>'.$titles{$item}.'</th>';
               foreach my $option (@options) {
                   my $val = $option;
                   if ($option eq 'norequest') {
                       $val = 0;
                   }
                   if ($option eq 'validate') {
                       my $canvalidate = 0;
                       if (ref($validations{$item}) eq 'HASH') {
                           if ($validations{$item}{'default'}) {
                               $canvalidate = 1;
                           }
                       }
                       next if (!$canvalidate);
                   }
                   my $checked = '';
                   if ($option eq $curroption) {
                       $checked = ' checked="checked"';
                   } elsif ($option eq 'autolimit') {
                       if ($curroption =~ /^autolimit/) {
                           $checked = ' checked="checked"';
                       }
                   }
                   $defcell{$item} .= '<span class="LC_nobreak"><label>'.
                                     '<input type="radio" name="crsreq_'.$item.
                                     '_default" value="'.$val.'"'.$checked.' />'.
                                     $titles{$option}.'</label>';
                   if ($option eq 'autolimit') {
                       $defcell{$item} .= '&nbsp;<input type="text" name="crsreq_'.
                                          $item.'_limit_default" size="1" '.
                                          'value="'.$currlimit.'" />';
                   }
                   $defcell{$item} .= '</span> ';
                   if ($option eq 'autolimit') {
                       $defcell{$item} .= $titles{'unlimited'};
                 }                  }
             }              }
           } else {
               my $checked = 'checked="checked" ';
               if (ref($settings) eq 'HASH') {
                   if (ref($settings->{$item}) eq 'HASH') {
                       if ($settings->{$item}->{'default'} == 0) {
                           $checked = '';
                       } elsif ($settings->{$item}->{'default'} == 1) {
                           $checked = 'checked="checked" ';
                       }
                   }
               }
               $datatable .= '<span class="LC_nobreak"><label>'.
                             '<input type="checkbox" name="'.$context.'_'.$item.
                             '" value="default" '.$checked.'/>'.$titles{$item}.
                             '</label></span>&nbsp; ';
         }          }
         $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">'.      if ($context eq 'requestcourses') {
                   '<input type="text" name="defaultquota" value="'.          $datatable .= '</tr><tr>';
                   $defaultquota.'" size="5" /> Mb</span></td></tr>';          foreach my $item (@usertools) {
               $datatable .= '<td style="vertical-align: top">'.$defcell{$item}.'</td>';
           }
           $datatable .= '</tr></table>';
       }
       $datatable .= '</td>';
       unless ($context eq 'requestcourses') {
           $datatable .= '<td class="LC_right_item"><span class="LC_nobreak">'.
                         '<input type="text" name="defaultquota" value="'.
                         $defaultquota.'" size="5" /> Mb</span></td>';
       }
       $datatable .= '</tr>';
     $typecount ++;      $typecount ++;
     $css_class = $typecount%2?' class="LC_odd_row"':'';      $css_class = $typecount%2?' class="LC_odd_row"':'';
     $datatable .= '<tr'.$css_class.'>'.      $datatable .= '<tr'.$css_class.'>'.
                   '<td><br/>'.&mt('LON-CAPA Advanced Users').'</td>'.                    '<td>'.&mt('LON-CAPA Advanced Users').' ';
                   '<td class="LC_left_item" colspan="2"><br />';      if ($context eq 'requestcourses') {
           $datatable .= &mt('(overrides affiliation, if set)').
                         '</td>'.
                         '<td class="LC_left_item">'.
                         '<table><tr>';
       } else {
           $datatable .= &mt('(overrides affiliation, if checked)').
                         '</td>'.
                         '<td class="LC_left_item" colspan="2">'.
                         '<br />';
       }
       my %advcell;
     foreach my $item (@usertools) {      foreach my $item (@usertools) {
         my $checked = 'checked="checked" ';          if ($context eq 'requestcourses') {
         if (ref($settings) eq 'HASH') {              my ($curroption,$currlimit);
             if (ref($settings->{$item}) eq 'HASH') {              if (ref($settings) eq 'HASH') {
                 if ($settings->{$item}->{'_LC_adv'} == 0) {                  if (ref($settings->{$item}) eq 'HASH') {
                     $checked = '';                      $curroption = $settings->{$item}->{'_LC_adv'};
                       if ($curroption =~ /^autolimit=(\d*)$/) {
                           $currlimit = $1;
                       }
                   }
               }
               $datatable .= '<th>'.$titles{$item}.'</th>';
               my $checked = '';
               if ($curroption eq '') {
                   $checked = ' checked="checked"';
               }
               $advcell{$item} .= '<span class="LC_nobreak"><label>'.
                                  '<input type="radio" name="crsreq_'.$item.
                                  '__LC_adv" value=""'.$checked.' />'.
                                  &mt('No override set').'</label></span>&nbsp; ';
               foreach my $option (@options) {
                   my $val = $option;
                   if ($option eq 'norequest') {
                       $val = 0;
                   }
                   if ($option eq 'validate') {
                       my $canvalidate = 0;
                       if (ref($validations{$item}) eq 'HASH') {
                           if ($validations{$item}{'_LC_adv'}) {
                               $canvalidate = 1;
                           }
                       }
                       next if (!$canvalidate);
                   }
                   my $checked = '';
                   if ($val eq $curroption) {
                       $checked = ' checked="checked"';
                   } elsif ($option eq 'autolimit') {
                       if ($curroption =~ /^autolimit/) {
                           $checked = ' checked="checked"';
                       }
                   }
                   $advcell{$item} .= '<span class="LC_nobreak"><label>'.
                                     '<input type="radio" name="crsreq_'.$item.
                                     '__LC_adv" value="'.$val.'"'.$checked.' />'.
                                     $titles{$option}.'</label>';
                   if ($option eq 'autolimit') {
                       $advcell{$item} .= '&nbsp;<input type="text" name="crsreq_'.
                                          $item.'_limit__LC_adv" size="1" '.
                                          'value="'.$currlimit.'" />';
                   }
                   $advcell{$item} .= '</span> ';
                   if ($option eq 'autolimit') {
                       $advcell{$item} .= $titles{'unlimited'};
                 }                  }
             }              }
           } else {
               my $checked = 'checked="checked" ';
               if (ref($settings) eq 'HASH') {
                   if (ref($settings->{$item}) eq 'HASH') {
                       if ($settings->{$item}->{'_LC_adv'} == 0) {
                           $checked = '';
                       } elsif ($settings->{$item}->{'_LC_adv'} == 1) {
                           $checked = 'checked="checked" ';
                       }
                   }
               }
               $datatable .= '<span class="LC_nobreak"><label>'.
                             '<input type="checkbox" name="'.$context.'_'.$item.
                             '" value="_LC_adv" '.$checked.'/>'.$titles{$item}.
                             '</label></span>&nbsp; ';
           }
       }
       if ($context eq 'requestcourses') {
           $datatable .= '</tr><tr>';
           foreach my $item (@usertools) {
               $datatable .= '<td style="vertical-align: top">'.$advcell{$item}.'</td>';
         }          }
         $datatable .= '<span class="LC_nobreak"><label>'.          $datatable .= '</tr></table>';
                       '<input type="checkbox" name="tools_'.$item.  
                       '" value="_LC_adv" '.$checked.'/>'.$titles{$item}.  
                       '</label></span>&nbsp; ';  
     }      }
     $datatable .= '<span class="LC_nobreak">('.&mt('overrides affiliation').      $datatable .= '</td></tr>';
                   ')</span></td></tr>';  
     $$rowtotal += $typecount;      $$rowtotal += $typecount;
     return $datatable;      return $datatable;
 }  }
   
   sub print_courserequestmail {
       my ($dom,$settings,$rowtotal) = @_;
       my ($now,$datatable,%dompersonnel,@domcoord,@currapproval,$rows);
       $now = time;
       $rows = 0;
       %dompersonnel = &Apache::lonnet::get_domain_roles($dom,['dc'],$now,$now);
       foreach my $server (keys(%dompersonnel)) {
           foreach my $user (sort(keys(%{$dompersonnel{$server}}))) {
               my ($trole,$uname,$udom,$runame,$rudom,$rsec) = split(/:/,$user);
               if (!grep(/^$uname:$udom$/,@domcoord)) {
                   push(@domcoord,$uname.':'.$udom);
               }
           }
       }
       if (ref($settings) eq 'HASH') {
           if (ref($settings->{'notify'}) eq 'HASH') {
               if ($settings->{'notify'}{'approval'} ne '') {
                  @currapproval = split(',',$settings->{'notify'}{'approval'});
               }
           }
       }
       if (@currapproval) {
           foreach my $dc (@currapproval) {
               unless (grep(/^\Q$dc\E$/,@domcoord)) {
                   push(@domcoord,$dc);
               }
           }
       }
       @domcoord = sort(@domcoord);
       my $numinrow = 4;
       my $numdc = @domcoord;
       my $css_class = 'class="LC_odd_row"';
       $datatable = '<tr'.$css_class.'>'.
                    ' <td>'.&mt('Receive notification of course requests requiring approval.').
                    ' </td>'.
                    ' <td class="LC_left_item">';
       if (@domcoord > 0) {
           $datatable .= '<table>';
           for (my $i=0; $i<$numdc; $i++) {
               my $rem = $i%($numinrow);
               if ($rem == 0) {
                   if ($i > 0) {
                       $datatable .= '</tr>';
                   }
                   $datatable .= '<tr>';
                   $rows ++;
               }
               my $check = ' ';
               if (grep(/^\Q$domcoord[$i]\E$/,@currapproval)) {
                   $check = ' checked="checked" ';
               }
               my ($uname,$udom) = split(':',$domcoord[$i]);
               my $fullname = &Apache::loncommon::plainname($uname,$udom);
               if ($i == $numdc-1) {
                   my $colsleft = $numinrow-$rem;
                   if ($colsleft > 1) {
                       $datatable .= '<td colspan="'.$colsleft.'" class="LC_left_item">';
                   } else {
                       $datatable .= '<td class="LC_left_item">';
                   }
               } else {
                   $datatable .= '<td class="LC_left_item">';
               }
               $datatable .= '<span class="LC_nobreak"><label>'.
                             '<input type="checkbox" name="reqapprovalnotify" '.
                             'value="'.$domcoord[$i].'"'.$check.'/>'.
                             $fullname.'</label></span></td>';
           }
           $datatable .= '</tr></table>';
       } else {
           $datatable .= &mt('There are no active Domain Coordinators');
           $rows ++;
       }
       $datatable .='</td></tr>';
       $$rowtotal += $rows;
       return $datatable;
   }
   
 sub print_autoenroll {  sub print_autoenroll {
     my ($dom,$settings,$rowtotal) = @_;      my ($dom,$settings,$rowtotal) = @_;
     my $autorun = &Apache::lonnet::auto_run(undef,$dom),      my $autorun = &Apache::lonnet::auto_run(undef,$dom),
     my ($defdom,$runon,$runoff);      my ($defdom,$runon,$runoff,$coownerson,$coownersoff);
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         if (exists($settings->{'run'})) {          if (exists($settings->{'run'})) {
             if ($settings->{'run'} eq '0') {              if ($settings->{'run'} eq '0') {
Line 1357  sub print_autoenroll { Line 1724  sub print_autoenroll {
                 $runon = ' ';                  $runon = ' ';
             }              }
         }          }
           if (exists($settings->{'co-owners'})) {
               if ($settings->{'co-owners'} eq '0') {
                   $coownersoff = ' checked="checked" ';
                   $coownerson = ' ';
               } else {
                   $coownerson = ' checked="checked" ';
                   $coownersoff = ' ';
               }
           } else {
               $coownersoff = ' checked="checked" ';
               $coownerson = ' ';
           }
         if (exists($settings->{'sender_domain'})) {          if (exists($settings->{'sender_domain'})) {
             $defdom = $settings->{'sender_domain'};              $defdom = $settings->{'sender_domain'};
         }          }
Line 1387  sub print_autoenroll { Line 1766  sub print_autoenroll {
                   &mt('username').':&nbsp;'.                    &mt('username').':&nbsp;'.
                   '<input type="text" name="sender_uname" value="'.                    '<input type="text" name="sender_uname" value="'.
                   $notif_sender.'" size="10" />&nbsp;&nbsp;'.&mt('domain').                    $notif_sender.'" size="10" />&nbsp;&nbsp;'.&mt('domain').
                   ':&nbsp;'.$domform.'</span></td></tr>';                    ':&nbsp;'.$domform.'</span></td></tr>'.
     $$rowtotal += 2;                    '<tr class="LC_odd_row">'.
                     '<td>'.&mt('Automatically assign co-ownership').'</td>'.
                     '<td class="LC_right_item"><span class="LC_nobreak"><label>'.
                     '<input type="radio" name="autoassign_coowners"'.
                     $coownerson.' value="1" />'.&mt('Yes').'</label>&nbsp;'.
                     '<label><input type="radio" name="autoassign_coowners"'.
                     $coownersoff.' value="0" />'.&mt('No').'</label></span></td>'.
                     '</tr>';
       $$rowtotal += 3;
     return $datatable;      return $datatable;
 }  }
   
Line 1430  sub print_autoupdate { Line 1817  sub print_autoupdate {
                   $classlistsoff.'value="0" />'.&mt('No').'</label></span></td>'.                    $classlistsoff.'value="0" />'.&mt('No').'</label></span></td>'.
                   '</tr>';                    '</tr>';
         $$rowtotal += 2;          $$rowtotal += 2;
       } elsif ($position eq 'middle') {
           my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
           my $numinrow = 3;
           my $locknamesettings;
           $datatable .= &insttypes_row($settings,$types,$usertypes,
                                        $dom,$numinrow,$othertitle,
                                       'lockablenames');
           $$rowtotal ++;
     } else {      } else {
         my ($othertitle,$usertypes,$types) = &Apache::loncommon::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','generation',
                       'permanentemail','id');                        'permanentemail','id');
         my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();          my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
         my $numrows = 0;          my $numrows = 0;
Line 1453  sub print_autoupdate { Line 1848  sub print_autoupdate {
     return $datatable;      return $datatable;
 }  }
   
   sub print_autocreate {
       my ($dom,$settings,$rowtotal) = @_;
       my (%createon,%createoff);
       my $curr_dc;
       my @types = ('xml','req');
       if (ref($settings) eq 'HASH') {
           foreach my $item (@types) {
               $createoff{$item} = ' checked="checked" ';
               $createon{$item} = ' ';
               if (exists($settings->{$item})) {
                   if ($settings->{$item}) {
                       $createon{$item} = ' checked="checked" ';
                       $createoff{$item} = ' ';
                   }
               }
           }
           $curr_dc = $settings->{'xmldc'};
       } else {
           foreach my $item (@types) {
               $createoff{$item} = ' checked="checked" ';
               $createon{$item} = ' ';
           }
       }
       $$rowtotal += 2;
       my $datatable='<tr class="LC_odd_row">'.
                     '<td>'.&mt('Create pending official courses from XML files').'</td>'.
                     '<td class="LC_right_item"><span class="LC_nobreak"><label>'.
                     '<input type="radio" name="autocreate_xml"'.
                     $createon{'xml'}.' value="1" />'.&mt('Yes').'</label>&nbsp;'.
                     '<label><input type="radio" name="autocreate_xml"'.
                     $createoff{'xml'}.' value="0" />'.&mt('No').'</label></span>'.
                     '</td></tr><tr>'.
                     '<td>'.&mt('Create pending requests for official courses (if validated)').'</td>'.
                     '<td class="LC_right_item"><span class="LC_nobreak"><label>'.
                     '<input type="radio" name="autocreate_req"'.
                     $createon{'req'}.' value="1" />'.&mt('Yes').'</label>&nbsp;'.
                     '<label><input type="radio" name="autocreate_req"'.
                     $createoff{'req'}.' value="0" />'.&mt('No').'</label></span>';
       my ($numdc,$dctable) = &active_dc_picker($dom,$curr_dc);
       if ($numdc > 1) {
           $datatable .= '</td></tr><tr class="LC_odd_row"><td>'.
                         &mt('Course creation processed as: (choose Dom. Coord.)'). 
                         '</td><td class="LC_left_item">'.$dctable.'</td></tr>';
           $$rowtotal ++ ;
       } else {
           $datatable .= $dctable.'</td></tr>';
       }
       return $datatable;
   }
   
 sub print_directorysrch {  sub print_directorysrch {
     my ($dom,$settings,$rowtotal) = @_;      my ($dom,$settings,$rowtotal) = @_;
     my $srchon = ' ';      my $srchon = ' ';
Line 1513  sub print_directorysrch { Line 1958  sub print_directorysrch {
     $$rowtotal += 2;      $$rowtotal += 2;
     if (ref($usertypes) eq 'HASH') {      if (ref($usertypes) eq 'HASH') {
         if (keys(%{$usertypes}) > 0) {          if (keys(%{$usertypes}) > 0) {
             $datatable .= &users_cansearch_row($settings,$types,$usertypes,$dom,              $datatable .= &insttypes_row($settings,$types,$usertypes,$dom,
                                                $numinrow,$othertitle);                                           $numinrow,$othertitle,'cansearch');
             $cansrchrow = 1;              $cansrchrow = 1;
         }          }
     }      }
Line 1529  sub print_directorysrch { Line 1974  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) eq 'HASH') {               if (ref($settings) eq 'HASH') {
                 if (ref($settings->{'searchby'}) eq 'ARRAY') {                  if (ref($settings->{'searchby'}) eq 'ARRAY') {
                     if (grep(/^\Q$title\E$/,@{$settings->{'searchby'}})) {                      if (grep(/^\Q$title\E$/,@{$settings->{'searchby'}})) {
                         $check = ' checked="checked" ';                          $check = ' checked="checked" ';
Line 1570  sub print_contacts { Line 2015  sub print_contacts {
     my ($dom,$settings,$rowtotal) = @_;      my ($dom,$settings,$rowtotal) = @_;
     my $datatable;      my $datatable;
     my @contacts = ('adminemail','supportemail');      my @contacts = ('adminemail','supportemail');
     my (%checked,%to,%otheremails);      my (%checked,%to,%otheremails,%bccemails);
     my @mailings = ('errormail','packagesmail','lonstatusmail','helpdeskmail');      my @mailings = ('errormail','packagesmail','lonstatusmail','helpdeskmail',
                       'requestsmail');
     foreach my $type (@mailings) {      foreach my $type (@mailings) {
         $otheremails{$type} = '';          $otheremails{$type} = '';
     }      }
       $bccemails{'helpdeskmail'} = '';
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         foreach my $item (@contacts) {          foreach my $item (@contacts) {
             if (exists($settings->{$item})) {              if (exists($settings->{$item})) {
Line 1590  sub print_contacts { Line 2037  sub print_contacts {
                         }                          }
                     }                      }
                     $otheremails{$type} = $settings->{$type}{'others'};                      $otheremails{$type} = $settings->{$type}{'others'};
                       if ($type eq 'helpdeskmail') {
                           $bccemails{$type} = $settings->{$type}{'bcc'};
                       }
                 }                  }
             } elsif ($type eq 'lonstatusmail') {              } elsif ($type eq 'lonstatusmail') {
                 $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" ';                  $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" ';
Line 1601  sub print_contacts { Line 2051  sub print_contacts {
         $checked{'errormail'}{'adminemail'} = ' checked="checked" ';          $checked{'errormail'}{'adminemail'} = ' checked="checked" ';
         $checked{'packagesmail'}{'adminemail'} = ' checked="checked" ';          $checked{'packagesmail'}{'adminemail'} = ' checked="checked" ';
         $checked{'helpdeskmail'}{'supportemail'} = ' checked="checked" ';          $checked{'helpdeskmail'}{'supportemail'} = ' checked="checked" ';
         $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" ';          $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; 
           $checked{'requestsmail'}{'adminemail'} = ' checked="checked" ';
     }      }
     my ($titles,$short_titles) = &contact_titles();      my ($titles,$short_titles) = &contact_titles();
     my $rownum = 0;      my $rownum = 0;
Line 1632  sub print_contacts { Line 2083  sub print_contacts {
         }          }
         $datatable .= '</span><br />'.&mt('Others').':&nbsp;&nbsp;'.          $datatable .= '</span><br />'.&mt('Others').':&nbsp;&nbsp;'.
                       '<input type="text" name="'.$type.'_others" '.                        '<input type="text" name="'.$type.'_others" '.
                       'value="'.$otheremails{$type}.'"  />'.                        'value="'.$otheremails{$type}.'"  />';
                       '</td></tr>'."\n";          if ($type eq 'helpdeskmail') {
               $datatable .= '<br />'.&mt('Bcc:').('&nbsp;'x6).
                             '<input type="text" name="'.$type.'_bcc" '.
                             'value="'.$bccemails{$type}.'"  />';
           }
           $datatable .= '</td></tr>'."\n";
     }      }
     $$rowtotal += $rownum;      $$rowtotal += $rownum;
     return $datatable;      return $datatable;
 }  }
   
   sub print_helpsettings {
   
    my ($position,$dom,$confname,$settings,$rowtotal) = @_;
    my ($css_class,$datatable);
   
    my $switchserver = &check_switchserver($dom,$confname);
   
    my $itemcount = 1;
   
    if ($position eq 'top') {
   
    my (%checkedon,%checkedoff,%choices,%defaultchecked,@toggles);
   
    %choices =
    &Apache::lonlocal::texthash (
    submitbugs => 'Display &quot;Submit a bug&quot; link?',
    );
   
    %defaultchecked = ('submitbugs' => 'on');
   
    @toggles = ('submitbugs',);
   
    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} = ' ';
    }
    }
   
    if (ref($settings) eq 'HASH') {
    foreach my $item (@toggles) {
    if ($settings->{$item} eq '1') {
    $checkedon{$item} =  ' checked="checked" ';
    $checkedoff{$item} = ' ';
    } elsif ($settings->{$item} eq '0') {
    $checkedoff{$item} =  ' checked="checked" ';
    $checkedon{$item} = ' ';
    }
    }
    }
   
    foreach my $item (@toggles) {
    $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';
    $datatable .=  
    '<tr'.$css_class.'>
    <td><span class="LC_nobreak">'.$choices{$item}.'</span></td>
    <td><span class="LC_nobreak">&nbsp;</span></td>
    <td class="LC_right_item"><span class="LC_nobreak">
    <label><input type="radio" name="'.$item.'" '.$checkedon{$item}.' value="1" />'.&mt('Yes').'</label>&nbsp;
    <label><input type="radio" name="'.$item.'" '.$checkedoff{$item}.' value="0" />'.&mt('No').'</label>'.
    '</span></td>'.
    '</tr>';
    $itemcount ++;
    }
        
        } else {
        
         $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';
        
         $datatable .= '<tr'.$css_class.'>';
        
         if (ref($settings) eq 'HASH') {
    if ($settings->{'loginhelpurl'} ne '') {
    my($directory, $filename) = $settings->{'loginhelpurl'} =~ m/(.*\/)(.*)$/;
    $datatable .= '<td width="33%"><span class="LC_left_item"><label><a href="'.$settings->{'loginhelpurl'}.'" target="_blank">'.&mt('Custom Login Page Help File In Use').'</a></label></span></td>';
    $datatable .= '<td width="33%"><span class="LC_right_item"><label><input type="checkbox" name="loginhelpurl_del" value="1" />'.&mt('Delete?').'</label></span></td>'
    } else {
    $datatable .= '<td width="33%"><span class="LC_left_item"><label>'.&mt('Default Login Page Help File In Use').'</label></span></td>';
    $datatable .= '<td width="33%"><span class="LC_right_item">&nbsp;</span></td>';
    }
    } else {
    $datatable .= '<td><span class="LC_left_item">&nbsp;</span></td>';
    $datatable .= '<td><span class="LC_right_item">&nbsp;</span></td>';
    }
      
         $datatable .= '<td width="33%"><span class="LC_right_item">';
         if ($switchserver) {
               $datatable .= &mt('Upload to library server: [_1]',$switchserver);
           } else {
           $datatable .= &mt('Upload Custom Login Page Help File:');
               $datatable .='<input type="file" name="loginhelpurl" />';
           }
           $datatable .= '</span></td></tr>';
           
        }
        
        return $datatable;
   
   }
   
   
   sub radiobutton_prefs {
       my ($settings,$toggles,$defaultchecked,$choices,$itemcount) = @_;
       return unless ((ref($toggles) eq 'ARRAY') && (ref($defaultchecked) eq 'HASH') &&
                      (ref($choices) eq 'HASH'));
   
       my (%checkedon,%checkedoff,$datatable,$css_class);
   
       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} = ' ';
           }
       }
       if (ref($settings) eq 'HASH') {
           foreach my $item (@{$toggles}) {
               if ($settings->{$item} eq '1') {
                   $checkedon{$item} =  ' checked="checked" ';
                   $checkedoff{$item} = ' ';
               } elsif ($settings->{$item} eq '0') {
                   $checkedoff{$item} =  ' checked="checked" ';
                   $checkedon{$item} = ' ';
               }
           }
       }
       foreach my $item (@{$toggles}) {
           $css_class = $itemcount%2?' class="LC_odd_row"':'';
           $datatable .=
               '<tr'.$css_class.'><td><span class="LC_nobreak">'.$choices->{$item}.
               '</span></td>'.
               '<td class="LC_right_item"><span class="LC_nobreak">'.
               '<label><input type="radio" name="'.
               $item.'" '.$checkedon{$item}.' value="1" />'.&mt('Yes').
               '</label>&nbsp;<label><input type="radio" name="'.$item.'" '.
               $checkedoff{$item}.' value="0" />'.&mt('No').'</label>'.
               '</span></td>'.
               '</tr>';
           $itemcount ++;
       }
       return ($datatable,$itemcount);
   }
   
   sub print_coursedefaults {
       my ($position,$dom,$settings,$rowtotal) = @_;
       my ($css_class,$datatable);
       my $itemcount = 1;
       if ($position eq 'top') {
           my (%checkedon,%checkedoff,%choices,%defaultchecked,@toggles);
           %choices =
               &Apache::lonlocal::texthash (
                   canuse_pdfforms => 'Course/Community users can create/upload PDF forms',
           );
           %defaultchecked = ('canuse_pdfforms' => 'off');
           @toggles = ('canuse_pdfforms',);
           ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked,
                                                    \%choices,$itemcount);
           $$rowtotal += $itemcount;
       } else {
           $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';
           my %choices =
               &Apache::lonlocal::texthash (
                   anonsurvey_threshold => 'Responder count needed before showing submissions for anonymous surveys',
           );
           my $currdefresponder;
           if (ref($settings) eq 'HASH') {
               $currdefresponder = $settings->{'anonsurvey_threshold'};
           }
           if (!$currdefresponder) {
               $currdefresponder = 10;
           } elsif ($currdefresponder < 1) {
               $currdefresponder = 1;
           }
           $datatable .=
                  '<tr'.$css_class.'><td><span class="LC_nobreak">'.$choices{'anonsurvey_threshold'}.
                   '</span></td>'.
                   '<td class="LC_right_item"><span class="LC_nobreak">'.
                   '<input type="text" name="anonsurvey_threshold"'.
                   ' value="'.$currdefresponder.'" size="5" /></span>'.
                   '</td></tr>';
       }
       return $datatable;
   }
   
   sub print_usersessions {
       my ($position,$dom,$settings,$rowtotal) = @_;
       my ($css_class,$datatable,%checked,%choices);
       my (%by_ip,%by_location,@intdoms);
       &build_location_hashes(\@intdoms,\%by_ip,\%by_location);
       if (keys(%by_location) == 0) {
           if ($position eq 'top') {
               $datatable .= '<tr'.$css_class.'><td colspan="2">'.
                             &mt('Nothing to set here, as the cluster to which this domain belongs only contains this institution.');
           }
       }
       my %lt = &usersession_titles();
       my $itemcount = 1;
       my $numinrow = 5;
       my $prefix;
       my @types;
       if ($position eq 'top') {
           $prefix = 'hosted';
           @types = ('excludedomain','includedomain');
       } else {
           $prefix = 'remote';
           @types = ('version','excludedomain','includedomain');
       }
       my (%current,%checkedon,%checkedoff);
       my @lcversions = &Apache::lonnet::all_loncaparevs();
       my @locations = sort(keys(%by_location));
       foreach my $type (@types) {
           $checkedon{$type} = '';
           $checkedoff{$type} = ' checked="checked"';
       }
       if (ref($settings) eq 'HASH') {
           if (ref($settings->{$prefix}) eq 'HASH') {
               foreach my $key (keys(%{$settings->{$prefix}})) {
                   $current{$key} = $settings->{$prefix}{$key};
                   if ($key eq 'version') {
                       if ($current{$key} ne '') {
                           $checkedon{$key} = ' checked="checked"';
                           $checkedoff{$key} = '';
                       }
                   } elsif (ref($current{$key}) eq 'ARRAY') {
                       $checkedon{$key} = ' checked="checked"';
                       $checkedoff{$key} = '';
                   }
               }
           }
       }
       foreach my $type (@types) {
           next if ($type ne 'version' && !@locations);
           $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';
           $datatable .= '<tr'.$css_class.'>
                          <td><span class="LC_nobreak">'.$lt{$type}.'</span><br />
                              <span class="LC_nobreak">&nbsp;
                              <label><input type="radio" name="'.$prefix.'_'.$type.'_inuse" '.$checkedoff{$type}.' value="0" />'.&mt('Not in use').'</label>&nbsp;
                              <label><input type="radio" name="'.$prefix.'_'.$type.'_inuse" '.$checkedon{$type}.' value="1" />'.&mt('In use').'</label></span></td><td>';
           if ($type eq 'version') {
               my $selector = '<select name="'.$prefix.'_version">';
               foreach my $version (@lcversions) {
                   my $selected = '';
                   if ($current{'version'} eq $version) {
                       $selected = ' selected="selected"';
                   }
                   $selector .= ' <option value="'.$version.'"'.
                                $selected.'>'.$version.'</option>';
               }
               $selector .= '</select> ';
               $datatable .= &mt('remote server must be version: [_1] or later',$selector);
           } else {
               $datatable.= '<div><input type="button" value="'.&mt('check all').'" '.
                            'onclick="javascript:checkAll(document.display.'.$prefix.'_'.$type.')"'.
                            ' />'.('&nbsp;'x2).
                            '<input type="button" value="'.&mt('uncheck all').'" '.
                            'onclick="javascript:uncheckAll(document.display.'.$prefix.'_'.$type.')" />'.
                            "\n".
                            '</div><div><table>';
               my $rem;
               for (my $i=0; $i<@locations; $i++) {
                   my ($showloc,$value,$checkedtype);
                   if (ref($by_location{$locations[$i]}) eq 'ARRAY') {
                       my $ip = $by_location{$locations[$i]}->[0];
                       if (ref($by_ip{$ip}) eq 'ARRAY') {
                           $value = join(':',@{$by_ip{$ip}});
                           $showloc = join(', ',@{$by_ip{$ip}});
                           if (ref($current{$type}) eq 'ARRAY') {
                               foreach my $loc (@{$by_ip{$ip}}) {  
                                   if (grep(/^\Q$loc\E$/,@{$current{$type}})) {
                                       $checkedtype = ' checked="checked"';
                                       last;
                                   }
                               }
                           }
                       }
                   }
                   $rem = $i%($numinrow);
                   if ($rem == 0) {
                       if ($i > 0) {
                           $datatable .= '</tr>';
                       }
                       $datatable .= '<tr>';
                   }
                   $datatable .= '<td class="LC_left_item">'.
                                 '<span class="LC_nobreak"><label>'.
                                 '<input type="checkbox" name="'.$prefix.'_'.$type.
                                 '" value="'.$value.'"'.$checkedtype.' />'.$showloc.
                                 '</label></span></td>';
               }
               $rem = @locations%($numinrow);
               my $colsleft = $numinrow - $rem;
               if ($colsleft > 1 ) {
                   $datatable .= '<td colspan="'.$colsleft.'" class="LC_left_item">'.
                                 '&nbsp;</td>';
               } elsif ($colsleft == 1) {
                   $datatable .= '<td class="LC_left_item">&nbsp;</td>';
               }
               $datatable .= '</tr></table>';
           }
           $datatable .= '</td></tr>';
           $itemcount ++;
       }
       $$rowtotal += $itemcount;
       return $datatable;
   }
   
   sub build_location_hashes {
       my ($intdoms,$by_ip,$by_location) = @_;
       return unless((ref($intdoms) eq 'ARRAY') && (ref($by_ip) eq 'HASH') &&
                     (ref($by_location) eq 'HASH')); 
       my %iphost = &Apache::lonnet::get_iphost();
       my $primary_id = &Apache::lonnet::domain($env{'request.role.domain'},'primary');
       my $primary_ip = &Apache::lonnet::get_host_ip($primary_id);
       if (ref($iphost{$primary_ip}) eq 'ARRAY') {
           foreach my $id (@{$iphost{$primary_ip}}) {
               my $intdom = &Apache::lonnet::internet_dom($id);
               unless(grep(/^\Q$intdom\E$/,@{$intdoms})) {
                   push(@{$intdoms},$intdom);
               }
           }
       }
       foreach my $ip (keys(%iphost)) {
           if (ref($iphost{$ip}) eq 'ARRAY') {
               foreach my $id (@{$iphost{$ip}}) {
                   my $location = &Apache::lonnet::internet_dom($id);
                   if ($location) {
                       next if (grep(/^\Q$location\E$/,@{$intdoms}));
                       if (ref($by_ip->{$ip}) eq 'ARRAY') {
                           unless(grep(/^\Q$location\E$/,@{$by_ip->{$ip}})) {
                               push(@{$by_ip->{$ip}},$location);
                           }
                       } else {
                           $by_ip->{$ip} = [$location];
                       }
                   }
               }
           }
       }
       foreach my $ip (sort(keys(%{$by_ip}))) {
           if (ref($by_ip->{$ip}) eq 'ARRAY') {
               @{$by_ip->{$ip}} = sort(@{$by_ip->{$ip}});
               my $first = $by_ip->{$ip}->[0];
               if (ref($by_location->{$first}) eq 'ARRAY') {
                   unless (grep(/^\Q$ip\E$/,@{$by_location->{$first}})) {
                       push(@{$by_location->{$first}},$ip);
                   }
               } else {
                   $by_location->{$first} = [$ip];
               }
           }
       }
       return;
   }
   
 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',
Line 1647  sub contact_titles { Line 2452  sub contact_titles {
                    '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',
                    'lonstatusmail' => 'E-mail from nightly status check (warnings/errors)',                     'lonstatusmail' => 'E-mail from nightly status check (warnings/errors)',
                      'requestsmail' => 'E-mail from course requests requiring approval',
                  );                   );
     my %short_titles = &Apache::lonlocal::texthash (      my %short_titles = &Apache::lonlocal::texthash (
                            adminemail   => 'Admin E-mail address',                             adminemail   => 'Admin E-mail address',
Line 1657  sub contact_titles { Line 2463  sub contact_titles {
   
 sub tool_titles {  sub tool_titles {
     my %titles = &Apache::lonlocal::texthash (      my %titles = &Apache::lonlocal::texthash (
                                               aboutme   => 'Personal Home Page',                       aboutme    => 'Personal Information Page',
                                               blog      => 'Blog',                       blog       => 'Blog',
                                               portfolio => 'Portfolio',                       portfolio  => 'Portfolio',
                                              );                       official   => 'Official courses (with institutional codes)',
                        unofficial => 'Unofficial courses',
                        community  => 'Communities',
                    );
     return %titles;      return %titles;
 }  }
   
   sub courserequest_titles {
       my %titles = &Apache::lonlocal::texthash (
                                      official   => 'Official',
                                      unofficial => 'Unofficial',
                                      community  => 'Communities',
                                      norequest  => 'Not allowed',
                                      approval   => 'Approval by Dom. Coord.',
                                      validate   => 'With validation',
                                      autolimit  => 'Numerical limit',
                                      unlimited  => '(blank for unlimited)',
                    );
       return %titles;
   }
   
   sub courserequest_conditions {
       my %conditions = &Apache::lonlocal::texthash (
          approval    => '(Processing of request subject to approval by Domain Coordinator).',
          validate   => '(Processing of request subject to instittutional validation).',
                    );
       return %conditions;
   }
   
   
 sub print_usercreation {  sub print_usercreation {
     my ($position,$dom,$settings,$rowtotal) = @_;      my ($position,$dom,$settings,$rowtotal) = @_;
     my $numinrow = 4;      my $numinrow = 4;
Line 1705  sub print_usercreation { Line 2537  sub print_usercreation {
             $rowcount ++;              $rowcount ++;
         }          }
     } elsif ($position eq 'middle') {      } elsif ($position eq 'middle') {
         my @creators = ('author','course','selfcreate');          my @creators = ('author','course','requestcrs','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();
Line 1782  sub print_usercreation { Line 2614  sub print_usercreation {
             }              }
             $datatable .= '</td></tr>';              $datatable .= '</td></tr>';
         }          }
           my ($othertitle,$usertypes,$types) =
               &Apache::loncommon::sorted_inst_types($dom);
           if (ref($usertypes) eq 'HASH') {
               if (keys(%{$usertypes}) > 0) {
                   my $createsettings;
                   if (ref($settings) eq 'HASH') {
                       $createsettings = $settings->{cancreate};
                   }
                   $datatable .= &insttypes_row($createsettings,$types,$usertypes,
                                                $dom,$numinrow,$othertitle,
                                                'statustocreate');
                   $$rowtotal ++;
               }
           }
     } else {      } else {
         my @contexts = ('author','course','domain');          my @contexts = ('author','course','domain');
         my @authtypes = ('int','krb4','krb5','loc');          my @authtypes = ('int','krb4','krb5','loc');
Line 1894  sub usercreation_types { Line 2740  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',
                       requestcrs => 'When requesting a course',
                     selfcreate => 'User creates own account',                       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',                      email      => 'E-mail address',
                     login      => 'Institutional Login',                      login      => 'Institutional Login',
                     sso        => 'SSO',                       sso        => 'SSO', 
                     none       => 'None',                      none       => 'None',
Line 1968  sub print_usermodification { Line 2815  sub print_usermodification {
 sub print_defaults {  sub print_defaults {
     my ($dom,$rowtotal) = @_;      my ($dom,$rowtotal) = @_;
     my @items = ('auth_def','auth_arg_def','lang_def','timezone_def',      my @items = ('auth_def','auth_arg_def','lang_def','timezone_def',
                  'datelocale_def');                   'datelocale_def','portal_def');
     my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);      my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
     my $titles = &defaults_titles();      my $titles = &defaults_titles($dom);
     my $rownum = 0;      my $rownum = 0;
     my ($datatable,$css_class);      my ($datatable,$css_class);
     foreach my $item (@items) {      foreach my $item (@items) {
Line 2007  sub print_defaults { Line 2854  sub print_defaults {
             my $includeempty = 1;              my $includeempty = 1;
             $datatable .= &Apache::loncommon::select_datelocale($item,$domdefaults{$item},undef,$includeempty);              $datatable .= &Apache::loncommon::select_datelocale($item,$domdefaults{$item},undef,$includeempty);
         } else {          } else {
               my $size;
               if ($item eq 'portal_def') {
                   $size = ' size="25"';
               }
             $datatable .= '<input type="text" name="'.$item.'" value="'.              $datatable .= '<input type="text" name="'.$item.'" value="'.
                           $domdefaults{$item}.'" />';                            $domdefaults{$item}.'"'.$size.' />';
         }          }
         $datatable .= '</td></tr>';          $datatable .= '</td></tr>';
         $rownum ++;          $rownum ++;
Line 2018  sub print_defaults { Line 2869  sub print_defaults {
 }  }
   
 sub defaults_titles {  sub defaults_titles {
       my ($dom) = @_;
     my %titles = &Apache::lonlocal::texthash (      my %titles = &Apache::lonlocal::texthash (
                    'auth_def'      => 'Default authentication type',                     'auth_def'      => 'Default authentication type',
                    'auth_arg_def'  => 'Default authentication argument',                     'auth_arg_def'  => 'Default authentication argument',
                    'lang_def'      => 'Default language',                     'lang_def'      => 'Default language',
                    'timezone_def'  => 'Default timezone',                     'timezone_def'  => 'Default timezone',
                    'datelocale_def' => 'Default locale for dates',                     'datelocale_def' => 'Default locale for dates',
                      'portal_def'     => 'Portal/Default URL',
                  );                   );
       if ($dom) {
           my $uprimary_id = &Apache::lonnet::domain($dom,'primary');
           my $uint_dom = &Apache::lonnet::internet_dom($uprimary_id);
           my $protocol = $Apache::lonnet::protocol{$uprimary_id};
           $protocol = 'http' if ($protocol ne 'https');
           if ($uint_dom) {
               $titles{'portal_def'} .= ' '.&mt('(for example: [_1])',$protocol.'://loncapa.'.
                                            $uint_dom);
           }
       }
     return (\%titles);      return (\%titles);
 }  }
   
Line 2035  sub print_scantronformat { Line 2898  sub print_scantronformat {
         %confhash);          %confhash);
     my $switchserver = &check_switchserver($dom,$confname);      my $switchserver = &check_switchserver($dom,$confname);
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                 default => 'Default scantron format file error',                  default => 'Default bubblesheet format file error',
                 custom  => 'Custom scantron format file error',                  custom  => 'Custom bubblesheet format file error',
              );               );
     my %scantronfiles = (      my %scantronfiles = (
         default => 'default.tab',          default => 'default.tab',
Line 2109  sub print_scantronformat { Line 2972  sub print_scantronformat {
                 }                  }
             }              }
         } else {          } else {
             $error{'default'} = &mt("Unable to copy default scantron formatfile to domain's RES space: [_1]",$switchserver);              $error{'default'} = &mt("Unable to copy default bubblesheet formatfile to domain's RES space: [_1]",$switchserver);
         }          }
     }      }
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
Line 2138  sub print_scantronformat { Line 3001  sub print_scantronformat {
                       '<span class="LC_nobreak">';                        '<span class="LC_nobreak">';
         if ($scantronurl) {          if ($scantronurl) {
             $datatable .= '<a href="'.$scantronurl.'" target="_blank">'.              $datatable .= '<a href="'.$scantronurl.'" target="_blank">'.
                           &mt('Default scantron format file').'</a>';                            &mt('Default bubblesheet format file').'</a>';
         } else {          } else {
             $datatable = &mt('File unavailable for display');              $datatable = &mt('File unavailable for display');
         }          }
Line 2165  sub print_scantronformat { Line 3028  sub print_scantronformat {
         } elsif ($scantronurl) {          } elsif ($scantronurl) {
             $datatable .= '<td><span class="LC_nobreak">'.              $datatable .= '<td><span class="LC_nobreak">'.
                           '<a href="'.$scantronurl.'" target="_blank">'.                            '<a href="'.$scantronurl.'" target="_blank">'.
                           &mt('Custom scantron format file').'</a><label>'.                            &mt('Custom bubblesheet format file').'</a><label>'.
                           '<input type="checkbox" name="scantronformat_del"'.                            '<input type="checkbox" name="scantronformat_del"'.
                           '" value="1" />'.&mt('Delete?').'</label></span></td>'.                            '" value="1" />'.&mt('Delete?').'</label></span></td>'.
                           '<td><span class="LC_nobreak">&nbsp;'.                            '<td><span class="LC_nobreak">&nbsp;'.
Line 2194  sub legacy_scantronformat { Line 3057  sub legacy_scantronformat {
             &publishlogo($r,'copy',$legacyfile,$dom,$confname,'scantron',              &publishlogo($r,'copy',$legacyfile,$dom,$confname,'scantron',
                          '','',$newfile);                           '','',$newfile);
         if ($result ne 'ok') {          if ($result ne 'ok') {
             $error = &mt("An error occurred publishing the [_1] scantron format file in RES space. Error was: [_2].",$newfile,$result);              $error = &mt("An error occurred publishing the [_1] bubblesheet format file in RES space. Error was: [_2].",$newfile,$result);
         }          }
     }      }
     return ($url,$error);      return ($url,$error);
Line 2208  sub print_coursecategories { Line 3071  sub print_coursecategories {
         my $toggle_cats_dom = ' checked="checked" ';          my $toggle_cats_dom = ' checked="checked" ';
         my $can_cat_crs = ' ';          my $can_cat_crs = ' ';
         my $can_cat_dom = ' checked="checked" ';          my $can_cat_dom = ' checked="checked" ';
           my $toggle_catscomm_comm = ' ';
           my $toggle_catscomm_dom = ' checked="checked" ';
           my $can_catcomm_comm = ' ';
           my $can_catcomm_dom = ' checked="checked" ';
   
         if (ref($settings) eq 'HASH') {          if (ref($settings) eq 'HASH') {
             if ($settings->{'togglecats'} eq 'crs') {              if ($settings->{'togglecats'} eq 'crs') {
                 $toggle_cats_crs = $toggle_cats_dom;                  $toggle_cats_crs = $toggle_cats_dom;
Line 2217  sub print_coursecategories { Line 3085  sub print_coursecategories {
                 $can_cat_crs = $can_cat_dom;                  $can_cat_crs = $can_cat_dom;
                 $can_cat_dom = ' ';                  $can_cat_dom = ' ';
             }              }
               if ($settings->{'togglecatscomm'} eq 'comm') {
                   $toggle_catscomm_comm = $toggle_catscomm_dom;
                   $toggle_catscomm_dom = ' ';
               }
               if ($settings->{'categorizecomm'} eq 'comm') {
                   $can_catcomm_comm = $can_catcomm_dom;
                   $can_catcomm_dom = ' ';
               }
         }          }
         my %title = &Apache::lonlocal::texthash (          my %title = &Apache::lonlocal::texthash (
                      togglecats => 'Show/Hide a course in the catalog',                       togglecats     => 'Show/Hide a course in catalog',
                      categorize    => 'Assign a category to a course',                       togglecatscomm => 'Show/Hide a community in catalog',
                        categorize     => 'Assign a category to a course',
                        categorizecomm => 'Assign a category to a community',
                     );                      );
         my %level = &Apache::lonlocal::texthash (          my %level = &Apache::lonlocal::texthash (
                      dom => 'Set in "Modify Course" (Domain)',                       dom  => 'Set in Domain',
                      crs => 'Set in "Modify Parameters" (Course)',                          crs  => 'Set in Course',
                        comm => 'Set in Community',
                     );                      );
         $datatable = '<tr class="LC_odd_row">'.          $datatable = '<tr class="LC_odd_row">'.
                   '<td>'.$title{'togglecats'}.'</td>'.                    '<td>'.$title{'togglecats'}.'</td>'.
Line 2240  sub print_coursecategories { Line 3119  sub print_coursecategories {
                   $can_cat_dom.' value="dom" />'.$level{'dom'}.'</label>&nbsp;'.                    $can_cat_dom.' value="dom" />'.$level{'dom'}.'</label>&nbsp;'.
                   '<label><input type="radio" name="categorize"'.                    '<label><input type="radio" name="categorize"'.
                   $can_cat_crs.'value="crs" />'.$level{'crs'}.'</label></span></td>'.                    $can_cat_crs.'value="crs" />'.$level{'crs'}.'</label></span></td>'.
                     '</tr><tr class="LC_odd_row">'.
                     '<td>'.$title{'togglecatscomm'}.'</td>'.
                     '<td class="LC_right_item"><span class="LC_nobreak"><label>'.
                     '<input type="radio" name="togglecatscomm"'.
                     $toggle_catscomm_dom.' value="dom" />'.$level{'dom'}.'</label>&nbsp;'.
                     '<label><input type="radio" name="togglecatscomm"'.
                     $toggle_catscomm_comm.' value="comm" />'.$level{'comm'}.'</label></span></td>'.
                     '</tr><tr>'.
                     '<td>'.$title{'categorizecomm'}.'</td>'.
                     '<td class="LC_right_item"><span class="LC_nobreak">'.
                     '<label><input type="radio" name="categorizecomm"'.
                     $can_catcomm_dom.' value="dom" />'.$level{'dom'}.'</label>&nbsp;'.
                     '<label><input type="radio" name="categorizecomm"'.
                     $can_catcomm_comm.'value="comm" />'.$level{'comm'}.'</label></span></td>'.
                   '</tr>';                    '</tr>';
         $$rowtotal += 2;          $$rowtotal += 4;
     } else {      } else {
         my $css_class;          my $css_class;
         my $itemcount = 1;          my $itemcount = 1;
Line 2263  sub print_coursecategories { Line 3156  sub print_coursecategories {
                 if (ref($cats[0]) eq 'ARRAY') {                  if (ref($cats[0]) eq 'ARRAY') {
                     my $numtop = @{$cats[0]};                      my $numtop = @{$cats[0]};
                     my $maxnum = $numtop;                      my $maxnum = $numtop;
                     if ((!grep(/^instcode$/,@{$cats[0]})) || ($cathash->{'instcode::0'} eq '')) {                      my %default_names = (
                             instcode    => &mt('Official courses'),
                             communities => &mt('Communities'),
                       );
   
                       if ((!grep(/^instcode$/,@{$cats[0]})) || 
                           ($cathash->{'instcode::0'} eq '') ||
                           (!grep(/^communities$/,@{$cats[0]})) || 
                           ($cathash->{'communities::0'} eq '')) {
                         $maxnum ++;                          $maxnum ++;
                     }                      }
                     my $lastidx;                      my $lastidx;
Line 2284  sub print_coursecategories { Line 3185  sub print_coursecategories {
                             $datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>';                              $datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>';
                         }                          }
                         $datatable .= '</select></td><td>';                          $datatable .= '</select></td><td>';
                         if ($parent eq 'instcode') {                          if ($parent eq 'instcode' || $parent eq 'communities') {
                             $datatable .=  '<span class="LC_nobreak">'.&mt('Official courses')                              $datatable .=  '<span class="LC_nobreak">'
                                            .'</span><br /><span class="LC_nobreak">('                                             .$default_names{$parent}.'</span>';
                                            .&mt('with institutional codes').')</span></td>'                              if ($parent eq 'instcode') {
                                            .'<td'.$colattrib.'><span class="LC_nobreak"><label><input type="radio" name="instcode" value="1" checked="checked" />'                                  $datatable .= '<br /><span class="LC_nobreak">('
                                             .&mt('Display').'</label>&nbsp;'                                                .&mt('with institutional codes')
                                             .'<label><input type="radio" name="instcode" value="0" />'                                                .')</span></td><td'.$colattrib.'>';
                                             .&mt('Do not display').'</label></span></td>';                              } else {
                                   $datatable .= '<table><tr><td>';
                               }
                               $datatable .= '<span class="LC_nobreak">'
                                             .'<label><input type="radio" name="'
                                             .$parent.'" value="1" checked="checked" />'
                                             .&mt('Display').'</label>';
                               if ($parent eq 'instcode') {
                                   $datatable .= '&nbsp;';
                               } else {
                                   $datatable .= '</span></td></tr><tr><td>'
                                                 .'<span class="LC_nobreak">';
                               }
                               $datatable .= '<label><input type="radio" name="'
                                             .$parent.'" value="0" />'
                                             .&mt('Do not display').'</label></span>';
                               if ($parent eq 'communities') {
                                   $datatable .= '</td></tr></table>';
                               }
                               $datatable .= '</td>';
                         } else {                          } else {
                             $datatable .= $parent                              $datatable .= $parent
                                           .'&nbsp;<label><input type="checkbox" name="deletecategory" '                                            .'&nbsp;<label><input type="checkbox" name="deletecategory" '
Line 2319  sub print_coursecategories { Line 3239  sub print_coursecategories {
                                   .'<input type="text" size="20" name="addcategory_name" value="" /></td>'                                    .'<input type="text" size="20" name="addcategory_name" value="" /></td>'
                                   .'</tr>'."\n";                                    .'</tr>'."\n";
                     $itemcount ++;                      $itemcount ++;
                     if ((!grep(/^instcode$/,@{$cats[0]})) || ($cathash->{'instcode::0'} eq '')) {                      foreach my $default ('instcode','communities') {
                         $css_class = $itemcount%2?' class="LC_odd_row"':'';                          if ((!grep(/^\Q$default\E$/,@{$cats[0]})) || ($cathash->{$default.'::0'} eq '')) {
                         my $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','instcode_pos','$lastidx'".');"';                              $css_class = $itemcount%2?' class="LC_odd_row"':'';
                         $datatable .= '<tr><td colspan="'.$maxdepth.'" class="LC_row_separator"></td></tr><tr '.$css_class.'><td>'.                              my $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','$default"."_pos','$lastidx'".');"';
                                       '<span class="LC_nobreak"><select name="instcode_pos"'.$chgstr.'>';                              $datatable .= '<tr><td colspan="'.$maxdepth.'" class="LC_row_separator"></td></tr><tr '.$css_class.'><td>'.
                         for (my $k=0; $k<=$maxnum; $k++) {                                            '<span class="LC_nobreak"><select name="'.$default.'_pos"'.$chgstr.'>';
                             my $vpos = $k+1;                              for (my $k=0; $k<=$maxnum; $k++) {
                             my $selstr;                                  my $vpos = $k+1;
                             if ($k == $maxnum) {                                  my $selstr;
                                 $selstr = ' selected="selected" ';                                  if ($k == $maxnum) {
                                       $selstr = ' selected="selected" ';
                                   }
                                   $datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>';
                             }                              }
                             $datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>';                              $datatable .= '</select></span></td>'.
                                             '<td><span class="LC_nobreak">'.
                                             $default_names{$default}.'</span>';
                               if ($default eq 'instcode') {
                                   $datatable .= '<br /><span class="LC_nobreak">(' 
                                                 .&mt('with institutional codes').')</span>';
                               }
                               $datatable .= '</td>'
                                             .'<td><span class="LC_nobreak"><label><input type="radio" name="'.$default.'" value="1" />'
                                             .&mt('Display').'</label>&nbsp;'
                                             .'<label><input type="radio" name="'.$default.'" value="0" checked="checked"/>'
                                             .&mt('Do not display').'</label></span></td></tr>';
                         }                          }
                         $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 {              } else {
Line 2402  sub print_serverstatuses { Line 3329  sub print_serverstatuses {
 sub serverstatus_pages {  sub serverstatus_pages {
     return ('userstatus','lonstatus','loncron','server-status','codeversions',      return ('userstatus','lonstatus','loncron','server-status','codeversions',
             'clusterstatus','metadata_keywords','metadata_harvest',              'clusterstatus','metadata_keywords','metadata_harvest',
             'takeoffline','takeonline','showenv');              'takeoffline','takeonline','showenv','toggledebug');
 }  }
   
 sub coursecategories_javascript {  sub coursecategories_javascript {
Line 2427  sub coursecategories_javascript { Line 3354  sub coursecategories_javascript {
         $jstext  = '    var categories = Array(1);'."\n".          $jstext  = '    var categories = Array(1);'."\n".
                    '    categories[0] = Array("instcode_pos");'."\n";                      '    categories[0] = Array("instcode_pos");'."\n"; 
     }      }
       my $instcode_reserved = &mt('The name: "instcode" is a reserved category');
       my $communities_reserved = &mt('The name: "communities" is a reserved category');
       my $choose_again = '\\n'.&mt('Please use a different name for the new top level category'); 
     $output = <<"ENDSCRIPT";      $output = <<"ENDSCRIPT";
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
 function reorderCats(form,parent,item,idx) {  function reorderCats(form,parent,item,idx) {
     var changedVal;      var changedVal;
 $jstext  $jstext
Line 2485  $jstext Line 3416  $jstext
     }      }
     return;      return;
 }  }
   
   function categoryCheck(form) {
       if (form.elements['addcategory_name'].value == 'instcode') {
           alert('$instcode_reserved\\n$choose_again');
           return false;
       }
       if (form.elements['addcategory_name'].value == 'communities') {
           alert('$communities_reserved\\n$choose_again');
           return false;
       }
       return true;
   }
   
   // ]]>
 </script>  </script>
   
 ENDSCRIPT  ENDSCRIPT
Line 2493  ENDSCRIPT Line 3438  ENDSCRIPT
   
 sub initialize_categories {  sub initialize_categories {
     my ($itemcount) = @_;      my ($itemcount) = @_;
     my $datatable;      my ($datatable,$css_class,$chgstr);
     my $css_class = $itemcount%2?' class="LC_odd_row"':'';      my %default_names = (
     my $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','instcode_pos','0'".');"';                        instcode    => 'Official courses (with institutional codes)',
                         communities => 'Communities',
     $datatable = '<tr '.$css_class.'><td><span class="LC_nobreak">'                          );
                  .'<select name="instcode_pos"><option value="0" selected="selected">1</option>'      my $select0 = ' selected="selected"';
                  .'<option value="1">2</option></select>&nbsp;'      my $select1 = '';
                  .&mt('Official courses (with institutional codes)')      foreach my $default ('instcode','communities') {
                  .'</span></td><td><span class="LC_nobreak">'          $css_class = $itemcount%2?' class="LC_odd_row"':'';
                  .'<label><input type="radio" name="instcode" value="1" checked="checked" />'          $chgstr = ' onchange="javascript:reorderCats(this.form,'."'',$default"."_pos','0'".');"';
                  .&mt('Display').'</label>&nbsp;<label>'          if ($default eq 'communities') {
                  .'<input type="radio" name="instcode" value="0" />'.&mt('Do not display')              $select1 = $select0;
               $select0 = '';
           }
           $datatable .= '<tr '.$css_class.'><td><span class="LC_nobreak">'
                        .'<select name="'.$default.'_pos">'
                        .'<option value="0"'.$select0.'>1</option>'
                        .'<option value="1"'.$select1.'>2</option>'
                        .'<option value="2">3</option></select>&nbsp;'
                        .$default_names{$default}
                        .'</span></td><td><span class="LC_nobreak">'
                        .'<label><input type="radio" name="'.$default.'" value="1" checked="checked" />'
                        .&mt('Display').'</label>&nbsp;<label>'
                        .'<input type="radio" name="'.$default.'" value="0" />'.&mt('Do not display')
                  .'</label></span></td></tr>';                   .'</label></span></td></tr>';
     $itemcount ++;          $itemcount ++;
       }
     $css_class = $itemcount%2?' class="LC_odd_row"':'';      $css_class = $itemcount%2?' class="LC_odd_row"':'';
     $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','addcategory_pos','0'".');"';      $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','addcategory_pos','0'".');"';
     $datatable .= '<tr '.$css_class.'><td><span class="LC_nobreak">'      $datatable .= '<tr '.$css_class.'><td><span class="LC_nobreak">'
                   .'<select name="addcategory_pos"'.$chgstr.'><option value="0">1</option>'                    .'<select name="addcategory_pos"'.$chgstr.'>'
                   .'<option value="1" selected="selected">2</option></select>&nbsp;'                    .'<option value="0">1</option>'
                     .'<option value="1">2</option>'
                     .'<option value="2" selected="selected">3</option></select>&nbsp;'
                   .&mt('Add category').'</td><td>'.&mt('Name:')                    .&mt('Add category').'</td><td>'.&mt('Name:')
                   .'&nbsp;<input type="text" size="20" name="addcategory_name" value="" /></td></tr>';                    .'&nbsp;<input type="text" size="20" name="addcategory_name" value="" /></td></tr>';
     return $datatable;      return $datatable;
Line 2672  sub modifiable_userdata_row { Line 3632  sub modifiable_userdata_row {
     return $output;      return $output;
 }  }
   
 sub users_cansearch_row {  sub insttypes_row {
     my ($settings,$types,$usertypes,$dom,$numinrow,$othertitle) = @_;      my ($settings,$types,$usertypes,$dom,$numinrow,$othertitle,$context) = @_;
       my %lt = &Apache::lonlocal::texthash (
                         cansearch => 'Users allowed to search',
                         statustocreate => 'Institutional affiliation(s) able to create own account (login/SSO)',
                         lockablenames => 'User preference to lock name',
                );
       my $showdom;
       if ($context eq 'cansearch') {
           $showdom = ' ('.$dom.')';
       }
     my $output =  '<tr class="LC_odd_row">'.      my $output =  '<tr class="LC_odd_row">'.
                   '<td>'.&mt('Users allowed to search').' ('.$dom.')'.                    '<td>'.$lt{$context}.$showdom.
                   '</td><td class="LC_left_item" colspan="2"><table>';                    '</td><td class="LC_left_item" colspan="2"><table>';
     my $rem;      my $rem;
     if (ref($types) eq 'ARRAY') {      if (ref($types) eq 'ARRAY') {
Line 2689  sub users_cansearch_row { Line 3658  sub users_cansearch_row {
                     $output .= '<tr>';                      $output .= '<tr>';
                 }                  }
                 my $check = ' ';                  my $check = ' ';
                 if (ref($settings->{'cansearch'}) eq 'ARRAY') {                  if (ref($settings) eq 'HASH') {
                     if (grep(/^\Q$types->[$i]\E$/,@{$settings->{'cansearch'}})) {                      if (ref($settings->{$context}) eq 'ARRAY') {
                           if (grep(/^\Q$types->[$i]\E$/,@{$settings->{$context}})) {
                               $check = ' checked="checked" ';
                           }
                       } elsif ($context eq 'statustocreate') {
                         $check = ' checked="checked" ';                          $check = ' checked="checked" ';
                     }                      }
                 }                  }
                 $output .= '<td class="LC_left_item">'.                  $output .= '<td class="LC_left_item">'.
                            '<span class="LC_nobreak"><label>'.                             '<span class="LC_nobreak"><label>'.
                            '<input type="checkbox" name="cansearch" '.                             '<input type="checkbox" name="'.$context.'" '.
                            'value="'.$types->[$i].'"'.$check.'/>'.                             'value="'.$types->[$i].'"'.$check.'/>'.
                            $usertypes->{$types->[$i]}.'</label></span></td>';                             $usertypes->{$types->[$i]}.'</label></span></td>';
             }              }
         }          }
          
         $rem = @{$types}%($numinrow);          $rem = @{$types}%($numinrow);
     }      }
     my $colsleft = $numinrow - $rem;      my $colsleft = $numinrow - $rem;
       if (($rem == 0) && (@{$types} > 0)) {
           $output .= '<tr>';
       }
     if ($colsleft > 1) {      if ($colsleft > 1) {
         $output .= '<td colspan="'.$colsleft.'" class="LC_left_item">';          $output .= '<td colspan="'.$colsleft.'" class="LC_left_item">';
     } else {      } else {
         $output .= '<td class="LC_left_item">';          $output .= '<td class="LC_left_item">';
     }      }
     my $defcheck = ' ';      my $defcheck = ' ';
     if (ref($settings->{'cansearch'}) eq 'ARRAY') {      if (ref($settings) eq 'HASH') {  
         if (grep(/^default$/,@{$settings->{'cansearch'}})) {          if (ref($settings->{$context}) eq 'ARRAY') {
               if (grep(/^default$/,@{$settings->{$context}})) {
                   $defcheck = ' checked="checked" ';
               }
           } elsif ($context eq 'statustocreate') {
             $defcheck = ' checked="checked" ';              $defcheck = ' checked="checked" ';
         }          }
     }      }
     $output .= '<span class="LC_nobreak"><label>'.      $output .= '<span class="LC_nobreak"><label>'.
                '<input type="checkbox" name="cansearch" '.                 '<input type="checkbox" name="'.$context.'" '.
                'value="default"'.$defcheck.'/>'.                 'value="default"'.$defcheck.'/>'.
                $othertitle.'</label></span></td>'.                 $othertitle.'</label></span></td>'.
                '</tr></table></td></tr>';                 '</tr></table></td></tr>';
Line 2802  sub modify_login { Line 3781  sub modify_login {
                   newuser => 'Link for visitors to create a user account',                    newuser => 'Link for visitors to create a user account',
                   loginheader => 'Log-in box header');                    loginheader => 'Log-in box header');
     my @offon = ('off','on');      my @offon = ('off','on');
       my %curr_loginvia;
       if (ref($domconfig{login}) eq 'HASH') {
           if (ref($domconfig{login}{loginvia}) eq 'HASH') {
               foreach my $lonhost (keys(%{$domconfig{login}{loginvia}})) {
                   $curr_loginvia{$lonhost} = $domconfig{login}{loginvia}{$lonhost};
               }
           }
       }
     my %loginhash;      my %loginhash;
     ($errors,%colchanges) = &modify_colors($r,$dom,$confname,['login'],      ($errors,%colchanges) = &modify_colors($r,$dom,$confname,['login'],
                                            \%domconfig,\%loginhash);                                             \%domconfig,\%loginhash);
Line 2814  sub modify_login { Line 3801  sub modify_login {
         $colchgtext = &display_colorchgs($dom,\%colchanges,['login'],          $colchgtext = &display_colorchgs($dom,\%colchanges,['login'],
                                          \%loginhash);                                           \%loginhash);
     }      }
   
       my %servers = &dom_servers($dom);
       my @loginvia_attribs = ('serverpath','custompath','exempt');
       if (keys(%servers) > 1) {
           foreach my $lonhost (keys(%servers)) {
               next if ($env{'form.'.$lonhost.'_server'} eq $lonhost);
               if (ref($curr_loginvia{$lonhost}) eq 'HASH') {
                   if ($env{'form.'.$lonhost.'_server'} eq $curr_loginvia{$lonhost}{'server'}) {
                       $loginhash{login}{loginvia}{$lonhost}{'server'} = $curr_loginvia{$lonhost}{'server'};
                   } elsif ($curr_loginvia{$lonhost}{'server'} ne '') {
                       if (defined($servers{$env{'form.'.$lonhost.'_server'}})) {
                           $loginhash{login}{loginvia}{$lonhost}{'server'} = $env{'form.'.$lonhost.'_server'};
                           $changes{'loginvia'}{$lonhost} = 1;
                       } else {
                           $loginhash{login}{loginvia}{$lonhost}{'server'} = '';
                           $changes{'loginvia'}{$lonhost} = 1;
                       }
                   } else {
                       if (defined($servers{$env{'form.'.$lonhost.'_server'}})) {
                           $loginhash{login}{loginvia}{$lonhost}{'server'} = $env{'form.'.$lonhost.'_server'};
                           $changes{'loginvia'}{$lonhost} = 1;
                       }
                   }
                   if ($loginhash{login}{loginvia}{$lonhost}{'server'} eq '') {
                       foreach my $item (@loginvia_attribs) {
                           $loginhash{login}{loginvia}{$lonhost}{$item} = '';
                       }
                   } else {
                       foreach my $item (@loginvia_attribs) {
                           my $new = $env{'form.'.$lonhost.'_'.$item};
                           if (($item eq 'serverpath') && ($new eq 'custom')) {
                               $env{'form.'.$lonhost.'_custompath'} =~ s/\s+//g;
                               if ($env{'form.'.$lonhost.'_custompath'} eq '') {
                                   $new = '/';
                               }
                           }
                           if (($item eq 'custompath') && 
                               ($env{'form.'.$lonhost.'_serverpath'} ne 'custom')) {
                               $new = '';
                           }
                           if ($new ne $curr_loginvia{$lonhost}{$item}) {
                               $changes{'loginvia'}{$lonhost} = 1;
                           }
                           if ($item eq 'exempt') {
                               $new =~ s/^\s+//;
                               $new =~ s/\s+$//;
                               my @poss_ips = split(/\s*[,:]\s*/,$new);
                               my @okips;
                               foreach my $ip (@poss_ips) {
                                   if ($ip =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/) {
                                       if (($1 <= 255) && ($2 <= 255) && ($3 <= 255) && ($4 <= 255)) {
                                           push(@okips,$ip); 
                                       }
                                   }
                               }
                               if (@okips > 0) {
                                   $new = join(',',@okips); 
                               } else {
                                   $new = ''; 
                               }
                           }
   
                           $loginhash{login}{loginvia}{$lonhost}{$item} = $new;
                       }
                   }
               } else {
                   if (defined($servers{$env{'form.'.$lonhost.'_server'}})) {
                       $loginhash{login}{loginvia}{$lonhost}{'server'} = $env{'form.'.$lonhost.'_server'};
                       $changes{'loginvia'}{$lonhost} = 1;
                       foreach my $item (@loginvia_attribs) {
                           my $new = $env{'form.'.$lonhost.'_'.$item};
                           if (($item eq 'serverpath') && ($new eq 'custom')) {
                               if ($env{'form.'.$lonhost.'_custompath'} eq '') {
                                   $new = '/';
                               }
                           }
                           if (($item eq 'custompath') && 
                               ($env{'form.'.$lonhost.'_serverpath'} ne 'custom')) {
                               $new = '';
                           }
                           $loginhash{login}{loginvia}{$lonhost}{$item} = $new;
                       }
                   }
               }
           }
       }
   
     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') {
Line 2845  sub modify_login { Line 3919  sub modify_login {
                     }                      }
                 }                  }
             }              }
             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);              &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))) {
                 if ($item eq 'loginheader') {                  if ($item eq 'loginvia') {
                     $resulttext .= '<li>'.&mt("$title{$item} set to $env{'form.loginheader'}").'</li>';                      if (ref($changes{$item}) eq 'HASH') {
                           $resulttext .= '<li>'.&mt('Log-in page availability:').'<ul>';
                           foreach my $lonhost (sort(keys(%{$changes{$item}}))) {
                               if (defined($servers{$loginhash{login}{loginvia}{$lonhost}{'server'}})) {
                                   if (ref($loginhash{login}{loginvia}{$lonhost}) eq 'HASH') {
                                       my $protocol = $Apache::lonnet::protocol{$env{'form.'.$lonhost.'_server'}};
                                       $protocol = 'http' if ($protocol ne 'https');
                                       my $target = $protocol.'://'.$servers{$env{'form.'.$lonhost.'_server'}};
   
                                       if ($loginhash{login}{loginvia}{$lonhost}{'serverpath'} eq 'custom') {
                                           $target .= $loginhash{login}{loginvia}{$lonhost}{'custompath'};
                                       } else {
                                           $target .= $loginhash{login}{loginvia}{$lonhost}{'serverpath'}; 
                                       }
                                       $resulttext .= '<li>'.&mt('Server: [_1] log-in page redirects to [_2].',$servers{$lonhost},'<a href="'.$target.'">'.$target.'</a>');
                                       if ($loginhash{login}{loginvia}{$lonhost}{'exempt'} ne '') {
                                           $resulttext .= '&nbsp;'.&mt('No redirection for clients from following IPs:').'&nbsp;'.$loginhash{login}{loginvia}{$lonhost}{'exempt'};
                                       }
                                       $resulttext .= '</li>';
                                   } else {
                                       $resulttext .= '<li>'.&mt('Server: [_1] has standard log-in page.',$lonhost).'</li>';
                                   }
                               } else {
                                   $resulttext .= '<li>'.&mt('Server: [_1] has standard log-in page.',$servers{$lonhost}).'</li>';
                               }
                           }
                           $resulttext .= '</ul></li>';
                       }
                 } else {                  } else {
                     $resulttext .= '<li>'.&mt("$title{$item} set to $offon[$env{'form.'.$item}]").'</li>';                      $resulttext .= '<li>'.&mt("$title{$item} set to $offon[$env{'form.'.$item}]").'</li>';
                 }                  }
Line 2887  sub color_font_choices { Line 3980  sub color_font_choices {
             links => "Link colors",              links => "Link colors",
             images => "Images",              images => "Images",
             font => "Font color",              font => "Font color",
               fontmenu => "Font Menu",
             pgbg => "Page",              pgbg => "Page",
             tabbg => "Header",              tabbg => "Header",
             sidebg => "Border",              sidebg => "Border",
Line 2944  sub modify_colors { Line 4038  sub modify_colors {
             @logintext = ('textcol','bgcol');              @logintext = ('textcol','bgcol');
         } else {          } else {
             %choices = &color_font_choices();              %choices = &color_font_choices();
               $confhash->{$role}{'fontmenu'} = $env{'form.'.$role.'_fontmenu'};
         }          }
         if ($role eq 'login') {          if ($role eq 'login') {
             @images = ('img','logo','domlogo','login');              @images = ('img','logo','domlogo','login');
Line 3066  sub modify_colors { Line 4161  sub modify_colors {
                         $changes{$role}{'font'} = 1;                          $changes{$role}{'font'} = 1;
                     }                      }
                 }                  }
                   if ($role ne 'login') {
                       if ($domconfig->{$role}{'fontmenu'} ne '') {
                           if ($confhash->{$role}{'fontmenu'} ne $domconfig->{$role}{'fontmenu'}) {
                               $changes{$role}{'fontmenu'} = 1;
                           }
                       } else {
                           if ($confhash->{$role}{'fontmenu'}) {
                               $changes{$role}{'fontmenu'} = 1;
                           }
                       }
                   }
                 foreach my $item (@bgs) {                  foreach my $item (@bgs) {
                     if ($domconfig->{$role}{$item} ne '') {                      if ($domconfig->{$role}{$item} ne '') {
                         if ($confhash->{$role}{$item} ne $domconfig->{$role}{$item}) {                          if ($confhash->{$role}{$item} ne $domconfig->{$role}{$item}) {
Line 3495  sub check_switchserver { Line 4601  sub check_switchserver {
     return $switchserver;      return $switchserver;
 }  }
   
 sub javascript_set_colnums {  sub modify_quotas {
     return <<END;      my ($dom,$action,%domconfig) = @_;
 function setDisplayColumns() {      my ($context,@usertools,@options,%validations,%titles,%confhash,%toolshash,
     if (document.pickactions.width.value > 1100) {          %limithash,$toolregexp,%conditions,$resulttext,%changes);
         document.pickactions.numcols[1].checked = true;      if ($action eq 'quotas') {
           $context = 'tools'; 
       } else { 
           $context = $action;
       }
       if ($context eq 'requestcourses') {
           @usertools = ('official','unofficial','community');
           @options =('norequest','approval','validate','autolimit');
           %validations = &Apache::lonnet::auto_courserequest_checks($dom);
           %titles = &courserequest_titles();
           $toolregexp = join('|',@usertools);
           %conditions = &courserequest_conditions();
     } else {      } else {
         document.pickactions.numcols[0].checked = true;          @usertools = ('aboutme','blog','portfolio');
           %titles = &tool_titles();
     }      }
 }  
 END  
 }  
   
 sub modify_quotas {  
     my ($dom,%domconfig) = @_;  
     my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);      my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
     my ($resulttext,%changes);  
     my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);      my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
     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 ($context eq 'requestcourses') {
             $confhash{'defaultquota'}{$1} = $env{$key};              if ($key =~ /^form\.crsreq_($toolregexp)_(.+)$/) {
         } elsif ($key =~ /^form\.tools_(.+)$/) {                  my $item = $1;
             @{$toolshash{$1}} = &Apache::loncommon::get_env_multiple($key);                  my $type = $2;
                   if ($type =~ /^limit_(.+)/) {
                       $limithash{$item}{$1} = $env{$key};
                   } else {
                       $confhash{$item}{$type} = $env{$key};
                   }
               }
           } else {
               if ($key =~ /^form\.quota_(.+)$/) {
                   $confhash{'defaultquota'}{$1} = $env{$key};
               }
               if ($key =~ /^form\.\Q$context\E_(.+)$/) {
                   @{$toolshash{$1}} = &Apache::loncommon::get_env_multiple($key);
               }
         }          }
     }      }
     $confhash{'defaultquota'}{'default'} = $env{'form.defaultquota'};      if ($context eq 'requestcourses') {
           my @approvalnotify = &Apache::loncommon::get_env_multiple('form.reqapprovalnotify');
           @approvalnotify = sort(@approvalnotify);
           $confhash{'notify'}{'approval'} = join(',',@approvalnotify);
           if (ref($domconfig{$action}) eq 'HASH') {
               if (ref($domconfig{$action}{'notify'}) eq 'HASH') {
                   if ($domconfig{$action}{'notify'}{'approval'} ne $confhash{'notify'}{'approval'}) {
                       $changes{'notify'}{'approval'} = 1;
                   }
               } else {
                   if ($domconfig{$action}{'notify'}{'approval'}) {
                       $changes{'notify'}{'approval'} = 1;
                   }
               }
           } else {
               if ($domconfig{$action}{'notify'}{'approval'}) {
                   $changes{'notify'}{'approval'} = 1;
               }
           }
       } else {
           $confhash{'defaultquota'}{'default'} = $env{'form.defaultquota'};
       }
     foreach my $item (@usertools) {      foreach my $item (@usertools) {
         foreach my $type (@{$types},'default','_LC_adv') {          foreach my $type (@{$types},'default','_LC_adv') {
             if (grep(/^\Q$type\E$/,@{$toolshash{$item}})) {              my $unset; 
                 $confhash{$item}{$type} = 1;              if ($context eq 'requestcourses') {
                   $unset = '0';
                   if ($type eq '_LC_adv') {
                       $unset = '';
                   }
                   if ($confhash{$item}{$type} eq 'autolimit') {
                       $confhash{$item}{$type} .= '=';
                       unless ($limithash{$item}{$type} =~ /\D/) {
                           $confhash{$item}{$type} .= $limithash{$item}{$type};
                       }
                   }
             } else {              } else {
                 $confhash{$item}{$type} = 0;                  if (grep(/^\Q$type\E$/,@{$toolshash{$item}})) {
                       $confhash{$item}{$type} = 1;
                   } else {
                       $confhash{$item}{$type} = 0;
                   }
             }              }
             if (ref($domconfig{'quotas'}) eq 'HASH') {              if (ref($domconfig{$action}) eq 'HASH') {
                 if (ref($domconfig{'quotas'}{$item}) eq 'HASH') {                  if (ref($domconfig{$action}{$item}) eq 'HASH') {
                     if ($domconfig{'quotas'}{$item}{$type} ne $confhash{$item}{$type}) {                      if ($domconfig{$action}{$item}{$type} ne $confhash{$item}{$type}) {
                         $changes{$item}{$type} = 1;                          $changes{$item}{$type} = 1;
                     }                      }
                 } else {                  } else {
                     if (!$confhash{$item}{$type}) {                      if ($context eq 'requestcourses') {
                         $changes{$item}{$type} = 1;                          if ($confhash{$item}{$type} ne $unset) {
                               $changes{$item}{$type} = 1;
                           }
                       } else {
                           if (!$confhash{$item}{$type}) {
                               $changes{$item}{$type} = 1;
                           }
                     }                      }
                 }                  }
             } else {              } else {
                 if (!$confhash{$item}{$type}) {                  if ($context eq 'requestcourses') {
                     $changes{$item}{$type} = 1;                      if ($confhash{$item}{$type} ne $unset) {
                           $changes{$item}{$type} = 1;
                       }
                   } else {
                       if (!$confhash{$item}{$type}) {
                           $changes{$item}{$type} = 1;
                       }
                 }                  }
             }              }
         }          }
     }      }
     if (ref($domconfig{'quotas'}) eq 'HASH') {      unless ($context eq 'requestcourses') {
         if (ref($domconfig{'quotas'}{'defaultquota'}) eq 'HASH') {          if (ref($domconfig{'quotas'}) eq 'HASH') {
             foreach my $key (keys(%{$domconfig{'quotas'}{'defaultquota'}})) {              if (ref($domconfig{'quotas'}{'defaultquota'}) eq 'HASH') {
                 if (exists($confhash{'defaultquota'}{$key})) {                  foreach my $key (keys(%{$domconfig{'quotas'}{'defaultquota'}})) {
                     if ($confhash{'defaultquota'}{$key} ne $domconfig{'quotas'}{'defaultquota'}{$key}) {                      if (exists($confhash{'defaultquota'}{$key})) {
                         $changes{'defaultquota'}{$key} = 1;                          if ($confhash{'defaultquota'}{$key} ne $domconfig{'quotas'}{'defaultquota'}{$key}) {
                               $changes{'defaultquota'}{$key} = 1;
                           }
                       } else {
                           $confhash{'defaultquota'}{$key} = $domconfig{'quotas'}{'defaultquota'}{$key};
                     }                      }
                 } else {  
                     $confhash{'defaultquota'}{$key} = $domconfig{'quotas'}{'defaultquota'}{$key};  
                 }                  }
             }              } else {
         } else {                  foreach my $key (keys(%{$domconfig{'quotas'}})) {
             foreach my $key (keys(%{$domconfig{'quotas'}})) {                      if (exists($confhash{'defaultquota'}{$key})) {
                 if (exists($confhash{'defaultquota'}{$key})) {                          if ($confhash{'defaultquota'}{$key} ne $domconfig{'quotas'}{$key}) {
                     if ($confhash{'defaultquota'}{$key} ne $domconfig{'quotas'}{$key}) {                              $changes{'defaultquota'}{$key} = 1;
                         $changes{'defaultquota'}{$key} = 1;                          }
                       } else {
                           $confhash{'defaultquota'}{$key} = $domconfig{'quotas'}{$key};
                     }                      }
                 } else {  
                     $confhash{'defaultquota'}{$key} = $domconfig{'quotas'}{$key};  
                 }                  }
             }              }
         }          }
     }          if (ref($confhash{'defaultquota'}) eq 'HASH') {
     if (ref($confhash{'defaultquota'}) eq 'HASH') {              foreach my $key (keys(%{$confhash{'defaultquota'}})) {
         foreach my $key (keys(%{$confhash{'defaultquota'}})) {                  if (ref($domconfig{'quotas'}) eq 'HASH') {
             if (ref($domconfig{'quotas'}) eq 'HASH') {                      if (ref($domconfig{'quotas'}{'defaultquota'}) eq 'HASH') {
                 if (ref($domconfig{'quotas'}{'defaultquota'}) eq 'HASH') {                          if (!exists($domconfig{'quotas'}{'defaultquota'}{$key})) {
                     if (!exists($domconfig{'quotas'}{'defaultquota'}{$key})) {                              $changes{'defaultquota'}{$key} = 1;
                         $changes{'defaultquota'}{$key} = 1;                          }
                       } else {
                           if (!exists($domconfig{'quotas'}{$key})) {
                               $changes{'defaultquota'}{$key} = 1;
                           }
                     }                      }
                 } else {                  } else {
                     if (!exists($domconfig{'quotas'}{$key})) {                      $changes{'defaultquota'}{$key} = 1;
                         $changes{'defaultquota'}{$key} = 1;  
                     }  
                 }                  }
             } else {  
                 $changes{'defaultquota'}{$key} = 1;  
             }              }
         }          }
     }      }
Line 3593  sub modify_quotas { Line 4763  sub modify_quotas {
     }      }
         
     my %quotahash = (      my %quotahash = (
                       quotas => { %confhash }                        $action => { %confhash }
                     );                      );
     my $putresult = &Apache::lonnet::put_dom('configuration',\%quotahash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%quotahash,
                                              $dom);                                               $dom);
Line 3603  sub modify_quotas { Line 4773  sub modify_quotas {
             &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);              &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
   
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             if (ref($changes{'defaultquota'}) eq 'HASH') {              unless ($context eq 'requestcourses') {
                 $resulttext .= '<li>'.&mt('Portfolio default quotas').'<ul>';                  if (ref($changes{'defaultquota'}) eq 'HASH') {
                 foreach my $type (@{$types},'default') {                      $resulttext .= '<li>'.&mt('Portfolio default quotas').'<ul>';
                     if (defined($changes{'defaultquota'}{$type})) {                      foreach my $type (@{$types},'default') {
                         my $typetitle = $usertypes->{$type};                          if (defined($changes{'defaultquota'}{$type})) {
                         if ($type eq 'default') {                              my $typetitle = $usertypes->{$type};
                             $typetitle = $othertitle;                              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,$confhash{'defaultquota'}{$type}).'</li>';  
                     }                      }
                       $resulttext .= '</ul></li>';
                 }                  }
                 $resulttext .= '</ul></li>';  
             }              }
             my %newenv;              my %newenv;
             foreach my $item (@usertools) {              foreach my $item (@usertools) {
                 if (ref($changes{$item}) eq 'HASH') {                  if (ref($changes{$item}) eq 'HASH') {
                     my $newacc =                      my $newacc = 
                         &Apache::lonnet::usertools_access($env{'user.name'},                          &Apache::lonnet::usertools_access($env{'user.name'},
                                                           $env{'user.domain'},                                                            $env{'user.domain'},
                                                           $item,'reload');                                                            $item,'reload',$context);
                     if ($env{'environment.availabletools.'.$item} ne $newacc) {                      if ($context eq 'requestcourses') {
                           if ($env{'environment.canrequest.'.$item} ne $newacc) {
                               $newenv{'environment.canrequest.'.$item} = $newacc;
                           }
                       } else {
                           if ($env{'environment.availabletools.'.$item} ne $newacc) { 
                             $newenv{'environment.availabletools.'.$item} = $newacc;                              $newenv{'environment.availabletools.'.$item} = $newacc;
                           }
                     }                      }
                     $resulttext .= '<li>'.$titles{$item}.'<ul>';                      $resulttext .= '<li>'.$titles{$item}.'<ul>';
                     foreach my $type (@{$types},'default','_LC_adv') {                      foreach my $type (@{$types},'default','_LC_adv') {
Line 3636  sub modify_quotas { Line 4814  sub modify_quotas {
                                 $typetitle = 'LON-CAPA Advanced Users';                                   $typetitle = 'LON-CAPA Advanced Users'; 
                             }                              }
                             if ($confhash{$item}{$type}) {                              if ($confhash{$item}{$type}) {
                                 $resulttext .= '<li>'.&mt('Set to be available to [_1]',$typetitle).'</li>';                                  if ($context eq 'requestcourses') {
                                       my $cond;
                                       if ($confhash{$item}{$type} =~ /^autolimit=(\d*)$/) {
                                           if ($1 eq '') {
                                               $cond = &mt('(Automatic processing of any request).');
                                           } else {
                                               $cond = &mt('(Automatic processing of requests up to limit of [quant,_1,request] per user).',$1);
                                           }
                                       } else { 
                                           $cond = $conditions{$confhash{$item}{$type}};
                                       }
                                       $resulttext .= '<li>'.&mt('Set to be available to [_1].',$typetitle).' '.$cond.'</li>';
                                   } else {
                                       $resulttext .= '<li>'.&mt('Set to be available to [_1]',$typetitle).'</li>';
                                   }
                             } else {                              } else {
                                 $resulttext .= '<li>'.&mt('Set to be unavailable to [_1]',$typetitle).'</li>';                                  if ($type eq '_LC_adv') {
                                       if ($confhash{$item}{$type} eq '0') {
                                           $resulttext .= '<li>'.&mt('Set to be unavailable to [_1]',$typetitle).'</li>';
                                       } else { 
                                           $resulttext .= '<li>'.&mt('No override set for [_1]',$typetitle).'</li>';
                                       }
                                   } else {
                                       $resulttext .= '<li>'.&mt('Set to be unavailable to [_1]',$typetitle).'</li>';
                                   }
                             }                              }
                         }                          }
                     }                      }
                     $resulttext .= '</ul></li>';                      $resulttext .= '</ul></li>';
                 }                  }
             }              }
               if ($action eq 'requestcourses') {
                   if (ref($changes{'notify'}) eq 'HASH') {
                       if ($changes{'notify'}{'approval'}) {
                           if (ref($confhash{'notify'}) eq 'HASH') {
                               if ($confhash{'notify'}{'approval'}) {
                                   $resulttext .= '<li>'.&mt('Notification of requests requiring approval will be sent to: ').$confhash{'notify'}{'approval'}.'</li>';
                               } else {
                                   $resulttext .= '<li>'.&mt('No Domain Coordinators will receive notification of course requests requiring approval.').'</li>';
                               }
                           }
                       }
                   }
               }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
             if (keys(%newenv)) {              if (keys(%newenv)) {
                 &Apache::lonnet::appenv(\%newenv);                  &Apache::lonnet::appenv(\%newenv);
             }              }
         } else {          } else {
             $resulttext = &mt('No changes made to availability of home pages, blogs, portfolios or default quotas');              if ($context eq 'requestcourses') {
                   $resulttext = &mt('No changes made to rights to request creation of courses.');
               } else {
                   $resulttext = &mt('No changes made to availability of personal information pages, blogs, portfolios or default quotas');
               }
         }          }
     } else {      } else {
         $resulttext = '<span class="LC_error">'.          $resulttext = '<span class="LC_error">'.
Line 3670  sub modify_autoenroll { Line 4887  sub modify_autoenroll {
     }      }
     my $autorun = &Apache::lonnet::auto_run(undef,$dom),      my $autorun = &Apache::lonnet::auto_run(undef,$dom),
     my %title = ( run => 'Auto-enrollment active',      my %title = ( run => 'Auto-enrollment active',
                   sender => 'Sender for notification messages');                    sender => 'Sender for notification messages',
                     coowners => 'Automatic assignment of co-ownership to instructors of record (institutional data)');
     my @offon = ('off','on');      my @offon = ('off','on');
     my $sender_uname = $env{'form.sender_uname'};      my $sender_uname = $env{'form.sender_uname'};
     my $sender_domain = $env{'form.sender_domain'};      my $sender_domain = $env{'form.sender_domain'};
Line 3679  sub modify_autoenroll { Line 4897  sub modify_autoenroll {
     } elsif ($sender_uname eq '') {      } elsif ($sender_uname eq '') {
         $sender_domain = '';          $sender_domain = '';
     }      }
       my $coowners = $env{'form.autoassign_coowners'};
     my %autoenrollhash =  (      my %autoenrollhash =  (
                        autoenroll => { run => $env{'form.autoenroll_run'},                         autoenroll => { 'run' => $env{'form.autoenroll_run'},
                                        sender_uname => $sender_uname,                                         'sender_uname' => $sender_uname,
                                        sender_domain => $sender_domain,                                         'sender_domain' => $sender_domain,
                                          'co-owners' => $coowners,
                                 }                                  }
                      );                       );
     my $putresult = &Apache::lonnet::put_dom('configuration',\%autoenrollhash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%autoenrollhash,
Line 3704  sub modify_autoenroll { Line 4923  sub modify_autoenroll {
         if ($currautoenroll{'sender_domain'} ne $sender_domain) {          if ($currautoenroll{'sender_domain'} ne $sender_domain) {
             $changes{'sender'} = 1;              $changes{'sender'} = 1;
         }          }
           if ($currautoenroll{'co-owners'} ne '') {
               if ($currautoenroll{'co-owners'} ne $coowners) {
                   $changes{'coowners'} = 1;
               }
           } elsif ($coowners) {
               $changes{'coowners'} = 1;
           }      
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             if ($changes{'run'}) {              if ($changes{'run'}) {
Line 3716  sub modify_autoenroll { Line 4942  sub modify_autoenroll {
                     $resulttext .= '<li>'.&mt("$title{'sender'} set to [_1]",$sender_uname.':'.$sender_domain).'</li>';                      $resulttext .= '<li>'.&mt("$title{'sender'} set to [_1]",$sender_uname.':'.$sender_domain).'</li>';
                 }                  }
             }              }
               if ($changes{'coowners'}) {
                   $resulttext .= '<li>'.&mt("$title{'coowners'} set to $offon[$env{'form.autoassign_coowners'}]").'</li>';
                   &Apache::loncommon::devalidate_domconfig_cache($dom);
               }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
         } else {          } else {
             $resulttext = &mt('No changes made to auto-enrollment settings');              $resulttext = &mt('No changes made to auto-enrollment settings');
Line 3747  sub modify_autoupdate { Line 4977  sub modify_autoupdate {
                         lastname => 'Last Name',                          lastname => 'Last Name',
                         firstname => 'First Name',                          firstname => 'First Name',
                         middlename => 'Middle Name',                          middlename => 'Middle Name',
                         gen => 'Generation',                          generation => 'Generation',
                       );                        );
     my $othertitle = &mt('All users');      $othertitle = &mt('All users');
     if (keys(%{$usertypes}) >  0) {      if (keys(%{$usertypes}) >  0) {
         $othertitle = &mt('Other users');          $othertitle = &mt('Other users');
     }      }
     foreach my $key (keys(%env)) {      foreach my $key (keys(%env)) {
         if ($key =~ /^form\.updateable_(.+)_([^_]+)$/) {          if ($key =~ /^form\.updateable_(.+)_([^_]+)$/) {
             push(@{$fields{$1}},$2);              my ($usertype,$item) = ($1,$2);
               if (grep(/^\Q$item\E$/,keys(%fieldtitles))) {
                   if ($usertype eq 'default') {   
                       push(@{$fields{$1}},$2);
                   } elsif (ref($types) eq 'ARRAY') {
                       if (grep(/^\Q$usertype\E$/,@{$types})) {
                           push(@{$fields{$1}},$2);
                       }
                   }
               }
           }
       }
       my @lockablenames = &Apache::loncommon::get_env_multiple('form.lockablenames');
       @lockablenames = sort(@lockablenames);
       if (ref($currautoupdate{'lockablenames'}) eq 'ARRAY') {
           my @changed = &Apache::loncommon::compare_arrays($currautoupdate{'lockablenames'},\@lockablenames);
           if (@changed) {
               $changes{'lockablenames'} = 1;
           }
       } else {
           if (@lockablenames) {
               $changes{'lockablenames'} = 1;
         }          }
     }      }
     my %updatehash = (      my %updatehash = (
                       autoupdate => { run => $env{'form.autoupdate_run'},                        autoupdate => { run => $env{'form.autoupdate_run'},
                                       classlists => $env{'form.classlists'},                                        classlists => $env{'form.classlists'},
                                       fields => {%fields},                                        fields => {%fields},
                                         lockablenames => \@lockablenames,
                                     }                                      }
                      );                       );
     foreach my $key (keys(%currautoupdate)) {      foreach my $key (keys(%currautoupdate)) {
Line 3779  sub modify_autoupdate { Line 5031  sub modify_autoupdate {
                         foreach my $type (@{$currautoupdate{$key}{$item}}) {                          foreach my $type (@{$currautoupdate{$key}{$item}}) {
                             if (!exists($fields{$item})) {                              if (!exists($fields{$item})) {
                                 $change = 1;                                  $change = 1;
                                   last;
                             } elsif (ref($fields{$item}) eq 'ARRAY') {                              } elsif (ref($fields{$item}) eq 'ARRAY') {
                                 if (!grep(/^\Q$type\E$/,@{$fields{$item}})) {                                  if (!grep(/^\Q$type\E$/,@{$fields{$item}})) {
                                     $change = 1;                                      $change = 1;
                                       last;
                                 }                                  }
                             }                              }
                         }                          }
Line 3791  sub modify_autoupdate { Line 5045  sub modify_autoupdate {
                     }                       } 
                 }                  }
             }              }
           } elsif ($key eq 'lockablenames') {
               if (ref($currautoupdate{$key}) eq 'ARRAY') {
                   my @changed = &Apache::loncommon::compare_arrays($currautoupdate{'lockablenames'},\@lockablenames);
                   if (@changed) {
                       $changes{'lockablenames'} = 1;
                   }
               } else {
                   if (@lockablenames) {
                       $changes{'lockablenames'} = 1;
                   }
               }
           }
       }
       unless (grep(/^\Qlockablenames\E$/,keys(%currautoupdate))) {
           if (@lockablenames) {
               $changes{'lockablenames'} = 1;
         }          }
     }      }
     foreach my $item (@{$types},'default') {      foreach my $item (@{$types},'default') {
         if (defined($fields{$item})) {          if (defined($fields{$item})) {
             if (ref($currautoupdate{'fields'}) eq 'HASH') {              if (ref($currautoupdate{'fields'}) eq 'HASH') {
                 if (!exists($currautoupdate{'fields'}{$item})) {                  if (ref($currautoupdate{'fields'}{$item}) eq 'ARRAY') {
                       my $change = 0;
                       if (ref($fields{$item}) eq 'ARRAY') {
                           foreach my $type (@{$fields{$item}}) {
                               if (!grep(/^\Q$type\E$/,@{$currautoupdate{'fields'}{$item}})) {
                                   $change = 1;
                                   last;
                               }
                           }
                       }
                       if ($change) {
                           push(@{$changes{'fields'}},$item);
                       }
                   } else {
                     push(@{$changes{'fields'}},$item);                      push(@{$changes{'fields'}},$item);
                 }                  }
             } else {              } else {
Line 3810  sub modify_autoupdate { Line 5093  sub modify_autoupdate {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             foreach my $key (sort(keys(%changes))) {              foreach my $key (sort(keys(%changes))) {
                 if (ref($changes{$key}) eq 'ARRAY') {                  if ($key eq 'lockablenames') {
                       $resulttext .= '<li>';
                       if (@lockablenames) {
                           $usertypes->{'default'} = $othertitle;
                           $resulttext .= &mt("User preference to disable replacement of user's name with institutional data (by auto-update), available for the following affiliations:").' '.
                                      join(', ', map { $usertypes->{$_}; } @lockablenames).'</li>';
                       } else {
                           $resulttext .= &mt("User preference to disable replacement of user's name with institutional data (by auto-update) is unavailable.");
                       }
                       $resulttext .= '</li>';
                   } elsif (ref($changes{$key}) eq 'ARRAY') {
                     foreach my $item (@{$changes{$key}}) {                      foreach my $item (@{$changes{$key}}) {
                         my @newvalues;                          my @newvalues;
                         foreach my $type (@{$fields{$item}}) {                          foreach my $type (@{$fields{$item}}) {
Line 3849  sub modify_autoupdate { Line 5142  sub modify_autoupdate {
     return $resulttext;      return $resulttext;
 }  }
   
   sub modify_autocreate {
       my ($dom,%domconfig) = @_;
       my ($resulttext,%changes,%currautocreate,%newvals,%autocreatehash);
       if (ref($domconfig{'autocreate'}) eq 'HASH') {
           foreach my $key (keys(%{$domconfig{'autocreate'}})) {
               $currautocreate{$key} = $domconfig{'autocreate'}{$key};
           }
       }
       my %title= ( xml => 'Auto-creation of courses in XML course description files',
                    req => 'Auto-creation of validated requests for official courses',
                    xmldc => 'Identity of course creator of courses from XML files',
                  );
       my @types = ('xml','req');
       foreach my $item (@types) {
           $newvals{$item} = $env{'form.autocreate_'.$item};
           $newvals{$item} =~ s/\D//g;
           $newvals{$item} = 0 if ($newvals{$item} eq '');
       }
       $newvals{'xmldc'} = $env{'form.autocreate_xmldc'};
       my %domcoords = &get_active_dcs($dom);
       unless (exists($domcoords{$newvals{'xmldc'}})) {
           $newvals{'xmldc'} = '';
       } 
       %autocreatehash =  (
                           autocreate => { xml => $newvals{'xml'},
                                           req => $newvals{'req'},
                                         }
                          );
       if ($newvals{'xmldc'} ne '') {
           $autocreatehash{'autocreate'}{'xmldc'} = $newvals{'xmldc'};
       }
       my $putresult = &Apache::lonnet::put_dom('configuration',\%autocreatehash,
                                                $dom);
       if ($putresult eq 'ok') {
           my @items = @types;
           if ($newvals{'xml'}) {
               push(@items,'xmldc');
           }
           foreach my $item (@items) {
               if (exists($currautocreate{$item})) {
                   if ($currautocreate{$item} ne $newvals{$item}) {
                       $changes{$item} = 1;
                   }
               } elsif ($newvals{$item}) {
                   $changes{$item} = 1;
               }
           }
           if (keys(%changes) > 0) {
               my @offon = ('off','on'); 
               $resulttext = &mt('Changes made:').'<ul>';
               foreach my $item (@types) {
                   if ($changes{$item}) {
                       my $newtxt = $offon[$newvals{$item}];
                       $resulttext .= '<li>'.&mt("$title{$item} set to [_1]$newtxt [_2]",'<b>','</b>').'</li>';
                   }
               }
               if ($changes{'xmldc'}) {
                   my ($dcname,$dcdom) = split(':',$newvals{'xmldc'});
                   my $newtxt = &Apache::loncommon::plainname($dcname,$dcdom);
                   $resulttext .= '<li>'.&mt("$title{'xmldc'} set to [_1]$newtxt [_2]",'<b>','</b>').'</li>'; 
               }
               $resulttext .= '</ul>';
           } else {
               $resulttext = &mt('No changes made to auto-creation settings');
           }
       } else {
           $resulttext = '<span class="LC_error">'.
               &mt('An error occurred: [_1]',$putresult).'</span>';
       }
       return $resulttext;
   }
   
 sub modify_directorysrch {  sub modify_directorysrch {
     my ($dom,%domconfig) = @_;      my ($dom,%domconfig) = @_;
     my ($resulttext,%changes);      my ($resulttext,%changes);
Line 4031  sub modify_contacts { Line 5396  sub modify_contacts {
             $currsetting{$key} = $domconfig{'contacts'}{$key};              $currsetting{$key} = $domconfig{'contacts'}{$key};
         }          }
     }      }
     my (%others,%to);      my (%others,%to,%bcc);
     my @contacts = ('supportemail','adminemail');      my @contacts = ('supportemail','adminemail');
     my @mailings = ('errormail','packagesmail','helpdeskmail','lonstatusmail');      my @mailings = ('errormail','packagesmail','helpdeskmail','lonstatusmail',
                       'requestsmail');
     foreach my $type (@mailings) {      foreach my $type (@mailings) {
         @{$newsetting{$type}} =           @{$newsetting{$type}} = 
             &Apache::loncommon::get_env_multiple('form.'.$type);              &Apache::loncommon::get_env_multiple('form.'.$type);
Line 4046  sub modify_contacts { Line 5412  sub modify_contacts {
         }            }  
         $others{$type} = $env{'form.'.$type.'_others'};          $others{$type} = $env{'form.'.$type.'_others'};
         $contacts_hash{contacts}{$type}{'others'} = $others{$type};          $contacts_hash{contacts}{$type}{'others'} = $others{$type};
           if ($type eq 'helpdeskmail') {
               $bcc{$type} = $env{'form.'.$type.'_bcc'};
               $contacts_hash{contacts}{$type}{'bcc'} = $bcc{$type};
           }
     }      }
     foreach my $item (@contacts) {      foreach my $item (@contacts) {
         $to{$item} = $env{'form.'.$item};          $to{$item} = $env{'form.'.$item};
Line 4070  sub modify_contacts { Line 5440  sub modify_contacts {
             if ($others{$type} ne $currsetting{$type}{'others'}) {              if ($others{$type} ne $currsetting{$type}{'others'}) {
                 push(@{$changes{$type}},'others');                  push(@{$changes{$type}},'others');
             }              }
               if ($type eq 'helpdeskmail') {   
                   if ($bcc{$type} ne $currsetting{$type}{'bcc'}) {
                       push(@{$changes{$type}},'bcc'); 
                   }
               }
         }          }
     } else {      } else {
         my %default;          my %default;
Line 4079  sub modify_contacts { Line 5454  sub modify_contacts {
         $default{'packagesmail'} = 'adminemail';          $default{'packagesmail'} = 'adminemail';
         $default{'helpdeskmail'} = 'supportemail';          $default{'helpdeskmail'} = 'supportemail';
         $default{'lonstatusmail'} = 'adminemail';          $default{'lonstatusmail'} = 'adminemail';
           $default{'requestsmail'} = 'adminemail';
         foreach my $item (@contacts) {          foreach my $item (@contacts) {
            if ($to{$item} ne $default{$item}) {             if ($to{$item} ne $default{$item}) {
               $changes{$item} = 1;                $changes{$item} = 1;
Line 4091  sub modify_contacts { Line 5467  sub modify_contacts {
             }              }
             if ($others{$type} ne '') {              if ($others{$type} ne '') {
                 push(@{$changes{$type}},'others');                  push(@{$changes{$type}},'others');
             }               }
               if ($type eq 'helpdeskmail') {
                   if ($bcc{$type} ne '') {
                       push(@{$changes{$type}},'bcc');
                   }
               }
         }          }
     }      }
     my $putresult = &Apache::lonnet::put_dom('configuration',\%contacts_hash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%contacts_hash,
Line 4119  sub modify_contacts { Line 5500  sub modify_contacts {
                         push(@text,$others{$type});                          push(@text,$others{$type});
                     }                      }
                     $resulttext .= '<span class="LC_cusr_emph">'.                      $resulttext .= '<span class="LC_cusr_emph">'.
                                    join(', ',@text).'</span></li>';                                     join(', ',@text).'</span>';
                       if ($type eq 'helpdeskmail') {
                           if ($bcc{$type} ne '') {
                               $resulttext .= '&nbsp;'.&mt('with Bcc to').': <span class="LC_cusr_emph">'.$bcc{$type}.'</span>';
                           }
                       }
                       $resulttext .= '</li>';
                 }                  }
             }              }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
Line 4145  sub modify_usercreation { Line 5532  sub modify_usercreation {
     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 @email_rule = &Apache::loncommon::get_env_multiple('form.email_rule');      my @email_rule = &Apache::loncommon::get_env_multiple('form.email_rule');
     my @contexts = ('author','course','selfcreate');      my @contexts = ('author','course','requestcrs','selfcreate');
     foreach my $item(@contexts) {      foreach my $item(@contexts) {
         if ($item eq 'selfcreate') {          if ($item eq 'selfcreate') {
             @{$cancreate{$item}} = &Apache::loncommon::get_env_multiple('form.can_createuser_'.$item);              @{$cancreate{$item}} = &Apache::loncommon::get_env_multiple('form.can_createuser_'.$item);
Line 4161  sub modify_usercreation { Line 5548  sub modify_usercreation {
             $cancreate{$item} = $env{'form.can_createuser_'.$item};              $cancreate{$item} = $env{'form.can_createuser_'.$item};
         }          }
     }      }
       my ($othertitle,$usertypes,$types) = 
           &Apache::loncommon::sorted_inst_types($dom);
       if (ref($types) eq 'ARRAY') {
           if (@{$types} > 0) {
               @{$cancreate{'statustocreate'}} = 
                   &Apache::loncommon::get_env_multiple('form.statustocreate');
           } else {
               @{$cancreate{'statustocreate'}} = ();
           }
           push(@contexts,'statustocreate');
       }
     if (ref($curr_usercreation{'cancreate'}) eq 'HASH') {      if (ref($curr_usercreation{'cancreate'}) eq 'HASH') {
         foreach my $item (@contexts) {          foreach my $item (@contexts) {
             if ($item eq 'selfcreate') {              if (($item eq 'selfcreate') || ($item eq 'statustocreate')) {
                 if (ref($curr_usercreation{'cancreate'}{$item}) eq 'ARRAY') {                   if (ref($curr_usercreation{'cancreate'}{$item}) eq 'ARRAY') {
                     foreach my $curr (@{$curr_usercreation{'cancreate'}{$item}}) {                      foreach my $curr (@{$curr_usercreation{'cancreate'}{$item}}) {
                         if (!grep(/^$curr$/,@{$cancreate{$item}})) {                          if (ref($cancreate{$item}) eq 'ARRAY') {
                             if (!grep(/^$item$/,@{$changes{'cancreate'}})) {                              if (!grep(/^$curr$/,@{$cancreate{$item}})) {
                                 push(@{$changes{'cancreate'}},$item);                                  if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                       push(@{$changes{'cancreate'}},$item);
                                   }
                             }                              }
                         }                          }
                     }                      }
Line 4340  sub modify_usercreation { Line 5740  sub modify_usercreation {
             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 =  $lt{$type}.', ';                      my $chgtext;
                       unless ($type eq 'statustocreate') {
                           $chgtext = $lt{$type}.', ';
                       }
                     if ($type eq 'selfcreate') {                      if ($type eq 'selfcreate') {
                         if (@{$cancreate{$type}} == 0) {                          if (@{$cancreate{$type}} == 0) {
                             $chgtext .= &mt('creation of a new user account is not permitted.');                              $chgtext .= &mt('creation of a new user account is not permitted.');
                         } else {                          } else {
                             $chgtext .= &mt('creation of a new account is permitted for:<ul>');                              $chgtext .= &mt('creation of a new account is permitted for:').'<ul>';
                             foreach my $case (@{$cancreate{$type}}) {                              foreach my $case (@{$cancreate{$type}}) {
                                 $chgtext .= '<li>'.$selfcreatetypes{$case}.'</li>';                                  $chgtext .= '<li>'.$selfcreatetypes{$case}.'</li>';
                             }                              }
                             $chgtext .= '</ul>';                              $chgtext .= '</ul>';
                               if (ref($cancreate{$type}) eq 'ARRAY') {
                                   if (grep(/^(login|sso)$/,@{$cancreate{$type}})) {
                                       if (ref($cancreate{'statustocreate'}) eq 'ARRAY') {
                                           if (@{$cancreate{'statustocreate'}} == 0) {
                                               $chgtext .= '<br /><span class="LC_warning">'.&mt("However, no institutional affiliations (including 'other') are currently permitted to create accounts.").'</span>';
                                           }
                                       }
                                   }
                               }
                           }
                       } elsif ($type eq 'statustocreate') {
                           if ((ref($cancreate{'selfcreate'}) eq 'ARRAY') &&
                               (ref($cancreate{'statustocreate'}) eq 'ARRAY')) {
                               if (@{$cancreate{'selfcreate'}} > 0) {
                                   if (@{$cancreate{'statustocreate'}} == 0) {
   
                                       $chgtext .= &mt("Institutional affiliations permitted to create accounts set to 'None'.");
                                       if (!grep(/^email$/,@{$cancreate{'selfcreate'}})) {
                                           $chgtext .= '<br /><span class="LC_warning">'.&mt("However, no institutional affiliations (including 'other') are currently permitted to create accounts.").'</span>';
                                       } 
                                   } elsif (ref($usertypes) eq 'HASH') {
                                       if (grep(/^(login|sso)$/,@{$cancreate{'selfcreate'}})) {
                                           $chgtext .= &mt('Creation of a new account for an institutional user is restricted to the following institutional affiliation(s):');
                                       } else {
                                           $chgtext .= &mt('Institutional affiliations permitted to create accounts with institutional authentication were set as follows:');
                                       }
                                       $chgtext .= '<ul>';
                                       foreach my $case (@{$cancreate{$type}}) {
                                           if ($case eq 'default') {
                                               $chgtext .= '<li>'.$othertitle.'</li>';
                                           } else {
                                               $chgtext .= '<li>'.$usertypes->{$case}.'</li>';
                                           }
                                       }
                                       $chgtext .= '</ul>';
                                       if (!grep(/^(login|sso)$/,@{$cancreate{'selfcreate'}})) {
                                           $chgtext .= '<br /><span class="LC_warning">'.&mt('However, users authenticated by institutional login/single sign on are not currently permitted to create accounts.').'</span>';
                                       }
                                   }
                               } else {
                                   if (@{$cancreate{$type}} == 0) {
                                       $chgtext .= &mt("Institutional affiliations permitted to create accounts were set to 'none'.");
                                   } else {
                                       $chgtext .= &mt('Although institutional affiliations permitted to create accounts were changed, self creation of accounts is not currently permitted for any authentication types.');
                                   }
                               }
                         }                          }
                     } else {                      } else {
                         if ($cancreate{$type} eq 'none') {                          if ($cancreate{$type} eq 'none') {
Line 4539  sub modify_usermodification { Line 5988  sub modify_usermodification {
                             }                              }
                             my @modifiable;                              my @modifiable;
                             if ($context eq 'selfcreate') {                              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): ');                                  $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 {                              } else {
                                 $resulttext .= '<li><span class="LC_cusr_emph">'.&mt('Target user with [_1] role',$rolename).'</span> - '.&mt('modifiable fields: ');                                  $resulttext .= '<li><span class="LC_cusr_emph">'.&mt('Target user with [_1] role',$rolename).'</span> - '.&mt('modifiable fields: ');
                             }                              }
Line 4574  sub modify_defaults { Line 6023  sub modify_defaults {
     my ($dom,$r) = @_;      my ($dom,$r) = @_;
     my ($resulttext,$mailmsgtxt,%newvalues,%changes,@errors);      my ($resulttext,$mailmsgtxt,%newvalues,%changes,@errors);
     my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);      my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
     my @items = ('auth_def','auth_arg_def','lang_def','timezone_def','datelocale_def');      my @items = ('auth_def','auth_arg_def','lang_def','timezone_def','datelocale_def','portal_def');
     my @authtypes = ('internal','krb4','krb5','localauth');      my @authtypes = ('internal','krb4','krb5','localauth');
     foreach my $item (@items) {      foreach my $item (@items) {
         $newvalues{$item} = $env{'form.'.$item};          $newvalues{$item} = $env{'form.'.$item};
Line 4588  sub modify_defaults { Line 6037  sub modify_defaults {
             if ($newvalues{$item} ne '') {              if ($newvalues{$item} ne '') {
                 if ($newvalues{$item} =~ /^(\w+)/) {                  if ($newvalues{$item} =~ /^(\w+)/) {
                     my $langcode = $1;                      my $langcode = $1;
                     if (code2language($langcode) eq '') {                      if ($langcode ne 'x_chef') {
                         push(@errors,$item);                          if (code2language($langcode) eq '') {
                               push(@errors,$item);
                           }
                     }                      }
                 } else {                  } else {
                     push(@errors,$item);                      push(@errors,$item);
Line 4608  sub modify_defaults { Line 6059  sub modify_defaults {
                     push(@errors,$item);                      push(@errors,$item);
                 }                  }
             }              }
           } elsif ($item eq 'portal_def') {
               if ($newvalues{$item} ne '') {
                   unless ($newvalues{$item} =~ /^https?\:\/\/(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])\/?$/) {
                       push(@errors,$item);
                   }
               }
         }          }
         if (grep(/^\Q$item\E$/,@errors)) {          if (grep(/^\Q$item\E$/,@errors)) {
             $newvalues{$item} = $domdefaults{$item};              $newvalues{$item} = $domdefaults{$item};
Line 4681  sub modify_scantron { Line 6138  sub modify_scantron {
         my $error;          my $error;
         if ($configuserok eq 'ok') {          if ($configuserok eq 'ok') {
             if ($switchserver) {              if ($switchserver) {
                 $error = &mt("Upload of scantron format file is not permitted to this server: [_1]",$switchserver);                  $error = &mt("Upload of bubblesheet format file is not permitted to this server: [_1]",$switchserver);
             } else {              } else {
                 if ($author_ok eq 'ok') {                  if ($author_ok eq 'ok') {
                     my ($result,$scantronurl) =                      my ($result,$scantronurl) =
Line 4721  sub modify_scantron { Line 6178  sub modify_scantron {
                 if (ref($confhash{'scantron'}) eq 'HASH') {                  if (ref($confhash{'scantron'}) eq 'HASH') {
                     $resulttext = &mt('Changes made:').'<ul>';                      $resulttext = &mt('Changes made:').'<ul>';
                     if ($confhash{'scantron'}{'scantronformat'} eq '') {                      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>';                          $resulttext .= '<li>'.&mt('[_1] bubblesheet format file removed; [_2] file will be used for courses in this domain.',$custom,$default).'</li>';
                     } else {                      } else {
                         $resulttext .= '<li>'.&mt('Custom scantron format file ([_1]) uploaded for use with courses in this domain.',$custom).'</li>';                          $resulttext .= '<li>'.&mt('Custom bubblesheet format file ([_1]) uploaded for use with courses in this domain.',$custom).'</li>';
                     }                      }
                     $resulttext .= '</ul>';                      $resulttext .= '</ul>';
                 } else {                  } else {
                     $resulttext = &mt('Changes made to scantron format file.');                      $resulttext = &mt('Changes made to bubblesheet format file.');
                 }                  }
                 $resulttext .= '</ul>';                  $resulttext .= '</ul>';
                 &Apache::loncommon::devalidate_domconfig_cache($dom);                  &Apache::loncommon::devalidate_domconfig_cache($dom);
             } else {              } else {
                 $resulttext = &mt('No changes made to scantron format file');                  $resulttext = &mt('No changes made to bubblesheet format file');
             }              }
         } else {          } else {
             $resulttext = '<span class="LC_error">'.              $resulttext = '<span class="LC_error">'.
                 &mt('An error occurred: [_1]',$putresult).'</span>';                  &mt('An error occurred: [_1]',$putresult).'</span>';
         }          }
     } else {      } else {
         $resulttext = &mt('No changes made to scantron format file');           $resulttext = &mt('No changes made to bubblesheet format file'); 
     }      }
     if ($errors) {      if ($errors) {
         $resulttext .= &mt('The following errors occurred: ').'<ul>'.          $resulttext .= &mt('The following errors occurred: ').'<ul>'.
Line 4763  sub modify_coursecategories { Line 6220  sub modify_coursecategories {
             $changes{'categorize'} = 1;              $changes{'categorize'} = 1;
             $domconfig{'coursecategories'}{'categorize'} = $env{'form.categorize'};              $domconfig{'coursecategories'}{'categorize'} = $env{'form.categorize'};
         }          }
           if ($domconfig{'coursecategories'}{'togglecatscomm'} ne $env{'form.togglecatscomm'}) {
               $changes{'togglecatscomm'} = 1;
               $domconfig{'coursecategories'}{'togglecatscomm'} = $env{'form.togglecatscomm'};
           }
           if ($domconfig{'coursecategories'}{'categorizecomm'} ne $env{'form.categorizecomm'}) {
               $changes{'categorizecomm'} = 1;
               $domconfig{'coursecategories'}{'categorizecomm'} = $env{'form.categorizecomm'};
           }
     } else {      } else {
         $changes{'togglecats'} = 1;          $changes{'togglecats'} = 1;
         $changes{'categorize'} = 1;          $changes{'categorize'} = 1;
           $changes{'togglecatscomm'} = 1;
           $changes{'categorizecomm'} = 1;
         $domconfig{'coursecategories'} = {          $domconfig{'coursecategories'} = {
                                              togglecats => $env{'form.togglecats'},                                               togglecats => $env{'form.togglecats'},
                                              categorize => $env{'form.categorize'},                                               categorize => $env{'form.categorize'},
                                                togglecatscomm => $env{'form.togglecatscomm'},
                                                categorizecomm => $env{'form.categorizecomm'},
                                          };                                           };
     }      }
     if (ref($cathash) eq 'HASH') {      if (ref($cathash) eq 'HASH') {
         if (($domconfig{'coursecategories'}{'cats'}{'instcode::0'} ne '')  && ($env{'form.instcode'} == 0)) {          if (($domconfig{'coursecategories'}{'cats'}{'instcode::0'} ne '')  && ($env{'form.instcode'} == 0)) {
             push (@deletecategory,'instcode::0');              push (@deletecategory,'instcode::0');
         }          }
           if (($domconfig{'coursecategories'}{'cats'}{'communities::0'} ne '')  && ($env{'form.communities'} == 0)) {
               push(@deletecategory,'communities::0');
           }
     }      }
     my (@predelcats,@predeltrails,%predelallitems,%sort_by_deltrail);      my (@predelcats,@predeltrails,%predelallitems,%sort_by_deltrail);
     if (ref($cathash) eq 'HASH') {      if (ref($cathash) eq 'HASH') {
Line 4824  sub modify_coursecategories { Line 6296  sub modify_coursecategories {
             $adds{$newitem} = 1;              $adds{$newitem} = 1;
         }          }
     }      }
       if ($env{'form.communities'} eq '1') {
           if (ref($cathash) eq 'HASH') {
               my $newitem = 'communities::0';
               if ($cathash->{$newitem} eq '') {
                   $domconfig{'coursecategories'}{'cats'}{$newitem} = $env{'form.communities_pos'};
                   $adds{$newitem} = 1;
               }
           } else {
               my $newitem = 'communities::0';
               $domconfig{'coursecategories'}{'cats'}{$newitem} = $env{'form.communities_pos'};
               $adds{$newitem} = 1;
           }
       }
     if ($env{'form.addcategory_name'} ne '') {      if ($env{'form.addcategory_name'} ne '') {
         my $newitem = &escape($env{'form.addcategory_name'}).'::0';          if (($env{'form.addcategory_name'} ne 'instcode') &&
         $domconfig{'coursecategories'}{'cats'}{$newitem} = $env{'form.addcategory_pos'};              ($env{'form.addcategory_name'} ne 'communities')) {
         $adds{$newitem} = 1;              my $newitem = &escape($env{'form.addcategory_name'}).'::0';
               $domconfig{'coursecategories'}{'cats'}{$newitem} = $env{'form.addcategory_pos'};
               $adds{$newitem} = 1;
           }
     }      }
     my $putresult;      my $putresult;
     if ((keys(%deletions) > 0) || (keys(%reorderings) > 0) || (keys(%adds) > 0)) {      if ((keys(%deletions) > 0) || (keys(%reorderings) > 0) || (keys(%adds) > 0)) {
Line 4864  sub modify_coursecategories { Line 6352  sub modify_coursecategories {
         $putresult = &Apache::lonnet::put_dom('configuration',\%domconfig,$dom);          $putresult = &Apache::lonnet::put_dom('configuration',\%domconfig,$dom);
         if ($putresult eq 'ok') {          if ($putresult eq 'ok') {
             my %title = (              my %title = (
                          togglecats  => 'Show/Hide a course in the catalog',                           togglecats     => 'Show/Hide a course in catalog',
                          categorize     => 'Category assigned to course',                           categorize     => 'Assign a category to a course',
                            togglecatscomm => 'Show/Hide a community in catalog',
                            categorizecomm => 'Assign a category to a community',
                         );                          );
             my %level = (              my %level = (
                          dom => 'set from "Modify Course" (Domain)',                           dom  => 'set in Domain ("Modify Course/Community")',
                          crs => 'set from "Parameters" (Course)',                           crs  => 'set in Course ("Course Configuration")',
                            comm => 'set in Community ("Community Configuration")',
                         );                          );
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             if ($changes{'togglecats'}) {              if ($changes{'togglecats'}) {
Line 4878  sub modify_coursecategories { Line 6369  sub modify_coursecategories {
             if ($changes{'categorize'}) {              if ($changes{'categorize'}) {
                 $resulttext .= '<li>'.&mt("$title{'categorize'} $level{$env{'form.categorize'}}").'</li>';                  $resulttext .= '<li>'.&mt("$title{'categorize'} $level{$env{'form.categorize'}}").'</li>';
             }              }
               if ($changes{'togglecatscomm'}) {
                   $resulttext .= '<li>'.&mt("$title{'togglecatscomm'} $level{$env{'form.togglecatscomm'}}").'</li>';
               }
               if ($changes{'categorizecomm'}) {
                   $resulttext .= '<li>'.&mt("$title{'categorizecomm'} $level{$env{'form.categorizecomm'}}").'</li>';
               }
             if ((keys(%deletions) > 0) || (keys(%reorderings) > 0) || (keys(%adds) > 0)) {              if ((keys(%deletions) > 0) || (keys(%reorderings) > 0) || (keys(%adds) > 0)) {
                 my $cathash;                  my $cathash;
                 if (ref($domconfig{'coursecategories'}) eq 'HASH') {                  if (ref($domconfig{'coursecategories'}) eq 'HASH') {
Line 4927  sub modify_coursecategories { Line 6424  sub modify_coursecategories {
                           &mt('An error occurred: [_1]',$putresult).'</span>';                            &mt('An error occurred: [_1]',$putresult).'</span>';
         }          }
     } else {      } else {
         $resulttext = &mt('No changes made to course categories');          $resulttext = &mt('No changes made to course and community categories');
     }      }
     return $resulttext;      return $resulttext;
 }  }
Line 4984  sub modify_serverstatuses { Line 6481  sub modify_serverstatuses {
     my %serverstatushash =  (      my %serverstatushash =  (
                                 serverstatuses => \%newserverstatus,                                  serverstatuses => \%newserverstatus,
                             );                              );
     my %changes;  
     foreach my $type (@pages) {      foreach my $type (@pages) {
         foreach my $setting ('namedusers','machines') {          foreach my $setting ('namedusers','machines') {
             my (@current,@new);              my (@current,@new);
             if (ref($currserverstatus{$type}) eq 'HASH') {              if (ref($currserverstatus{$type}) eq 'HASH') {
                 if ($currserverstatus{$type}{$setting} ne '') {                  if ($currserverstatus{$type}{$setting} ne '') { 
                     @current = split(/,/,$currserverstatus{$type}{$setting});                      @current = split(/,/,$currserverstatus{$type}{$setting});
                 }                  }
             }              }
Line 5057  sub modify_serverstatuses { Line 6553  sub modify_serverstatuses {
     return $resulttext;      return $resulttext;
 }  }
   
   sub modify_helpsettings {
       my ($r,$dom,$confname,%domconfig) = @_;
     my ($resulttext,$errors,%changes,%helphash);
    
     my $customhelpfile  = $env{'form.loginhelpurl.filename'};
       my $defaulthelpfile = 'defaulthelp.html';
     my $servadm = $r->dir_config('lonAdmEMail');
       my ($configuserok,$author_ok,$switchserver) = 
           &config_check($dom,$confname,$servadm);
    
     my %defaultchecked = ('submitbugs' => 'on');
     my @offon = ('off','on');
       my %title = ( submitbugs     => 'Display link for users to submit a bug', 
        loginhelpurl  => 'Unauthenticated login help page set to custom file');
        
       my @toggles = ('submitbugs');
   
       $helphash{'helpsettings'} = {};
       
       if (ref($domconfig{'helpsettings'}) ne 'HASH') {
           if ($domconfig{'helpsettings'} eq '') {
               $domconfig{'helpsettings'} = {};
           }
       }
       
       if (ref($domconfig{'helpsettings'}) eq 'HASH') {
      
           foreach my $item (@toggles) {
          
    if ($defaultchecked{$item} eq 'on') { 
    if (($domconfig{'helpsettings'}{$item} eq '') &&
    ($env{'form.'.$item} eq '0')) {
    $changes{$item} = 1;
    } elsif ($domconfig{'helpsettings'}{$item} ne $env{'form.'.$item}) {
    $changes{$item} = 1;
    }
    } elsif ($defaultchecked{$item} eq 'off') {
    if (($domconfig{'helpsettings'}{$item} eq '') &&
    ($env{'form.'.$item} eq '1')) {
    $changes{$item} = 1;
    } elsif ($domconfig{'helpsettings'}{$item} ne $env{'form.'.$item}) {
    $changes{$item} = 1;
    }
    }
    $helphash{'helpsettings'}{$item} = $env{'form.'.$item};
    }
   
    if ($customhelpfile ne '') {
    my $error;
    if ($configuserok eq 'ok') {
    if ($switchserver) {
    $error = &mt("Upload of custom help file is not permitted to this server: [_1]",$switchserver);
    } else {
    if ($author_ok eq 'ok') {
    my ($result,$loginhelpurl) =
    &publishlogo($r,'upload','loginhelpurl',$dom,
    $confname,'help','','',$customhelpfile);
    if ($result eq 'ok') {
    $helphash{'helpsettings'}{'loginhelpurl'} = $loginhelpurl;
    $changes{'loginhelpurl'} = 1;
    } else {
    $error = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$customhelpfile,$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].",$customhelpfile,$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].",$customhelpfile,$confname,$dom,$configuserok);
    }
    if ($error) {
    &Apache::lonnet::logthis($error);
    $errors .= '<li><span class="LC_error">'.$error.'</span></li>';
    }
    }
   
           if ($domconfig{'helpsettings'}{'loginhelpurl'} ne '') {
               if ($env{'form.loginhelpurl_del'}) {
                   $helphash{'helpsettings'}{'loginhelpurl'} = '';
                   $changes{'loginhelpurl'} = 1;
               }
           }
       }
       
       
       my $putresult;
       
       if (keys(%changes) > 0) {
       $putresult = &Apache::lonnet::put_dom('configuration',\%helphash,$dom);
       } else {
       $putresult = 'ok';
       }
                                                
       if ($putresult eq 'ok') {
           if (keys(%changes) > 0) {
    $resulttext = &mt('Changes made:').'<ul>';
    foreach my $item (sort(keys(%changes))) {
    if ($item eq 'submitbugs') {
    $resulttext .= '<li>'.&mt("$title{$item} set to $offon[$env{'form.'.$item}]").'</li>';
    }
    if ($item eq 'loginhelpurl') {
    if ($helphash{'helpsettings'}{'loginhelpurl'} eq '') {
                           $resulttext .= '<li>'.&mt('[_1] help file removed; [_2] file will be used for the unathorized help page in this domain.',$customhelpfile,$defaulthelpfile).'</li>';
                       } else {
                           $resulttext .= '<li>'.&mt("$title{$item} [_1]",$customhelpfile).'</li>';
                       }
    }
    }
    $resulttext .= '</ul>';
    } else {
    $resulttext = &mt('No changes made to help settings');
    }
       } else {
           $resulttext = '<span class="LC_error">'.
       &mt('An error occurred: [_1]',$putresult).'</span>';
       }
       if ($errors) {
           $resulttext .= &mt('The following errors occurred: ').'<ul>'.
                          $errors.'</ul>';
       }
       return $resulttext;
   }
   
   sub modify_coursedefaults {
       my ($dom,%domconfig) = @_;
       my ($resulttext,$errors,%changes,%defaultshash);
       my %defaultchecked = ('canuse_pdfforms' => 'off');
       my @offon = ('off','on');
       my @toggles = ();
   
       $defaultshash{'coursedefaults'} = {};
   
       if (ref($domconfig{'coursedefaults'}) ne 'HASH') {
           if ($domconfig{'coursedefaults'} eq '') {
               $domconfig{'coursedefaults'} = {};
           }
       }
   
       if (ref($domconfig{'coursedefaults'}) eq 'HASH') {
           foreach my $item (@toggles) {
               if ($defaultchecked{$item} eq 'on') {
                   if (($domconfig{'coursedefaults'}{$item} eq '') &&
                       ($env{'form.'.$item} eq '0')) {
                       $changes{$item} = 1;
                   } elsif ($domconfig{'coursdefaults'}{$item} ne $env{'form.'.$item}) {
                       $changes{$item} = 1;
                   }
               } elsif ($defaultchecked{$item} eq 'off') {
                   if (($domconfig{'coursedefaults'}{$item} eq '') &&
                       ($env{'form.'.$item} eq '1')) {
                       $changes{$item} = 1;
                   } elsif ($domconfig{'coursedefaults'}{$item} ne $env{'form.'.$item}) {
                       $changes{$item} = 1;
                   }
               }
               $defaultshash{'coursedefaults'}{$item} = $env{'form.'.$item};
           }
           my $currdefresponder = $domconfig{'coursedefaults'}{'anonsurvey_threshold'};
           my $newdefresponder = $env{'form.anonsurvey_threshold'};
           $newdefresponder =~ s/\D//g;
           if ($newdefresponder eq '' || $newdefresponder < 1) {
               $newdefresponder = 1;
           }
           $defaultshash{'coursedefaults'}{'anonsurvey_threshold'} = $newdefresponder;
           if ($currdefresponder ne $newdefresponder) {
               unless ($currdefresponder eq '' && $newdefresponder == 10) {
                   $changes{'anonsurvey_threshold'} = 1;
               }
           }
       }
       my $putresult = &Apache::lonnet::put_dom('configuration',\%defaultshash,
                                                $dom);
       if ($putresult eq 'ok') {
           if (keys(%changes) > 0) {
               if ($changes{'canuse_pdfforms'}) {
                   my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
                   $domdefaults{'canuse_pdfforms'}=$defaultshash{'coursedefaults'}{'canuse_pdfforms'};
                   my $cachetime = 24*60*60;
                   &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
               }
               $resulttext = &mt('Changes made:').'<ul>';
               foreach my $item (sort(keys(%changes))) {
                   if ($item eq 'canuse_pdfforms') {
                       if ($env{'form.'.$item} eq '1') {
                           $resulttext .= '<li>'.&mt("Course/Community users can create/upload PDF forms set to 'on'").'</li>';
                       } else {
                           $resulttext .= '<li>'.&mt('Course/Community users can create/upload PDF forms set to "off"').'</li>';
                       }
                   } elsif ($item eq 'anonsurvey_threshold') {
                           $resulttext .= '<li>'.&mt('Responder count required for display of anonymous survey submissions set to [_1].',$defaultshash{'coursedefaults'}{'anonsurvey_threshold'}).'</li>';
                   }
               }
               $resulttext .= '</ul>';
           } else {
               $resulttext = &mt('No changes made to course defaults');
           }
       } else {
           $resulttext = '<span class="LC_error">'.
               &mt('An error occurred: [_1]',$putresult).'</span>';
       }
       return $resulttext;
   }
   
   sub modify_usersessions {
       my ($dom,%domconfig) = @_;
       my @types = ('version','excludedomain','includedomain');
       my @prefixes = ('remote','hosted');
       my @lcversions = &Apache::lonnet::all_loncaparevs();
       my (%by_ip,%by_location,@intdoms);
       &build_location_hashes(\@intdoms,\%by_ip,\%by_location);
       my @locations = sort(keys(%by_location));
       my (%defaultshash,%changes);
       foreach my $prefix (@prefixes) {
           $defaultshash{'usersessions'}{$prefix} = {};
       }
       my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
       my $resulttext;
       my %iphost = &Apache::lonnet::get_iphost();
       foreach my $prefix (@prefixes) {
           foreach my $type (@types) {
               my $inuse = $env{'form.'.$prefix.'_'.$type.'_inuse'};
               if ($type eq 'version') {
                   my $value = $env{'form.'.$prefix.'_'.$type};
                   my $okvalue;
                   if ($value ne '') {
                       if (grep(/^\Q$value\E$/,@lcversions)) {
                           $okvalue = $value;
                       }
                   }
                   if (ref($domconfig{'usersessions'}) eq 'HASH') {
                       if (ref($domconfig{'usersessions'}{$prefix}) eq 'HASH') {
                           if ($domconfig{'usersessions'}{$prefix}{$type} ne '') {
                               if ($inuse == 0) {
                                   $changes{$prefix}{$type} = 1;
                               } else {
                                   if ($okvalue ne $domconfig{'usersessions'}{$prefix}{$type}) {
                                       $changes{$prefix}{$type} = 1;
                                   }
                                   if ($okvalue ne '') {
                                       $defaultshash{'usersessions'}{$prefix}{$type} = $okvalue;
                                   } 
                               }
                           } else {
                               if (($inuse == 1) && ($okvalue ne '')) {
                                   $defaultshash{'usersessions'}{$prefix}{$type} = $okvalue;
                                   $changes{$prefix}{$type} = 1;
                               }
                           }
                       } else {
                           if (($inuse == 1) && ($okvalue ne '')) {
                               $defaultshash{'usersessions'}{$prefix}{$type} = $okvalue;
                               $changes{$prefix}{$type} = 1;
                           }
                       }
                   } else {
                       if (($inuse == 1) && ($okvalue ne '')) {
                           $defaultshash{'usersessions'}{$prefix}{$type} = $okvalue;
                           $changes{$prefix}{$type} = 1;
                       }
                   }
               } else {
                   my @vals = &Apache::loncommon::get_env_multiple('form.'.$prefix.'_'.$type);
                   my @okvals;
                   foreach my $val (@vals) {
                       if ($val =~ /:/) {
                           my @items = split(/:/,$val);
                           foreach my $item (@items) {
                               if (ref($by_location{$item}) eq 'ARRAY') {
                                   push(@okvals,$item);
                               }
                           }
                       } else {
                           if (ref($by_location{$val}) eq 'ARRAY') {
                               push(@okvals,$val);
                           }
                       }
                   }
                   @okvals = sort(@okvals);
                   if (ref($domconfig{'usersessions'}) eq 'HASH') {
                       if (ref($domconfig{'usersessions'}{$prefix}) eq 'HASH') {
                           if (ref($domconfig{'usersessions'}{$prefix}{$type}) eq 'ARRAY') {
                               if ($inuse == 0) {
                                   $changes{$prefix}{$type} = 1; 
                               } else {
                                   $defaultshash{'usersessions'}{$prefix}{$type} = \@okvals;
                                   my @changed = &Apache::loncommon::compare_arrays($domconfig{'usersessions'}{$prefix}{$type},$defaultshash{'usersessions'}{$prefix}{$type});
                                   if (@changed > 0) {
                                       $changes{$prefix}{$type} = 1;
                                   }
                               }
                           } else {
                               if ($inuse == 1) {
                                   $defaultshash{'usersessions'}{$prefix}{$type} = \@okvals;
                                   $changes{$prefix}{$type} = 1;
                               }
                           } 
                       } else {
                           if ($inuse == 1) {
                               $defaultshash{'usersessions'}{$prefix}{$type} = \@okvals;
                               $changes{$prefix}{$type} = 1;
                           }
                       }
                   } else {
                       if ($inuse == 1) {
                           $defaultshash{'usersessions'}{$prefix}{$type} = \@okvals;
                           $changes{$prefix}{$type} = 1;
                       }
                   }
               }
           }
       }
       if (keys(%changes) > 0) {
           my $putresult = &Apache::lonnet::put_dom('configuration',\%defaultshash,
                                                    $dom);
           if ($putresult eq 'ok') {
               if (ref($defaultshash{'usersessions'}) eq 'HASH') {
                   if (ref($defaultshash{'usersessions'}{'remote'}) eq 'HASH') {
                       $domdefaults{'remotesessions'} = $defaultshash{'usersessions'}{'remote'};
                   }
                   if (ref($defaultshash{'usersessions'}{'hosted'}) eq 'HASH') {
                       $domdefaults{'hostedsessions'} = $defaultshash{'usersessions'}{'hosted'};
                   }
               }
               my $cachetime = 24*60*60;
               &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
               my %lt = &usersession_titles();
               $resulttext = &mt('Changes made:').'<ul>';
               foreach my $prefix (@prefixes) {
                   if (ref($changes{$prefix}) eq 'HASH') {
                       $resulttext .= '<li>'.$lt{$prefix}.'<ul>';
                       foreach my $type (@types) {
                           if (defined($changes{$prefix}{$type})) {
                               my $newvalue;
                               if (ref($defaultshash{'usersessions'}) eq 'HASH') {
                                   if (ref($defaultshash{'usersessions'}{$prefix})) {
                                       if ($type eq 'version') {
                                           $newvalue = $defaultshash{'usersessions'}{$prefix}{$type};
                                       } elsif (ref($defaultshash{'usersessions'}{$prefix}{$type}) eq 'ARRAY') {
                                           if (@{$defaultshash{'usersessions'}{$prefix}{$type}} > 0) {
                                               $newvalue = join(', ',@{$defaultshash{'usersessions'}{$prefix}{$type}});
                                           }
                                       }
                                   }
                               }
                               if ($newvalue eq '') {
                                   if ($type eq 'version') {
                                       $resulttext .= '<li>'.&mt('[_1] set to: off',$lt{$type}).'</li>';
                                   } else {
                                       $resulttext .= '<li>'.&mt('[_1] set to: none',$lt{$type}).'</li>';
                                   }
                               } else {
                                   if ($type eq 'version') {
                                       $newvalue .= ' '.&mt('(or later)'); 
                                   } 
                                   $resulttext .= '<li>'.&mt('[_1] set to: [_2].',$lt{$type},$newvalue).'</li>'; 
                               }
                           }
                       }
                       $resulttext .= '</ul>';
                   }
               }
               $resulttext .= '</ul>';
           } else {
               $resulttext = '<span class="LC_error">'.
                             &mt('An error occurred: [_1]',$putresult).'</span>';
           }
       } else {
           $resulttext =  &mt('No changes made to settings for user session hosting.');
       }
       return $resulttext;
   }
   
 sub recurse_check {  sub recurse_check {
     my ($chkcats,$categories,$depth,$name) = @_;      my ($chkcats,$categories,$depth,$name) = @_;
     if (ref($chkcats->[$depth]{$name}) eq 'ARRAY') {      if (ref($chkcats->[$depth]{$name}) eq 'ARRAY') {
Line 5097  sub recurse_cat_deletes { Line 6965  sub recurse_cat_deletes {
     return;      return;
 }  }
   
   sub dom_servers {
       my ($dom) = @_;
       my (%uniqservers,%servers);
       my $primaryserver = &Apache::lonnet::hostname(&Apache::lonnet::domain($dom,'primary'));
       my @machinedoms = &Apache::lonnet::machine_domains($primaryserver);
       foreach my $mdom (@machinedoms) {
           my %currservers = %servers;
           my %server = &Apache::lonnet::get_servers($mdom);
           %servers = (%currservers,%server);
       }
       my %by_hostname;
       foreach my $id (keys(%servers)) {
           push(@{$by_hostname{$servers{$id}}},$id);
       }
       foreach my $hostname (sort(keys(%by_hostname))) {
           if (@{$by_hostname{$hostname}} > 1) {
               my $match = 0;
               foreach my $id (@{$by_hostname{$hostname}}) {
                   if (&Apache::lonnet::host_domain($id) eq $dom) {
                       $uniqservers{$id} = $hostname;
                       $match = 1;
                   }
               }
               unless ($match) {
                   $uniqservers{$by_hostname{$hostname}[0]} = $hostname;
               }
           } else {
               $uniqservers{$by_hostname{$hostname}[0]} = $hostname;
           }
       }
       return %uniqservers;
   }
   
   sub get_active_dcs {
       my ($dom) = @_;
       my %dompersonnel = &Apache::lonnet::get_domain_roles($dom,['dc']);
       my %domcoords;
       my $numdcs = 0;
       my $now = time;
       foreach my $server (keys(%dompersonnel)) {
           foreach my $user (sort(keys(%{$dompersonnel{$server}}))) {
               my ($trole,$uname,$udom,$runame,$rudom,$rsec) = split(/:/,$user);
               my ($end,$start) = split(':',$dompersonnel{$server}{$user});
               if (($end eq '') || ($end == 0) || ($end > $now)) {
                   if ($start <= $now) {
                       $domcoords{$uname.':'.$udom} = $dompersonnel{$server}{$user};
                   }
               }
           }
       }
       return %domcoords;
   }
   
   sub active_dc_picker {
       my ($dom,$curr_dc) = @_;
       my %domcoords = &get_active_dcs($dom); 
       my @dcs = sort(keys(%domcoords));
       my $numdcs = scalar(@dcs); 
       my $datatable;
       my $numinrow = 2;
       if ($numdcs > 1) {
           $datatable = '<table>';
           for (my $i=0; $i<@dcs; $i++) {
               my $rem = $i%($numinrow);
               if ($rem == 0) {
                   if ($i > 0) {
                       $datatable .= '</tr>';
                   }
                   $datatable .= '<tr>';
               }
               my $check = ' ';
               if ($curr_dc eq '') {
                   if (!$i) { 
                       $check = ' checked="checked" ';
                   }
               } elsif ($dcs[$i] eq $curr_dc) {
                   $check = ' checked="checked" ';
               }
               if ($i == @dcs - 1) {
                   my $colsleft = $numinrow - $rem;
                   if ($colsleft > 1) {
                       $datatable .= '<td colspan="'.$colsleft.'">';
                   } else {
                       $datatable .= '<td>';
                   }
               } else {
                   $datatable .= '<td>';
               }
               my ($dcname,$dcdom) = split(':',$dcs[$i]);
               $datatable .= '<span class="LC_nobreak"><label>'.
                             '<input type="radio" name="autocreate_xmldc"'.
                             ' value="'.$dcs[$i].'"'.$check.'/>'.
                             &Apache::loncommon::plainname($dcname,$dcdom).
                             '</label></span></td>';
           }
           $datatable .= '</tr></table>';
       } elsif (@dcs) {
           $datatable .= '<input type="hidden" name="autocreate_dc" value="'.
                         $dcs[0].'" />';
       }
       return ($numdcs,$datatable);
   }
   
   sub usersession_titles {
       return &Apache::lonlocal::texthash(
                  hosted => 'Hosting of sessions for users from other domains on servers in this domain',
   
                  remote => 'Hosting of sessions for users in this domain on servers in other domains',
                  version => 'LON-CAPA version requirement',
                  excludedomain => 'Allow all, but exclude specific domains',
                  includedomain => 'Deny all, but include specific domains',
              );
   }
   
 1;  1;

Removed from v.1.76.4.1  
changed lines
  Added in v.1.138.2.8


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