Diff for /loncom/interface/domainprefs.pm between versions 1.160.6.20 and 1.238

version 1.160.6.20, 2013/07/05 19:18:34 version 1.238, 2014/04/28 01:48:04
Line 86  $dom,$settings,$rowtotal,$action. Line 86  $dom,$settings,$rowtotal,$action.
   
 $dom is the domain, $settings is a reference to a hash of current settings for  $dom is the domain, $settings is a reference to a hash of current settings for
 the current context, $rowtotal is a reference to the scalar used to record the   the current context, $rowtotal is a reference to the scalar used to record the 
 number of rows displayed on the page, and $action is the context (quotas,  number of rows displayed on the page, and $action is the context (quotas, 
 requestcourses or requestauthor).  requestcourses or requestauthor).
   
 The print_quotas routine was orginally created to display/store information  The print_quotas routine was orginally created to display/store information
Line 95  institutional affiliation in the domain Line 95  institutional affiliation in the domain
 but is now also used to manage availability of user tools:   but is now also used to manage availability of user tools: 
 i.e., blogs, aboutme page, and portfolios, and the course request tool,  i.e., blogs, aboutme page, and portfolios, and the course request tool,
 used by course owners to request creation of a course, and to display/store  used by course owners to request creation of a course, and to display/store
 default quota sizes for authoring spaces.  default quota sizes for Authoring Spaces.
   
   
 Outputs: 1  Outputs: 1
   
Line 104  $datatable  - HTML containing form eleme Line 103  $datatable  - HTML containing form eleme
   
 In the case of course requests, radio buttons are displayed for each institutional  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   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   (official, unofficial, community, and textbook).  In each case the radio buttons 
 selection of one of four values:  allow the selection of one of four values:
   
 0, approval, validate, autolimit=N (where N is blank, or a positive integer).  0, approval, validate, autolimit=N (where N is blank, or a positive integer).
 which have the following effects:  which have the following effects:
Line 165  use Apache::lonhtmlcommon(); Line 164  use Apache::lonhtmlcommon();
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonmsg();  use Apache::lonmsg();
 use Apache::lonconfigsettings;  use Apache::lonconfigsettings;
   use Apache::lonuserutils();
   use Apache::loncoursequeueadmin();
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
 use LONCAPA::Enrollment;  use LONCAPA::Enrollment;
 use LONCAPA::lonauthcgi();  use LONCAPA::lonauthcgi();
Line 212  sub handler { Line 213  sub handler {
                 'quotas','autoenroll','autoupdate','autocreate',                  'quotas','autoenroll','autoupdate','autocreate',
                 'directorysrch','usercreation','usermodification',                  'directorysrch','usercreation','usermodification',
                 'contacts','defaults','scantron','coursecategories',                  'contacts','defaults','scantron','coursecategories',
                 'serverstatuses','requestcourses','coursedefaults',                  'serverstatuses','requestcourses','helpsettings',
                 'usersessions','loadbalancing','requestauthor'],$dom);                  'coursedefaults','usersessions','loadbalancing',
                   'requestauthor','selfenrollment','inststatus'],$dom);
     my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll',      my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll',
                        'autoupdate','autocreate','directorysrch','contacts',                         'autoupdate','autocreate','directorysrch','contacts',
                        'usercreation','usermodification','scantron',                         'usercreation','selfcreation','usermodification','scantron',
                        'requestcourses','requestauthor','coursecategories',                         'requestcourses','requestauthor','coursecategories',
                        'serverstatuses','coursedefaults','usersessions');                         'serverstatuses','helpsettings',
                          'coursedefaults','selfenrollment','usersessions');
     my %existing;      my %existing;
     if (ref($domconfig{'loadbalancing'}) eq 'HASH') {      if (ref($domconfig{'loadbalancing'}) eq 'HASH') {
         %existing = %{$domconfig{'loadbalancing'}};          %existing = %{$domconfig{'loadbalancing'}};
Line 238  sub handler { Line 241  sub handler {
                                  col2 => '',},                                   col2 => '',},
                                 {col1 => 'Administrator Settings',                                  {col1 => 'Administrator Settings',
                                  col2 => '',}],                                   col2 => '',}],
                         print => \&print_rolecolors,
                         modify => \&modify_rolecolors,
                     },                      },
         'login' =>          'login' =>
                     { text => 'Log-in page options',                      { text => 'Log-in page options',
Line 246  sub handler { Line 251  sub handler {
                                   col2 => '',},                                    col2 => '',},
                                  {col1 => 'Log-in Help',                                   {col1 => 'Log-in Help',
                                   col2 => 'Value'}],                                    col2 => 'Value'}],
                         print => \&print_login,
                         modify => \&modify_login,
                     },                      },
         'defaults' =>           'defaults' => 
                     { text => 'Default authentication/language/timezone/portal',                      { text => 'Default authentication/language/timezone/portal/types',
                       help => 'Domain_Configuration_LangTZAuth',                        help => 'Domain_Configuration_LangTZAuth',
                       header => [{col1 => 'Setting',                        header => [{col1 => 'Setting',
                                   col2 => 'Value'}],                                    col2 => 'Value'},
                                    {col1 => 'Institutional user types',
                                     col2 => 'Assignable to e-mail usernames'}],
                         print => \&print_defaults,
                         modify => \&modify_defaults,
                     },                      },
         'quotas' =>           'quotas' => 
                     { text => 'Blogs, personal web pages, webDAV/quotas, portfolios',                      { text => 'Blogs, personal web pages, webDAV/quotas, portfolios',
                       help => 'Domain_Configuration_Quotas',                        help => 'Domain_Configuration_Quotas',
                       header => [{col1 => 'User affiliation',                        header => [{col1 => 'User affiliation',
                                   col2 => 'Available tools',                                    col2 => 'Available tools',
                                   col3 => 'Quotas, Mb; (Authoring requires role)',}],                                    col3 => 'Quotas, MB; (Authoring requires role)',}],
                         print => \&print_quotas,
                         modify => \&modify_quotas,
                     },                      },
         'autoenroll' =>          'autoenroll' =>
                    { text => 'Auto-enrollment settings',                     { text => 'Auto-enrollment settings',
                      help => 'Domain_Configuration_Auto_Enrollment',                       help => 'Domain_Configuration_Auto_Enrollment',
                      header => [{col1 => 'Configuration setting',                       header => [{col1 => 'Configuration setting',
                                  col2 => 'Value(s)'}],                                   col2 => 'Value(s)'}],
                        print => \&print_autoenroll,
                        modify => \&modify_autoenroll,
                    },                     },
         'autoupdate' =>           'autoupdate' => 
                    { text => 'Auto-update settings',                     { text => 'Auto-update settings',
Line 274  sub handler { Line 289  sub handler {
                                 {col1 => 'Setting',                                  {col1 => 'Setting',
                                  col2 => 'Affiliation'},                                   col2 => 'Affiliation'},
                                 {col1 => 'User population',                                  {col1 => 'User population',
                                  col2 => 'Updateable user data'}],                                   col2 => 'Updatable user data'}],
                        print => \&print_autoupdate,
                        modify => \&modify_autoupdate,
                   },                    },
         'autocreate' =>           'autocreate' => 
                   { text => 'Auto-course creation settings',                    { text => 'Auto-course creation settings',
                      help => 'Domain_Configuration_Auto_Creation',                       help => 'Domain_Configuration_Auto_Creation',
                      header => [{col1 => 'Configuration Setting',                       header => [{col1 => 'Configuration Setting',
                                  col2 => 'Value',}],                                   col2 => 'Value',}],
                        print => \&print_autocreate,
                        modify => \&modify_autocreate,
                   },                    },
         'directorysrch' =>           'directorysrch' => 
                   { text => 'Institutional directory searches',                    { text => 'Institutional directory searches',
                     help => 'Domain_Configuration_InstDirectory_Search',                      help => 'Domain_Configuration_InstDirectory_Search',
                     header => [{col1 => 'Setting',                      header => [{col1 => 'Setting',
                                 col2 => 'Value',}],                                  col2 => 'Value',}],
                       print => \&print_directorysrch,
                       modify => \&modify_directorysrch,
                   },                    },
         'contacts' =>          'contacts' =>
                   { text => 'Contact Information',                    { text => 'Contact Information',
                     help => 'Domain_Configuration_Contact_Info',                      help => 'Domain_Configuration_Contact_Info',
                     header => [{col1 => 'Setting',                      header => [{col1 => 'Setting',
                                 col2 => 'Value',}],                                  col2 => 'Value',}],
                       print => \&print_contacts,
                       modify => \&modify_contacts,
                   },                    },
   
         'usercreation' =>           'usercreation' => 
                   { text => 'User creation',                    { text => 'User creation',
                     help => 'Domain_Configuration_User_Creation',                      help => 'Domain_Configuration_User_Creation',
Line 304  sub handler { Line 326  sub handler {
                                 col2 => 'Usernames which may be created',},                                  col2 => 'Usernames which may be created',},
                                {col1 => 'Context',                                 {col1 => 'Context',
                                 col2 => 'Assignable authentication types'}],                                  col2 => 'Assignable authentication types'}],
                       print => \&print_usercreation,
                       modify => \&modify_usercreation,
                     },
           'selfcreation' => 
                     { text => 'Users self-creating accounts',
                       help => 'Domain_Configuration_Self_Creation', 
                       header => [{col1 => 'Self-creation with institutional username',
                                   col2 => 'Enabled?'},
                                  {col1 => 'Institutional user type (login/SSO self-creation)',
                                   col2 => 'Information user can enter'},
                                  {col1 => 'Self-creation with e-mail as username',
                                   col2 => 'Settings'}],
                       print => \&print_selfcreation,
                       modify => \&modify_selfcreation,
                   },                    },
         'usermodification' =>          'usermodification' =>
                   { text => 'User modification',                    { text => 'User modification',
                     help => 'Domain_Configuration_User_Modification',                      help => 'Domain_Configuration_User_Modification',
                     header => [{col1 => 'Target user has role',                      header => [{col1 => 'Target user has role',
                                 col2 => 'User information updateable in author context'},                                  col2 => 'User information updatable in author context'},
                                {col1 => 'Target user has role',                                 {col1 => 'Target user has role',
                                 col2 => 'User information updateable in course context'},                                  col2 => 'User information updatable in course context'}],
                                {col1 => "Status of user",                      print => \&print_usermodification,
                                 col2 => 'Information settable when self-creating account (if directory data blank)'}],                      modify => \&modify_usermodification,
                   },                    },
         'scantron' =>          'scantron' =>
                   { text => 'Bubblesheet format file',                    { text => 'Bubblesheet format file',
Line 321  sub handler { Line 357  sub handler {
                     header => [ {col1 => 'Item',                      header => [ {col1 => 'Item',
                                  col2 => '',                                   col2 => '',
                               }],                                }],
                       print => \&print_scantron,
                       modify => \&modify_scantron,
                   },                    },
         'requestcourses' =>           'requestcourses' => 
                  {text => 'Request creation of courses',                   {text => 'Request creation of courses',
Line 328  sub handler { Line 366  sub handler {
                   header => [{col1 => 'User affiliation',                    header => [{col1 => 'User affiliation',
                               col2 => 'Availability/Processing of requests',},                                col2 => 'Availability/Processing of requests',},
                              {col1 => 'Setting',                               {col1 => 'Setting',
                               col2 => 'Value'}],                                col2 => 'Value'},
                                {col1 => 'Available textbooks',
                                 col2 => ''},
                                {col1 => 'Validation (not official courses)',
                                 col2 => 'Value'},],
                     print => \&print_quotas,
                     modify => \&modify_quotas,
                  },                   },
         'requestauthor' =>          'requestauthor' =>
                  {text => 'Request authoring space',                   {text => 'Request Authoring Space',
                   help => 'Domain_Configuration_Request_Author',                    help => 'Domain_Configuration_Request_Author',
                   header => [{col1 => 'User affiliation',                    header => [{col1 => 'User affiliation',
                               col2 => 'Availability/Processing of requests',},                                col2 => 'Availability/Processing of requests',},
                              {col1 => 'Setting',                               {col1 => 'Setting',
                               col2 => 'Value'}],                                col2 => 'Value'}],
                     print => \&print_quotas,
                     modify => \&modify_quotas,
                  },                   },
         'coursecategories' =>          'coursecategories' =>
                   { text => 'Cataloging of courses/communities',                    { text => 'Cataloging of courses/communities',
                     help => 'Domain_Configuration_Cataloging_Courses',                      help => 'Domain_Configuration_Cataloging_Courses',
                     header => [{col1 => 'Category settings',                      header => [{col1 => 'Catalog type/availability',
                                   col2 => '',},
                                  {col1 => 'Category settings for standard catalog',
                                 col2 => '',},                                  col2 => '',},
                                {col1 => 'Categories',                                 {col1 => 'Categories',
                                 col2 => '',                                  col2 => '',
                                }],                                 }],
                       print => \&print_coursecategories,
                       modify => \&modify_coursecategories,
                   },                    },
         'serverstatuses' =>          'serverstatuses' =>
                  {text   => 'Access to server status pages',                   {text   => 'Access to server status pages',
Line 354  sub handler { Line 404  sub handler {
                               col2 => 'Other named users',                                col2 => 'Other named users',
                               col3 => 'Specific IPs',                                col3 => 'Specific IPs',
                             }],                              }],
                     print => \&print_serverstatuses,
                     modify => \&modify_serverstatuses,
                    },
           'helpsettings' =>
                    {text   => 'Help page settings',
                     help   => 'Domain_Configuration_Help_Settings',
                     header => [{col1 => 'Help Settings (logged-in users)',
                                 col2 => 'Value'}],
                     print  => \&print_helpsettings,
                     modify => \&modify_helpsettings,
                  },                   },
         'coursedefaults' =>          'coursedefaults' => 
                  {text => 'Course/Community defaults',                   {text => 'Course/Community defaults',
                   help => 'Domain_Configuration_Course_Defaults',                    help => 'Domain_Configuration_Course_Defaults',
                   header => [{col1 => 'Defaults which can be overridden for each course by a DC',                    header => [{col1 => 'Defaults which can be overridden in each course by a CC',
                                 col2 => 'Value',},
                                {col1 => 'Defaults which can be overridden for each course by a DC',
                               col2 => 'Value',},],                                col2 => 'Value',},],
                     print => \&print_coursedefaults,
                     modify => \&modify_coursedefaults,
                    },
           'selfenrollment' => 
                    {text   => 'Self-enrollment in Course/Community',
                     help   => 'Domain_Configuration_Selfenrollment',
                     header => [{col1 => 'Configuration Rights',
                                 col2 => 'Configured by Course Personnel or Domain Coordinator?'},
                                {col1 => 'Defaults',
                                 col2 => 'Value'},
                                {col1 => 'Self-enrollment validation (optional)',
                                 col2 => 'Value'},],
                     print => \&print_selfenrollment,
                     modify => \&modify_selfenrollment,
                    },
           'privacy' => 
                    {text   => 'User Privacy',
                     help   => 'Domain_Configuration_User_Privacy',
                     header => [{col1 => 'Setting',
                                 col2 => 'Value',}],
                     print => \&print_privacy,
                     modify => \&modify_privacy,
                  },                   },
         'usersessions' =>          'usersessions' =>
                  {text  => 'User session hosting/offloading',                   {text  => 'User session hosting/offloading',
Line 370  sub handler { Line 454  sub handler {
                               col2 => 'Rules'},                                col2 => 'Rules'},
                              {col1 => "Hosting domain's own users elsewhere",                               {col1 => "Hosting domain's own users elsewhere",
                               col2 => 'Rules'}],                                col2 => 'Rules'}],
                     print => \&print_usersessions,
                     modify => \&modify_usersessions,
                  },                   },
          'loadbalancing' =>           'loadbalancing' =>
                  {text  => 'Dedicated Load Balancer(s)',                   {text  => 'Dedicated Load Balancer(s)',
Line 379  sub handler { Line 465  sub handler {
                               col3 => 'User affiliation',                                col3 => 'User affiliation',
                               col4 => 'Overrides'},                                col4 => 'Overrides'},
                             ],                              ],
                     print => \&print_loadbalancing,
                     modify => \&modify_loadbalancing,
                  },                   },
     );      );
     if (keys(%servers) > 1) {      if (keys(%servers) > 1) {
Line 390  sub handler { Line 478  sub handler {
                                         col2 => ''},                                          col2 => ''},
                                        {col1 => 'Log-in Help',                                         {col1 => 'Log-in Help',
                                         col2 => 'Value'}],                                          col2 => 'Value'}],
                               print => \&print_login,
                               modify => \&modify_login,
                            };                             };
     }      }
   
Line 401  sub handler { Line 491  sub handler {
     my $confname = $dom.'-domainconfig';      my $confname = $dom.'-domainconfig';
   
     if ($phase eq 'process') {      if ($phase eq 'process') {
         &Apache::lonconfigsettings::make_changes($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,\@roles);          my $result = &Apache::lonconfigsettings::make_changes($r,$dom,$phase,$context,\@prefs_order,
                                                                 \%prefs,\%domconfig,$confname,\@roles);
           if ((ref($result) eq 'HASH') && (keys(%{$result}))) {
               $r->rflush();
               &devalidate_remote_domconfs($dom,$result);
           }
     } elsif ($phase eq 'display') {      } elsif ($phase eq 'display') {
         my $js = &recaptcha_js().          my $js = &recaptcha_js().
                  &credits_js();                    &toggle_display_js();
         if ((keys(%servers) > 1) || (keys(%existing) > 0)) {          if ((keys(%servers) > 1) || (keys(%existing) > 0)) {
             my ($othertitle,$usertypes,$types) =              my ($othertitle,$usertypes,$types) =
                 &Apache::loncommon::sorted_inst_types($dom);                  &Apache::loncommon::sorted_inst_types($dom);
Line 414  sub handler { Line 509  sub handler {
                    &common_domprefs_js().                     &common_domprefs_js().
                    &Apache::loncommon::javascript_array_indexof();                     &Apache::loncommon::javascript_array_indexof();
         }          }
           if (grep(/^requestcourses$/,@actions)) {
               my $javascript_validations;
               my $coursebrowserjs=&Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'}); 
               $js .= <<END;
   <script type="text/javascript">
   $javascript_validations
   </script>
   $coursebrowserjs
   END
           }
         &Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,$js);          &Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,$js);
     } else {      } else {
 # check if domconfig user exists for the domain.  # check if domconfig user exists for the domain.
         my $servadm = $r->dir_config('lonAdmEMail');          my $servadm = $r->dir_config('lonAdmEMail');
         my ($configuserok,$author_ok,$switchserver) =           my ($configuserok,$author_ok,$switchserver) =
             &config_check($dom,$confname,$servadm);              &config_check($dom,$confname,$servadm);
         unless ($configuserok eq 'ok') {          unless ($configuserok eq 'ok') {
             &Apache::lonconfigsettings::print_header($r,$phase,$context);              &Apache::lonconfigsettings::print_header($r,$phase,$context);
Line 483  sub handler { Line 588  sub handler {
 }  }
   
 sub process_changes {  sub process_changes {
     my ($r,$dom,$confname,$action,$roles,$values) = @_;      my ($r,$dom,$confname,$action,$roles,$values,$lastactref) = @_;
     my %domconfig;      my %domconfig;
     if (ref($values) eq 'HASH') {      if (ref($values) eq 'HASH') {
         %domconfig = %{$values};          %domconfig = %{$values};
     }      }
     my $output;      my $output;
     if ($action eq 'login') {      if ($action eq 'login') {
         $output = &modify_login($r,$dom,$confname,%domconfig);          $output = &modify_login($r,$dom,$confname,$lastactref,%domconfig);
     } elsif ($action eq 'rolecolors') {      } elsif ($action eq 'rolecolors') {
         $output = &modify_rolecolors($r,$dom,$confname,$roles,          $output = &modify_rolecolors($r,$dom,$confname,$roles,
                                      %domconfig);                                       $lastactref,%domconfig);
     } elsif ($action eq 'quotas') {      } elsif ($action eq 'quotas') {
         $output = &modify_quotas($dom,$action,%domconfig);          $output = &modify_quotas($r,$dom,$action,$lastactref,%domconfig);
     } elsif ($action eq 'autoenroll') {      } elsif ($action eq 'autoenroll') {
         $output = &modify_autoenroll($dom,%domconfig);          $output = &modify_autoenroll($dom,$lastactref,%domconfig);
     } elsif ($action eq 'autoupdate') {      } elsif ($action eq 'autoupdate') {
         $output = &modify_autoupdate($dom,%domconfig);          $output = &modify_autoupdate($dom,%domconfig);
     } elsif ($action eq 'autocreate') {      } elsif ($action eq 'autocreate') {
Line 506  sub process_changes { Line 611  sub process_changes {
         $output = &modify_directorysrch($dom,%domconfig);          $output = &modify_directorysrch($dom,%domconfig);
     } elsif ($action eq 'usercreation') {      } elsif ($action eq 'usercreation') {
         $output = &modify_usercreation($dom,%domconfig);          $output = &modify_usercreation($dom,%domconfig);
       } elsif ($action eq 'selfcreation') {
           $output = &modify_selfcreation($dom,%domconfig);
     } elsif ($action eq 'usermodification') {      } elsif ($action eq 'usermodification') {
         $output = &modify_usermodification($dom,%domconfig);          $output = &modify_usermodification($dom,%domconfig);
     } elsif ($action eq 'contacts') {      } elsif ($action eq 'contacts') {
         $output = &modify_contacts($dom,%domconfig);          $output = &modify_contacts($dom,$lastactref,%domconfig);
     } elsif ($action eq 'defaults') {      } elsif ($action eq 'defaults') {
         $output = &modify_defaults($dom,$r);          $output = &modify_defaults($dom,$lastactref,%domconfig);
     } elsif ($action eq 'scantron') {      } elsif ($action eq 'scantron') {
         $output = &modify_scantron($r,$dom,$confname,%domconfig);          $output = &modify_scantron($r,$dom,$confname,$lastactref,%domconfig);
     } elsif ($action eq 'coursecategories') {      } elsif ($action eq 'coursecategories') {
         $output = &modify_coursecategories($dom,%domconfig);          $output = &modify_coursecategories($dom,%domconfig);
     } elsif ($action eq 'serverstatuses') {      } elsif ($action eq 'serverstatuses') {
         $output = &modify_serverstatuses($dom,%domconfig);          $output = &modify_serverstatuses($dom,%domconfig);
     } elsif ($action eq 'requestcourses') {      } elsif ($action eq 'requestcourses') {
         $output = &modify_quotas($dom,$action,%domconfig);          $output = &modify_quotas($r,$dom,$action,$lastactref,%domconfig);
     } elsif ($action eq 'requestauthor') {      } elsif ($action eq 'requestauthor') {
         $output = &modify_quotas($dom,$action,%domconfig);          $output = &modify_quotas($r,$dom,$action,$lastactref,%domconfig);
       } elsif ($action eq 'helpsettings') {
           $output = &modify_helpsettings($r,$dom,$confname,%domconfig);
     } elsif ($action eq 'coursedefaults') {      } elsif ($action eq 'coursedefaults') {
         $output = &modify_coursedefaults($dom,%domconfig);          $output = &modify_coursedefaults($dom,$lastactref,%domconfig);
       } elsif ($action eq 'selfenrollment') {
           $output = &modify_selfenrollment($dom,$lastactref,%domconfig)
     } elsif ($action eq 'usersessions') {      } elsif ($action eq 'usersessions') {
         $output = &modify_usersessions($dom,%domconfig);          $output = &modify_usersessions($dom,$lastactref,%domconfig);
     } elsif ($action eq 'loadbalancing') {      } elsif ($action eq 'loadbalancing') {
         $output = &modify_loadbalancing($dom,%domconfig);          $output = &modify_loadbalancing($dom,%domconfig);
     }      }
Line 538  sub print_config_box { Line 649  sub print_config_box {
     my $output;      my $output;
     if ($action eq 'coursecategories') {      if ($action eq 'coursecategories') {
         $output = &coursecategories_javascript($settings);          $output = &coursecategories_javascript($settings);
       } elsif ($action eq 'defaults') {
           $output = &defaults_javascript($settings); 
     }      }
     $output .=       $output .=
          '<table class="LC_nested_outer">           '<table class="LC_nested_outer">
           <tr>            <tr>
            <th align="left" valign="middle"><span class="LC_nobreak">'.             <th align="left" valign="middle"><span class="LC_nobreak">'.
Line 554  sub print_config_box { Line 667  sub print_config_box {
     if ($numheaders > 1) {      if ($numheaders > 1) {
         my $colspan = '';          my $colspan = '';
         my $rightcolspan = '';          my $rightcolspan = '';
         if (($action eq 'rolecolors') || ($action eq 'coursecategories') ||          if (($action eq 'rolecolors') || ($action eq 'defaults') ||
             (($action eq 'login') && ($numheaders < 3))) {              (($action eq 'login') && ($numheaders < 3))) {
             $colspan = ' colspan="2"';              $colspan = ' colspan="2"';
         }          }
Line 570  sub print_config_box { Line 683  sub print_config_box {
               <td class="LC_right_item"'.$rightcolspan.'>'.&mt($item->{'header'}->[0]->{'col2'}).'</td>                <td class="LC_right_item"'.$rightcolspan.'>'.&mt($item->{'header'}->[0]->{'col2'}).'</td>
              </tr>';               </tr>';
         $rowtotal ++;          $rowtotal ++;
         if ($action eq 'autoupdate') {          if (($action eq 'autoupdate') || ($action eq 'usercreation') || ($action eq 'selfcreation') ||
             $output .= &print_autoupdate('top',$dom,$settings,\$rowtotal);              ($action eq 'usermodification') || ($action eq 'defaults') || ($action eq 'coursedefaults') ||
         } elsif ($action eq 'usercreation') {              ($action eq 'selfenrollment') || ($action eq 'usersessions')) {
             $output .= &print_usercreation('top',$dom,$settings,\$rowtotal);              $output .= $item->{'print'}->('top',$dom,$settings,\$rowtotal);
         } elsif ($action eq 'usermodification') {  
             $output .= &print_usermodification('top',$dom,$settings,\$rowtotal);  
         } elsif ($action eq 'coursecategories') {          } elsif ($action eq 'coursecategories') {
             $output .= &print_coursecategories('top',$dom,$item,$settings,\$rowtotal);              $output .= $item->{'print'}->('top',$dom,$item,$settings,\$rowtotal);
         } elsif ($action eq 'login') {          } elsif ($action eq 'login') {
             if ($numheaders == 3) {              if ($numheaders == 3) {
                 $colspan = ' colspan="2"';                  $colspan = ' colspan="2"';
Line 585  sub print_config_box { Line 696  sub print_config_box {
             } else {              } else {
                 $output .= &print_login('page',$dom,$confname,$phase,$settings,\$rowtotal);                  $output .= &print_login('page',$dom,$confname,$phase,$settings,\$rowtotal);
             }              }
         } elsif ($action eq 'requestcourses') {          } elsif (($action eq 'requestcourses') || ($action eq 'requestauthor')) {
             $output .= &print_quotas($dom,$settings,\$rowtotal,$action);  
         } elsif ($action eq 'requestauthor') {  
             $output .= &print_quotas($dom,$settings,\$rowtotal,$action);              $output .= &print_quotas($dom,$settings,\$rowtotal,$action);
         } elsif ($action eq 'usersessions') {  
             $output .= &print_usersessions('top',$dom,$settings,\$rowtotal);   
         } elsif ($action eq 'rolecolors') {          } elsif ($action eq 'rolecolors') {
             $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal);              $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal);
         }          }
Line 602  sub print_config_box { Line 709  sub print_config_box {
            <td>             <td>
             <table class="LC_nested">              <table class="LC_nested">
              <tr class="LC_info_row">               <tr class="LC_info_row">
               <td class="LC_left_item"'.$colspan.'>'.&mt($item->{'header'}->[1]->{'col1'}).'</td>';                <td class="LC_left_item"'.$colspan.'>'.&mt($item->{'header'}->[1]->{'col1'}).'</td>
         $output .= '  
               <td class="LC_right_item"'.$colspan.'>'.&mt($item->{'header'}->[1]->{'col2'}).'</td>                <td class="LC_right_item"'.$colspan.'>'.&mt($item->{'header'}->[1]->{'col2'}).'</td>
              </tr>';               </tr>';
             $rowtotal ++;              $rowtotal ++;
         if ($action eq 'autoupdate') {          if (($action eq 'autoupdate') || ($action eq 'usercreation') ||
             $output .= &print_autoupdate('middle',$dom,$settings,\$rowtotal).'              ($action eq 'selfcreation') || ($action eq 'selfenrollment') ||
            </table>              ($action eq 'usersessions') || ($action eq 'coursecategories')) {
           </td>              if ($action eq 'coursecategories') {
          </tr>                  $output .= &print_coursecategories('middle',$dom,$item,$settings,\$rowtotal);
          <tr>                  $colspan = ' colspan="2"';
            <td>              } else {
             <table class="LC_nested">                  $output .= $item->{'print'}->('middle',$dom,$settings,\$rowtotal);
              <tr class="LC_info_row">              }
               <td class="LC_left_item"'.$colspan.'>'.&mt($item->{'header'}->[2]->{'col1'}).'</td>              $output .= '
               <td class="LC_right_item">'.&mt($item->{'header'}->[2]->{'col2'}).'</td>      </tr>'.  
             &print_autoupdate('bottom',$dom,$settings,\$rowtotal);  
             $rowtotal ++;  
         } elsif ($action eq 'usercreation') {  
             $output .= &print_usercreation('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_usercreation('bottom',$dom,$settings,\$rowtotal);  
             $rowtotal ++;  
         } elsif ($action eq 'usermodification') {  
             $output .= &print_usermodification('middle',$dom,$settings,\$rowtotal).'  
            </table>             </table>
           </td>            </td>
          </tr>           </tr>
Line 643  sub print_config_box { Line 731  sub print_config_box {
             <table class="LC_nested">              <table class="LC_nested">
              <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>
                        &print_usermodification('bottom',$dom,$settings,\$rowtotal);               </tr>'."\n";
               if ($action eq 'coursecategories') {
                   $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal);
               } else {
                   $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal);
               }
             $rowtotal ++;              $rowtotal ++;
         } elsif ($action eq 'coursecategories') {          } elsif (($action eq 'usermodification') || ($action eq 'coursedefaults') ||
             $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal);                    ($action eq 'defaults')) {
               $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal);
         } elsif ($action eq 'login') {          } elsif ($action eq 'login') {
             if ($numheaders == 3) {              if ($numheaders == 3) {
                 $output .= &print_login('page',$dom,$confname,$phase,$settings,\$rowtotal).'                  $output .= &print_login('page',$dom,$confname,$phase,$settings,\$rowtotal).'
Line 659  sub print_config_box { Line 753  sub print_config_box {
             <table class="LC_nested">              <table class="LC_nested">
              <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"'.$colspan.'>'.&mt($item->{'header'}->[2]->{'col2'}).'</td>      </tr>'.                <td class="LC_right_item"'.$colspan.'>'.&mt($item->{'header'}->[2]->{'col2'}).'</td></tr>'.
                        &print_login('help',$dom,$confname,$phase,$settings,\$rowtotal);                         &print_login('help',$dom,$confname,$phase,$settings,\$rowtotal);
                 $rowtotal ++;                  $rowtotal ++;
             } else {              } else {
                 $output .= &print_login('help',$dom,$confname,$phase,$settings,\$rowtotal);                  $output .= &print_login('help',$dom,$confname,$phase,$settings,\$rowtotal);
             }              }
         } elsif ($action eq 'requestcourses') {          } elsif ($action eq 'requestcourses') {
             $output .= &print_requestmail($dom,$action,$settings,\$rowtotal);              $output .= &print_requestmail($dom,$action,$settings,\$rowtotal).
         } elsif ($action eq 'requestauthor') {                         &print_studentcode($settings,\$rowtotal).'
             $output .= &print_requestmail($dom,$action,$settings,\$rowtotal);  
         } elsif ($action eq 'usersessions') {  
             $output .= &print_usersessions('middle',$dom,$settings,\$rowtotal).'  
            </table>             </table>
           </td>            </td>
          </tr>           </tr>
Line 679  sub print_config_box { Line 770  sub print_config_box {
             <table class="LC_nested">              <table class="LC_nested">
              <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_usersessions('bottom',$dom,$settings,\$rowtotal);                         &print_textbookcourses($dom,$settings,\$rowtotal).'
             $rowtotal ++;              </table>
              </td>
             </tr>
             <tr>
              <td>
               <table class="LC_nested">
                <tr class="LC_info_row">
                 <td class="LC_left_item"'.$colspan.' valign="top">'.&mt($item->{'header'}->[3]->{'col1'}).'</td>
                 <td class="LC_right_item" valign="top">'.&mt($item->{'header'}->[3]->{'col2'}).'</td>
                </tr>'.
               &print_validation_rows('requestcourses',$dom,$settings,\$rowtotal);
           } elsif ($action eq 'requestauthor') {
               $output .= &print_requestmail($dom,$action,$settings,\$rowtotal);
         } elsif ($action eq 'rolecolors') {          } elsif ($action eq 'rolecolors') {
             $output .= &print_rolecolors($phase,'coordinator',$dom,$confname,$settings,\$rowtotal).'              $output .= &print_rolecolors($phase,'coordinator',$dom,$confname,$settings,\$rowtotal).'
            </table>             </table>
Line 760  sub print_config_box { Line 863  sub print_config_box {
         $rowtotal ++;          $rowtotal ++;
         if ($action eq 'quotas') {          if ($action eq 'quotas') {
             $output .= &print_quotas($dom,$settings,\$rowtotal,$action);              $output .= &print_quotas($dom,$settings,\$rowtotal,$action);
         } elsif ($action eq 'autoenroll') {          } elsif (($action eq 'autoenroll') || ($action eq 'autocreate') || ($action eq 'directorysrch') ||
             $output .= &print_autoenroll($dom,$settings,\$rowtotal);                   ($action eq 'contacts') || ($action eq 'serverstatuses') || ($action eq 'loadbalancing')) {
         } elsif ($action eq 'autocreate') {              $output .= $item->{'print'}->($dom,$settings,\$rowtotal);
             $output .= &print_autocreate($dom,$settings,\$rowtotal);  
         } elsif ($action eq 'directorysrch') {  
             $output .= &print_directorysrch($dom,$settings,\$rowtotal);  
         } elsif ($action eq 'contacts') {  
             $output .= &print_contacts($dom,$settings,\$rowtotal);  
         } elsif ($action eq 'defaults') {  
             $output .= &print_defaults($dom,\$rowtotal);  
         } elsif ($action eq 'scantron') {          } elsif ($action eq 'scantron') {
             $output .= &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal);              $output .= &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal);
         } elsif ($action eq 'serverstatuses') {  
             $output .= &print_serverstatuses($dom,$settings,\$rowtotal);  
         } elsif ($action eq 'helpsettings') {          } elsif ($action eq 'helpsettings') {
             $output .= &print_helpsettings($dom,$confname,$settings,\$rowtotal);              $output .= &print_helpsettings($dom,$confname,$settings,\$rowtotal);
         } elsif ($action eq 'loadbalancing') {  
             $output .= &print_loadbalancing($dom,$settings,\$rowtotal);  
         } elsif ($action eq 'coursedefaults') {  
             $output .= &print_coursedefaults('bottom',$dom,$settings,\$rowtotal);  
         }          }
     }      }
     $output .= '      $output .= '
Line 1123  sub print_rolecolors { Line 1213  sub print_rolecolors {
     my %designhash = &Apache::loncommon::get_domainconf($dom);      my %designhash = &Apache::loncommon::get_domainconf($dom);
     my %defaultdesign = %Apache::loncommon::defaultdesign;      my %defaultdesign = %Apache::loncommon::defaultdesign;
     my (%is_custom,%designs);      my (%is_custom,%designs);
     my %defaults = (      my %defaults = &role_defaults($role,\@bgs,\@links,\@images);
                    img => $defaultdesign{$role.'.img'},  
                    font => $defaultdesign{$role.'.font'},  
    fontmenu => $defaultdesign{$role.'.fontmenu'},  
                    );  
     foreach my $item (@bgs) {  
         $defaults{'bgs'}{$item} = $defaultdesign{$role.'.'.$item};  
     }  
     foreach my $item (@links) {  
         $defaults{'links'}{$item} = $defaultdesign{$role.'.'.$item};  
     }  
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         if (ref($settings->{$role}) eq 'HASH') {          if (ref($settings->{$role}) eq 'HASH') {
             if ($settings->{$role}->{'img'} ne '') {              if ($settings->{$role}->{'img'} ne '') {
Line 1194  sub print_rolecolors { Line 1274  sub print_rolecolors {
     return $datatable;      return $datatable;
 }  }
   
   sub role_defaults {
       my ($role,$bgs,$links,$images,$logintext) = @_;
       my %defaults;
       unless ((ref($bgs) eq 'ARRAY') && (ref($links) eq 'ARRAY') && (ref($images) eq 'ARRAY')) {
           return %defaults;
       }
       my %defaultdesign = %Apache::loncommon::defaultdesign;
       if ($role eq 'login') {
           %defaults = (
                          font => $defaultdesign{$role.'.font'},
                       );
           if (ref($logintext) eq 'ARRAY') {
               foreach my $item (@{$logintext}) {
                   $defaults{'logintext'}{$item} = $defaultdesign{$role.'.'.$item};
               }
           }
           foreach my $item (@{$images}) {
               $defaults{'showlogo'}{$item} = 1;
           }
       } else {
           %defaults = (
                          img => $defaultdesign{$role.'.img'},
                          font => $defaultdesign{$role.'.font'},
                          fontmenu => $defaultdesign{$role.'.fontmenu'},
                       );
       }
       foreach my $item (@{$bgs}) {
           $defaults{'bgs'}{$item} = $defaultdesign{$role.'.'.$item};
       }
       foreach my $item (@{$links}) {
           $defaults{'links'}{$item} = $defaultdesign{$role.'.'.$item};
       }
       foreach my $item (@{$images}) {
           $defaults{$item} = $defaultdesign{$role.'.'.$item};
       }
       return %defaults;
   }
   
 sub display_color_options {  sub display_color_options {
     my ($dom,$confname,$phase,$role,$itemcount,$choices,$is_custom,$defaults,$designs,      my ($dom,$confname,$phase,$role,$itemcount,$choices,$is_custom,$defaults,$designs,
         $images,$bgs,$links,$alt_text,$rowtotal,$logintext) = @_;          $images,$bgs,$links,$alt_text,$rowtotal,$logintext) = @_;
Line 1220  sub display_color_options { Line 1338  sub display_color_options {
         } else {          } else {
             $datatable .= '<td>&nbsp;</td>';              $datatable .= '<td>&nbsp;</td>';
         }          }
         $current_color = $designs->{'fontmenu'} ?   $current_color = $designs->{'fontmenu'} ?
             $designs->{'fontmenu'} : $defaults->{'fontmenu'};      $designs->{'fontmenu'} : $defaults->{'fontmenu'};
         $datatable .= '<td><span class="LC_nobreak">'.          $datatable .= '<td><span class="LC_nobreak">'.
                       '<input class="colorchooser" type="text" size="10" name="'                        '<input class="colorchooser" type="text" size="10" name="'
                       .$role.'_fontmenu"'.        .$role.'_fontmenu"'.
                       ' value="'.$current_color.'" />&nbsp;'.                        ' value="'.$current_color.'" />&nbsp;'.
                       '&nbsp;</td></tr>';                        '&nbsp;</td></tr>';
     }      }
Line 1241  sub display_color_options { Line 1359  sub display_color_options {
                     &login_header_options($img,$role,$defaults,$is_custom,$choices);                      &login_header_options($img,$role,$defaults,$is_custom,$choices);
                 $logincolors =                  $logincolors =
                     &login_text_colors($img,$role,$logintext,$phase,$choices,                      &login_text_colors($img,$role,$logintext,$phase,$choices,
                                             $designs);                                         $designs,$defaults);
             } elsif ($img ne 'domlogo') {              } elsif ($img ne 'domlogo') {
                 $datatable.= &logo_display_options($img,$defaults,$designs);                  $datatable.= &logo_display_options($img,$defaults,$designs);
             }              }
Line 1320  sub display_color_options { Line 1438  sub display_color_options {
                 $datatable .= &image_changes($is_custom->{$img},$alt_text->{$img},$img_import,                  $datatable .= &image_changes($is_custom->{$img},$alt_text->{$img},$img_import,
                                              $showfile,$fullsize,$role,$img,$imgfile,$logincolors);                                               $showfile,$fullsize,$role,$img,$imgfile,$logincolors);
             } else {              } else {
                 $datatable .= '<td colspan="2" class="LC_right_item"><br />'.                  $datatable .= '<td>&nbsp;</td><td class="LC_left_item">'.
                               &mt('Upload:');                                &mt('Upload:').'<br />';
             }              }
         } else {          } else {
             $datatable .= '<td colspan="2" class="LC_right_item"><br />'.              $datatable .= '<td>&nbsp;</td><td class="LC_left_item">'.
                           &mt('Upload:');                            &mt('Upload:').'<br />';
         }          }
         if ($switchserver) {          if ($switchserver) {
             $datatable .= &mt('Upload to library server: [_1]',$switchserver);              $datatable .= &mt('Upload to library server: [_1]',$switchserver);
Line 1355  sub display_color_options { Line 1473  sub display_color_options {
                   '<table border="0"><tr>';                    '<table border="0"><tr>';
   
     foreach my $item (@{$bgs}) {      foreach my $item (@{$bgs}) {
         $datatable .= '<td align="center">';          $datatable .= '<td align="center">'.$choices->{$item};
         my $color = $designs->{'bgs'}{$item} ? $designs->{'bgs'}{$item} : $defaults->{'bgs'}{$item};   my $color = $designs->{'bgs'}{$item} ? $designs->{'bgs'}{$item} : $defaults->{'bgs'}{$item};
         if ($designs->{'bgs'}{$item}) {          if ($designs->{'bgs'}{$item}) {
             $datatable .= '&nbsp;';              $datatable .= '&nbsp;';
         }          }
Line 1382  sub display_color_options { Line 1500  sub display_color_options {
     $datatable .= '<td class="LC_right_item">'.      $datatable .= '<td class="LC_right_item">'.
                   '<table border="0"><tr>';                    '<table border="0"><tr>';
     foreach my $item (@{$links}) {      foreach my $item (@{$links}) {
         my $color = $designs->{'link'}{$item} ? $designs->{'link'}{$item} : $defaults->{'links'}{$item};   my $color = $designs->{'links'}{$item} ? $designs->{'links'}{$item} : $defaults->{'links'}{$item};
         $datatable .= '<td align="center">'."\n";          $datatable .= '<td align="center">'.$choices->{$item}."\n";
   
         if ($designs->{'links'}{$item}) {          if ($designs->{'links'}{$item}) {
             $datatable.='&nbsp;';              $datatable.='&nbsp;';
         }          }
Line 1442  sub login_header_options  { Line 1559  sub login_header_options  {
 }  }
   
 sub login_text_colors {  sub login_text_colors {
     my ($img,$role,$logintext,$phase,$choices,$designs) = @_;      my ($img,$role,$logintext,$phase,$choices,$designs,$defaults) = @_;
     my $color_menu = '<table border="0"><tr>';      my $color_menu = '<table border="0"><tr>';
     foreach my $item (@{$logintext}) {      foreach my $item (@{$logintext}) {
         my $link = &color_pick($phase,$role,$item,$choices->{$item},$designs->{'logintext'}{$item});          $color_menu .= '<td align="center">'.$choices->{$item};
         $color_menu .= '<td align="center">'.$link;          my $color = $designs->{'logintext'}{$item} ? $designs->{'logintext'}{$item} : $defaults->{'logintext'}{$item};
         if ($designs->{'logintext'}{$item}) {          $color_menu .= '<br /><input type="text" class="colorchooser" size="8" name="'.$role.'_'.$item.'" value="'.$color.
             $color_menu .= '&nbsp;<span id="css_'.$role.'_'.$item.'" style="background-color: '.$designs->{'logintext'}{$item}.';">&nbsp;&nbsp;&nbsp;</span>';                        '" onblur = "javascript:colchg_span('."'css_".$role.'_'.$item."'".',this);" /></td>';
         }  
         $color_menu .= '<br /><input type="text" size="8" name="'.$role.'_'.$item.'" value="'.  
                        $designs->{'logintext'}{$item}.'" onblur = "javascript:colchg_span('."'css_".$role.'_'.$item."'".',this);" /></td>'.  
                        '<td>&nbsp;</td>';  
     }      }
     $color_menu .= '</tr></table><br />';      $color_menu .= '</tr></table><br />';
     return $color_menu;      return $color_menu;
Line 1484  sub image_changes { Line 1597  sub image_changes {
                        $role.'_del_'.$img.'" value="1" />'.&mt('Delete?').                         $role.'_del_'.$img.'" value="1" />'.&mt('Delete?').
                        '</label>&nbsp;'.&mt('Replace:').'</span><br />';                         '</label>&nbsp;'.&mt('Replace:').'</span><br />';
         } else {          } else {
             $output .= '<td valign="bottom">'.$logincolors.&mt('Upload:').'<br />';              $output .= '<td valign="middle">'.$logincolors.&mt('Upload:').'<br />';
         }          }
     }      }
     return $output;      return $output;
 }  }
   
 sub color_pick {  
     my ($phase,$role,$item,$desc,$curcol) = @_;  
     my $link = '<a href="javascript:pjump('."'color_custom','".$desc.  
                "','".$curcol."','".$role.'_'.$item."','parmform.pres','psub'".  
                ');">'.$desc.'</a>';  
     return $link;  
 }  
   
 sub print_quotas {  sub print_quotas {
     my ($dom,$settings,$rowtotal,$action) = @_;      my ($dom,$settings,$rowtotal,$action) = @_;
     my $context;      my $context;
Line 1511  sub print_quotas { Line 1616  sub print_quotas {
     my $typecount = 0;      my $typecount = 0;
     my ($css_class,%titles);      my ($css_class,%titles);
     if ($context eq 'requestcourses') {      if ($context eq 'requestcourses') {
         @usertools = ('official','unofficial','community');          @usertools = ('official','unofficial','community','textbook');
         @options =('norequest','approval','validate','autolimit');          @options =('norequest','approval','validate','autolimit');
         %validations = &Apache::lonnet::auto_courserequest_checks($dom);          %validations = &Apache::lonnet::auto_courserequest_checks($dom);
         %titles = &courserequest_titles();          %titles = &courserequest_titles();
Line 1925  sub print_quotas { Line 2030  sub print_quotas {
   
 sub print_requestmail {  sub print_requestmail {
     my ($dom,$action,$settings,$rowtotal) = @_;      my ($dom,$action,$settings,$rowtotal) = @_;
     my ($now,$datatable,%currapp,$rows);      my ($now,$datatable,%currapp);
     $now = time;      $now = time;
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         if (ref($settings->{'notify'}) eq 'HASH') {          if (ref($settings->{'notify'}) eq 'HASH') {
             if ($settings->{'notify'}{'approval'} ne '') {              if ($settings->{'notify'}{'approval'} ne '') {
                map {$currapp{$_}=1;} split(/,/,$settings->{'notify'}{'approval'});                  map {$currapp{$_}=1;} split(/,/,$settings->{'notify'}{'approval'});
             }              }
         }          }
     }      }
     my $numinrow = 2;      my $numinrow = 2;
     my $css_class = 'class="LC_odd_row"';      my $css_class;
       $css_class = ($$rowtotal%2? ' class="LC_odd_row"':'');
     my $text;      my $text;
     if ($action eq 'requestcourses') {      if ($action eq 'requestcourses') {
         $text = &mt('Receive notification of course requests requiring approval');          $text = &mt('Receive notification of course requests requiring approval');
       } elsif ($action eq 'requestauthor') {
           $text = &mt('Receive notification of Authoring Space requests requiring approval');
     } else {      } else {
         $text = &mt('Receive notification of authoring space requests requiring approval')         $text = &mt('Receive notification of queued requests for self-created user accounts requiring approval');
     }      }
     $datatable = '<tr '.$css_class.'>'.      $datatable = '<tr'.$css_class.'>'.
                  ' <td>'.$text.'</td>'.                   ' <td>'.$text.'</td>'.
                  ' <td class="LC_left_item">';                   ' <td class="LC_left_item">';
     my ($numdc,$table,$rows) = &active_dc_picker($dom,$numinrow,'checkbox',      my ($numdc,$table,$rows) = &active_dc_picker($dom,$numinrow,'checkbox',
                                                  'reqapprovalnotify',%currapp);                                                   $action.'notifyapproval',%currapp);
     if ($numdc > 0) {      if ($numdc > 0) {
         $datatable .= $table;          $datatable .= $table;
     } else {      } else {
Line 1957  sub print_requestmail { Line 2065  sub print_requestmail {
     return $datatable;      return $datatable;
 }  }
   
   sub print_studentcode {
       my ($settings,$rowtotal) = @_;
       my $rownum = 0; 
       my ($output,%current);
       my @crstypes = ('official','unofficial','community','textbook');
       if (ref($settings->{'uniquecode'}) eq 'HASH') {
           foreach my $type (@crstypes) {
               $current{$type} = $settings->{'uniquecode'}{$type};
           }
       }
       $output .= '<tr>'.
                  '<td class="LC_left_item">'.&mt('Generate unique six character code as course identifier?').'</td>'.
                  '<td class="LC_left_item">';
       foreach my $type (@crstypes) {
           my $check = ' ';
           if ($current{$type}) {
               $check = ' checked="checked" ';
           }
           $output .= '<span class="LC_nobreak"><label>'.
                      '<input type="checkbox" name="uniquecode" value="'.$type.'"'.$check.'/>'.
                      &mt($type).'</label></span>'.('&nbsp;'x2).' ';
       }
       $output .= '</td></tr>';
       $$rowtotal ++;
       return $output;
   }
   
   sub print_textbookcourses {
       my ($dom,$settings,$rowtotal) = @_;
       my $rownum = 0;
       my $css_class;
       my $itemcount = 1;
       my $maxnum = 0;
       my $bookshash;
       if (ref($settings) eq 'HASH') {
           $bookshash = $settings->{'textbooks'};
       }
       my %ordered;
       if (ref($bookshash) eq 'HASH') {
           foreach my $item (keys(%{$bookshash})) {
               if (ref($bookshash->{$item}) eq 'HASH') {
                   my $num = $bookshash->{$item}{'order'};
                   $ordered{$num} = $item;
               }
           }
       }
       my $confname = $dom.'-domainconfig';
       my $switchserver = &check_switchserver($dom,$confname);
       $maxnum = scalar(keys(%ordered));
       my $datatable = &textbookcourses_javascript(\%ordered);
       if (keys(%ordered)) {
           my @items = sort { $a <=> $b } keys(%ordered);
           for (my $i=0; $i<@items; $i++) {
               $css_class = $itemcount%2?' class="LC_odd_row"':'';
               my $key = $ordered{$items[$i]};
               my %coursehash=&Apache::lonnet::coursedescription($key);
               my $coursetitle = $coursehash{'description'};
               my ($subject,$title,$author,$image,$imgsrc,$cdom,$cnum);
               if (ref($bookshash->{$key}) eq 'HASH') {
                   $subject = $bookshash->{$key}->{'subject'};
                   $title = $bookshash->{$key}->{'title'};
                   $author = $bookshash->{$key}->{'author'};
                   $image = $bookshash->{$key}->{'image'};
                   if ($image ne '') {
                       my ($path,$imagefile) = ($image =~ m{^(.+)/([^/]+)$});
                       my $imagethumb = "$path/tn-".$imagefile;
                       $imgsrc = '<img src="'.$imagethumb.'" alt="'.&mt('Textbook image').'" />';
                   }
               }
               my $chgstr = ' onchange="javascript:reorderBooks(this.form,'."'$key'".');"';
               $datatable .= '<tr '.$css_class.'><td><span class="LC_nobreak">'
                            .'<select name="'.$key.'"'.$chgstr.'>';
               for (my $k=0; $k<=$maxnum; $k++) {
                   my $vpos = $k+1;
                   my $selstr;
                   if ($k == $i) {
                       $selstr = ' selected="selected" ';
                   }
                   $datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>';
               }
               $datatable .= '</select>'.('&nbsp;'x2).
                   '<label><input type="checkbox" name="book_del" value="'.$key.'" />'.
                   &mt('Delete?').'</label></span></td>'.
                   '<td colspan="2">'.
                   '<span class="LC_nobreak">'.&mt('Subject:').'<input type="text" size="15" name="book_subject_'.$i.'" value="'.$subject.'" /></span> '.
                   ('&nbsp;'x2).
                   '<span class="LC_nobreak">'.&mt('Title:').'<input type="text" size="30" name="book_title_'.$i.'" value="'.$title.'" /></span> '.
                   ('&nbsp;'x2).
                   '<span class="LC_nobreak">'.&mt('Author(s):').'<input type="text" size="25" name="book_author_'.$i.'" value="'.$author.'" /></span> '.
                   ('&nbsp;'x2).
                   '<span class="LC_nobreak">'.&mt('Thumbnail:');
               if ($image) {
                   $datatable .= '<span class="LC_nobreak">'.
                                 $imgsrc.
                                 '<label><input type="checkbox" name="book_image_del"'.
                                 ' value="'.$key.'" />'.&mt('Delete?').'</label></span> '.
                                 '<span class="LC_nobreak">&nbsp;'.&mt('Replace:').'&nbsp;';
               }
               if ($switchserver) {
                   $datatable .= &mt('Upload to library server: [_1]',$switchserver);
               } else {
                   $datatable .= '<input type="file" name="book_image_'.$i.'" value="" />';
               }
               $datatable .= '<input type="hidden" name="book_id_'.$i.'" value="'.$key.'" /></span> '.
                             '<span class="LC_nobreak">'.&mt('LON-CAPA course:').'&nbsp;'.
                             $coursetitle.'</span></td></tr>'."\n";
               $itemcount ++;
           }
       }
       $css_class = $itemcount%2?' class="LC_odd_row"':'';
       my $chgstr = ' onchange="javascript:reorderBooks(this.form,'."'addbook_pos'".');"';
       $datatable .= '<tr '.$css_class.'><td><span class="LC_nobreak">'."\n".
                     '<input type="hidden" name="book_maxnum" value="'.$maxnum.'" />'."\n".
                     '<select name="addbook_pos"'.$chgstr.'>';
       for (my $k=0; $k<$maxnum+1; $k++) {
           my $vpos = $k+1;
           my $selstr;
           if ($k == $maxnum) {
               $selstr = ' selected="selected" ';
           }
           $datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>';
       }
       $datatable .= '</select>&nbsp;'."\n".
                     '<input type="checkbox" name="addbook" value="1" />'.&mt('Add').'</td>'."\n".
                     '<td colspan="2">'.
                     '<span class="LC_nobreak">'.&mt('Subject:').'<input type="text" size="15" name="addbook_subject" value="" /></span> '."\n".
                     ('&nbsp;'x2).
                     '<span class="LC_nobreak">'.&mt('Title:').'<input type="text" size="30" name="addbook_title" value="" /></span> '."\n".
                     ('&nbsp;'x2).
                     '<span class="LC_nobreak">'.&mt('Author(s):').'<input type="text" size="25" name="addbook_author" value="" /></span> '."\n".
                     ('&nbsp;'x2).
                     '<span class="LC_nobreak">'.&mt('Image:').'&nbsp;';
       if ($switchserver) {
           $datatable .= &mt('Upload to library server: [_1]',$switchserver);
       } else {
           $datatable .= '<input type="file" name="addbook_image" value="" />';
       }
       $datatable .= '</span>'."\n".
                     '<span class="LC_nobreak">'.&mt('LON-CAPA course:').'&nbsp;'.
                     &Apache::loncommon::select_dom_form($env{'request.role.domain'},'addbook_cdom').
                     '<input type="text" size="25" name="addbook_cnum" value="" />'.
                     &Apache::loncommon::selectcourse_link
                         ('display','addbook_cnum','addbook_cdom',undef,undef,undef,'Course');
                     '</span></td>'."\n".
                     '</tr>'."\n";
       $itemcount ++;
       return $datatable;
   }
   
   sub textbookcourses_javascript {
       my ($textbooks) = @_;
       return unless(ref($textbooks) eq 'HASH');
       my $num = scalar(keys(%{$textbooks}));
       my @jsarray;
       foreach my $item (sort {$a <=> $b } (keys(%{$textbooks}))) {
           push(@jsarray,$textbooks->{$item});
       }
       my $jstext = '    var textbooks = Array('."'".join("','",@jsarray)."'".');'."\n";
       return <<"ENDSCRIPT";
   <script type="text/javascript">
   // <![CDATA[
   function reorderBooks(form,item) {
       var changedVal;
   $jstext 
       var newpos = 'addbook_pos';
       var current = new Array;
       var maxh = 1 + $num;
       var newitemVal = form.elements[newpos].options[form.elements[newpos].selectedIndex].value;
       if (item == newpos) {
           changedVal = newitemVal;
       } else {
           changedVal = form.elements[item].options[form.elements[item].selectedIndex].value;
           current[newitemVal] = newpos;
       }
       for (var i=0; i<textbooks.length; i++) {
           var elementName = textbooks[i];
           if (elementName != item) {
               if (form.elements[elementName]) {
                   var currVal = form.elements[elementName].options[form.elements[elementName].selectedIndex].value;
                   current[currVal] = elementName;
               }
           }
       }
       var oldVal;
       for (var j=0; j<maxh; j++) {
           if (current[j] == undefined) {
               oldVal = j;
           }
       }
       if (oldVal < changedVal) {
           for (var k=oldVal+1; k<=changedVal ; k++) {
              var elementName = current[k];
              form.elements[elementName].selectedIndex = form.elements[elementName].selectedIndex - 1;
           }
       } else {
           for (var k=changedVal; k<oldVal; k++) {
               var elementName = current[k];
               form.elements[elementName].selectedIndex = form.elements[elementName].selectedIndex + 1;
           }
       }
       return;
   }
   
   // ]]>
   </script>
   
   ENDSCRIPT
   }
   
 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),
Line 2275  sub print_contacts { Line 2592  sub print_contacts {
     my @contacts = ('adminemail','supportemail');      my @contacts = ('adminemail','supportemail');
     my (%checked,%to,%otheremails,%bccemails);      my (%checked,%to,%otheremails,%bccemails);
     my @mailings = ('errormail','packagesmail','lonstatusmail','helpdeskmail',      my @mailings = ('errormail','packagesmail','lonstatusmail','helpdeskmail',
                     'requestsmail','updatesmail');                      'requestsmail','updatesmail','idconflictsmail');
     foreach my $type (@mailings) {      foreach my $type (@mailings) {
         $otheremails{$type} = '';          $otheremails{$type} = '';
     }      }
Line 2311  sub print_contacts { Line 2628  sub print_contacts {
         $checked{'helpdeskmail'}{'supportemail'} = ' checked="checked" ';          $checked{'helpdeskmail'}{'supportemail'} = ' checked="checked" ';
         $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" ';           $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; 
         $checked{'requestsmail'}{'adminemail'} = ' checked="checked" ';          $checked{'requestsmail'}{'adminemail'} = ' checked="checked" ';
         $checked{'updatesmail'}{'adminemail'} = ' checked="checked" ';           $checked{'updatesmail'}{'adminemail'} = ' checked="checked" ';
           $checked{'idconflictsmail'}{'adminemail'} = ' checked="checked" ';
     }      }
     my ($titles,$short_titles) = &contact_titles();      my ($titles,$short_titles) = &contact_titles();
     my $rownum = 0;      my $rownum = 0;
     my $css_class;      my $css_class;
     foreach my $item (@contacts) {      foreach my $item (@contacts) {
         $rownum ++;  
         $css_class = $rownum%2?' class="LC_odd_row"':'';          $css_class = $rownum%2?' class="LC_odd_row"':'';
         $datatable .= '<tr'.$css_class.'>'.           $datatable .= '<tr'.$css_class.'>'. 
                   '<td><span class="LC_nobreak">'.$titles->{$item}.                    '<td><span class="LC_nobreak">'.$titles->{$item}.
                   '</span></td><td class="LC_right_item">'.                    '</span></td><td class="LC_right_item">'.
                   '<input type="text" name="'.$item.'" value="'.                    '<input type="text" name="'.$item.'" value="'.
                   $to{$item}.'" /></td></tr>';                    $to{$item}.'" /></td></tr>';
           $rownum ++;
     }      }
     foreach my $type (@mailings) {      foreach my $type (@mailings) {
         $rownum ++;  
         $css_class = $rownum%2?' class="LC_odd_row"':'';          $css_class = $rownum%2?' class="LC_odd_row"':'';
         $datatable .= '<tr'.$css_class.'>'.          $datatable .= '<tr'.$css_class.'>'.
                       '<td><span class="LC_nobreak">'.                        '<td><span class="LC_nobreak">'.
Line 2349  sub print_contacts { Line 2666  sub print_contacts {
                           'value="'.$bccemails{$type}.'"  />';                            'value="'.$bccemails{$type}.'"  />';
         }          }
         $datatable .= '</td></tr>'."\n";          $datatable .= '</td></tr>'."\n";
           $rownum ++;
     }      }
       my %choices;
       $choices{'reporterrors'} = &mt('E-mail error reports to [_1]',
                                      &Apache::loncommon::modal_link('http://loncapa.org/core.html',
                                      &mt('LON-CAPA core group - MSU'),600,500));
       $choices{'reportupdates'} = &mt('E-mail record of completed LON-CAPA updates to [_1]',
                                       &Apache::loncommon::modal_link('http://loncapa.org/core.html',
                                       &mt('LON-CAPA core group - MSU'),600,500));
       my @toggles = ('reporterrors','reportupdates');
       my %defaultchecked = ('reporterrors'  => 'on',
                             'reportupdates' => 'on');
       (my $reports,$rownum) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked,
                                                  \%choices,$rownum);
       $datatable .= $reports;
     $$rowtotal += $rownum;      $$rowtotal += $rownum;
     return $datatable;      return $datatable;
 }  }
Line 2426  sub print_coursedefaults { Line 2757  sub print_coursedefaults {
     my $itemcount = 1;      my $itemcount = 1;
     my %choices =  &Apache::lonlocal::texthash (      my %choices =  &Apache::lonlocal::texthash (
         canuse_pdfforms      => 'Course/Community users can create/upload PDF forms',          canuse_pdfforms      => 'Course/Community users can create/upload PDF forms',
           uploadquota          => 'Default quota for files uploaded directly to course/community using Course Editor (MB)',
         anonsurvey_threshold => 'Responder count needed before showing submissions for anonymous surveys',          anonsurvey_threshold => 'Responder count needed before showing submissions for anonymous surveys',
         coursecredits        => 'Credits can be specified for courses',          coursecredits        => 'Credits can be specified for courses',
     );      );
       my %staticdefaults = (
                              anonsurvey_threshold => 10,
                              uploadquota          => 500,
                            );
     if ($position eq 'top') {      if ($position eq 'top') {
         %defaultchecked = ('canuse_pdfforms' => 'off');          %defaultchecked = ('canuse_pdfforms' => 'off');
         @toggles = ('canuse_pdfforms');          @toggles = ('canuse_pdfforms');
Line 2436  sub print_coursedefaults { Line 2772  sub print_coursedefaults {
                                                  \%choices,$itemcount);                                                   \%choices,$itemcount);
     } else {      } else {
         $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';          $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';
         my ($currdefresponder,$def_official_credits,$def_unofficial_credits);          my ($currdefresponder,$def_official_credits,$def_unofficial_credits,$def_textbook_credits,
               %curruploadquota);
         my $currusecredits = 0;          my $currusecredits = 0;
           my @types = ('official','unofficial','community','textbook');
         if (ref($settings) eq 'HASH') {          if (ref($settings) eq 'HASH') {
             $currdefresponder = $settings->{'anonsurvey_threshold'};              $currdefresponder = $settings->{'anonsurvey_threshold'};
               if (ref($settings->{'uploadquota'}) eq 'HASH') {
                   foreach my $type (keys(%{$settings->{'uploadquota'}})) {
                       $curruploadquota{$type} = $settings->{'uploadquota'}{$type};
                   }
               }
             if (ref($settings->{'coursecredits'}) eq 'HASH') {              if (ref($settings->{'coursecredits'}) eq 'HASH') {
                 $def_official_credits = $settings->{'coursecredits'}->{'official'};                  $def_official_credits = $settings->{'coursecredits'}->{'official'};
                 $def_unofficial_credits = $settings->{'coursecredits'}->{'unofficial'};                  $def_unofficial_credits = $settings->{'coursecredits'}->{'unofficial'};
                 if (($def_official_credits ne '') || ($def_unofficial_credits ne '')) {                  $def_textbook_credits = $settings->{'coursecredits'}->{'textbook'};
                   if (($def_official_credits ne '') || ($def_unofficial_credits ne '') ||
                       ($def_textbook_credits ne '')) {
                     $currusecredits = 1;                      $currusecredits = 1;
                 }                  }
             }              }
         }          }
         if (!$currdefresponder) {          if (!$currdefresponder) {
             $currdefresponder = 10;              $currdefresponder = $staticdefaults{'anonsurvey_threshold'};
         } elsif ($currdefresponder < 1) {          } elsif ($currdefresponder < 1) {
             $currdefresponder = 1;              $currdefresponder = 1;
         }          }
           foreach my $type (@types) {
               if ($curruploadquota{$type} eq '') {
                   $curruploadquota{$type} = $staticdefaults{'uploadquota'};
               }
           }
         $datatable .=          $datatable .=
                 '<tr'.$css_class.'><td><span class="LC_nobreak">'.                  '<tr'.$css_class.'><td><span class="LC_nobreak">'.
                 $choices{'anonsurvey_threshold'}.                  $choices{'anonsurvey_threshold'}.
Line 2462  sub print_coursedefaults { Line 2812  sub print_coursedefaults {
                 ' value="'.$currdefresponder.'" size="5" /></span>'.                  ' value="'.$currdefresponder.'" size="5" /></span>'.
                 '</td></tr>'."\n";                  '</td></tr>'."\n";
         $itemcount ++;          $itemcount ++;
         my $onclick = 'toggleCredits(this.form);';          $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';
           $datatable .= '<tr'.$css_class.'><td><span class="LC_nobreak">'.
                         $choices{'uploadquota'}.
                         '</span></td>'.
                         '<td align="right" class="LC_right_item">'.
                         '<table><tr>';
           foreach my $type (@types) {
               $datatable .= '<td align="center">'.&mt($type).'<br />'.
                              '<input type="text" name="uploadquota_'.$type.'"'.
                              ' value="'.$curruploadquota{$type}.'" size="5" /></td>';
           }
           $datatable .= '</tr></table></td></tr>'."\n";
           $itemcount ++;
           my $onclick = "toggleDisplay(this.form,'credits');";
         my $display = 'none';          my $display = 'none';
         if ($currusecredits) {          if ($currusecredits) {
             $display = 'block';              $display = 'block';
Line 2477  sub print_coursedefaults { Line 2840  sub print_coursedefaults {
                          &mt('Default credits for unofficial courses [_1]',                           &mt('Default credits for unofficial courses [_1]',
                          '<input type="text" name="unofficial_credits" value="'.                           '<input type="text" name="unofficial_credits" value="'.
                          $def_unofficial_credits.'" size="3" />').                           $def_unofficial_credits.'" size="3" />').
                            '</span><br />'.
                            '<span class="LC_nobreak">'.
                            &mt('Default credits for textbook courses [_1]',
                            '<input type="text" name="textbook_credits" value="'.
                            $def_textbook_credits.'" size="3" />').
                          '</span></div>'."\n";                           '</span></div>'."\n";
         %defaultchecked = ('coursecredits' => 'off');          %defaultchecked = ('coursecredits' => 'off');
         @toggles = ('coursecredits');          @toggles = ('coursecredits');
Line 2487  sub print_coursedefaults { Line 2855  sub print_coursedefaults {
             &radiobutton_prefs($current,\@toggles,\%defaultchecked,              &radiobutton_prefs($current,\@toggles,\%defaultchecked,
                                \%choices,$itemcount,$onclick,$additional);                                 \%choices,$itemcount,$onclick,$additional);
         $datatable .= $table;          $datatable .= $table;
           $itemcount ++;
       }
       $$rowtotal += $itemcount;
       return $datatable;
   }
   
   sub print_selfenrollment {
       my ($position,$dom,$settings,$rowtotal) = @_;
       my ($css_class,$datatable);
       my $itemcount = 1;
       my @types = ('official','unofficial','community','textbook');
       if (($position eq 'top') || ($position eq 'middle')) {
           my ($rowsref,$titlesref) = &Apache::lonuserutils::get_selfenroll_titles();
           my %descs = &Apache::lonuserutils::selfenroll_default_descs();
           my @rows;
           my $key;
           if ($position eq 'top') {
               $key = 'admin'; 
               if (ref($rowsref) eq 'ARRAY') {
                   @rows = @{$rowsref};
               }
           } elsif ($position eq 'middle') {
               $key = 'default';
               @rows = ('types','registered','approval','limit');
           }
           foreach my $row (@rows) {
               if (defined($titlesref->{$row})) {
                   $itemcount ++;
                   $css_class = $itemcount%2?' class="LC_odd_row"':'';
                   $datatable .= '<tr'.$css_class.'>'.
                                 '<td>'.$titlesref->{$row}.'</td>'.
                                 '<td class="LC_left_item">'.
                                 '<table><tr>';
                   my (%current,%currentcap);
                   if (ref($settings) eq 'HASH') {
                       if (ref($settings->{$key}) eq 'HASH') {
                           foreach my $type (@types) {
                               if (ref($settings->{$key}->{$type}) eq 'HASH') {
                                   $current{$type} = $settings->{$key}->{$type}->{$row};
                               }
                               if (($row eq 'limit') && ($key eq 'default')) {
                                   if (ref($settings->{$key}->{$type}) eq 'HASH') {
                                       $currentcap{$type} = $settings->{$key}->{$type}->{'cap'};
                                   }
                               }
                           }
                       }
                   }
                   my %roles = (
                                '0' => &Apache::lonnet::plaintext('dc'),
                               ); 
               
                   foreach my $type (@types) {
                       unless (($row eq 'registered') && ($key eq 'default')) {
                           $datatable .= '<th>'.&mt($type).'</th>';
                       }
                   }
                   unless (($row eq 'registered') && ($key eq 'default')) {
                       $datatable .= '</tr><tr>';
                   }
                   foreach my $type (@types) {
                       if ($type eq 'community') {
                           $roles{'1'} = &mt('Community personnel');
                       } else {
                           $roles{'1'} = &mt('Course personnel');
                       }
                       $datatable .= '<td style="vertical-align: top">';
                       if ($position eq 'top') {
                           my %checked;
                           if ($current{$type} eq '0') {
                               $checked{'0'} = ' checked="checked"';
                           } else {
                               $checked{'1'} = ' checked="checked"';
                           }
                           foreach my $role ('1','0') {
                               $datatable .= '<span class="LC_nobreak"><label>'.
                                             '<input type="radio" name="selfenrolladmin_'.$row.'_'.$type.'" '.
                                             'value="'.$role.'"'.$checked{$role}.' />'.
                                             $roles{$role}.'</label></span> ';
                           }
                       } else {
                           if ($row eq 'types') {
                               my %checked;
                               if ($current{$type} =~ /^(all|dom)$/) {
                                   $checked{$1} = ' checked="checked"';
                               } else {
                                   $checked{''} = ' checked="checked"';
                               }
                               foreach my $val ('','dom','all') {
                                   $datatable .= '<span class="LC_nobreak"><label>'.
                                                 '<input type ="radio" name="selfenrolldefault_'.$row.'_'.$type.'" '.
                                                 'value="'.$val.'"'.$checked{$val}.' />'.$descs{$row}{$val}.'</label></span> ';
                               }
                           } elsif ($row eq 'registered') {
                               my %checked;
                               if ($current{$type} eq '1') {
                                   $checked{'1'} = ' checked="checked"';
                               } else {
                                   $checked{'0'} = ' checked="checked"';
                               }
                               foreach my $val ('0','1') {
                                   $datatable .= '<span class="LC_nobreak"><label>'.
                                                 '<input type ="radio" name="selfenrolldefault_'.$row.'_'.$type.'" '.
                                                 'value="'.$val.'"'.$checked{$val}.' />'.$descs{$row}{$val}.'</label></span> ';
                               }
                           } elsif ($row eq 'approval') {
                               my %checked;
                               if ($current{$type} =~ /^([12])$/) {
                                   $checked{$1} = ' checked="checked"';
                               } else {
                                   $checked{'0'} = ' checked="checked"';
                               }
                               for my $val (0..2) {
                                   $datatable .= '<span class="LC_nobreak"><label>'.
                                                 '<input type="radio" name="selfenrolldefault_'.$row.'_'.$type.'" '.
                                                 'value="'.$val.'"'.$checked{$val}.' />'.$descs{$row}{$val}.'</label></span> ';
                               }
                           } elsif ($row eq 'limit') {
                               my %checked;
                               if ($current{$type} =~ /^(allstudents|selfenrolled)$/) {
                                   $checked{$1} = ' checked="checked"';
                               } else {
                                   $checked{'none'} = ' checked="checked"';
                               }
                               my $cap;
                               if ($currentcap{$type} =~ /^\d+$/) {
                                   $cap = $currentcap{$type};
                               }
                               foreach my $val ('none','allstudents','selfenrolled') {
                                   $datatable .= '<span class="LC_nobreak"><label>'.
                                                 '<input type="radio" name="selfenrolldefault_'.$row.'_'.$type.'" '.
                                                 'value="'.$val.'"'.$checked{$val}.' />'.$descs{$row}{$val}.'</label></span> ';
                               }
                               $datatable .= '<br />'.
                                             '<span class="LC_nobreak">'.&mt('Maximum allowed: ').
                                             '<input type="text" name="selfenrolldefault_cap_'.$type.'" size = "5" value="'.$cap.'" />'.
                                             '</span>'; 
                           }
                       }
                       $datatable .= '</td>';
                   }
                   $datatable .= '</tr>';
               }
               $datatable .= '</table></td></tr>';
           }
       } elsif ($position eq 'bottom') {
           $datatable .= &print_validation_rows('selfenroll',$dom,$settings,\$itemcount);
     }      }
     $$rowtotal += $itemcount;      $$rowtotal += $itemcount;
     return $datatable;      return $datatable;
 }  }
   
   sub print_validation_rows {
       my ($caller,$dom,$settings,$rowtotal) = @_;
       my ($itemsref,$namesref,$fieldsref);
       if ($caller eq 'selfenroll') { 
           ($itemsref,$namesref,$fieldsref) = &Apache::lonuserutils::selfenroll_validation_types();
       } elsif ($caller eq 'requestcourses') {
           ($itemsref,$namesref,$fieldsref) = &Apache::loncoursequeueadmin::requestcourses_validation_types();
       }
       my %currvalidation;
       if (ref($settings) eq 'HASH') {
           if (ref($settings->{'validation'}) eq 'HASH') {
               %currvalidation = %{$settings->{'validation'}};
           }
       }
       my $datatable;
       my $itemcount = 0;
       foreach my $item (@{$itemsref}) {
           my $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';
           $datatable .= '<tr'.$css_class.'><td><span class="LC_nobreak">'.
                         $namesref->{$item}.
                         '</span></td>'.
                         '<td class="LC_left_item">';
           if (($item eq 'url') || ($item eq 'button')) {
               $datatable .= '<span class="LC_nobreak">'.
                             '<input type="text" name="'.$caller.'_validation_'.$item.'"'.
                             ' value="'.$currvalidation{$item}.'" size="50" /></span>';
           } elsif ($item eq 'fields') {
               my @currfields;
               if (ref($currvalidation{$item}) eq 'ARRAY') {
                   @currfields = @{$currvalidation{$item}};
               }
               foreach my $field (@{$fieldsref}) {
                   my $check = '';
                   if (grep(/^\Q$field\E$/,@currfields)) {
                       $check = ' checked="checked"';
                   }
                   $datatable .= '<span class="LC_nobreak"><label>'.
                                 '<input type="checkbox" name="'.$caller.'_validation_fields"'.
                                 ' value="'.$field.'"'.$check.' />'.$field.
                                 '</label></span> ';
               }
           } elsif ($item eq 'markup') {
               $datatable .= '<textarea name="'.$caller.'_validation_markup" cols="50" rows="5" wrap="soft">'.
                              $currvalidation{$item}.
                                 '</textarea>';
           }
           $datatable .= '</td></tr>'."\n";
           if (ref($rowtotal)) {
               $itemcount ++;
           }
       }
       if ($caller eq 'requestcourses') {
           my %currhash;
           if (ref($settings->{'validation'}) eq 'HASH') {
               if ($settings->{'validation'}{'dc'} ne '') {
                   $currhash{$settings->{'validation'}{'dc'}} = 1;
               }
           }
           my $numinrow = 2;
           my ($numdc,$dctable,$rows) = &active_dc_picker($dom,$numinrow,'radio',
                                                          'validationdc',%currhash);
           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>';
           } else {
               $datatable .= $dctable.'</td></tr>';
           }
           $itemcount ++;
       }
       if (ref($rowtotal)) {
           $$rowtotal += $itemcount;
       }
       return $datatable;
   }
   
 sub print_usersessions {  sub print_usersessions {
     my ($position,$dom,$settings,$rowtotal) = @_;      my ($position,$dom,$settings,$rowtotal) = @_;
     my ($css_class,$datatable,%checked,%choices);      my ($css_class,$datatable,%checked,%choices);
Line 2918  sub print_loadbalancing { Line 3509  sub print_loadbalancing {
     }      }
     my ($othertitle,$usertypes,$types) =      my ($othertitle,$usertypes,$types) =
         &Apache::loncommon::sorted_inst_types($dom);          &Apache::loncommon::sorted_inst_types($dom);
     my $rownum = 6;      my $rownum = 8;
     if (ref($types) eq 'ARRAY') {      if (ref($types) eq 'ARRAY') {
         $rownum += scalar(@{$types});          $rownum += scalar(@{$types});
     }      }
Line 3097  sub loadbalancing_rules { Line 3688  sub loadbalancing_rules {
             if (ref($currrules) eq 'HASH') {              if (ref($currrules) eq 'HASH') {
                 $current = $currrules->{$type};                  $current = $currrules->{$type};
             }              }
             if (($type eq '_LC_external') || ($type eq '_LC_internetdom')) {              if (($type eq '_LC_external') || ($type eq '_LC_internetdom') || ($type eq '_LC_ipchange')) {
                 if ($dom ne &Apache::lonnet::host_domain($lonhost)) {                  if ($dom ne &Apache::lonnet::host_domain($lonhost)) {
                     $current = '';                      $current = '';
                 }                  }
Line 3118  sub loadbalancing_titles { Line 3709  sub loadbalancing_titles {
            '_LC_author'      => &mt('Users from [_1] with author role',$dom),             '_LC_author'      => &mt('Users from [_1] with author role',$dom),
            '_LC_internetdom' => &mt('Users not from [_1], but from [_2]',$dom,$intdom),             '_LC_internetdom' => &mt('Users not from [_1], but from [_2]',$dom,$intdom),
            '_LC_external'    => &mt('Users not from [_1]',$intdom),             '_LC_external'    => &mt('Users not from [_1]',$intdom),
              '_LC_ipchangesso' => &mt('SSO users from [_1], with IP mismatch',$dom),
              '_LC_ipchange'    => &mt('Non-SSO users with IP mismatch'),
                      );                       );
     my @alltypes = ('_LC_adv','_LC_author','_LC_internetdom','_LC_external');      my @alltypes = ('_LC_adv','_LC_author','_LC_internetdom','_LC_external','_LC_ipchangesso','_LC_ipchange');
     if (ref($types) eq 'ARRAY') {      if (ref($types) eq 'ARRAY') {
         unshift(@alltypes,@{$types},'default');          unshift(@alltypes,@{$types},'default');
     }      }
Line 3144  sub loadbalancing_titles { Line 3737  sub loadbalancing_titles {
 sub loadbalance_rule_row {  sub loadbalance_rule_row {
     my ($type,$title,$current,$servers,$currbalancer,$lonhost,$dom,      my ($type,$title,$current,$servers,$currbalancer,$lonhost,$dom,
         $targets_div_style,$homedom_div_style,$css_class,$balnum,$num,$islast) = @_;          $targets_div_style,$homedom_div_style,$css_class,$balnum,$num,$islast) = @_;
     my @rulenames = ('default','homeserver');      my @rulenames;
     my %ruletitles = &offloadtype_text();      my %ruletitles = &offloadtype_text();
     if ($type eq '_LC_external') {      if (($type eq '_LC_ipchangesso') || ($type eq '_LC_ipchange')) {
         push(@rulenames,'externalbalancer');          @rulenames = ('balancer','offloadedto');
     } else {      } else {
         push(@rulenames,'specific');          @rulenames = ('default','homeserver');
           if ($type eq '_LC_external') {
               push(@rulenames,'externalbalancer');
           } else {
               push(@rulenames,'specific');
           }
           push(@rulenames,'none');
     }      }
     push(@rulenames,'none');  
     my $style = $targets_div_style;      my $style = $targets_div_style;
     if (($type eq '_LC_external') || ($type eq '_LC_internetdom')) {      if (($type eq '_LC_external') || ($type eq '_LC_internetdom') || ($type eq '_LC_ipchange')) {
         $style = $homedom_div_style;          $style = $homedom_div_style;
     }      }
     my $space;      my $space;
Line 3218  sub offloadtype_text { Line 3816  sub offloadtype_text {
            'externalbalancer' => "Offloads to Load Balancer in user's domain",             'externalbalancer' => "Offloads to Load Balancer in user's domain",
            'specific'         => 'Offloads to specific server',             'specific'         => 'Offloads to specific server',
            'none'             => 'No offload',             'none'             => 'No offload',
              'balancer'         => 'Session hosted on Load Balancer, after re-authentication',
              'offloadedto'      => 'Session hosted on offload server, after re-authentication',
     );      );
     return %ruletitles;      return %ruletitles;
 }  }
Line 3240  sub contact_titles { Line 3840  sub contact_titles {
                    'lonstatusmail' => 'E-mail from nightly status check (warnings/errors)',                     'lonstatusmail' => 'E-mail from nightly status check (warnings/errors)',
                    'requestsmail' => 'E-mail from course requests requiring approval',                     'requestsmail' => 'E-mail from course requests requiring approval',
                    'updatesmail'  => 'E-mail from nightly check of LON-CAPA module integrity/updates',                     'updatesmail'  => 'E-mail from nightly check of LON-CAPA module integrity/updates',
                      'idconflictsmail' => 'E-mail from bi-nightly check for multiple users sharing same student/employee ID',
                  );                   );
     my %short_titles = &Apache::lonlocal::texthash (      my %short_titles = &Apache::lonlocal::texthash (
                            adminemail   => 'Admin E-mail address',                             adminemail   => 'Admin E-mail address',
Line 3257  sub tool_titles { Line 3858  sub tool_titles {
                      official   => 'Official courses (with institutional codes)',                       official   => 'Official courses (with institutional codes)',
                      unofficial => 'Unofficial courses',                       unofficial => 'Unofficial courses',
                      community  => 'Communities',                       community  => 'Communities',
                        textbook   => 'Textbook courses',
                  );                   );
     return %titles;      return %titles;
 }  }
Line 3266  sub courserequest_titles { Line 3868  sub courserequest_titles {
                                    official   => 'Official',                                     official   => 'Official',
                                    unofficial => 'Unofficial',                                     unofficial => 'Unofficial',
                                    community  => 'Communities',                                     community  => 'Communities',
                                      textbook   => 'Textbook',
                                    norequest  => 'Not allowed',                                     norequest  => 'Not allowed',
                                    approval   => 'Approval by Dom. Coord.',                                     approval   => 'Approval by Dom. Coord.',
                                    validate   => 'With validation',                                     validate   => 'With validation',
Line 3318  sub print_usercreation { Line 3921  sub print_usercreation {
                 $rowcount ++;                  $rowcount ++;
             }              }
         }          }
         my ($emailrules,$emailruleorder) =   
             &Apache::lonnet::inst_userrules($dom,'email');  
         if (ref($emailrules) eq 'HASH') {  
             if (keys(%{$emailrules}) > 0) {  
                 $datatable .= &user_formats_row('email',$settings,$emailrules,  
                                                 $emailruleorder,$numinrow,$rowcount);  
                 $$rowtotal ++;  
                 $rowcount ++;  
             }  
         }  
         if ($rowcount == 0) {          if ($rowcount == 0) {
             $datatable .= '<tr><td colspan="2">'.&mt('No format rules have been defined for usernames or IDs in this domain.').'</td></tr>';                $datatable .= '<tr><td colspan="2">'.&mt('No format rules have been defined for usernames or IDs in this domain.').'</td></tr>';  
             $$rowtotal ++;              $$rowtotal ++;
             $rowcount ++;              $rowcount ++;
         }          }
     } elsif ($position eq 'middle') {      } elsif ($position eq 'middle') {
         my @creators = ('author','course','requestcrs','selfcreate');          my @creators = ('author','course','requestcrs');
         my ($rules,$ruleorder) =          my ($rules,$ruleorder) =
             &Apache::lonnet::inst_userrules($dom,'username');              &Apache::lonnet::inst_userrules($dom,'username');
         my %lt = &usercreation_types();          my %lt = &usercreation_types();
         my %checked;          my %checked;
         my @selfcreate;   
         if (ref($settings) eq 'HASH') {          if (ref($settings) eq 'HASH') {
             if (ref($settings->{'cancreate'}) eq 'HASH') {              if (ref($settings->{'cancreate'}) eq 'HASH') {
                 foreach my $item (@creators) {                  foreach my $item (@creators) {
                     $checked{$item} = $settings->{'cancreate'}{$item};                      $checked{$item} = $settings->{'cancreate'}{$item};
                 }                  }
                 if (ref($settings->{'cancreate'}{'selfcreate'}) eq 'ARRAY') {  
                     @selfcreate = @{$settings->{'cancreate'}{'selfcreate'}};  
                 } elsif ($settings->{'cancreate'}{'selfcreate'} ne '') {  
                     if ($settings->{'cancreate'}{'selfcreate'} eq 'any') {  
                         @selfcreate = ('email','login','sso');  
                     } elsif ($settings->{'cancreate'}{'selfcreate'} ne 'none') {  
                         @selfcreate = ($settings->{'cancreate'}{'selfcreate'});  
                     }  
                 }  
             } elsif (ref($settings->{'cancreate'}) eq 'ARRAY') {              } elsif (ref($settings->{'cancreate'}) eq 'ARRAY') {
                 foreach my $item (@creators) {                  foreach my $item (@creators) {
                     if (grep(/^\Q$item\E$/,@{$settings->{'cancreate'}})) {                      if (grep(/^\Q$item\E$/,@{$settings->{'cancreate'}})) {
Line 3365  sub print_usercreation { Line 3948  sub print_usercreation {
         my $rownum = 0;          my $rownum = 0;
         foreach my $item (@creators) {          foreach my $item (@creators) {
             $rownum ++;              $rownum ++;
             if ($item ne 'selfcreate') {                if ($checked{$item} eq '') {
                 if ($checked{$item} eq '') {                  $checked{$item} = 'any';
                     $checked{$item} = 'any';  
                 }  
             }              }
             my $css_class;              my $css_class;
             if ($rownum%2) {              if ($rownum%2) {
Line 3379  sub print_usercreation { Line 3960  sub print_usercreation {
             $datatable .= '<tr'.$css_class.'>'.              $datatable .= '<tr'.$css_class.'>'.
                          '<td><span class="LC_nobreak">'.$lt{$item}.                           '<td><span class="LC_nobreak">'.$lt{$item}.
                          '</span></td><td align="right">';                           '</span></td><td align="right">';
             my @options;              my @options = ('any');
             if ($item eq 'selfcreate') {              if (ref($rules) eq 'HASH') {
                 push(@options,('email','login','sso'));                  if (keys(%{$rules}) > 0) {
             } else {                      push(@options,('official','unofficial'));
                 @options = ('any');  
                 if (ref($rules) eq 'HASH') {  
                     if (keys(%{$rules}) > 0) {  
                         push(@options,('official','unofficial'));  
                     }  
                 }                  }
                 push(@options,'none');  
             }              }
               push(@options,'none');
             foreach my $option (@options) {              foreach my $option (@options) {
                 my $type = 'radio';                  my $type = 'radio';
                 my $check = ' ';                  my $check = ' ';
                 if ($item eq 'selfcreate') {                  if ($checked{$item} eq $option) {
                     $type = 'checkbox';                      $check = ' checked="checked" ';
                     if (grep(/^\Q$option\E$/,@selfcreate)) {  
                         $check = ' checked="checked" ';  
                     }  
                 } else {  
                     if ($checked{$item} eq $option) {  
                         $check = ' checked="checked" ';  
                     }  
                 }                   } 
                 $datatable .= '<span class="LC_nobreak"><label>'.                  $datatable .= '<span class="LC_nobreak"><label>'.
                               '<input type="'.$type.'" name="can_createuser_'.                                '<input type="'.$type.'" name="can_createuser_'.
Line 3411  sub print_usercreation { Line 3980  sub print_usercreation {
             }              }
             $datatable .= '</td></tr>';              $datatable .= '</td></tr>';
         }          }
         my ($othertitle,$usertypes,$types) =  
             &Apache::loncommon::sorted_inst_types($dom);  
         my $createsettings;  
         if (ref($settings) eq 'HASH') {  
             $createsettings = $settings->{cancreate};  
         }  
         if (ref($usertypes) eq 'HASH') {  
             if (keys(%{$usertypes}) > 0) {  
                 $datatable .= &insttypes_row($createsettings,$types,$usertypes,  
                                              $dom,$numinrow,$othertitle,  
                                              'statustocreate');  
                 $$rowtotal ++;  
                 $rownum ++;  
             }  
         }  
         $datatable .= &captcha_choice('cancreate',$createsettings,$rownum);  
     } 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 3478  sub print_usercreation { Line 4031  sub print_usercreation {
     return $datatable;      return $datatable;
 }  }
   
   sub print_selfcreation {
       my ($position,$dom,$settings,$rowtotal) = @_;
       my (@selfcreate,$createsettings,$processing,$datatable);
       if (ref($settings) eq 'HASH') {
           if (ref($settings->{'cancreate'}) eq 'HASH') {
               $createsettings = $settings->{'cancreate'};
               if (ref($createsettings) eq 'HASH') {
                   if (ref($createsettings->{'selfcreate'}) eq 'ARRAY') {
                       @selfcreate = @{$createsettings->{'selfcreate'}};
                   } elsif ($createsettings->{'selfcreate'} ne '') {
                       if ($settings->{'cancreate'}{'selfcreate'} eq 'any') {
                           @selfcreate = ('email','login','sso');
                       } elsif ($createsettings->{'selfcreate'} ne 'none') {
                           @selfcreate = ($createsettings->{'selfcreate'});
                       }
                   }
                   if (ref($createsettings->{'selfcreateprocessing'}) eq 'HASH') {
                       $processing = $createsettings->{'selfcreateprocessing'};
                   }
               }
           }
       }
       my %radiohash;
       my $numinrow = 4;
       map { $radiohash{'cancreate_'.$_} = 1; } @selfcreate;
       if ($position eq 'top') {
           my %choices = &Apache::lonlocal::texthash (
                                                         cancreate_login      => 'Institutional Login',
                                                         cancreate_sso        => 'Institutional Single Sign On',
                                                     );
           my @toggles = sort(keys(%choices));
           my %defaultchecked = (
                                  'cancreate_login' => 'off',
                                  'cancreate_sso'   => 'off',
                                );
           my ($onclick,$itemcount);
           ($datatable,$itemcount) = &radiobutton_prefs(\%radiohash,\@toggles,\%defaultchecked,
                                                        \%choices,$itemcount,$onclick);
           $$rowtotal += $itemcount;
           
           my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
   
           if (ref($usertypes) eq 'HASH') {
               if (keys(%{$usertypes}) > 0) {
                   $datatable .= &insttypes_row($createsettings,$types,$usertypes,
                                                $dom,$numinrow,$othertitle,
                                                'statustocreate',$$rowtotal);
                   $$rowtotal ++;
               }
           }
       } elsif ($position eq 'middle') {
           my %domconf = &Apache::lonnet::get_dom('configuration',['usermodification'],$dom);
           my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
           $usertypes->{'default'} = $othertitle;
           if (ref($types) eq 'ARRAY') {
               push(@{$types},'default');
               $usertypes->{'default'} = $othertitle;
               foreach my $status (@{$types}) {
                   $datatable .= &modifiable_userdata_row('selfcreate',$status,$domconf{'usermodification'},
                                                          $numinrow,$$rowtotal,$usertypes);
               $$rowtotal ++;
               }
           }
       } else {
           my %choices = &Apache::lonlocal::texthash (
                                                         cancreate_email => 'E-mail address as username',
                                                     );
           my @toggles = sort(keys(%choices));
           my %defaultchecked = (
                                  'cancreate_email' => 'off',
                                );
           my $itemcount = 0;
           my $display = 'none';
           if (grep(/^\Qemail\E$/,@selfcreate)) {
               $display = 'block';
           }
           my $onclick = "toggleDisplay(this.form,'emailoptions');";
           my $additional = '<div id="emailoptions" style="display: '.$display.'">';
           my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
           my $usertypes = {};
           my $order = [];
           if ((ref($domdefaults{'inststatustypes'}) eq 'HASH') && (ref($domdefaults{'inststatusguest'}) eq 'ARRAY')) {
               $usertypes = $domdefaults{'inststatustypes'};
               $order = $domdefaults{'inststatusguest'};
           }
           if (ref($order) eq 'ARRAY') {
               push(@{$order},'default');
               if (@{$order} > 1) {
                   $usertypes->{'default'} = &mt('Other users');
                   $additional .= '<table><tr>';
                   foreach my $status (@{$order}) {
                       $additional .= '<th>'.$usertypes->{$status}.'</th>';
                   }
                   $additional .= '</tr><tr>';
                   foreach my $status (@{$order}) {
                       $additional .= '<td>'.&email_as_username($rowtotal,$processing,$status).'</td>';
                   }
                   $additional .= '</tr></table>';
               } else {
                   $usertypes->{'default'} = &mt('All users');
                   $additional .= &email_as_username($rowtotal,$processing);
               }
           }
           $additional .= '</div>'."\n";
   
           ($datatable,$itemcount) = &radiobutton_prefs(\%radiohash,\@toggles,\%defaultchecked,
                                                        \%choices,$itemcount,$onclick,$additional);
           $$rowtotal += $itemcount;
           $datatable .= &print_requestmail($dom,'selfcreation',$createsettings,$rowtotal);
           $$rowtotal ++;
           my ($infofields,$infotitles) = &Apache::loncommon::emailusername_info();
           $numinrow = 1;
           if (ref($order) eq 'ARRAY') {
               foreach my $status (@{$order}) {
                   $datatable .= &modifiable_userdata_row('cancreate','emailusername_'.$status,$settings,
                                                          $numinrow,$$rowtotal,$usertypes,$infofields,$infotitles);
                   $$rowtotal ++;
               }
           }
           my ($emailrules,$emailruleorder) =
               &Apache::lonnet::inst_userrules($dom,'email');
           if (ref($emailrules) eq 'HASH') {
               if (keys(%{$emailrules}) > 0) {
                   $datatable .= &user_formats_row('email',$settings,$emailrules,
                                                   $emailruleorder,$numinrow,$$rowtotal);
                   $$rowtotal ++;
               }
           }
           $datatable .= &captcha_choice('cancreate',$createsettings,$$rowtotal);
       }
       return $datatable;
   }
   
   sub email_as_username {
       my ($rowtotal,$processing,$type) = @_;
       my %choices =
           &Apache::lonlocal::texthash (
                                         automatic => 'Automatic approval',
                                         approval  => 'Queued for approval',
                                       );
       my $output;
       foreach my $option ('automatic','approval') {
           my $checked;
           if (ref($processing) eq 'HASH') {
               if ($type eq '') {   
                   if (!exists($processing->{'default'})) {
                       if ($option eq 'automatic') {
                           $checked = ' checked="checked"';
                       }
                   } else {
                       if ($processing->{'default'} eq $option) {
                           $checked = ' checked="checked"';
                       }
                   }
               } else {
                   if (!exists($processing->{$type})) {
                       if ($option eq 'automatic') {
                           $checked = ' checked="checked"';
                       }
                   } else {
                       if ($processing->{$type} eq $option) {
                           $checked = ' checked="checked"';
                       }
                   }
               }
           } elsif ($option eq 'automatic') {
               $checked = ' checked="checked"'; 
           }
           my $name = 'cancreate_emailprocess';
           if (($type ne '') && ($type ne 'default')) {
               $name .= '_'.$type;
           }
           $output .= '<span class="LC_nobreak"><label>'.
                      '<input type="radio" name="'.$name.'"'.
                      $checked.' value="'.$option.'" />'.
                      $choices{$option}.'</label></span>';
           if ($type eq '') {
               $output .= '&nbsp;';
           } else {
               $output .= '<br />';
           }
       }
       $$rowtotal ++;
       return $output;
   }
   
 sub captcha_choice {  sub captcha_choice {
     my ($context,$settings,$itemcount) = @_;      my ($context,$settings,$itemcount) = @_;
     my ($keyentry,$currpub,$currpriv,%checked,$rowname,$pubtext,$privtext);      my ($keyentry,$currpub,$currpriv,%checked,$rowname,$pubtext,$privtext);
     my %lt = &captcha_phrases();      my %lt = &captcha_phrases();
     $keyentry = 'hidden';      $keyentry = 'hidden';
     if ($context eq 'cancreate') {      if ($context eq 'cancreate') {
         $rowname = &mt('CAPTCHA validation (e-mail as username)');          $rowname = &mt('CAPTCHA validation');
     } elsif ($context eq 'login') {      } elsif ($context eq 'login') {
         $rowname =  &mt('"Contact helpdesk" CAPTCHA validation');          $rowname =  &mt('"Contact helpdesk" CAPTCHA validation');
     }      }
Line 3598  sub usercreation_types { Line 4337  sub usercreation_types {
                     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',                      requestcrs => 'When requesting a course',
                     selfcreate => 'User creates own account',   
                     any        => 'Any',                      any        => 'Any',
                     official   => 'Institutional only ',                      official   => 'Institutional only ',
                     unofficial => 'Non-institutional only',                      unofficial => 'Non-institutional only',
                     email      => 'E-mail address',  
                     login      => 'Institutional Login',  
                     sso        => 'SSO',   
                     none       => 'None',                      none       => 'None',
     );      );
     return %lt;      return %lt;
 }  }
   
   sub selfcreation_types {
       my %lt = &Apache::lonlocal::texthash (
                       selfcreate => 'User creates own account',
                       any        => 'Any',
                       official   => 'Institutional only ',
                       unofficial => 'Non-institutional only',
                       email      => 'E-mail address',
                       login      => 'Institutional Login',
                       sso        => 'SSO',
                );
   }
   
 sub authtype_names {  sub authtype_names {
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                       int    => 'Internal',                        int    => 'Internal',
Line 3642  sub print_usermodification { Line 4389  sub print_usermodification {
             $$rowtotal ++;              $$rowtotal ++;
             $rowcount ++;              $rowcount ++;
         }          }
     } elsif ($position eq 'middle') {      } elsif ($position eq 'bottom') {
         $context = 'course';          $context = 'course';
         $rowcount = 0;          $rowcount = 0;
         foreach my $role ('st','ep','ta','in','cr') {          foreach my $role ('st','ep','ta','in','cr') {
Line 3651  sub print_usermodification { Line 4398  sub print_usermodification {
             $$rowtotal ++;              $$rowtotal ++;
             $rowcount ++;              $rowcount ++;
         }          }
     } elsif ($position eq 'bottom') {  
         $context = 'selfcreate';  
         my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);  
         $usertypes->{'default'} = $othertitle;  
         if (ref($types) eq 'ARRAY') {  
             push(@{$types},'default');  
             $usertypes->{'default'} = $othertitle;  
             foreach my $status (@{$types}) {  
                 $datatable .= &modifiable_userdata_row($context,$status,$settings,  
                                                        $numinrow,$rowcount,$usertypes);  
                 $$rowtotal ++;  
                 $rowcount ++;  
             }  
         }  
     }      }
     return $datatable;      return $datatable;
 }  }
   
 sub print_defaults {  sub print_defaults {
     my ($dom,$rowtotal) = @_;      my ($position,$dom,$settings,$rowtotal) = @_;
     my @items = ('auth_def','auth_arg_def','lang_def','timezone_def',  
                  'datelocale_def','portal_def');  
     my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);  
     my $titles = &defaults_titles($dom);  
     my $rownum = 0;      my $rownum = 0;
     my ($datatable,$css_class);      my ($datatable,$css_class);
     foreach my $item (@items) {      if ($position eq 'top') {
         if ($rownum%2) {          my @items = ('auth_def','auth_arg_def','lang_def','timezone_def',
             $css_class = '';                       'datelocale_def','portal_def');
           my %defaults;
           if (ref($settings) eq 'HASH') {
               %defaults = %{$settings};
         } else {          } else {
             $css_class = ' class="LC_odd_row" ';              my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
               foreach my $item (@items) {
                   $defaults{$item} = $domdefaults{$item};
               }
         }          }
         $datatable .= '<tr'.$css_class.'>'.          my $titles = &defaults_titles($dom);
                   '<td><span class="LC_nobreak">'.$titles->{$item}.          foreach my $item (@items) {
                   '</span></td><td class="LC_right_item">';              if ($rownum%2) {
         if ($item eq 'auth_def') {                  $css_class = '';
             my @authtypes = ('internal','krb4','krb5','localauth');              } else {
             my %shortauth = (                  $css_class = ' class="LC_odd_row" ';
                              internal => 'int',  
                              krb4 => 'krb4',  
                              krb5 => 'krb5',  
                              localauth  => 'loc'  
                            );  
             my %authnames = &authtype_names();  
             foreach my $auth (@authtypes) {  
                 my $checked = ' ';  
                 if ($domdefaults{$item} eq $auth) {  
                     $checked = ' checked="checked" ';  
                 }  
                 $datatable .= '<label><input type="radio" name="'.$item.  
                               '" value="'.$auth.'"'.$checked.'/>'.  
                               $authnames{$shortauth{$auth}}.'</label>&nbsp;&nbsp;';  
             }              }
         } elsif ($item eq 'timezone_def') {              $datatable .= '<tr'.$css_class.'>'.
             my $includeempty = 1;                            '<td><span class="LC_nobreak">'.$titles->{$item}.
             $datatable .= &Apache::loncommon::select_timezone($item,$domdefaults{$item},undef,$includeempty);                            '</span></td><td class="LC_right_item" colspan="3">';
         } elsif ($item eq 'datelocale_def') {              if ($item eq 'auth_def') {
             my $includeempty = 1;                  my @authtypes = ('internal','krb4','krb5','localauth');
             $datatable .= &Apache::loncommon::select_datelocale($item,$domdefaults{$item},undef,$includeempty);                  my %shortauth = (
         } elsif ($item eq 'lang_def') {                                   internal => 'int',
             my %langchoices = &get_languages_hash();                                   krb4 => 'krb4',
             $langchoices{''} = 'No language preference';                                   krb5 => 'krb5',
             %langchoices = &Apache::lonlocal::texthash(%langchoices);                                   localauth  => 'loc'
             $datatable .= &Apache::loncommon::select_form($domdefaults{$item},$item,                                  );
                                                           \%langchoices);                  my %authnames = &authtype_names();
         } else {                  foreach my $auth (@authtypes) {
             my $size;                      my $checked = ' ';
             if ($item eq 'portal_def') {                      if ($defaults{$item} eq $auth) {
                 $size = ' size="25"';                          $checked = ' checked="checked" ';
                       }
                       $datatable .= '<label><input type="radio" name="'.$item.
                                     '" value="'.$auth.'"'.$checked.'/>'.
                                     $authnames{$shortauth{$auth}}.'</label>&nbsp;&nbsp;';
                   }
               } elsif ($item eq 'timezone_def') {
                   my $includeempty = 1;
                   $datatable .= &Apache::loncommon::select_timezone($item,$defaults{$item},undef,$includeempty);
               } elsif ($item eq 'datelocale_def') {
                   my $includeempty = 1;
                   $datatable .= &Apache::loncommon::select_datelocale($item,$defaults{$item},undef,$includeempty);
               } elsif ($item eq 'lang_def') {
                   my %langchoices = &get_languages_hash();
                   $langchoices{''} = 'No language preference';
                   %langchoices = &Apache::lonlocal::texthash(%langchoices);
                   $datatable .= &Apache::loncommon::select_form($defaults{$item},$item,
                                                                 \%langchoices);
               } else {
                   my $size;
                   if ($item eq 'portal_def') {
                       $size = ' size="25"';
                   }
                   $datatable .= '<input type="text" name="'.$item.'" value="'.
                                 $defaults{$item}.'"'.$size.' />';
               }
               $datatable .= '</td></tr>';
               $rownum ++;
           }
       } else {
           my (%defaults);
           if (ref($settings) eq 'HASH') {
               if ((ref($settings->{'inststatusorder'}) eq 'ARRAY') && (ref($settings->{'inststatustypes'}) eq 'HASH') &&
                   (ref($settings->{'inststatusguest'}) eq 'ARRAY')) {
                   my $maxnum = @{$settings->{'inststatusorder'}};
                   for (my $i=0; $i<$maxnum; $i++) {
                       $css_class = $rownum%2?' class="LC_odd_row"':'';
                       my $item = $settings->{'inststatusorder'}->[$i];
                       my $title = $settings->{'inststatustypes'}->{$item};
                       my $guestok;
                       if (grep(/^\Q$item\E$/,@{$settings->{'inststatusguest'}})) {
                           $guestok = 1;
                       }
                       my $chgstr = ' onchange="javascript:reorderTypes(this.form,'."'$item'".');"';
                       $datatable .= '<tr'.$css_class.'>'.
                                     '<td><span class="LC_nobreak">'.
                                     '<select name="inststatus_pos_'.$item.'"'.$chgstr.'>';
                       for (my $k=0; $k<=$maxnum; $k++) {
                           my $vpos = $k+1;
                           my $selstr;
                           if ($k == $i) {
                               $selstr = ' selected="selected" ';
                           }
                           $datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>';
                       }
                       my ($checkedon,$checkedoff);
                       $checkedoff = ' checked="checked"';
                       if ($guestok) {
                           $checkedon = $checkedoff;
                           $checkedoff = ''; 
                       }
                       $datatable .= '</select>&nbsp;'.&mt('Internal ID:').'&nbsp;<b>'.$item.'</b>&nbsp;'.
                                     '<input type="checkbox" name="inststatus_delete" value="'.$item.'" />'.
                                     &mt('delete').'</span></td>'.
                                     '<td class="LC_left_item"><span class="LC_nobreak">'.&mt('Name displayed:').
                                     '<input type="text" size="20" name="inststatus_title_'.$item.'" value="'.$title.'" />'.
                                     '</span></td>'.
                                     '<td class="LC_right_item"><span class="LC_nobreak">'.
                                     '<label><input type="radio" value="1" name="inststatus_guest_'.$item.'"'.$checkedon.' />'.
                                     &mt('Yes').'</label>'.('&nbsp;'x2).
                                     '<label><input type="radio" value="0" name="inststatus_guest_'.$item.'"'.$checkedoff.' />'.
                                     &mt('No').'</label></span></td></tr>';
                   }
                   $css_class = $rownum%2?' class="LC_odd_row"':'';
                   my $chgstr = ' onchange="javascript:reorderTypes(this.form,'."'addinststatus_pos'".');"';
                   $datatable .= '<tr '.$css_class.'>'.
                                 '<td><span class="LC_nobreak"><select name="addinststatus_pos"'.$chgstr.'>';
                   for (my $k=0; $k<=$maxnum; $k++) {
                       my $vpos = $k+1;
                       my $selstr;
                       if ($k == $maxnum) {
                           $selstr = ' selected="selected" ';
                       }
                       $datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>';
                   }
                   $datatable .= '</select>&nbsp;'.&mt('Internal ID:').
                                 '<input type="text" size="10" name="addinststatus" value="" /></span>'.
                                 '&nbsp;'.&mt('(new)').
                                 '</span></td><td class="LC_left_item"><span class="LC_nobreak">'.
                                 &mt('Name displayed:').
                                 '<input type="text" size="20" name="addinststatus_title" value="" /></span></td>'.
                                 '<td class="LC_right_item"><span class="LC_nobreak">'.
                                 '<label><input type="radio" value="1" name="addinststatus_guest" />'.
                                 &mt('Yes').'</label>'.('&nbsp;'x2).
                                 '<label><input type="radio" value="0" name="addinststatus_guest" />'.
                                 &mt('No').'</label></span></td></tr>';
                                 '</tr>'."\n";
                   $rownum ++;
             }              }
             $datatable .= '<input type="text" name="'.$item.'" value="'.  
                           $domdefaults{$item}.'"'.$size.' />';  
         }          }
         $datatable .= '</td></tr>';  
         $rownum ++;  
     }      }
     $$rowtotal += $rownum;      $$rowtotal += $rownum;
     return $datatable;      return $datatable;
Line 3874  sub print_scantronformat { Line 4688  sub print_scantronformat {
         $datatable .= '<td>'.&mt('Default in use:').'<br />'.          $datatable .= '<td>'.&mt('Default in use:').'<br />'.
                       '<span class="LC_nobreak">';                        '<span class="LC_nobreak">';
         if ($scantronurl) {          if ($scantronurl) {
             $datatable .= '<a href="'.$scantronurl.'" target="_blank">'.              $datatable .= &Apache::loncommon::modal_link($scantronurl,&mt('Default bubblesheet format file'),600,500,
                           &mt('Default bubblesheet format file').'</a>';                                                           undef,undef,undef,undef,'background-color:#ffffff');
         } else {          } else {
             $datatable = &mt('File unavailable for display');              $datatable = &mt('File unavailable for display');
         }          }
Line 3900  sub print_scantronformat { Line 4714  sub print_scantronformat {
             }               } 
             $datatable .= '<td>'.$errorstr.'</td><td>&nbsp;';              $datatable .= '<td>'.$errorstr.'</td><td>&nbsp;';
         } elsif ($scantronurl) {          } elsif ($scantronurl) {
               my $link =  &Apache::loncommon::modal_link($scantronurl,&mt('Custom bubblesheet format file'),600,500,
                                                          undef,undef,undef,undef,'background-color:#ffffff');
             $datatable .= '<td><span class="LC_nobreak">'.              $datatable .= '<td><span class="LC_nobreak">'.
                           '<a href="'.$scantronurl.'" target="_blank">'.                            $link.
                           &mt('Custom bubblesheet format file').'</a><label>'.                            '<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;'.
                           &mt('Replace:').'</span><br />';                            &mt('Replace:').'</span><br />';
         }          }
Line 3941  sub print_coursecategories { Line 4756  sub print_coursecategories {
     my ($position,$dom,$hdritem,$settings,$rowtotal) = @_;      my ($position,$dom,$hdritem,$settings,$rowtotal) = @_;
     my $datatable;      my $datatable;
     if ($position eq 'top') {      if ($position eq 'top') {
           my (%checked);
           my @catitems = ('unauth','auth');
           my @cattypes = ('std','domonly','codesrch','none');
           $checked{'unauth'} = 'std';
           $checked{'auth'} = 'std';
           if (ref($settings) eq 'HASH') {
               foreach my $type (@cattypes) {
                   if ($type eq $settings->{'unauth'}) {
                       $checked{'unauth'} = $type;
                   }
                   if ($type eq $settings->{'auth'}) {
                       $checked{'auth'} = $type;
                   }
               }
           }
           my %lt = &Apache::lonlocal::texthash (
                                                  unauth   => 'Catalog type for unauthenticated users',
                                                  auth     => 'Catalog type for authenticated users',
                                                  none     => 'No catalog',
                                                  std      => 'Standard catalog',
                                                  domonly  => 'Domain-only catalog',
                                                  codesrch => "Code search form",
                                                );
          my $itemcount = 0;
          foreach my $item (@catitems) {
              my $css_class = $itemcount%2? ' class="LC_odd_row"':'';
              $datatable .= '<tr '.$css_class.'>'.
                            '<td>'.$lt{$item}.'</td>'.
                            '<td class="LC_right_item"><span class="LC_nobreak">';
              foreach my $type (@cattypes) {
                  my $ischecked;
                  if ($checked{$item} eq $type) {
                      $ischecked=' checked="checked"';
                  }
                  $datatable .= '<label>'.
                                '<input type="radio" name="coursecat_'.$item.'" value="'.$type.'"'.$ischecked.
                                ' />'.$lt{$type}.'</label>&nbsp;';
              }
              $datatable .= '</td></tr>';
              $itemcount ++;
           }
           $$rowtotal += $itemcount;
       } elsif ($position eq 'middle') {
         my $toggle_cats_crs = ' ';          my $toggle_cats_crs = ' ';
         my $toggle_cats_dom = ' checked="checked" ';          my $toggle_cats_dom = ' checked="checked" ';
         my $can_cat_crs = ' ';          my $can_cat_crs = ' ';
Line 4058  sub print_coursecategories { Line 4916  sub print_coursecategories {
                             }                              }
                             $datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>';                              $datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>';
                         }                          }
                         $datatable .= '</select></td><td>';                          $datatable .= '</select></span></td><td>';
                         if ($parent eq 'instcode' || $parent eq 'communities') {                          if ($parent eq 'instcode' || $parent eq 'communities') {
                             $datatable .=  '<span class="LC_nobreak">'                              $datatable .=  '<span class="LC_nobreak">'
                                            .$default_names{$parent}.'</span>';                                             .$default_names{$parent}.'</span>';
Line 4088  sub print_coursecategories { Line 4946  sub print_coursecategories {
                             $datatable .= '</td>';                              $datatable .= '</td>';
                         } else {                          } else {
                             $datatable .= $parent                              $datatable .= $parent
                                           .'&nbsp;<label><input type="checkbox" name="deletecategory" '                                            .'&nbsp;<span class="LC_nobreak"><label>'
                                             .'<input type="checkbox" name="deletecategory" '
                                           .'value="'.$item.'" />'.&mt('Delete').'</label></span></td>';                                            .'value="'.$item.'" />'.&mt('Delete').'</label></span></td>';
                         }                          }
                         my $depth = 1;                          my $depth = 1;
Line 4146  sub print_coursecategories { Line 5005  sub print_coursecategories {
                 $datatable .= &initialize_categories($itemcount);                  $datatable .= &initialize_categories($itemcount);
             }              }
         } else {          } else {
             $datatable .= '<td class="LC_right_item">'.$hdritem->{'header'}->[0]->{'col2'}.'</td>'              $datatable .= '<td class="LC_right_item">'.$hdritem->{'header'}->[1]->{'col2'}.'</td>'
                           .&initialize_categories($itemcount);                            .&initialize_categories($itemcount);
         }          }
         $$rowtotal += $itemcount;          $$rowtotal += $itemcount;
Line 4203  sub print_serverstatuses { Line 5062  sub print_serverstatuses {
 sub serverstatus_pages {  sub serverstatus_pages {
     return ('userstatus','lonstatus','loncron','server-status','codeversions',      return ('userstatus','lonstatus','loncron','server-status','codeversions',
             'checksums','clusterstatus','metadata_keywords','metadata_harvest',              'checksums','clusterstatus','metadata_keywords','metadata_harvest',
             'takeoffline','takeonline','showenv','toggledebug','ping','domconf');              'takeoffline','takeonline','showenv','toggledebug','ping','domconf',
               'uniquecodes','diskusage');
   }
   
   sub defaults_javascript {
       my ($settings) = @_;
       my ($output,$jstext); 
       if ((ref($settings->{'inststatusorder'}) eq 'ARRAY') && (ref($settings->{'inststatustypes'}) eq 'HASH')) {
           my $maxnum = scalar(@{$settings->{'inststatusorder'}});
           if ($maxnum eq '') {
               $maxnum = 0;
           }
           $maxnum ++;
           $jstext = '    var inststatuses = Array('."'".join("','",@{$settings->{'inststatusorder'}})."'".');';  
           return <<"ENDSCRIPT";
   <script type="text/javascript">
   // <![CDATA[
   function reorderTypes(form,caller) {
       var changedVal;
   $jstext 
       var newpos = 'addinststatus_pos';
       var current = new Array;
       var maxh = $maxnum;
       var newitemVal = form.elements[newpos].options[form.elements[newpos].selectedIndex].value;
       var oldVal;
       if (caller == newpos) {
           changedVal = newitemVal;
       } else {
           var curritem = 'inststatus_pos_'+caller;
           changedVal = form.elements[curritem].options[form.elements[curritem].selectedIndex].value;
           current[newitemVal] = newpos;
       }
       for (var i=0; i<inststatuses.length; i++) {
           if (inststatuses[i] != caller) {
               var elementName = 'inststatus_pos_'+inststatuses[i];
               if (form.elements[elementName]) {
                   var currVal = form.elements[elementName].options[form.elements[elementName].selectedIndex].value;
                   current[currVal] = elementName;
               }
           }
       }
       for (var j=0; j<maxh; j++) {
           if (current[j] == undefined) {
               oldVal = j;
           }
       }
       if (oldVal < changedVal) {
           for (var k=oldVal+1; k<=changedVal ; k++) {
              var elementName = current[k];
              form.elements[elementName].selectedIndex = form.elements[elementName].selectedIndex - 1;
           }
       } else {
           for (var k=changedVal; k<oldVal; k++) {
               var elementName = current[k];
               form.elements[elementName].selectedIndex = form.elements[elementName].selectedIndex + 1;
           }
       }
       return;
   }
   
   // ]]>
   </script>
   
   ENDSCRIPT
       }
 }  }
   
 sub coursecategories_javascript {  sub coursecategories_javascript {
Line 4228  sub coursecategories_javascript { Line 5151  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 $instcode_reserved = &mt('The name: [_1] is a reserved category.','"instcode"');
     my $communities_reserved = &mt('The name: "communities" is a reserved category');      my $communities_reserved = &mt('The name: [_1] is a reserved category.','"communities"');
     my $choose_again = '\\n'.&mt('Please use a different name for the new top level 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[  // <![CDATA[
Line 4238  function reorderCats(form,parent,item,id Line 5161  function reorderCats(form,parent,item,id
     var changedVal;      var changedVal;
 $jstext  $jstext
     var newpos = 'addcategory_pos';      var newpos = 'addcategory_pos';
     var current = new Array;  
     if (parent == '') {      if (parent == '') {
         var has_instcode = 0;          var has_instcode = 0;
         var maxtop = categories[idx].length;          var maxtop = categories[idx].length;
Line 4360  sub build_category_rows { Line 5282  sub build_category_rows {
             if (ref($cats->[$depth]{$parent}) eq 'ARRAY') {              if (ref($cats->[$depth]{$parent}) eq 'ARRAY') {
                 my $numchildren = @{$cats->[$depth]{$parent}};                  my $numchildren = @{$cats->[$depth]{$parent}};
                 my $css_class = $itemcount%2?' class="LC_odd_row"':'';                  my $css_class = $itemcount%2?' class="LC_odd_row"':'';
                 $text .= '<td><table class="LC_datatable">';                  $text .= '<td><table class="LC_data_table">';
                 my ($idxnum,$parent_name,$parent_item);                  my ($idxnum,$parent_name,$parent_item);
                 my $higher = $depth - 1;                  my $higher = $depth - 1;
                 if ($higher == 0) {                  if ($higher == 0) {
Line 4434  sub build_category_rows { Line 5356  sub build_category_rows {
 }  }
   
 sub modifiable_userdata_row {  sub modifiable_userdata_row {
     my ($context,$role,$settings,$numinrow,$rowcount,$usertypes) = @_;      my ($context,$item,$settings,$numinrow,$rowcount,$usertypes,$fieldsref,$titlesref) = @_;
     my $rolename;      my ($role,$rolename,$statustype);
     if ($context eq 'selfcreate') {      $role = $item;
       if ($context eq 'cancreate') {
           if ($item =~ /^emailusername_(.+)$/) {
               $statustype = $1;
               $role = 'emailusername';
               if (ref($usertypes) eq 'HASH') {
                   if ($usertypes->{$statustype}) {
                       $rolename = &mt('Data provided by [_1]',$usertypes->{$statustype});
                   } else {
                       $rolename = &mt('Data provided by user');
                   }
               }
           }
       } elsif ($context eq 'selfcreate') {
         if (ref($usertypes) eq 'HASH') {          if (ref($usertypes) eq 'HASH') {
             $rolename = $usertypes->{$role};              $rolename = $usertypes->{$role};
         } else {          } else {
Line 4449  sub modifiable_userdata_row { Line 5384  sub modifiable_userdata_row {
             $rolename = &Apache::lonnet::plaintext($role);              $rolename = &Apache::lonnet::plaintext($role);
         }          }
     }      }
     my @fields = ('lastname','firstname','middlename','generation',      my (@fields,%fieldtitles);
                   'permanentemail','id');      if (ref($fieldsref) eq 'ARRAY') {
     my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();          @fields = @{$fieldsref};
       } else {
           @fields = ('lastname','firstname','middlename','generation',
                      'permanentemail','id');
       }
       if ((ref($titlesref) eq 'HASH')) {
           %fieldtitles = %{$titlesref};
       } else {
           %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
       }
     my $output;      my $output;
     my $css_class = $rowcount%2?' class="LC_odd_row"':'';      my $css_class = $rowcount%2?' class="LC_odd_row"':'';
     $output = '<tr '.$css_class.'>'.      $output = '<tr '.$css_class.'>'.
Line 4462  sub modifiable_userdata_row { Line 5406  sub modifiable_userdata_row {
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         if (ref($settings->{$context}) eq 'HASH') {          if (ref($settings->{$context}) eq 'HASH') {
             if (ref($settings->{$context}->{$role}) eq 'HASH') {              if (ref($settings->{$context}->{$role}) eq 'HASH') {
                 foreach my $field (@fields) {                  my $hashref = $settings->{$context}->{$role};
                     if ($settings->{$context}->{$role}->{$field}) {                  if ($role eq 'emailusername') {
                         $checks{$field} = ' checked="checked" ';                      if ($statustype) {
                           if (ref($settings->{$context}->{$role}->{$statustype}) eq 'HASH') {
                               $hashref = $settings->{$context}->{$role}->{$statustype};
                               if (ref($hashref) eq 'HASH') { 
                                   foreach my $field (@fields) {
                                       if ($hashref->{$field}) {
                                           $checks{$field} = $hashref->{$field};
                                       }
                                   }
                               }
                           }
                       }
                   } else {
                       if (ref($hashref) eq 'HASH') {
                           foreach my $field (@fields) {
                               if ($hashref->{$field}) {
                                   $checks{$field} = ' checked="checked" ';
                               }
                           }
                     }                      }
                 }                  }
             }              }
         }          }
     }      }
        
     for (my $i=0; $i<@fields; $i++) {      for (my $i=0; $i<@fields; $i++) {
         my $rem = $i%($numinrow);          my $rem = $i%($numinrow);
         if ($rem == 0) {          if ($rem == 0) {
Line 4479  sub modifiable_userdata_row { Line 5442  sub modifiable_userdata_row {
             $output .= '<tr>';              $output .= '<tr>';
         }          }
         my $check = ' ';          my $check = ' ';
         if (exists($checks{$fields[$i]})) {          unless ($role eq 'emailusername') {
             $check = $checks{$fields[$i]}              if (exists($checks{$fields[$i]})) {
         } else {                  $check = $checks{$fields[$i]}
             if ($role eq 'st') {              } else {
                 if (ref($settings) ne 'HASH') {                  if ($role eq 'st') {
                     $check = ' checked="checked" ';                       if (ref($settings) ne 'HASH') {
                           $check = ' checked="checked" '; 
                       }
                 }                  }
             }              }
         }          }
         $output .= '<td class="LC_left_item">'.          $output .= '<td class="LC_left_item">'.
                    '<span class="LC_nobreak"><label>'.                     '<span class="LC_nobreak">';
                    '<input type="checkbox" name="canmodify_'.$role.'" '.          if ($role eq 'emailusername') {
                    'value="'.$fields[$i].'"'.$check.'/>'.$fieldtitles{$fields[$i]}.              unless ($checks{$fields[$i]} =~ /^(required|optional)$/) {
                    '</label></span></td>';                  $checks{$fields[$i]} = 'omit';
               }
               foreach my $option ('required','optional','omit') {
                   my $checked='';
                   if ($checks{$fields[$i]} eq $option) {
                       $checked='checked="checked" ';
                   }
                   $output .= '<label>'.
                              '<input type="radio" name="canmodify_'.$item.'_'.$fields[$i].'" value="'.$option.'" '.$checked.'/>'.
                              &mt($option).'</label>'.('&nbsp;' x2);
               }
               $output .= '<i>'.$fieldtitles{$fields[$i]}.'</i>';
           } else {
               $output .= '<label>'.
                          '<input type="checkbox" name="canmodify_'.$role.'" '.
                          'value="'.$fields[$i].'"'.$check.'/>'.$fieldtitles{$fields[$i]}.
                          '</label>';
           }
           $output .= '</span></td>';
         $rem = @fields%($numinrow);          $rem = @fields%($numinrow);
     }      }
     my $colsleft = $numinrow - $rem;      my $colsleft = $numinrow - $rem;
Line 4507  sub modifiable_userdata_row { Line 5490  sub modifiable_userdata_row {
 }  }
   
 sub insttypes_row {  sub insttypes_row {
     my ($settings,$types,$usertypes,$dom,$numinrow,$othertitle,$context) = @_;      my ($settings,$types,$usertypes,$dom,$numinrow,$othertitle,$context,$rownum) = @_;
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                       cansearch => 'Users allowed to search',                        cansearch => 'Users allowed to search',
                       statustocreate => 'Institutional affiliation(s) able to create own account (login/SSO)',                        statustocreate => 'Institutional affiliation(s) able to create own account (login/SSO)',
Line 4521  sub insttypes_row { Line 5504  sub insttypes_row {
     if ($context eq 'statustocreate') {      if ($context eq 'statustocreate') {
         $class = 'LC_right_item';          $class = 'LC_right_item';
     }      }
     my $output =  '<tr class="LC_odd_row">'.      my $css_class = ' class="LC_odd_row"';
                   '<td>'.$lt{$context}.$showdom.      if ($rownum ne '') { 
                   '</td><td class="'.$class.'" colspan="2"><table>';          $css_class = ($rownum%2? ' class="LC_odd_row"':'');
       }
       my $output = '<tr'.$css_class.'>'.
                    '<td>'.$lt{$context}.$showdom.
                    '</td><td class="'.$class.'" colspan="2"><table>';
     my $rem;      my $rem;
     if (ref($types) eq 'ARRAY') {      if (ref($types) eq 'ARRAY') {
         for (my $i=0; $i<@{$types}; $i++) {          for (my $i=0; $i<@{$types}; $i++) {
Line 4652  sub usertype_update_row { Line 5639  sub usertype_update_row {
 }  }
   
 sub modify_login {  sub modify_login {
     my ($r,$dom,$confname,%domconfig) = @_;      my ($r,$dom,$confname,$lastactref,%domconfig) = @_;
     my ($resulttext,$errors,$colchgtext,%changes,%colchanges,%newfile,%newurl,      my ($resulttext,$errors,$colchgtext,%changes,%colchanges,%newfile,%newurl,
         %curr_loginvia,%loginhash,@currlangs,@newlangs,$addedfile,%title,@offon);          %curr_loginvia,%loginhash,@currlangs,@newlangs,$addedfile,%title,@offon);
     %title = ( coursecatalog => 'Display course catalog',      %title = ( coursecatalog => 'Display course catalog',
Line 4890  sub modify_login { Line 5877  sub modify_login {
         }          }
         if (keys(%changes) > 0 || $colchgtext) {          if (keys(%changes) > 0 || $colchgtext) {
             &Apache::loncommon::devalidate_domconfig_cache($dom);              &Apache::loncommon::devalidate_domconfig_cache($dom);
               if (ref($lastactref) eq 'HASH') {
                   $lastactref->{'domainconfig'} = 1;
               }
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             foreach my $item (sort(keys(%changes))) {              foreach my $item (sort(keys(%changes))) {
                 if ($item eq 'loginvia') {                  if ($item eq 'loginvia') {
Line 5010  sub color_font_choices { Line 6000  sub color_font_choices {
             links => "Link colors",              links => "Link colors",
             images => "Images",              images => "Images",
             font => "Font color",              font => "Font color",
             fontmenu => "Font Menu",              fontmenu => "Font menu",
             pgbg => "Page",              pgbg => "Page",
             tabbg => "Header",              tabbg => "Header",
             sidebg => "Border",              sidebg => "Border",
Line 5022  sub color_font_choices { Line 6012  sub color_font_choices {
 }  }
   
 sub modify_rolecolors {  sub modify_rolecolors {
     my ($r,$dom,$confname,$roles,%domconfig) = @_;      my ($r,$dom,$confname,$roles,$lastactref,%domconfig) = @_;
     my ($resulttext,%rolehash);      my ($resulttext,%rolehash);
     $rolehash{'rolecolors'} = {};      $rolehash{'rolecolors'} = {};
     if (ref($domconfig{'rolecolors'}) ne 'HASH') {      if (ref($domconfig{'rolecolors'}) ne 'HASH') {
Line 5037  sub modify_rolecolors { Line 6027  sub modify_rolecolors {
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             &Apache::loncommon::devalidate_domconfig_cache($dom);              &Apache::loncommon::devalidate_domconfig_cache($dom);
               if (ref($lastactref) eq 'HASH') {
                   $lastactref->{'domainconfig'} = 1;
               }
             $resulttext = &display_colorchgs($dom,\%changes,$roles,              $resulttext = &display_colorchgs($dom,\%changes,$roles,
                                              $rolehash{'rolecolors'});                                               $rolehash{'rolecolors'});
         } else {          } else {
Line 5062  sub modify_colors { Line 6055  sub modify_colors {
     my @images;      my @images;
     my $servadm = $r->dir_config('lonAdmEMail');      my $servadm = $r->dir_config('lonAdmEMail');
     my $errors;      my $errors;
       my %defaults;
     foreach my $role (@{$roles}) {      foreach my $role (@{$roles}) {
         if ($role eq 'login') {          if ($role eq 'login') {
             %choices = &login_choices();              %choices = &login_choices();
             @logintext = ('textcol','bgcol');              @logintext = ('textcol','bgcol');
         } else {          } else {
             %choices = &color_font_choices();              %choices = &color_font_choices();
             $confhash->{$role}{'fontmenu'} = $env{'form.'.$role.'_fontmenu'};  
         }          }
         if ($role eq 'login') {          if ($role eq 'login') {
             @images = ('img','logo','domlogo','login');              @images = ('img','logo','domlogo','login');
             @bgs = ('pgbg','mainbg','sidebg');              @bgs = ('pgbg','mainbg','sidebg');
         } else {          } else {
             @images = ('img');              @images = ('img');
             @bgs = ('pgbg','tabbg','sidebg');               @bgs = ('pgbg','tabbg','sidebg');
           }
           my %defaults = &role_defaults($role,\@bgs,\@links,\@images,\@logintext);
           unless ($env{'form.'.$role.'_font'} eq $defaults{'font'}) {
               $confhash->{$role}{'font'} = $env{'form.'.$role.'_font'};
           }
           if ($role eq 'login') {
               foreach my $item (@logintext) {
                   $env{'form.'.$role.'_'.$item} = lc($env{'form.'.$role.'_'.$item});
                   if ($env{'form.'.$role.'_'.$item} =~ /^\w+/) {
                       $env{'form.'.$role.'_'.$item} = '#'.$env{'form.'.$role.'_'.$item};
                   }
                   unless ($env{'form.'.$role.'_'.$item} eq lc($defaults{'logintext'}{$item})) {
                       $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item};
                   }
               }
           } else {
               $env{'form.'.$role.'_fontmenu'} = lc($env{'form.'.$role.'_fontmenu'});
               if ($env{'form.'.$role.'_fontmenu'} =~ /^\w+/) {
                   $env{'form.'.$role.'_fontmenu'} = '#'.$env{'form.'.$role.'_fontmenu'};
               }
               unless($env{'form.'.$role.'_fontmenu'} eq lc($defaults{'fontmenu'})) {
                   $confhash->{$role}{'fontmenu'} = $env{'form.'.$role.'_fontmenu'};
               }
         }          }
         $confhash->{$role}{'font'} = $env{'form.'.$role.'_font'};          foreach my $item (@bgs) {
         foreach my $item (@bgs,@links,@logintext) {              $env{'form.'.$role.'_'.$item} = lc($env{'form.'.$role.'_'.$item});
             $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item};              if ($env{'form.'.$role.'_'.$item} =~ /^\w+/) {
                   $env{'form.'.$role.'_'.$item} = '#'.$env{'form.'.$role.'_'.$item};
               }
               unless ($env{'form.'.$role.'_'.$item} eq lc($defaults{'bgs'}{$item})) {
                   $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item};
               }
           }
           foreach my $item (@links) {
               $env{'form.'.$role.'_'.$item} = lc($env{'form.'.$role.'_'.$item});
               if ($env{'form.'.$role.'_'.$item} =~ /^\w+/) {
                   $env{'form.'.$role.'_'.$item} = '#'.$env{'form.'.$role.'_'.$item};
               }
               unless ($env{'form.'.$role.'_'.$item} eq lc($defaults{'links'}{$item})) {
                   $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item};
               }
         }          }
         my ($configuserok,$author_ok,$switchserver) =           my ($configuserok,$author_ok,$switchserver) = 
             &config_check($dom,$confname,$servadm);              &config_check($dom,$confname,$servadm);
Line 5435  sub publishlogo { Line 6465  sub publishlogo {
     if ($fname=~m|/|) {      if ($fname=~m|/|) {
         ($fnamepath,$file) = ($fname =~ m|^(.*)/([^/]+)$|);          ($fnamepath,$file) = ($fname =~ m|^(.*)/([^/]+)$|);
     }      }
     my @parts=split(/\//,"$filepath/$relpath/$fnamepath");        my @parts=split(/\//,"$filepath/$relpath/$fnamepath");
     my $count;      my $count;
     for ($count=5;$count<=$#parts;$count++) {      for ($count=5;$count<=$#parts;$count++) {
         $filepath.="/$parts[$count]";          $filepath.="/$parts[$count]";
Line 5447  sub publishlogo { Line 6477  sub publishlogo {
     if ($file=~/\.(\w+)$/ &&      if ($file=~/\.(\w+)$/ &&
         (&Apache::loncommon::fileembstyle($1) eq 'hdn')) {          (&Apache::loncommon::fileembstyle($1) eq 'hdn')) {
         $output =           $output = 
             &mt('Invalid file extension ([_1]) - reserved for LONCAPA use.',$1);               &mt('Invalid file extension ([_1]) - reserved for internal use.',$1); 
     } elsif ($file=~/\.(\w+)$/ &&      } elsif ($file=~/\.(\w+)$/ &&
         !defined(&Apache::loncommon::fileembstyle($1))) {          !defined(&Apache::loncommon::fileembstyle($1))) {
         $output = &mt('Unrecognized file extension ([_1]) - rename the file with a proper extension and re-upload.',$1);          $output = &mt('Unrecognized file extension ([_1]) - rename the file with a proper extension and re-upload.',$1);
Line 5696  sub check_switchserver { Line 6726  sub check_switchserver {
 }  }
   
 sub modify_quotas {  sub modify_quotas {
     my ($dom,$action,%domconfig) = @_;      my ($r,$dom,$action,$lastactref,%domconfig) = @_;
     my ($context,@usertools,@options,%validations,%titles,%confhash,%toolshash,      my ($context,@usertools,@options,%validations,%titles,%confhash,%toolshash,
         %limithash,$toolregexp,%conditions,$resulttext,%changes);          %limithash,$toolregexp,%conditions,$resulttext,%changes,$confname,$configuserok,
           $author_ok,$switchserver,$errors,$validationitemsref,$validationnamesref,
           $validationfieldsref);
     if ($action eq 'quotas') {      if ($action eq 'quotas') {
         $context = 'tools';           $context = 'tools'; 
     } else {       } else {
         $context = $action;          $context = $action;
     }      }
     if ($context eq 'requestcourses') {      if ($context eq 'requestcourses') {
         @usertools = ('official','unofficial','community');          @usertools = ('official','unofficial','community','textbook');
         @options =('norequest','approval','validate','autolimit');          @options =('norequest','approval','validate','autolimit');
         %validations = &Apache::lonnet::auto_courserequest_checks($dom);          %validations = &Apache::lonnet::auto_courserequest_checks($dom);
         %titles = &courserequest_titles();          %titles = &courserequest_titles();
         $toolregexp = join('|',@usertools);          $toolregexp = join('|',@usertools);
         %conditions = &courserequest_conditions();          %conditions = &courserequest_conditions();
           $confname = $dom.'-domainconfig';
           my $servadm = $r->dir_config('lonAdmEMail');
           ($configuserok,$author_ok,$switchserver) = &config_check($dom,$confname,$servadm);
           ($validationitemsref,$validationnamesref,$validationfieldsref) = 
               &Apache::loncoursequeueadmin::requestcourses_validation_types();
     } elsif ($context eq 'requestauthor') {      } elsif ($context eq 'requestauthor') {
         @usertools = ('author');          @usertools = ('author');
         %titles = &authorrequest_titles();          %titles = &authorrequest_titles();
Line 5718  sub modify_quotas { Line 6755  sub modify_quotas {
         @usertools = ('aboutme','blog','webdav','portfolio');          @usertools = ('aboutme','blog','webdav','portfolio');
         %titles = &tool_titles();          %titles = &tool_titles();
     }      }
     my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);      my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
     my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);      my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
     foreach my $key (keys(%env)) {      foreach my $key (keys(%env)) {
         if ($context eq 'requestcourses') {          if ($context eq 'requestcourses') {
Line 5746  sub modify_quotas { Line 6783  sub modify_quotas {
         }          }
     }      }
     if (($context eq 'requestcourses') || ($context eq 'requestauthor')) {      if (($context eq 'requestcourses') || ($context eq 'requestauthor')) {
         my @approvalnotify = &Apache::loncommon::get_env_multiple('form.reqapprovalnotify');          my @approvalnotify = &Apache::loncommon::get_env_multiple('form.'.$context.'notifyapproval');
         @approvalnotify = sort(@approvalnotify);          @approvalnotify = sort(@approvalnotify);
         $confhash{'notify'}{'approval'} = join(',',@approvalnotify);          $confhash{'notify'}{'approval'} = join(',',@approvalnotify);
           my @crstypes = ('official','unofficial','community','textbook');
           my @hasuniquecode = &Apache::loncommon::get_env_multiple('form.uniquecode');
           foreach my $type (@hasuniquecode) {
               if (grep(/^\Q$type\E$/,@crstypes)) {
                   $confhash{'uniquecode'}{$type} = 1;
               }
           }
           my ($newbook,@allpos);
           if ($context eq 'requestcourses') {
               if ($env{'form.addbook'}) {
                   if (($env{'form.addbook_cnum'} =~ /^$match_courseid$/) &&
                       ($env{'form.addbook_cdom'} =~ /^$match_domain$/)) {
                       if (&Apache::lonnet::homeserver($env{'form.addbook_cnum'},
                                                       $env{'form.addbook_cdom'}) eq 'no_host') {
                           $errors .= '<li><span class="LC_error">'.&mt('Invalid LON-CAPA course for textbook').
                                      '</span></li>';
                       } else {
                           $newbook = $env{'form.addbook_cdom'}.'_'.$env{'form.addbook_cnum'};
                           my $position = $env{'form.addbook_pos'};
                           $position =~ s/\D+//g;
                           if ($position ne '') {
                               $allpos[$position] = $newbook;
                           }
                       }
                   } else {
                       $errors .= '<li><span class="LC_error">'.&mt('Invalid LON-CAPA course for textbook').
                                  '</span></li>';
                   }
               }
   
           }
         if (ref($domconfig{$action}) eq 'HASH') {          if (ref($domconfig{$action}) eq 'HASH') {
             if (ref($domconfig{$action}{'notify'}) eq 'HASH') {              if (ref($domconfig{$action}{'notify'}) eq 'HASH') {
                 if ($domconfig{$action}{'notify'}{'approval'} ne $confhash{'notify'}{'approval'}) {                  if ($domconfig{$action}{'notify'}{'approval'} ne $confhash{'notify'}{'approval'}) {
Line 5759  sub modify_quotas { Line 6827  sub modify_quotas {
                     $changes{'notify'}{'approval'} = 1;                      $changes{'notify'}{'approval'} = 1;
                 }                  }
             }              }
               if (ref($domconfig{$action}{'uniquecode'}) eq 'HASH') {
                   if (ref($confhash{'uniquecode'}) eq 'HASH') {
                       foreach my $crstype (keys(%{$domconfig{$action}{'uniquecode'}})) {
                           unless ($confhash{'uniquecode'}{$crstype}) {
                               $changes{'uniquecode'} = 1;
                           }
                       }
                       unless ($changes{'uniquecode'}) {
                           foreach my $crstype (keys(%{$confhash{'uniquecode'}})) {
                               unless ($domconfig{$action}{'uniquecode'}{$crstype}) {
                                   $changes{'uniquecode'} = 1;
                               }
                           }
                       }
                  } else {
                      $changes{'uniquecode'} = 1;
                  }
               } elsif (ref($confhash{'uniquecode'}) eq 'HASH') {
                   $changes{'uniquecode'} = 1;
               }
               if ($context eq 'requestcourses') {
                   if (ref($domconfig{$action}{'textbooks'}) eq 'HASH') {
                       my %deletions;
                       my @todelete = &Apache::loncommon::get_env_multiple('form.book_del');
                       if (@todelete) {
                           map { $deletions{$_} = 1; } @todelete;
                       }
                       my %imgdeletions;
                       my @todeleteimages = &Apache::loncommon::get_env_multiple('form.book_image_del');
                       if (@todeleteimages) {
                           map { $imgdeletions{$_} = 1; } @todeleteimages;
                       }
                       my $maxnum = $env{'form.book_maxnum'};
                       for (my $i=0; $i<=$maxnum; $i++) {
                           my $key = $env{'form.book_id_'.$i};
                           if (ref($domconfig{$action}{'textbooks'}{$key}) eq 'HASH') {
                               if ($deletions{$key}) {
                                   if ($domconfig{$action}{'textbooks'}{$key}{'image'}) {
                                       #FIXME need to obsolete item in RES space
                                   }
                                   next;
                               } else {
                                   my $newpos = $env{'form.'.$key};
                                   $newpos =~ s/\D+//g;
                                   foreach my $item ('subject','title','author') {
                                       $confhash{'textbooks'}{$key}{$item} = $env{'form.book_'.$item.'_'.$i};
                                       if ($domconfig{$action}{'textbooks'}{$key}{$item} ne $confhash{'textbooks'}{$key}{$item}) {
                                           $changes{'textbooks'}{$key} = 1;
                                       }
                                   }
                                   $allpos[$newpos] = $key;
                               }
                               if ($imgdeletions{$key}) {
                                   $changes{'textbooks'}{$key} = 1;
                                   #FIXME need to obsolete item in RES space
                               } elsif ($env{'form.book_image_'.$i.'.filename'}) {
                                   my ($cdom,$cnum) = split(/_/,$key);
                                   my ($imgurl,$error) = &process_textbook_image($r,$dom,$confname,'book_image_'.$i,
                                                                                 $cdom,$cnum,$configuserok,
                                                                                 $switchserver,$author_ok);
                                   if ($imgurl) {
                                       $confhash{'textbooks'}{$key}{'image'} = $imgurl;
                                       $changes{'textbooks'}{$key} = 1; 
                                   }
                                   if ($error) {
                                       &Apache::lonnet::logthis($error);
                                       $errors .= '<li><span class="LC_error">'.$error.'</span></li>';
                                   } 
                               } elsif ($domconfig{$action}{'textbooks'}{$key}{'image'}) {
                                   $confhash{'textbooks'}{$key}{'image'} = 
                                       $domconfig{$action}{'textbooks'}{$key}{'image'};
                               }
                           }
                       }
                   }
               }
         } else {          } else {
             if ($confhash{'notify'}{'approval'}) {              if ($confhash{'notify'}{'approval'}) {
                 $changes{'notify'}{'approval'} = 1;                  $changes{'notify'}{'approval'} = 1;
             }              }
               if (ref($confhash{'uniquecode'} eq 'HASH')) {
                   $changes{'uniquecode'} = 1;
               }
           }
           if ($context eq 'requestcourses') {
               if ($newbook) {
                   $changes{'textbooks'}{$newbook} = 1;
                   foreach my $item ('subject','title','author') {
                       $env{'form.addbook_'.$item} =~ s/(`)/'/g;
                       if ($env{'form.addbook_'.$item}) {
                           $confhash{'textbooks'}{$newbook}{$item} = $env{'form.addbook_'.$item};
                       }
                   }
                   if ($env{'form.addbook_image.filename'} ne '') {
                       my ($cdom,$cnum) = split(/_/,$newbook);
                       my ($imageurl,$error) =
                           &process_textbook_image($r,$dom,$confname,'addbook_image',$cdom,$cnum,$configuserok,
                                                   $switchserver,$author_ok);
                       if ($imageurl) {
                           $confhash{'textbooks'}{$newbook}{'image'} = $imageurl;
                       }
                       if ($error) {
                           &Apache::lonnet::logthis($error);
                           $errors .= '<li><span class="LC_error">'.$error.'</span></li>';
                       }
                   }
               }
               if (@allpos > 0) {
                   my $idx = 0;
                   foreach my $item (@allpos) {
                       if ($item ne '') {
                           $confhash{'textbooks'}{$item}{'order'} = $idx;
                           if (ref($domconfig{$action}) eq 'HASH') {
                               if (ref($domconfig{$action}{'textbooks'}) eq 'HASH') {
                                   if (ref($domconfig{$action}{'textbooks'}{$item}) eq 'HASH') {
                                       if ($domconfig{$action}{'textbooks'}{$item}{'order'} ne $idx) {
                                           $changes{'textbooks'}{$item} = 1;
                                       }
                                   }
                               }
                           }
                           $idx ++;
                       }
                   }
               }
               if (ref($validationitemsref) eq 'ARRAY') {
                   foreach my $item (@{$validationitemsref}) {
                       if ($item eq 'fields') {
                           my @changed;
                           @{$confhash{'validation'}{$item}} = &Apache::loncommon::get_env_multiple('form.requestcourses_validation_'.$item);
                           if (@{$confhash{'validation'}{$item}} > 0) {
                               @{$confhash{'validation'}{$item}} = sort(@{$confhash{'validation'}{$item}});
                           }
                           if (ref($domconfig{'requestcourses'}{'validation'}) eq 'HASH') {
                               if (ref($domconfig{'requestcourses'}{'validation'}{$item}) eq 'ARRAY') {
                                   @changed = &Apache::loncommon::compare_arrays($confhash{'validation'}{$item},
                                                                                 $domconfig{'requestcourses'}{'validation'}{$item});
                               } else {
                                   @changed = @{$confhash{'validation'}{$item}};
                               }
                           } else {
                               @changed = @{$confhash{'validation'}{$item}};
                           }
                           if (@changed) {
                               if ($confhash{'validation'}{$item}) {
                                   $changes{'validation'}{$item} = join(', ',@{$confhash{'validation'}{$item}});
                               } else {
                                   $changes{'validation'}{$item} = &mt('None');
                               }
                           }
                       } else {
                           $confhash{'validation'}{$item} = $env{'form.requestcourses_validation_'.$item};
                           if ($item eq 'markup') {
                               if ($env{'form.requestcourses_validation_'.$item}) {
                                   $env{'form.requestcourses_validation_'.$item} =~ s/[\n\r\f]+/\s/gs;
                               }
                           }
                           if (ref($domconfig{'requestcourses'}{'validation'}) eq 'HASH') {
                               if ($domconfig{'requestcourses'}{'validation'}{$item} ne $confhash{'validation'}{$item}) {
                                   $changes{'validation'}{$item} = $confhash{'validation'}{$item};
                               }
                           } else {
                               if ($confhash{'validation'}{$item} ne '') {
                                   $changes{'validation'}{$item} = $confhash{'validation'}{$item};
                               }
                           }
                       }
                   }
               }
               if ($env{'form.validationdc'}) {
                   my $newval = $env{'form.validationdc'};
                   my %domcoords = &get_active_dcs($dom);
                   if (exists($domcoords{$newval})) {
                       $confhash{'validation'}{'dc'} = $newval;
                   }
               }
               if (ref($confhash{'validation'}) eq 'HASH') {
                   if (ref($domconfig{'requestcourses'}{'validation'}) eq 'HASH') {
                       if ($domconfig{'requestcourses'}{'validation'}{'dc'}) {
                           unless ($confhash{'validation'}{'dc'} eq $domconfig{'requestcourses'}{'validation'}{'dc'}) {
                               if ($confhash{'validation'}{'dc'} eq '') {
                                   $changes{'validation'}{'dc'} = &mt('None');
                               } else {
                                   $changes{'validation'}{'dc'} = $confhash{'validation'}{'dc'};
                               }
                           }
                       } elsif ($confhash{'validation'}{'dc'} ne '') {
                           $changes{'validation'}{'dc'} = $confhash{'validation'}{'dc'};
                       }
                   } elsif ($confhash{'validation'}{'dc'} ne '') {
                       $changes{'validation'}{'dc'} = $confhash{'validation'}{'dc'};
                   }
               } elsif (ref($domconfig{'requestcourses'}{'validation'}) eq 'HASH') {
                   if ($domconfig{'requestcourses'}{'validation'}{'dc'}) {
                       $changes{'validation'}{'dc'} = &mt('None');
                   }
               }
         }          }
     } else {      } else {
         $confhash{'defaultquota'}{'default'} = $env{'form.defaultquota'};          $confhash{'defaultquota'}{'default'} = $env{'form.defaultquota'};
Line 5904  sub modify_quotas { Line 7165  sub modify_quotas {
         $domdefaults{'requestauthor'} = \%confhash;          $domdefaults{'requestauthor'} = \%confhash;
     } else {      } else {
         foreach my $key (keys(%confhash)) {          foreach my $key (keys(%confhash)) {
             $domdefaults{$key} = $confhash{$key};              unless (($context eq 'requestcourses') && ($key eq 'textbooks')) {
                   $domdefaults{$key} = $confhash{$key};
               }
         }          }
     }      }
   
Line 5917  sub modify_quotas { Line 7180  sub modify_quotas {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             my $cachetime = 24*60*60;              my $cachetime = 24*60*60;
             &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);              &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
               if (ref($lastactref) eq 'HASH') {
                   $lastactref->{'domdefaults'} = 1;
               }
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             unless (($context eq 'requestcourses') ||              unless (($context eq 'requestcourses') ||
                     ($context eq 'requestauthor')) {                      ($context eq 'requestauthor')) {
Line 5929  sub modify_quotas { Line 7194  sub modify_quotas {
                             if ($type eq 'default') {                              if ($type eq 'default') {
                                 $typetitle = $othertitle;                                  $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>';
                 }                  }
                 if (ref($changes{'authorquota'}) eq 'HASH') {                  if (ref($changes{'authorquota'}) eq 'HASH') {
                     $resulttext .= '<li>'.&mt('Authoring space default quotas').'<ul>';                      $resulttext .= '<li>'.&mt('Authoring Space default quotas').'<ul>';
                     foreach my $type (@{$types},'default') {                      foreach my $type (@{$types},'default') {
                         if (defined($changes{'authorquota'}{$type})) {                          if (defined($changes{'authorquota'}{$type})) {
                             my $typetitle = $usertypes->{$type};                              my $typetitle = $usertypes->{$type};
                             if ($type eq 'default') {                              if ($type eq 'default') {
                                 $typetitle = $othertitle;                                  $typetitle = $othertitle;
                             }                              }
                             $resulttext .= '<li>'.&mt('[_1] set to [_2] Mb',$typetitle,$confhash{'authorquota'}{$type}).'</li>';                              $resulttext .= '<li>'.&mt('[_1] set to [_2] MB',$typetitle,$confhash{'authorquota'}{$type}).'</li>';
                         }                          }
                     }                      }
                     $resulttext .= '</ul></li>';                      $resulttext .= '</ul></li>';
Line 6039  sub modify_quotas { Line 7304  sub modify_quotas {
                     }                      }
                 }                  }
             }              }
               if ($action eq 'requestcourses') {
                   my @offon = ('off','on');
                   if ($changes{'uniquecode'}) {
                       if (ref($confhash{'uniquecode'}) eq 'HASH') {
                           my $codestr = join(' ',map{ &mt($_); } sort(keys(%{$confhash{'uniquecode'}})));
                           $resulttext .= '<li>'.
                                          &mt('Generation of six character code as course identifier for distribution to students set to on for: [_1].','<b>'.$codestr.'</b>').
                                          '</li>';
                       } else {
                           $resulttext .= '<li>'.&mt('Generation of six character code as course identifier for distribution to students set to off.').
                                          '</li>';
                       }
                   }
                   if (ref($changes{'textbooks'}) eq 'HASH') {
                       $resulttext .= '<li>'.&mt('Available textbooks updated').'<ul>';
                       foreach my $key (sort(keys(%{$changes{'textbooks'}}))) {
                           my %coursehash = &Apache::lonnet::coursedescription($key);
                           my $coursetitle = $coursehash{'description'};
                           my $position = $confhash{'textbooks'}{$key}{'order'} + 1;
                           $resulttext .= '<li>';
                           foreach my $item ('subject','title','author') {
                               my $name = $item.':';
                               $name =~ s/^(\w)/\U$1/;
                               $resulttext .= &mt($name).' '.$confhash{'textbooks'}{$key}{$item}.'<br />';
                           }
                           $resulttext .= ' '.&mt('Order: [_1]',$position).'<br />';
                           if ($confhash{'textbooks'}{$key}{'image'}) {
                               $resulttext .= ' '.&mt('Image: [_1]',
                                                  '<img src="'.$confhash{'textbooks'}{$key}{'image'}.'"'.
                                                  ' alt="Textbook cover" />').'<br />';
                           }
                           $resulttext .= ' '.&mt('LON-CAPA Course: [_1]',$coursetitle).'</li>';
                       }
                       $resulttext .= '</ul></li>';
                   }
                   if (ref($changes{'validation'}) eq 'HASH') {
                       if ((ref($validationitemsref) eq 'ARRAY') && (ref($validationnamesref) eq 'HASH')) {
                           $resulttext .= '<li>'.&mt('Validation of courses/communities updated').'<ul>';
                           foreach my $item (@{$validationitemsref}) {
                               if (exists($changes{'validation'}{$item})) {
                                   if ($item eq 'markup') {
                                       $resulttext .= '<li>'.&mt('[_1] set to: [_2]',$validationnamesref->{$item},
                                                                 '<br /><pre>'.$changes{'validation'}{$item}.'</pre>').'</li>';
                                   } else {
                                       $resulttext .= '<li>'.&mt('[_1] set to: [_2]',$validationnamesref->{$item},
                                                                 '<b>'.$changes{'validation'}{$item}.'</b>').'</li>';
                                   }
                               }
                           }
                           if (exists($changes{'validation'}{'dc'})) {
                               $resulttext .= '<li>'.&mt('Validated course requests identified as processed by: [_1]',
                                                        '<b>'.$changes{'validation'}{'dc'}.'</b>').'</li>';
                           }
                       }
                   }
               }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
             if (keys(%newenv)) {              if (keys(%newenv)) {
                 &Apache::lonnet::appenv(\%newenv);                  &Apache::lonnet::appenv(\%newenv);
Line 6056  sub modify_quotas { Line 7377  sub modify_quotas {
         $resulttext = '<span class="LC_error">'.          $resulttext = '<span class="LC_error">'.
     &mt('An error occurred: [_1]',$putresult).'</span>';      &mt('An error occurred: [_1]',$putresult).'</span>';
     }      }
       if ($errors) {
           $resulttext .= '<p>'.&mt('The following errors occurred when modifying Textbook settings.').
                          '<ul>'.$errors.'</ul></p>';
       }
     return $resulttext;      return $resulttext;
 }  }
   
   sub process_textbook_image {
       my ($r,$dom,$confname,$caller,$cdom,$cnum,$configuserok,$switchserver,$author_ok) = @_;
       my $filename = $env{'form.'.$caller.'.filename'};
       my ($error,$url);
       my ($width,$height) = (50,50);
       if ($configuserok eq 'ok') {
           if ($switchserver) {
               $error = &mt('Upload of textbook image is not permitted to this server: [_1]',
                            $switchserver);
           } elsif ($author_ok eq 'ok') {
               my ($result,$imageurl) =
                   &publishlogo($r,'upload',$caller,$dom,$confname,
                                "textbooks/$dom/$cnum/cover",$width,$height);
               if ($result eq 'ok') {
                   $url = $imageurl;
               } else {
                   $error = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$filename,$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].",$filename,$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].",$filename,$confname,$dom,$configuserok);
       }
       return ($url,$error);
   }
   
 sub modify_autoenroll {  sub modify_autoenroll {
     my ($dom,%domconfig) = @_;      my ($dom,$lastactref,%domconfig) = @_;
     my ($resulttext,%changes);      my ($resulttext,%changes);
     my %currautoenroll;      my %currautoenroll;
     if (ref($domconfig{'autoenroll'}) eq 'HASH') {      if (ref($domconfig{'autoenroll'}) eq 'HASH') {
Line 6128  sub modify_autoenroll { Line 7480  sub modify_autoenroll {
             if ($changes{'coowners'}) {              if ($changes{'coowners'}) {
                 $resulttext .= '<li>'.&mt("$title{'coowners'} set to $offon[$env{'form.autoassign_coowners'}]").'</li>';                  $resulttext .= '<li>'.&mt("$title{'coowners'} set to $offon[$env{'form.autoassign_coowners'}]").'</li>';
                 &Apache::loncommon::devalidate_domconfig_cache($dom);                  &Apache::loncommon::devalidate_domconfig_cache($dom);
                   if (ref($lastactref) eq 'HASH') {
                       $lastactref->{'domainconfig'} = 1;
                   }
             }              }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
         } else {          } else {
Line 6579  sub modify_directorysrch { Line 7934  sub modify_directorysrch {
 }  }
   
 sub modify_contacts {  sub modify_contacts {
     my ($dom,%domconfig) = @_;      my ($dom,$lastactref,%domconfig) = @_;
     my ($resulttext,%currsetting,%newsetting,%changes,%contacts_hash);      my ($resulttext,%currsetting,%newsetting,%changes,%contacts_hash);
     if (ref($domconfig{'contacts'}) eq 'HASH') {      if (ref($domconfig{'contacts'}) eq 'HASH') {
         foreach my $key (keys(%{$domconfig{'contacts'}})) {          foreach my $key (keys(%{$domconfig{'contacts'}})) {
Line 6589  sub modify_contacts { Line 7944  sub modify_contacts {
     my (%others,%to,%bcc);      my (%others,%to,%bcc);
     my @contacts = ('supportemail','adminemail');      my @contacts = ('supportemail','adminemail');
     my @mailings = ('errormail','packagesmail','helpdeskmail','lonstatusmail',      my @mailings = ('errormail','packagesmail','helpdeskmail','lonstatusmail',
                     'requestsmail','updatesmail');                      'requestsmail','updatesmail','idconflictsmail');
       my @toggles = ('reporterrors','reportupdates');
     foreach my $type (@mailings) {      foreach my $type (@mailings) {
         @{$newsetting{$type}} =           @{$newsetting{$type}} = 
             &Apache::loncommon::get_env_multiple('form.'.$type);              &Apache::loncommon::get_env_multiple('form.'.$type);
Line 6611  sub modify_contacts { Line 7967  sub modify_contacts {
         $to{$item} = $env{'form.'.$item};          $to{$item} = $env{'form.'.$item};
         $contacts_hash{'contacts'}{$item} = $to{$item};          $contacts_hash{'contacts'}{$item} = $to{$item};
     }      }
       foreach my $item (@toggles) {
           if ($env{'form.'.$item} =~ /^(0|1)$/) {
               $contacts_hash{'contacts'}{$item} = $env{'form.'.$item};
           }
       }
     if (keys(%currsetting) > 0) {      if (keys(%currsetting) > 0) {
         foreach my $item (@contacts) {          foreach my $item (@contacts) {
             if ($to{$item} ne $currsetting{$item}) {              if ($to{$item} ne $currsetting{$item}) {
Line 6649  sub modify_contacts { Line 8010  sub modify_contacts {
         foreach my $item (@contacts) {          foreach my $item (@contacts) {
            if ($to{$item} ne $default{$item}) {             if ($to{$item} ne $default{$item}) {
               $changes{$item} = 1;                $changes{$item} = 1;
            }              }
         }          }
         foreach my $type (@mailings) {          foreach my $type (@mailings) {
             if ((@{$newsetting{$type}} != 1) || ($newsetting{$type}[0] ne $default{$type})) {              if ((@{$newsetting{$type}} != 1) || ($newsetting{$type}[0] ne $default{$type})) {
Line 6666  sub modify_contacts { Line 8027  sub modify_contacts {
             }              }
         }          }
     }      }
       foreach my $item (@toggles) {
           if (($env{'form.'.$item} == 1) && ($currsetting{$item} == 0)) {
               $changes{$item} = 1;
           } elsif ((!$env{'form.'.$item}) &&
                    (($currsetting{$item} eq '') || ($currsetting{$item} == 1))) {
               $changes{$item} = 1;
           }
       }
     my $putresult = &Apache::lonnet::put_dom('configuration',\%contacts_hash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%contacts_hash,
                                              $dom);                                               $dom);
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
               &Apache::loncommon::devalidate_domconfig_cache($dom);
               if (ref($lastactref) eq 'HASH') {
                   $lastactref->{'domainconfig'} = 1;
               }
             my ($titles,$short_titles)  = &contact_titles();              my ($titles,$short_titles)  = &contact_titles();
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             foreach my $item (@contacts) {              foreach my $item (@contacts) {
Line 6700  sub modify_contacts { Line 8073  sub modify_contacts {
                     $resulttext .= '</li>';                      $resulttext .= '</li>';
                 }                  }
             }              }
               my @offon = ('off','on');
               if ($changes{'reporterrors'}) {
                   $resulttext .= '<li>'.
                                  &mt('E-mail error reports to [_1] set to "'.
                                      $offon[$env{'form.reporterrors'}].'".',
                                      &Apache::loncommon::modal_link('http://loncapa.org/core.html',
                                          &mt('LON-CAPA core group - MSU'),600,500)).
                                  '</li>';
               }
               if ($changes{'reportupdates'}) {
                   $resulttext .= '<li>'.
                                   &mt('E-mail record of completed LON-CAPA updates to [_1] set to "'.
                                       $offon[$env{'form.reportupdates'}].'".',
                                       &Apache::loncommon::modal_link('http://loncapa.org/core.html',
                                           &mt('LON-CAPA core group - MSU'),600,500)).
                                   '</li>';
               }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
         } else {          } else {
             $resulttext = &mt('No changes made to contact information');              $resulttext = &mt('No changes made to contact information');
Line 6713  sub modify_contacts { Line 8103  sub modify_contacts {
   
 sub modify_usercreation {  sub modify_usercreation {
     my ($dom,%domconfig) = @_;      my ($dom,%domconfig) = @_;
     my ($resulttext,%curr_usercreation,%changes,%authallowed,%cancreate);      my ($resulttext,%curr_usercreation,%changes,%authallowed,%cancreate,%save_usercreate);
     my $warningmsg;      my $warningmsg;
     if (ref($domconfig{'usercreation'}) eq 'HASH') {      if (ref($domconfig{'usercreation'}) eq 'HASH') {
         foreach my $key (keys(%{$domconfig{'usercreation'}})) {          foreach my $key (keys(%{$domconfig{'usercreation'}})) {
             $curr_usercreation{$key} = $domconfig{'usercreation'}{$key};              if ($key eq 'cancreate') {
         }                  if (ref($domconfig{'usercreation'}{$key}) eq 'HASH') {
     }                      foreach my $item (keys(%{$domconfig{'usercreation'}{$key}})) {
     my @username_rule = &Apache::loncommon::get_env_multiple('form.username_rule');                          if (($item eq 'selfcreate') || ($item eq 'statustocreate') ||
     my @id_rule = &Apache::loncommon::get_env_multiple('form.id_rule');                              ($item eq 'captcha') || ($item eq 'recaptchakeys')) {
     my @email_rule = &Apache::loncommon::get_env_multiple('form.email_rule');                              $save_usercreate{$key}{$item} = $domconfig{'usercreation'}{$key}{$item};
     my @contexts = ('author','course','requestcrs','selfcreate');                          } else {
     foreach my $item(@contexts) {                              $curr_usercreation{$key}{$item} = $domconfig{'usercreation'}{$key}{$item};
         if ($item eq 'selfcreate') {                          }
             @{$cancreate{$item}} = &Apache::loncommon::get_env_multiple('form.can_createuser_'.$item);  
             my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);  
             if (!((($domdefaults{'auth_def'} =~/^krb/) && ($domdefaults{'auth_arg_def'} ne '')) || ($domdefaults{'auth_def'} eq 'localauth'))) {  
                 if (ref($cancreate{$item}) eq 'ARRAY') {   
                     if (grep(/^login$/,@{$cancreate{$item}})) {  
                         $warningmsg = &mt('Although account creation has been set to be available for institutional logins, currently default authentication in this domain has not been set to support this.').' '.&mt('You need to set the default authentication type to Kerberos 4 or 5 (with a Kerberos domain specified), or to Local authentication, if the localauth module has been customized in your domain to authenticate institutional logins.');     
                     }                      }
                 }                  }
               } elsif ($key eq 'email_rule') {
                   $save_usercreate{$key} = $domconfig{'usercreation'}{$key};
               } else {
                   $curr_usercreation{$key} = $domconfig{'usercreation'}{$key};
             }              }
         } else {  
             $cancreate{$item} = $env{'form.can_createuser_'.$item};  
         }          }
     }      }
     my ($othertitle,$usertypes,$types) =       my @username_rule = &Apache::loncommon::get_env_multiple('form.username_rule');
         &Apache::loncommon::sorted_inst_types($dom);      my @id_rule = &Apache::loncommon::get_env_multiple('form.id_rule');
     if (ref($types) eq 'ARRAY') {      my @contexts = ('author','course','requestcrs');
         if (@{$types} > 0) {      foreach my $item(@contexts) {
             @{$cancreate{'statustocreate'}} =           $cancreate{$item} = $env{'form.can_createuser_'.$item};
                 &Apache::loncommon::get_env_multiple('form.statustocreate');  
         } else {  
             @{$cancreate{'statustocreate'}} = ();  
         }  
         push(@contexts,'statustocreate');  
     }      }
     &process_captcha('cancreate',\%changes,\%cancreate,\%curr_usercreation);  
     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') || ($item eq 'statustocreate')) {              if ($curr_usercreation{'cancreate'}{$item} ne $cancreate{$item}) {
                 if (ref($curr_usercreation{'cancreate'}{$item}) eq 'ARRAY') {                  push(@{$changes{'cancreate'}},$item);
                     foreach my $curr (@{$curr_usercreation{'cancreate'}{$item}}) {  
                         if (ref($cancreate{$item}) eq 'ARRAY') {  
                             if (!grep(/^$curr$/,@{$cancreate{$item}})) {  
                                 if (!grep(/^$item$/,@{$changes{'cancreate'}})) {  
                                     push(@{$changes{'cancreate'}},$item);  
                                 }  
                             }  
                         }  
                     }  
                 } else {  
                     if ($curr_usercreation{'cancreate'}{$item} eq '') {  
                         if (@{$cancreate{$item}} > 0) {  
                             if (!grep(/^$item$/,@{$changes{'cancreate'}})) {  
                                 push(@{$changes{'cancreate'}},$item);  
                             }  
                         }  
                     } else {  
                         if ($curr_usercreation{'cancreate'}{$item} eq 'any') {  
                             if (@{$cancreate{$item}} < 3) {  
                                 if (!grep(/^$item$/,@{$changes{'cancreate'}})) {  
                                     push(@{$changes{'cancreate'}},$item);  
                                 }  
                             }  
                         } elsif ($curr_usercreation{'cancreate'}{$item} eq 'none') {  
                             if (@{$cancreate{$item}} > 0) {  
                                 if (!grep(/^$item$/,@{$changes{'cancreate'}})) {  
                                     push(@{$changes{'cancreate'}},$item);  
                                 }  
                             }  
                         } elsif (!grep(/^$curr_usercreation{'cancreate'}{$item}$/,@{$cancreate{$item}})) {  
                             if (!grep(/^$item$/,@{$changes{'cancreate'}})) {  
                                 push(@{$changes{'cancreate'}},$item);  
                             }  
                         }  
                     }  
                 }  
                 if (!grep(/^$item$/,@{$changes{'cancreate'}})) {  
                     foreach my $type (@{$cancreate{$item}}) {  
                         if (ref($curr_usercreation{'cancreate'}{$item}) eq 'ARRAY') {  
                             if (!grep(/^$type$/,@{$curr_usercreation{'cancreate'}{$item}})) {  
                                 if (!grep(/^$item$/,@{$changes{'cancreate'}})) {  
                                     push(@{$changes{'cancreate'}},$item);  
                                 }  
                             }  
                         } elsif (($curr_usercreation{'cancreate'}{$item} ne 'any') &&  
                                  ($curr_usercreation{'cancreate'}{$item} ne 'none')) {  
                             if ($curr_usercreation{'cancreate'}{$item} ne $type) {  
                                 if (!grep(/^$item$/,@{$changes{'cancreate'}})) {  
                                     push(@{$changes{'cancreate'}},$item);  
                                 }  
                             }  
                         }  
                     }  
                 }  
             } else {  
                 if ($curr_usercreation{'cancreate'}{$item} ne $cancreate{$item}) {  
                     push(@{$changes{'cancreate'}},$item);  
                 }  
             }              }
         }          }
     } elsif (ref($curr_usercreation{'cancreate'}) eq 'ARRAY') {      } elsif (ref($curr_usercreation{'cancreate'}) eq 'ARRAY') {
Line 6863  sub modify_usercreation { Line 8185  sub modify_usercreation {
         push(@{$changes{'id_rule'}},@id_rule);          push(@{$changes{'id_rule'}},@id_rule);
     }      }
   
     if (ref($curr_usercreation{'email_rule'}) eq 'ARRAY') {  
         foreach my $type (@{$curr_usercreation{'email_rule'}}) {  
             if (!grep(/^\Q$type\E$/,@email_rule)) {  
                 push(@{$changes{'email_rule'}},$type);  
             }  
         }  
         foreach my $type (@email_rule) {  
             if (!grep(/^\Q$type\E$/,@{$curr_usercreation{'email_rule'}})) {  
                 push(@{$changes{'email_rule'}},$type);  
             }  
         }  
     } else {  
         push(@{$changes{'email_rule'}},@email_rule);  
     }  
   
     my @authen_contexts = ('author','course','domain');      my @authen_contexts = ('author','course','domain');
     my @authtypes = ('int','krb4','krb5','loc');      my @authtypes = ('int','krb4','krb5','loc');
     my %authhash;      my %authhash;
Line 6908  sub modify_usercreation { Line 8215  sub modify_usercreation {
         }          }
     }      }
   
       $save_usercreate{'cancreate'}{'course'} = $cancreate{'course'}; 
       $save_usercreate{'cancreate'}{'author'} = $cancreate{'author'};
       $save_usercreate{'cancreate'}{'requestcrs'} = $cancreate{'requestcrs'};
       $save_usercreate{'id_rule'} = \@id_rule;
       $save_usercreate{'username_rule'} = \@username_rule,
       $save_usercreate{'authtypes'} = \%authhash;
   
     my %usercreation_hash =  (      my %usercreation_hash =  (
             usercreation => {          usercreation     => \%save_usercreate,
                               cancreate     => \%cancreate,      );
                               username_rule => \@username_rule,  
                               id_rule       => \@id_rule,  
                               email_rule    => \@email_rule,  
                               authtypes     => \%authhash,  
                             }  
             );  
   
     my $putresult = &Apache::lonnet::put_dom('configuration',\%usercreation_hash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%usercreation_hash,
                                              $dom);                                               $dom);
   
       if ($putresult eq 'ok') {
           if (keys(%changes) > 0) {
               $resulttext = &mt('Changes made:').'<ul>';
               if (ref($changes{'cancreate'}) eq 'ARRAY') {
                   my %lt = &usercreation_types();
                   foreach my $type (@{$changes{'cancreate'}}) {
                       my $chgtext = $lt{$type}.', ';
                       if ($cancreate{$type} eq 'none') {
                           $chgtext .= &mt('creation of new users is not permitted, except by a Domain Coordinator.');
                       } elsif ($cancreate{$type} eq 'any') {
                           $chgtext .= &mt('creation of new users is permitted for both institutional and non-institutional usernames.');
                       } elsif ($cancreate{$type} eq 'official') {
                           $chgtext .= &mt('creation of new users is only permitted for institutional usernames.');
                       } elsif ($cancreate{$type} eq 'unofficial') {
                           $chgtext .= &mt('creation of new users is only permitted for non-institutional usernames.');
                       }
                       $resulttext .= '<li>'.$chgtext.'</li>';
                   }
               }
               if (ref($changes{'username_rule'}) eq 'ARRAY') {
                   my ($rules,$ruleorder) = 
                       &Apache::lonnet::inst_userrules($dom,'username');
                   my $chgtext = '<ul>';
                   foreach my $type (@username_rule) {
                       if (ref($rules->{$type}) eq 'HASH') {
                           $chgtext .= '<li>'.$rules->{$type}{'name'}.'</li>';
                       }
                   }
                   $chgtext .= '</ul>';
                   if (@username_rule > 0) {
                       $resulttext .= '<li>'.&mt('Usernames with the following formats are restricted to verified users in the institutional directory: ').$chgtext.'</li>';     
                   } else {
                       $resulttext .= '<li>'.&mt('There are now no username formats restricted to verified users in the institutional directory.').'</li>'; 
                   }
               }
               if (ref($changes{'id_rule'}) eq 'ARRAY') {
                   my ($idrules,$idruleorder) = 
                       &Apache::lonnet::inst_userrules($dom,'id');
                   my $chgtext = '<ul>';
                   foreach my $type (@id_rule) {
                       if (ref($idrules->{$type}) eq 'HASH') {
                           $chgtext .= '<li>'.$idrules->{$type}{'name'}.'</li>';
                       }
                   }
                   $chgtext .= '</ul>';
                   if (@id_rule > 0) {
                       $resulttext .= '<li>'.&mt('IDs with the following formats are restricted to verified users in the institutional directory: ').$chgtext.'</li>';
                   } else {
                       $resulttext .= '<li>'.&mt('There are now no ID formats restricted to verified users in the institutional directory.').'</li>';
                   }
               }
               my %authname = &authtype_names();
               my %context_title = &context_names();
               if (ref($changes{'authtypes'}) eq 'ARRAY') {
                   my $chgtext = '<ul>';
                   foreach my $type (@{$changes{'authtypes'}}) {
                       my @allowed;
                       $chgtext .= '<li><span class="LC_cusr_emph">'.$context_title{$type}.'</span> - '.&mt('assignable authentication types: ');
                       foreach my $auth (@authtypes) {
                           if ($authhash{$type}{$auth}) {
                               push(@allowed,$authname{$auth});
                           }
                       }
                       if (@allowed > 0) {
                           $chgtext .= join(', ',@allowed).'</li>';
                       } else {
                           $chgtext .= &mt('none').'</li>';
                       }
                   }
                   $chgtext .= '</ul>';
                   $resulttext .= '<li>'.&mt('Authentication types available for assignment to new users').'<br />'.$chgtext;
                   $resulttext .= '</li>';
               }
               $resulttext .= '</ul>';
           } else {
               $resulttext = &mt('No changes made to user creation settings');
           }
       } else {
           $resulttext = '<span class="LC_error">'.
               &mt('An error occurred: [_1]',$putresult).'</span>';
       }
       if ($warningmsg ne '') {
           $resulttext .= '<br /><span class="LC_warning">'.$warningmsg.'</span><br />';
       }
       return $resulttext;
   }
   
   sub modify_selfcreation {
       my ($dom,%domconfig) = @_;
       my ($resulttext,$warningmsg,%curr_usercreation,%curr_usermodify,%changes,%cancreate);
       my (%save_usercreate,%save_usermodify);
       my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
       if (ref($types) eq 'ARRAY') {
           $usertypes->{'default'} = $othertitle;
           push(@{$types},'default');
       }
   #
   # Retrieve current domain configuration for self-creation of usernames from $domconfig{'usercreation'}.
   #
       if (ref($domconfig{'usercreation'}) eq 'HASH') {
           foreach my $key (keys(%{$domconfig{'usercreation'}})) {
               if ($key eq 'cancreate') {
                   if (ref($domconfig{'usercreation'}{$key}) eq 'HASH') {
                       foreach my $item (keys(%{$domconfig{'usercreation'}{$key}})) {
                           if (($item eq 'selfcreate') || ($item eq 'statustocreate') ||
                               ($item eq 'captcha') || ($item eq 'recaptchakeys') || 
                               ($item eq 'emailusername') || ($item eq 'notify') ||
                               ($item eq 'selfcreateprocessing')) {
                               $curr_usercreation{$key}{$item} = $domconfig{'usercreation'}{$key}{$item};
                           } else {
                               $save_usercreate{$key}{$item} = $domconfig{'usercreation'}{$key}{$item};
                           }
                       }
                   }
               } elsif ($key eq 'email_rule') {
                   $curr_usercreation{$key} = $domconfig{'usercreation'}{$key};
               } else {
                   $save_usercreate{$key} = $domconfig{'usercreation'}{$key};
               }
           }
       }
   #
   # Retrieve current domain configuration for self-creation of usernames from $domconfig{'usermodification'}.
   #
       if (ref($domconfig{'usermodification'}) eq 'HASH') {
           foreach my $key (keys(%{$domconfig{'usermodification'}})) {
               if ($key eq 'selfcreate') {
                   $curr_usermodify{$key} = $domconfig{'usermodification'}{$key};
               } else {
                   $save_usermodify{$key} = $domconfig{'usermodification'}{$key};
               }
           }
       }
   
       my @contexts = ('selfcreate');
       @{$cancreate{'selfcreate'}} = ();
       %{$cancreate{'emailusername'}} = ();
       @{$cancreate{'statustocreate'}} = ();
       %{$cancreate{'selfcreateprocessing'}} = ();
     my %selfcreatetypes = (      my %selfcreatetypes = (
                              sso   => 'users authenticated by institutional single sign on',                               sso   => 'users authenticated by institutional single sign on',
                              login => 'users authenticated by institutional log-in',                               login => 'users authenticated by institutional log-in',
                              email => 'users who provide a valid e-mail address for use as the username',                               email => 'users who provide a valid e-mail address for use as username',
                           );                            );
   #
   # Populate $cancreate{'selfcreate'} array reference with types of user, for which self-creation of user accounts
   # is permitted.
   #
   
       my @statuses;
       if (ref($domconfig{'inststatus'}) eq 'HASH') {
           if (ref($domconfig{'inststatus'}{'inststatusguest'}) eq 'ARRAY') {
               @statuses = @{$domconfig{'inststatus'}{'inststatusguest'}};
           }
       }
       push(@statuses,'default');
   
       foreach my $item ('login','sso','email') {
           if ($item eq 'email') {
               if ($env{'form.cancreate_email'}) {
                   push(@{$cancreate{'selfcreate'}},'email');
                   push(@contexts,'selfcreateprocessing');
                   foreach my $type (@statuses) {
                       if ($type eq 'default') {
                           $cancreate{'selfcreateprocessing'}{$type} = $env{'form.cancreate_emailprocess'};
                       } else { 
                           $cancreate{'selfcreateprocessing'}{$type} = $env{'form.cancreate_emailprocess_'.$type};
                       }
                   }
               }
           } else {
               if ($env{'form.cancreate_'.$item}) {
                   push(@{$cancreate{'selfcreate'}},$item);
               }
           }
       }
       my (@email_rule,%userinfo,%savecaptcha);
       my ($infofields,$infotitles) = &Apache::loncommon::emailusername_info();
   #
   # Populate $cancreate{'emailusername'}{$type} hash ref with information fields (if new user will provide data
   # value set to one), if self-creation with e-mail address permitted, where $type is user type: faculty, staff, student etc.
   #
   
       if ($env{'form.cancreate_email'} eq 'email') {
           push(@contexts,'emailusername');
           if (ref($types) eq 'ARRAY') {
               foreach my $type (@{$types}) {
                   if (ref($infofields) eq 'ARRAY') {
                       foreach my $field (@{$infofields}) {
                           if ($env{'form.canmodify_emailusername_'.$type.'_'.$field} =~ /^(required|optional)$/) {
                               $cancreate{'emailusername'}{$type}{$field} = $1;
                           }
                       }
                   }
               }
           }
   #
   # Populate $cancreate{'notify'} hash ref with names of Domain Coordinators who are to be notified of
   # queued requests for self-creation of account using e-mail address as username
   #
   
           my @approvalnotify = &Apache::loncommon::get_env_multiple('form.selfcreationnotifyapproval');
           @approvalnotify = sort(@approvalnotify);
           $cancreate{'notify'}{'approval'} = join(',',@approvalnotify);
           if (ref($curr_usercreation{'cancreate'}) eq 'HASH') {
               if (ref($curr_usercreation{'cancreate'}{'notify'}) eq 'HASH') {
                   if ($curr_usercreation{'cancreate'}{'notify'}{'approval'} ne $cancreate{'notify'}{'approval'}) {
                       push(@{$changes{'cancreate'}},'notify');
                   }
               } else {
                   if ($cancreate{'notify'}{'approval'}) {
                       push(@{$changes{'cancreate'}},'notify');
                   }
               }
           } elsif ($cancreate{'notify'}{'approval'}) {
               push(@{$changes{'cancreate'}},'notify');
           }
   
   #
   # Retrieve rules (if any) governing types of e-mail address which may be used as a username
   #
           @email_rule = &Apache::loncommon::get_env_multiple('form.email_rule');
           &process_captcha('cancreate',\%changes,\%savecaptcha,$curr_usercreation{'cancreate'});
           if (ref($curr_usercreation{'email_rule'}) eq 'ARRAY') {
               if (@{$curr_usercreation{'email_rule'}} > 0) {
                   foreach my $type (@{$curr_usercreation{'email_rule'}}) {
                       if (!grep(/^\Q$type\E$/,@email_rule)) {
                           push(@{$changes{'email_rule'}},$type);
                       }
                   }
               }
               if (@email_rule > 0) {
                   foreach my $type (@email_rule) {
                       if (!grep(/^\Q$type\E$/,@{$curr_usercreation{'email_rule'}})) {
                           push(@{$changes{'email_rule'}},$type);
                       }
                   }
               }
           } elsif (@email_rule > 0) {
               push(@{$changes{'email_rule'}},@email_rule);
           }
       }
   #  
   # Check if domain default is set appropriately, if self-creation of accounts is to be available for
   # institutional log-in.
   #
       if (grep(/^login$/,@{$cancreate{'selfcreate'}})) {
           my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
           if (!((($domdefaults{'auth_def'} =~/^krb/) && ($domdefaults{'auth_arg_def'} ne '')) || 
                  ($domdefaults{'auth_def'} eq 'localauth'))) {
               $warningmsg = &mt('Although account creation has been set to be available for institutional logins, currently default authentication in this domain has not been set to support this.').' '.
                             &mt('You need to set the default authentication type to Kerberos 4 or 5 (with a Kerberos domain specified), or to Local authentication, if the localauth module has been customized in your domain to authenticate institutional logins.');
           }
       }
       my @fields = ('lastname','firstname','middlename','generation',
                     'permanentemail','id');
       my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
   #
   # Where usernames may created for institutional log-in and/or institutional single sign on:
   # (a) populate $cancreate{'statustocreate'} array reference with institutional status types who
   # may self-create accounts 
   # (b) populate $save_usermodify{'selfcreate'} hash reference with status types, and information fields
   # which the user may supply, if institutional data is unavailable.
   #
       if (($env{'form.cancreate_login'}) || ($env{'form.cancreate_sso'})) {
           if (ref($types) eq 'ARRAY') {
               if (@{$types} > 1) {
                   @{$cancreate{'statustocreate'}} = &Apache::loncommon::get_env_multiple('form.statustocreate');
                   push(@contexts,'statustocreate');
               } else {
                   undef($cancreate{'statustocreate'});
               } 
               foreach my $type (@{$types}) {
                   my @modifiable =  &Apache::loncommon::get_env_multiple('form.canmodify_'.$type);
                   foreach my $field (@fields) {
                       if (grep(/^\Q$field\E$/,@modifiable)) {
                           $save_usermodify{'selfcreate'}{$type}{$field} = 1;
                       } else {
                           $save_usermodify{'selfcreate'}{$type}{$field} = 0;
                       }
                   }
               }
               if (ref($curr_usermodify{'selfcreate'}) eq 'HASH') {
                   foreach my $type (@{$types}) {
                       if (ref($curr_usermodify{'selfcreate'}{$type}) eq 'HASH') {
                           foreach my $field (@fields) {
                               if ($save_usermodify{'selfcreate'}{$type}{$field} ne
                                   $curr_usermodify{'selfcreate'}{$type}{$field}) {
                                   push(@{$changes{'selfcreate'}},$type);
                                   last;
                               }
                           }
                       }
                   }
               } else {
                   foreach my $type (@{$types}) {
                       push(@{$changes{'selfcreate'}},$type);
                   }
               }
           }
       }
       foreach my $item (@contexts) {
           if (ref($curr_usercreation{'cancreate'}{$item}) eq 'ARRAY') {
               foreach my $curr (@{$curr_usercreation{'cancreate'}{$item}}) {
                   if (ref($cancreate{$item}) eq 'ARRAY') {
                       if (!grep(/^$curr$/,@{$cancreate{$item}})) {
                           if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                               push(@{$changes{'cancreate'}},$item);
                           }
                       }
                   }
               }
               if (ref($cancreate{$item}) eq 'ARRAY') {
                   foreach my $type (@{$cancreate{$item}}) {
                       if (!grep(/^$type$/,@{$curr_usercreation{'cancreate'}{$item}})) {
                           if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                               push(@{$changes{'cancreate'}},$item);
                           }
                       }
                   }
               }
           } elsif (ref($curr_usercreation{'cancreate'}{$item}) eq 'HASH') {
               if (ref($cancreate{$item}) eq 'HASH') {
                   foreach my $curr (keys(%{$curr_usercreation{'cancreate'}{$item}})) {
                       if (ref($curr_usercreation{'cancreate'}{$item}{$curr}) eq 'HASH') {
                           foreach my $field (keys(%{$curr_usercreation{'cancreate'}{$item}{$curr}})) {
                               unless ($curr_usercreation{'cancreate'}{$item}{$curr}{$field} eq $cancreate{$item}{$curr}{$field}) {
                                   if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                       push(@{$changes{'cancreate'}},$item);
                                   }
                               }
                           }
                       } elsif ($item eq 'selfcreateprocessing') {
                           if ($cancreate{$item}{$curr} ne $curr_usercreation{'cancreate'}{$item}{$curr}) {
                               if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                   push(@{$changes{'cancreate'}},$item);
                               }
                           }
                       } else {
                           if (!$cancreate{$item}{$curr}) {
                               if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                   push(@{$changes{'cancreate'}},$item);
                               }
                           }
                       }
                   }
                   foreach my $field (keys(%{$cancreate{$item}})) {
                       if (ref($cancreate{$item}{$field}) eq 'HASH') {
                           foreach my $inner (keys(%{$cancreate{$item}{$field}})) {
                               if (ref($curr_usercreation{'cancreate'}{$item}{$field}) eq 'HASH') {
                                   unless ($curr_usercreation{'cancreate'}{$item}{$field}{$inner} eq $cancreate{$item}{$field}{$inner}) {
                                       if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                           push(@{$changes{'cancreate'}},$item);
                                       }
                                   }
                               } else {
                                   if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                       push(@{$changes{'cancreate'}},$item);
                                   }
                               }
                           }
                       } elsif ($item eq 'selfcreateprocessing') {
                           if ($cancreate{$item}{$field} ne $curr_usercreation{'cancreate'}{$item}{$field}) {
                               if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                   push(@{$changes{'cancreate'}},$item);
                               }
                           }
                       } else {
                           if (!$curr_usercreation{'cancreate'}{$item}{$field}) {
                               if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                   push(@{$changes{'cancreate'}},$item);
                               }
                           }
                       }
                   }
               }
           } elsif ($curr_usercreation{'cancreate'}{$item}) {
               if (ref($cancreate{$item}) eq 'ARRAY') {
                   if (!grep(/^\Q$curr_usercreation{'cancreate'}{$item}\E$/,@{$cancreate{$item}})) {
                       if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                           push(@{$changes{'cancreate'}},$item);
                       }
                   }
               } elsif (ref($cancreate{$item}) eq 'HASH') {
                   if (!$cancreate{$item}{$curr_usercreation{'cancreate'}{$item}}) {
                       if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                           push(@{$changes{'cancreate'}},$item);
                       }
                   }
               }
           } elsif ($item eq 'emailusername') {
               if (ref($cancreate{$item}) eq 'HASH') {
                   foreach my $type (keys(%{$cancreate{$item}})) {
                       if (ref($cancreate{$item}{$type}) eq 'HASH') {
                           foreach my $field (keys(%{$cancreate{$item}{$type}})) {
                               if ($cancreate{$item}{$type}{$field}) {
                                   if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                       push(@{$changes{'cancreate'}},$item);
                                   }
                                   last;
                               }
                           }
                       }
                   }
               }
           }
       }
   #
   # Populate %save_usercreate hash with updates to self-creation configuration.
   #
       $save_usercreate{'cancreate'}{'captcha'} = $savecaptcha{'captcha'};
       $save_usercreate{'cancreate'}{'recaptchakeys'} = $savecaptcha{'recaptchakeys'};
       $save_usercreate{'cancreate'}{'selfcreate'} = $cancreate{'selfcreate'};
       if (ref($cancreate{'notify'}) eq 'HASH') {
           $save_usercreate{'cancreate'}{'notify'} = $cancreate{'notify'};
       }
       if (ref($cancreate{'selfcreateprocessing'}) eq 'HASH') {
           $save_usercreate{'cancreate'}{'selfcreateprocessing'} = $cancreate{'selfcreateprocessing'};
       }
       if (ref($cancreate{'statustocreate'}) eq 'ARRAY') {
           $save_usercreate{'cancreate'}{'statustocreate'} = $cancreate{'statustocreate'};
       }
       $save_usercreate{'cancreate'}{'emailusername'} = $cancreate{'emailusername'};
       $save_usercreate{'emailrule'} = \@email_rule;
   
       my %userconfig_hash = (
               usercreation     => \%save_usercreate,
               usermodification => \%save_usermodify,
       );
       my $putresult = &Apache::lonnet::put_dom('configuration',\%userconfig_hash,
                                                $dom);
   #
   # Accumulate details of changes to domain cofiguration for self-creation of usernames in $resulttext
   #
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             if (ref($changes{'cancreate'}) eq 'ARRAY') {              if (ref($changes{'cancreate'}) eq 'ARRAY') {
                 my %lt = &usercreation_types();                  my %lt = &selfcreation_types();
                 foreach my $type (@{$changes{'cancreate'}}) {                  foreach my $type (@{$changes{'cancreate'}}) {
                     my $chgtext;                      my $chgtext;
                     unless (($type eq 'statustocreate') || ($type eq 'captcha') || ($type eq 'recaptchakeys')) {  
                         $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('Self creation of a new user account is not permitted.');
                         } else {                          } else {
                             $chgtext .= &mt('creation of a new account is permitted for:').'<ul>';                              $chgtext .= &mt('Self-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>';
                             }                              }
Line 6949  sub modify_usercreation { Line 8684  sub modify_usercreation {
                                 if (grep(/^(login|sso)$/,@{$cancreate{$type}})) {                                  if (grep(/^(login|sso)$/,@{$cancreate{$type}})) {
                                     if (ref($cancreate{'statustocreate'}) eq 'ARRAY') {                                      if (ref($cancreate{'statustocreate'}) eq 'ARRAY') {
                                         if (@{$cancreate{'statustocreate'}} == 0) {                                          if (@{$cancreate{'statustocreate'}} == 0) {
                                             $chgtext .= '<br /><span class="LC_warning">'.&mt("However, no institutional affiliations (including 'other') are currently permitted to create accounts.").'</span>';                                              $chgtext .= '<br />'.
                                                           '<span class="LC_warning">'.
                                                           &mt("However, no institutional affiliations (including 'other') are currently permitted to create accounts.").
                                                           '</span>';
                                         }                                          }
                                     }                                      }
                                 }                                  }
Line 6960  sub modify_usercreation { Line 8698  sub modify_usercreation {
                             (ref($cancreate{'statustocreate'}) eq 'ARRAY')) {                              (ref($cancreate{'statustocreate'}) eq 'ARRAY')) {
                             if (@{$cancreate{'selfcreate'}} > 0) {                              if (@{$cancreate{'selfcreate'}} > 0) {
                                 if (@{$cancreate{'statustocreate'}} == 0) {                                  if (@{$cancreate{'statustocreate'}} == 0) {
   
                                     $chgtext .= &mt("Institutional affiliations permitted to create accounts set to 'None'.");                                      $chgtext .= &mt("Institutional affiliations permitted to create accounts set to 'None'.");
                                     if (!grep(/^email$/,@{$cancreate{'selfcreate'}})) {                                      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>';                                          $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') {                                  } elsif (ref($usertypes) eq 'HASH') {
                                     if (grep(/^(login|sso)$/,@{$cancreate{'selfcreate'}})) {                                      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):');                                          $chgtext .= &mt('Creation of a new account for an institutional user is restricted to the following institutional affiliation(s):');
Line 6981  sub modify_usercreation { Line 8721  sub modify_usercreation {
                                     }                                      }
                                     $chgtext .= '</ul>';                                      $chgtext .= '</ul>';
                                     if (!grep(/^(login|sso)$/,@{$cancreate{'selfcreate'}})) {                                      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>';                                          $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 {                              } else {
Line 6992  sub modify_usercreation { Line 8734  sub modify_usercreation {
                                 }                                  }
                             }                              }
                         }                          }
                       } elsif ($type eq 'selfcreateprocessing') {
                           my %choices = &Apache::lonlocal::texthash (
                                                                       automatic => 'Automatic approval',
                                                                       approval  => 'Queued for approval',
                                                                     );
                           if (@statuses > 1) {
                               $chgtext .= &mt('Processing of requests to create account with e-mail address as username set as follows:'). 
                                           '<ul>';
                              foreach my $type (@statuses) {
                                  if ($type eq 'default') {
                                      $chgtext .= '<li>'.$othertitle.' -- '.$choices{$cancreate{'selfcreateprocessing'}{$type}}.'</li>';
                                  } else {
                                      $chgtext .= '<li>'.$usertypes->{$type}.' -- '.$choices{$cancreate{'selfcreateprocessing'}{$type}}.'</li>';
                                  }
                              }
                              $chgtext .= '</ul>';
                           } else {
                              $chgtext .= &mt('Processing of requests to create account with e-mail address as username set to: "[_1]"',
                                            $choices{$cancreate{'selfcreateprocessing'}{'default'}});
                           }
                     } elsif ($type eq 'captcha') {                      } elsif ($type eq 'captcha') {
                         if ($cancreate{$type} eq 'notused') {                          if ($savecaptcha{$type} eq 'notused') {
                             $chgtext .= &mt('No CAPTCHA validation in use for self-creation screen.');                              $chgtext .= &mt('No CAPTCHA validation in use for self-creation screen.');
                         } else {                          } else {
                             my %captchas = &captcha_phrases();                              my %captchas = &captcha_phrases();
                             if ($captchas{$cancreate{$type}}) {                              if ($captchas{$savecaptcha{$type}}) {
                                 $chgtext .= &mt("Validation for self-creation screen set to $captchas{$cancreate{$type}}.");                                  $chgtext .= &mt("Validation for self-creation screen set to $captchas{$savecaptcha{$type}}.");
                             } else {                              } else {
                                 $chgtext .= &mt('Validation for self-creation screen set to unknown type.');                                  $chgtext .= &mt('Validation for self-creation screen set to unknown type.');
                             }                              }
                         }                          }
                     } elsif ($type eq 'recaptchakeys') {                      } elsif ($type eq 'recaptchakeys') {
                         my ($privkey,$pubkey);                          my ($privkey,$pubkey);
                         if (ref($cancreate{$type}) eq 'HASH') {                          if (ref($savecaptcha{$type}) eq 'HASH') {
                             $pubkey = $cancreate{$type}{'public'};                              $pubkey = $savecaptcha{$type}{'public'};
                             $privkey = $cancreate{$type}{'private'};                              $privkey = $savecaptcha{$type}{'private'};
                         }                          }
                         $chgtext .= &mt('ReCAPTCHA keys changes').'<ul>';                          $chgtext .= &mt('ReCAPTCHA keys changes').'<ul>';
                         if (!$pubkey) {                          if (!$pubkey) {
Line 7021  sub modify_usercreation { Line 8783  sub modify_usercreation {
                             $chgtext .= '<li>'.&mt('Private key set to [_1]',$pubkey).'</li>';                              $chgtext .= '<li>'.&mt('Private key set to [_1]',$pubkey).'</li>';
                         }                          }
                         $chgtext .= '</ul>';                          $chgtext .= '</ul>';
                     } else {                      } elsif ($type eq 'emailusername') {
                         if ($cancreate{$type} eq 'none') {                          if (ref($cancreate{'emailusername'}) eq 'HASH') {
                             $chgtext .= &mt('creation of new users is not permitted, except by a Domain Coordinator.');                              if (ref($types) eq 'ARRAY') {
                         } elsif ($cancreate{$type} eq 'any') {                                  foreach my $type (@{$types}) {
                             $chgtext .= &mt('creation of new users is permitted for both institutional and non-institutional usernames.');                                      if (ref($cancreate{'emailusername'}{$type}) eq 'HASH') {
                         } elsif ($cancreate{$type} eq 'official') {                                          if (keys(%{$cancreate{'emailusername'}{$type}}) > 0) {
                             $chgtext .= &mt('creation of new users is only permitted for institutional usernames.');                                              $chgtext .= &mt('When self-creating account with e-mail as username, the following information will be provided by [_1]:',$usertypes->{$type}).
                         } elsif ($cancreate{$type} eq 'unofficial') {                                                      '<ul>';
                             $chgtext .= &mt('creation of new users is only permitted for non-institutional usernames.');                                              foreach my $field (@{$infofields}) {
                                                   if ($cancreate{'emailusername'}{$type}{$field}) {
                                                       $chgtext .= '<li>'.$infotitles->{$field}.'</li>';
                                                   }
                                               }
                                           }
                                           $chgtext .= '</ul>';
                                       } else {
                                           $chgtext .= &mt('When self creating account with e-mail as username, no information besides e-mail address will be provided by [_1].',$usertypes->{$type}).'<br />';
                                       }
                                   }
                               }
                           }
                       } elsif ($type eq 'notify') {
                           $chgtext = &mt('No Domain Coordinators will receive notification of username requests requiring approval.');
                           if (ref($changes{'cancreate'}) eq 'ARRAY') {
                               if ((grep(/^notify$/,@{$changes{'cancreate'}})) && (ref($cancreate{'notify'}) eq 'HASH')) {
                                   if ($cancreate{'notify'}{'approval'}) {
                                       $chgtext = &mt('Notification of username requests requiring approval will be sent to: ').$cancreate{'notify'}{'approval'};
                                   }
                               }
                         }                          }
                     }                      }
                     $resulttext .= '<li>'.$chgtext.'</li>';                      if ($chgtext) {
                 }                          $resulttext .= '<li>'.$chgtext.'</li>';
             }  
             if (ref($changes{'username_rule'}) eq 'ARRAY') {  
                 my ($rules,$ruleorder) =   
                     &Apache::lonnet::inst_userrules($dom,'username');  
                 my $chgtext = '<ul>';  
                 foreach my $type (@username_rule) {  
                     if (ref($rules->{$type}) eq 'HASH') {  
                         $chgtext .= '<li>'.$rules->{$type}{'name'}.'</li>';  
                     }                      }
                 }                  }
                 $chgtext .= '</ul>';  
                 if (@username_rule > 0) {  
                     $resulttext .= '<li>'.&mt('Usernames with the following formats are restricted to verified users in the institutional directory: ').$chgtext.'</li>';       
                 } else {  
                     $resulttext .= '<li>'.&mt('There are now no username formats restricted to verified users in the institutional directory.').'</li>';   
                 }  
             }  
             if (ref($changes{'id_rule'}) eq 'ARRAY') {  
                 my ($idrules,$idruleorder) =   
                     &Apache::lonnet::inst_userrules($dom,'id');  
                 my $chgtext = '<ul>';  
                 foreach my $type (@id_rule) {  
                     if (ref($idrules->{$type}) eq 'HASH') {  
                         $chgtext .= '<li>'.$idrules->{$type}{'name'}.'</li>';  
                     }  
                 }  
                 $chgtext .= '</ul>';  
                 if (@id_rule > 0) {  
                     $resulttext .= '<li>'.&mt('IDs with the following formats are restricted to verified users in the institutional directory: ').$chgtext.'</li>';  
                 } else {  
                     $resulttext .= '<li>'.&mt('There are now no ID formats restricted to verified users in the institutional directory.').'</li>';  
                 }  
             }              }
             if (ref($changes{'email_rule'}) eq 'ARRAY') {              if (ref($changes{'email_rule'}) eq 'ARRAY') {
                 my ($emailrules,$emailruleorder) =                  my ($emailrules,$emailruleorder) =
Line 7078  sub modify_usercreation { Line 8830  sub modify_usercreation {
                 }                  }
                 $chgtext .= '</ul>';                  $chgtext .= '</ul>';
                 if (@email_rule > 0) {                  if (@email_rule > 0) {
                     $resulttext .= '<li>'.&mt('Accounts may not be created by users self-enrolling with e-mail addresses of the following types: ').$chgtext.'</li>';                      $resulttext .= '<li>'.
                                      &mt('Accounts may not be created by users self-enrolling with e-mail addresses of the following types: ').
                                          $chgtext.
                                      '</li>';
                 } else {                  } else {
                     $resulttext .= '<li>'.&mt('There are now no restrictions on e-mail addresses which may be used as a username when self-enrolling.').'</li>';                      $resulttext .= '<li>'.
                                      &mt('There are now no restrictions on e-mail addresses which may be used as a username when self-enrolling.').
                                      '</li>';
                 }                  }
             }              }
               if (ref($changes{'selfcreate'}) eq 'ARRAY') {
             my %authname = &authtype_names();                  $resulttext .= '<li>'.&mt('When self-creating institutional account:').'<ul>';
             my %context_title = &context_names();                  my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
             if (ref($changes{'authtypes'}) eq 'ARRAY') {                  foreach my $type (@{$changes{'selfcreate'}}) {
                 my $chgtext = '<ul>';                      my $typename = $type;
                 foreach my $type (@{$changes{'authtypes'}}) {                      if (ref($usertypes) eq 'HASH') {
                     my @allowed;                          if ($usertypes->{$type} ne '') {
                     $chgtext .= '<li><span class="LC_cusr_emph">'.$context_title{$type}.'</span> - '.&mt('assignable authentication types: ');                              $typename = $usertypes->{$type};
                     foreach my $auth (@authtypes) {  
                         if ($authhash{$type}{$auth}) {  
                             push(@allowed,$authname{$auth});  
                         }                          }
                     }                      }
                     if (@allowed > 0) {                      my @modifiable;
                         $chgtext .= join(', ',@allowed).'</li>';                      $resulttext .= '<li>'.
                                       &mt('Self-creation of account by users with status: [_1]',
                                           '<span class="LC_cusr_emph">'.$typename.'</span>').
                                       ' - '.&mt('modifiable fields (if institutional data blank): ');
                       foreach my $field (@fields) {
                           if ($save_usermodify{'selfcreate'}{$type}{$field}) {
                               push(@modifiable,'<b>'.$fieldtitles{$field}.'</b>');
                           }
                       }
                       if (@modifiable > 0) {
                           $resulttext .= join(', ',@modifiable);
                     } else {                      } else {
                         $chgtext .= &mt('none').'</li>';                          $resulttext .= &mt('none');
                     }                      }
                       $resulttext .= '</li>';
                 }                  }
                 $chgtext .= '</ul>';                  $resulttext .= '</ul></li>';
                 $resulttext .= '<li>'.&mt('Authentication types available for assignment to new users').'<br />'.$chgtext;  
                 $resulttext .= '</li>';  
             }              }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
         } else {          } else {
             $resulttext = &mt('No changes made to user creation settings');              $resulttext = &mt('No changes made to self-creation settings');
         }          }
     } else {      } else {
         $resulttext = '<span class="LC_error">'.          $resulttext = '<span class="LC_error">'.
Line 7175  sub process_captcha { Line 8938  sub process_captcha {
   
 sub modify_usermodification {  sub modify_usermodification {
     my ($dom,%domconfig) = @_;      my ($dom,%domconfig) = @_;
     my ($resulttext,%curr_usermodification,%changes);      my ($resulttext,%curr_usermodification,%changes,%modifyhash);
     if (ref($domconfig{'usermodification'}) eq 'HASH') {      if (ref($domconfig{'usermodification'}) eq 'HASH') {
         foreach my $key (keys(%{$domconfig{'usermodification'}})) {          foreach my $key (keys(%{$domconfig{'usermodification'}})) {
             $curr_usermodification{$key} = $domconfig{'usermodification'}{$key};              if ($key eq 'selfcreate') {
                   $modifyhash{$key} = $domconfig{'usermodification'}{$key};
               } else {  
                   $curr_usermodification{$key} = $domconfig{'usermodification'}{$key};
               }
         }          }
     }      }
     my @contexts = ('author','course','selfcreate');      my @contexts = ('author','course');
     my %context_title = (      my %context_title = (
                            author => 'In author context',                             author => 'In author context',
                            course => 'In course context',                             course => 'In course context',
                            selfcreate => 'When self creating account',   
                         );                          );
     my @fields = ('lastname','firstname','middlename','generation',      my @fields = ('lastname','firstname','middlename','generation',
                   'permanentemail','id');                    'permanentemail','id');
Line 7193  sub modify_usermodification { Line 8959  sub modify_usermodification {
                   author => ['ca','aa'],                    author => ['ca','aa'],
                   course => ['st','ep','ta','in','cr'],                    course => ['st','ep','ta','in','cr'],
                 );                  );
     my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);  
     if (ref($types) eq 'ARRAY') {  
         push(@{$types},'default');  
         $usertypes->{'default'} = $othertitle;  
     }  
     $roles{'selfcreate'} = $types;    
     my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();      my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
     my %modifyhash;  
     foreach my $context (@contexts) {      foreach my $context (@contexts) {
         foreach my $role (@{$roles{$context}}) {          foreach my $role (@{$roles{$context}}) {
             my @modifiable =  &Apache::loncommon::get_env_multiple('form.canmodify_'.$role);              my @modifiable =  &Apache::loncommon::get_env_multiple('form.canmodify_'.$role);
Line 7246  sub modify_usermodification { Line 9005  sub modify_usermodification {
                     if (ref($changes{$context}) eq 'ARRAY') {                      if (ref($changes{$context}) eq 'ARRAY') {
                         foreach my $role (@{$changes{$context}}) {                          foreach my $role (@{$changes{$context}}) {
                             my $rolename;                              my $rolename;
                             if ($context eq 'selfcreate') {                              if ($role eq 'cr') {
                                 $rolename = $role;                                  $rolename = &mt('Custom');
                                 if (ref($usertypes) eq 'HASH') {  
                                     if ($usertypes->{$role} ne '') {  
                                         $rolename = $usertypes->{$role};  
                                     }  
                                 }  
                             } else {                              } else {
                                 if ($role eq 'cr') {                                  $rolename = &Apache::lonnet::plaintext($role);
                                     $rolename = &mt('Custom');  
                                 } else {  
                                     $rolename = &Apache::lonnet::plaintext($role);  
                                 }  
                             }                              }
                             my @modifiable;                              my @modifiable;
                             if ($context eq 'selfcreate') {                              $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('Self-creation of account by users with status: [_1]',$rolename).'</span> - '.&mt('modifiable fields (if institutional data blank): ');  
                             } else {  
                                 $resulttext .= '<li><span class="LC_cusr_emph">'.&mt('Target user with [_1] role',$rolename).'</span> - '.&mt('modifiable fields: ');  
                             }  
                             foreach my $field (@fields) {                              foreach my $field (@fields) {
                                 if ($modifyhash{$context}{$role}{$field}) {                                  if ($modifyhash{$context}{$role}{$field}) {
                                     push(@modifiable,$fieldtitles{$field});                                      push(@modifiable,$fieldtitles{$field});
Line 7294  sub modify_usermodification { Line 9040  sub modify_usermodification {
 }  }
   
 sub modify_defaults {  sub modify_defaults {
     my ($dom,$r) = @_;      my ($dom,$lastactref,%domconfig) = @_;
     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,1);
     my @items = ('auth_def','auth_arg_def','lang_def','timezone_def','datelocale_def','portal_def');      my @items = ('auth_def','auth_arg_def','lang_def','timezone_def','datelocale_def','portal_def');
     my @authtypes = ('internal','krb4','krb5','localauth');      my @authtypes = ('internal','krb4','krb5','localauth');
     foreach my $item (@items) {      foreach my $item (@items) {
Line 7351  sub modify_defaults { Line 9097  sub modify_defaults {
                          defaults => \%newvalues,                           defaults => \%newvalues,
                         );                          );
     my $title = &defaults_titles();      my $title = &defaults_titles();
   
       my $currinststatus;
       if (ref($domconfig{'inststatus'}) eq 'HASH') {
           $currinststatus = $domconfig{'inststatus'};
       } else {
           my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
           $currinststatus = {
                                inststatustypes => $usertypes,
                                inststatusorder => $types,
                                inststatusguest => [],
                             };
       }
       my @todelete = &Apache::loncommon::get_env_multiple('form.inststatus_delete');
       my @allpos;
       my %guests;
       my %alltypes;
       my ($currtitles,$currguests,$currorder);
       if (ref($currinststatus) eq 'HASH') {
           if (ref($currinststatus->{'inststatusorder'}) eq 'ARRAY') {
               foreach my $type (@{$currinststatus->{'inststatusorder'}}) {
                   if (ref($currinststatus->{inststatustypes}) eq 'HASH') {
                       if ($currinststatus->{inststatustypes}->{$type} ne '') {
                           $currtitles .= $currinststatus->{inststatustypes}->{$type}.',';
                       }
                   }
                   unless (grep(/^\Q$type\E$/,@todelete)) { 
                       my $position = $env{'form.inststatus_pos_'.$type};
                       $position =~ s/\D+//g;
                       $allpos[$position] = $type;
                       $alltypes{$type} = $env{'form.inststatus_title_'.$type};
                       $alltypes{$type} =~ s/`//g;
                       if ($env{'form.inststatus_guest_'.$type}) {
                           $guests{$type} = 1;
                       }
                   }
               }
               if (ref($currinststatus->{'inststatusguest'}) eq 'ARRAY') {
                   $currguests = join(',',@{$currinststatus->{'inststatusguest'}});
               }
               $currorder = join(',',@{$currinststatus->{'inststatusorder'}});
               $currtitles =~ s/,$//;
           }
       }
       if ($env{'form.addinststatus'}) {
           my $newtype = $env{'form.addinststatus'};
           $newtype =~ s/\W//g;
           unless (exists($alltypes{$newtype})) {
               if ($env{'form.addinststatus_guest'}) {
                   $guests{$newtype} = 1;
               }
               $alltypes{$newtype} = $env{'form.addinststatus_title'};
               $alltypes{$newtype} =~ s/`//g; 
               my $position = $env{'form.addinststatus_pos'};
               $position =~ s/\D+//g;
               if ($position ne '') {
                   $allpos[$position] = $newtype;
               }
           }
       }
       my (@orderedstatus,@orderedguests);
       foreach my $type (@allpos) {
           unless (($type eq '') || (grep(/^\Q$type\E$/,@orderedstatus))) {
               push(@orderedstatus,$type);
               if ($guests{$type}) {
                   push(@orderedguests,$type);
               }
           }
       }
       foreach my $type (keys(%alltypes)) {
           unless (grep(/^\Q$type\E$/,@orderedstatus)) {
               delete($alltypes{$type});
           }
       }
       $defaults_hash{'inststatus'} = {
                                        inststatustypes => \%alltypes,
                                        inststatusorder => \@orderedstatus,
                                        inststatusguest => \@orderedguests,
                                      };
       if (ref($defaults_hash{'inststatus'}) eq 'HASH') {
           foreach my $item ('inststatustypes','inststatusorder','inststatusguest') {
               $domdefaults{$item} = $defaults_hash{'inststatus'}{$item};
           }
       }
       if ($currorder ne join(',',@orderedstatus)) {
           $changes{'inststatus'}{'inststatusorder'} = 1;
       }
       if ($currguests ne join(',',@orderedguests)) {
           $changes{'inststatus'}{'inststatusguest'} = 1;
       }
       my $newtitles;
       foreach my $item (@orderedstatus) {
           $newtitles .= $alltypes{$item}.',';
       }
       $newtitles =~ s/,$//;
       if ($currtitles ne $newtitles) {
           $changes{'inststatus'}{'inststatustypes'} = 1;
       }
     my $putresult = &Apache::lonnet::put_dom('configuration',\%defaults_hash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%defaults_hash,
                                              $dom);                                               $dom);
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             my $version = $r->dir_config('lonVersion');              my $version = &Apache::lonnet::get_server_loncaparev($dom);
             my $mailmsgtext = "Changes made to domain settings in a LON-CAPA installation - domain: $dom (running version: $version) - dns_domain.tab needs to be updated with the following changes, to support legacy 2.4, 2.5 and 2.6 versions of LON-CAPA.\n\n";              my $mailmsgtext = "Changes made to domain settings in a LON-CAPA installation - domain: $dom (running version: $version) - dns_domain.tab needs to be updated with the following changes, to support legacy 2.4, 2.5 and 2.6 versions of LON-CAPA.\n\n";
             foreach my $item (sort(keys(%changes))) {              foreach my $item (sort(keys(%changes))) {
                 my $value = $env{'form.'.$item};                  if ($item eq 'inststatus') {
                 if ($value eq '') {                      if (ref($changes{'inststatus'}) eq 'HASH') {
                     $value = &mt('none');                          if (($changes{'inststatus'}{'inststatustypes'}) || $changes{'inststatus'}{'inststatusorder'}) {
                 } elsif ($item eq 'auth_def') {                              $resulttext .= '<li>'.&mt('Institutional user status types set to:').' ';
                     my %authnames = &authtype_names();                              foreach my $type (@orderedstatus) { 
                     my %shortauth = (                                  $resulttext .= $alltypes{$type}.', ';
                              internal => 'int',                              }
                              krb4 => 'krb4',                              $resulttext =~ s/, $//;
                              krb5 => 'krb5',                              $resulttext .= '</li>';
                              localauth  => 'loc',                          }
                     );                          if ($changes{'inststatus'}{'inststatusguest'}) {
                     $value = $authnames{$shortauth{$value}};                              $resulttext .= '<li>'; 
                               if (@orderedguests) {
                                   $resulttext .= &mt('Types assignable to "non-institutional" usernames set to:').' ';
                                   foreach my $type (@orderedguests) {
                                       $resulttext .= $alltypes{$type}.', ';
                                   }
                                   $resulttext =~ s/, $//;
                               } else {
                                   $resulttext .= &mt('Types assignable to "non-institutional" usernames set to none.');
                               }
                               $resulttext .= '</li>';
                           }
                       }
                   } else {
                       my $value = $env{'form.'.$item};
                       if ($value eq '') {
                           $value = &mt('none');
                       } elsif ($item eq 'auth_def') {
                           my %authnames = &authtype_names();
                           my %shortauth = (
                                             internal   => 'int',
                                             krb4       => 'krb4',
                                             krb5       => 'krb5',
                                             localauth  => 'loc',
                           );
                           $value = $authnames{$shortauth{$value}};
                       }
                       $resulttext .= '<li>'.&mt('[_1] set to "[_2]"',$title->{$item},$value).'</li>';
                       $mailmsgtext .= "$title->{$item} set to $value\n";  
                 }                  }
                 $resulttext .= '<li>'.&mt('[_1] set to "[_2]"',$title->{$item},$value).'</li>';  
                 $mailmsgtext .= "$title->{$item} set to $value\n";    
             }              }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
             $mailmsgtext .= "\n";              $mailmsgtext .= "\n";
             my $cachetime = 24*60*60;              my $cachetime = 24*60*60;
             &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);              &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
               if (ref($lastactref) eq 'HASH') {
                   $lastactref->{'domdefaults'} = 1;
               }
             if ($changes{'auth_def'} || $changes{'auth_arg_def'} || $changes{'lang_def'} || $changes{'datelocale_def'}) {              if ($changes{'auth_def'} || $changes{'auth_arg_def'} || $changes{'lang_def'} || $changes{'datelocale_def'}) {
                 my $sysmail = $r->dir_config('lonSysEMail');                  my $notify = 1;
                 &Apache::lonmsg::sendemail($sysmail,"LON-CAPA Domain Settings Change - $dom",$mailmsgtext);                  if (ref($domconfig{'contacts'}) eq 'HASH') {
                       if ($domconfig{'contacts'}{'reportupdates'} == 0) {
                           $notify = 0;
                       }
                   }
                   if ($notify) {
                       &Apache::lonmsg::sendemail('installrecord@loncapa.org',
                                                  "LON-CAPA Domain Settings Change - $dom",
                                                  $mailmsgtext);
                   }
             }              }
         } else {          } else {
             $resulttext = &mt('No changes made to default authentication/language/timezone settings');              $resulttext = &mt('No changes made to default authentication/language/timezone settings');
Line 7401  sub modify_defaults { Line 9282  sub modify_defaults {
 }  }
   
 sub modify_scantron {  sub modify_scantron {
     my ($r,$dom,$confname,%domconfig) = @_;      my ($r,$dom,$confname,$lastactref,%domconfig) = @_;
     my ($resulttext,%confhash,%changes,$errors);      my ($resulttext,%confhash,%changes,$errors);
     my $custom = 'custom.tab';      my $custom = 'custom.tab';
     my $default = 'default.tab';      my $default = 'default.tab';
Line 7462  sub modify_scantron { Line 9343  sub modify_scantron {
                 }                  }
                 $resulttext .= '</ul>';                  $resulttext .= '</ul>';
                 &Apache::loncommon::devalidate_domconfig_cache($dom);                  &Apache::loncommon::devalidate_domconfig_cache($dom);
                   if (ref($lastactref) eq 'HASH') {
                       $lastactref->{'domainconfig'} = 1;
                   }
             } else {              } else {
                 $resulttext = &mt('No changes made to bubblesheet format file');                  $resulttext = &mt('No changes made to bubblesheet format file');
             }              }
Line 7484  sub modify_coursecategories { Line 9368  sub modify_coursecategories {
     my ($resulttext,%deletions,%reorderings,%needreordering,%adds,%changes,$errors,      my ($resulttext,%deletions,%reorderings,%needreordering,%adds,%changes,$errors,
         $cathash);          $cathash);
     my @deletecategory = &Apache::loncommon::get_env_multiple('form.deletecategory');      my @deletecategory = &Apache::loncommon::get_env_multiple('form.deletecategory');
       my @catitems = ('unauth','auth');
       my @cattypes = ('std','domonly','codesrch','none');
     if (ref($domconfig{'coursecategories'}) eq 'HASH') {      if (ref($domconfig{'coursecategories'}) eq 'HASH') {
         $cathash = $domconfig{'coursecategories'}{'cats'};          $cathash = $domconfig{'coursecategories'}{'cats'};
         if ($domconfig{'coursecategories'}{'togglecats'} ne $env{'form.togglecats'}) {          if ($domconfig{'coursecategories'}{'togglecats'} ne $env{'form.togglecats'}) {
Line 7502  sub modify_coursecategories { Line 9388  sub modify_coursecategories {
             $changes{'categorizecomm'} = 1;              $changes{'categorizecomm'} = 1;
             $domconfig{'coursecategories'}{'categorizecomm'} = $env{'form.categorizecomm'};              $domconfig{'coursecategories'}{'categorizecomm'} = $env{'form.categorizecomm'};
         }          }
           foreach my $item (@catitems) {
               if (grep(/^\Q$env{'form.coursecat_'.$item}\E$/,@cattypes)) {
                   if ($domconfig{'coursecategories'}{$item} ne $env{'form.coursecat_'.$item}) {
                       $changes{$item} = 1;
                       $domconfig{'coursecategories'}{$item} = $env{'form.coursecat_'.$item};
                   }
               }
           }
     } else {      } else {
         $changes{'togglecats'} = 1;          $changes{'togglecats'} = 1;
         $changes{'categorize'} = 1;          $changes{'categorize'} = 1;
Line 7513  sub modify_coursecategories { Line 9407  sub modify_coursecategories {
                                              togglecatscomm => $env{'form.togglecatscomm'},                                               togglecatscomm => $env{'form.togglecatscomm'},
                                              categorizecomm => $env{'form.categorizecomm'},                                               categorizecomm => $env{'form.categorizecomm'},
                                          };                                           };
           foreach my $item (@catitems) {
               if ($env{'form.coursecat_'.$item} ne 'std') {
                   $changes{$item} = 1;
               }
               if (grep(/^\Q$env{'form.coursecat_'.$item}\E$/,@cattypes)) {
                   $domconfig{'coursecategories'}{$item} = $env{'form.coursecat_'.$item};
               }
           }
     }      }
     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)) {
Line 7635  sub modify_coursecategories { Line 9537  sub modify_coursecategories {
                          dom  => 'set in Domain ("Modify Course/Community")',                           dom  => 'set in Domain ("Modify Course/Community")',
                          crs  => 'set in Course ("Course Configuration")',                           crs  => 'set in Course ("Course Configuration")',
                          comm => 'set in Community ("Community Configuration")',                           comm => 'set in Community ("Community Configuration")',
                            none     => 'No catalog',
                            std      => 'Standard catalog',
                            domonly  => 'Domain-only catalog',
                            codesrch => 'Code search form',
                         );                          );
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             if ($changes{'togglecats'}) {              if ($changes{'togglecats'}) {
Line 7649  sub modify_coursecategories { Line 9555  sub modify_coursecategories {
             if ($changes{'categorizecomm'}) {              if ($changes{'categorizecomm'}) {
                 $resulttext .= '<li>'.&mt("$title{'categorizecomm'} $level{$env{'form.categorizecomm'}}").'</li>';                  $resulttext .= '<li>'.&mt("$title{'categorizecomm'} $level{$env{'form.categorizecomm'}}").'</li>';
             }              }
               if ($changes{'unauth'}) {
                   $resulttext .= '<li>'.&mt('Catalog type for unauthenticated users set to "'.$level{$env{'form.coursecat_unauth'}}.'"').'</li>';
               }
               if ($changes{'auth'}) {
                   $resulttext .= '<li>'.&mt('Catalog type for authenticated users set to "'.$level{$env{'form.coursecat_auth'}}.'"').'</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 7851  sub modify_helpsettings { Line 9763  sub modify_helpsettings {
                 } elsif ($domconfig{'helpsettings'}{$item} ne $env{'form.'.$item}) {                  } elsif ($domconfig{'helpsettings'}{$item} ne $env{'form.'.$item}) {
                     $changes{$item} = 1;                      $changes{$item} = 1;
                 }                  }
     }              }
             if (($env{'form.'.$item} eq '0') || ($env{'form.'.$item} eq '1')) {              if (($env{'form.'.$item} eq '0') || ($env{'form.'.$item} eq '1')) {
                 $helphash{'helpsettings'}{$item} = $env{'form.'.$item};                  $helphash{'helpsettings'}{$item} = $env{'form.'.$item};
             }              }
Line 7885  sub modify_helpsettings { Line 9797  sub modify_helpsettings {
 }  }
   
 sub modify_coursedefaults {  sub modify_coursedefaults {
     my ($dom,%domconfig) = @_;      my ($dom,$lastactref,%domconfig) = @_;
     my ($resulttext,$errors,%changes,%defaultshash);      my ($resulttext,$errors,%changes,%defaultshash);
     my %defaultchecked = ('canuse_pdfforms' => 'off');      my %defaultchecked = ('canuse_pdfforms' => 'off');
     my @toggles = ('canuse_pdfforms');      my @toggles = ('canuse_pdfforms');
       my @numbers = ('anonsurvey_threshold','uploadquota_official','uploadquota_unofficial',
                      'uploadquota_community','uploadquota_textbook');
       my @types = ('official','unofficial','community','textbook');
       my %staticdefaults = (
                              anonsurvey_threshold => 10,
                              uploadquota          => 500,
                            );
   
     $defaultshash{'coursedefaults'} = {};      $defaultshash{'coursedefaults'} = {};
   
Line 7917  sub modify_coursedefaults { Line 9836  sub modify_coursedefaults {
             }              }
             $defaultshash{'coursedefaults'}{$item} = $env{'form.'.$item};              $defaultshash{'coursedefaults'}{$item} = $env{'form.'.$item};
         }          }
         my $currdefresponder = $domconfig{'coursedefaults'}{'anonsurvey_threshold'};          foreach my $item (@numbers) {
         my $newdefresponder = $env{'form.anonsurvey_threshold'};              my ($currdef,$newdef);
         $newdefresponder =~ s/\D//g;              $newdef = $env{'form.'.$item};
         if ($newdefresponder eq '' || $newdefresponder < 1) {              if ($item eq 'anonsurvey_threshold') {
             $newdefresponder = 1;                  $currdef = $domconfig{'coursedefaults'}{$item};
         }                  $newdef =~ s/\D//g;
         $defaultshash{'coursedefaults'}{'anonsurvey_threshold'} = $newdefresponder;                  if ($newdef eq '' || $newdef < 1) {
         if ($currdefresponder ne $newdefresponder) {                      $newdef = 1;
             unless ($currdefresponder eq '' && $newdefresponder == 10) {                  }
                 $changes{'anonsurvey_threshold'} = 1;                  $defaultshash{'coursedefaults'}{$item} = $newdef;
               } else {
                   my ($type) = ($item =~ /^\Quploadquota_\E(\w+)$/);
                   if (ref($domconfig{'coursedefaults'}{'uploadquota'}) eq 'HASH') {
                       $currdef = $domconfig{'coursedefaults'}{'uploadquota'}{$type};
                   }
                   $newdef =~ s/[^\w.\-]//g;
                   $defaultshash{'coursedefaults'}{'uploadquota'}{$type} = $newdef;
               }
               if ($currdef ne $newdef) {
                   my $staticdef;
                   if ($item eq 'anonsurvey_threshold') {
                       unless (($currdef eq '') && ($newdef == $staticdefaults{$item})) {
                           $changes{$item} = 1;
                       }
                   } else {
                       unless (($currdef eq '') && ($newdef == $staticdefaults{'uploadquota'})) {
                           $changes{'uploadquota'} = 1;
                       }
                   }
             }              }
         }          }
   
         my $officialcreds = $env{'form.official_credits'};          my $officialcreds = $env{'form.official_credits'};
         $officialcreds =~ s/^[^\d\.]//g;          $officialcreds =~ s/[^\d.]+//g;
         my $unofficialcreds = $env{'form.unofficial_credits'};          my $unofficialcreds = $env{'form.unofficial_credits'};
         $unofficialcreds =~ s/^[^\d\.]//g;          $unofficialcreds =~ s/[^\d.]+//g;
           my $textbookcreds = $env{'form.textbook_credits'};
           $textbookcreds =~ s/[^\d.]+//g;
         if (ref($domconfig{'coursedefaults'}{'coursecredits'} ne 'HASH') &&          if (ref($domconfig{'coursedefaults'}{'coursecredits'} ne 'HASH') &&
                 ($env{'form.coursecredits'} eq '1')) {                  ($env{'form.coursecredits'} eq '1')) {
                 $changes{'coursecredits'} = 1;                  $changes{'coursecredits'} = 1;
         } else {          } else {
             if (($domconfig{'coursedefaults'}{'coursecredits'}{'official'} ne $officialcreds)  ||              if (($domconfig{'coursedefaults'}{'coursecredits'}{'official'} ne $officialcreds)  ||
                 ($domconfig{'coursedefaults'}{'coursecredits'}{'unofficial'} ne $unofficialcreds)) {                  ($domconfig{'coursedefaults'}{'coursecredits'}{'unofficial'} ne $unofficialcreds) ||
                   ($domconfig{'coursedefaults'}{'coursecredits'}{'textbook'} ne $textbookcreds)) {
                 $changes{'coursecredits'} = 1;                  $changes{'coursecredits'} = 1;
             }              }
         }          }
         $defaultshash{'coursedefaults'}{'coursecredits'} = {          $defaultshash{'coursedefaults'}{'coursecredits'} = {
             official   => $officialcreds,              official   => $officialcreds,
             unofficial => $unofficialcreds,              unofficial => $unofficialcreds,
               textbook   => $textbookcreds,
         }          }
     }      }
     my $putresult = &Apache::lonnet::put_dom('configuration',\%defaultshash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%defaultshash,
                                              $dom);                                               $dom);
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         my %domdefaults;  
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             if (($changes{'canuse_pdfforms'}) || ($changes{'coursecredits'})) {              my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
                 %domdefaults = &Apache::lonnet::get_domain_defaults($dom);              if (($changes{'canuse_pdfforms'}) || ($changes{'coursecredits'}) || 
                   ($changes{'uploadquota'})) { 
                 if ($changes{'canuse_pdfforms'}) {                  if ($changes{'canuse_pdfforms'}) {
                     $domdefaults{'canuse_pdfforms'}=$defaultshash{'coursedefaults'}{'canuse_pdfforms'};                      $domdefaults{'canuse_pdfforms'}=$defaultshash{'coursedefaults'}{'canuse_pdfforms'};
                 }                  }
Line 7963  sub modify_coursedefaults { Line 9906  sub modify_coursedefaults {
                             $defaultshash{'coursedefaults'}{'coursecredits'}{'official'};                              $defaultshash{'coursedefaults'}{'coursecredits'}{'official'};
                         $domdefaults{'unofficialcredits'} =                          $domdefaults{'unofficialcredits'} =
                             $defaultshash{'coursedefaults'}{'coursecredits'}{'unofficial'};                              $defaultshash{'coursedefaults'}{'coursecredits'}{'unofficial'};
                           $domdefaults{'textbookcredits'} =
                               $domdefaults{'coursedefaults'}{'coursecredits'}{'textbook'};
                       }
                   }
                   if ($changes{'uploadquota'}) {
                       if (ref($defaultshash{'coursedefaults'}{'uploadquota'}) eq 'HASH') {
                           foreach my $type (@types) {
                               $domdefaults{$type.'quota'}=$defaultshash{'coursedefaults'}{'uploadquota'}{$type};
                           }
                     }                      }
                 }                  }
                 my $cachetime = 24*60*60;                  my $cachetime = 24*60*60;
                 &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);                  &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
                   if (ref($lastactref) eq 'HASH') {
                       $lastactref->{'domdefaults'} = 1;
                   }
             }              }
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             foreach my $item (sort(keys(%changes))) {              foreach my $item (sort(keys(%changes))) {
Line 7977  sub modify_coursedefaults { Line 9932  sub modify_coursedefaults {
                         $resulttext .= '<li>'.&mt('Course/Community users can create/upload PDF forms set to "off"').'</li>';                          $resulttext .= '<li>'.&mt('Course/Community users can create/upload PDF forms set to "off"').'</li>';
                     }                      }
                 } elsif ($item eq 'anonsurvey_threshold') {                  } elsif ($item eq 'anonsurvey_threshold') {
                         $resulttext .= '<li>'.&mt('Responder count required for display of anonymous survey submissions set to [_1].',$defaultshash{'coursedefaults'}{'anonsurvey_threshold'}).'</li>';                      $resulttext .= '<li>'.&mt('Responder count required for display of anonymous survey submissions set to [_1].',$defaultshash{'coursedefaults'}{'anonsurvey_threshold'}).'</li>';
                   } elsif ($item eq 'uploadquota') {
                       if (ref($defaultshash{'coursedefaults'}{'uploadquota'}) eq 'HASH') {
                           $resulttext .= '<li>'.&mt('Default quota for content uploaded to a course/community via Course Editor set as follows:').'<ul>'.
                                          '<li>'.&mt('Official courses: [_1] MB','<b>'.$defaultshash{'coursedefaults'}{'uploadquota'}{'official'}.'</b>').'</li>'.
                                          '<li>'.&mt('Unofficial courses: [_1] MB','<b>'.$defaultshash{'coursedefaults'}{'uploadquota'}{'unofficial'}.'</b>').'</li>'.
                                          '<li>'.&mt('Textbook courses: [_1] MB','<b>'.$defaultshash{'coursedefaults'}{'uploadquota'}{'textbook'}.'</b>').'</li>'.
   
                                          '<li>'.&mt('Communities: [_1] MB','<b>'.$defaultshash{'coursedefaults'}{'uploadquota'}{'community'}.'</b>').'</li>'.
                                          '</ul>'.
                                          '</li>';
                       } else {
                           $resulttext .= '<li>'.&mt('Default quota for content uploaded via Course Editor remains default: [_1] MB',$staticdefaults{'uploadquota'}).'</li>';
                       }
                 } elsif ($item eq 'coursecredits') {                  } elsif ($item eq 'coursecredits') {
                     if (ref($defaultshash{'coursedefaults'}{'coursecredits'}) eq 'HASH') {                      if (ref($defaultshash{'coursedefaults'}{'coursecredits'}) eq 'HASH') {
                         if (($domdefaults{'officialcredits'} eq '') &&                          if (($domdefaults{'officialcredits'} eq '') &&
                             ($domdefaults{'unofficialcredits'} eq '')) {                              ($domdefaults{'unofficialcredits'} eq '') &&
                               ($domdefaults{'textbookcredits'} eq '')) {
                             $resulttext .= '<li>'.&mt('Student credits not in use for courses in this domain').'</li>';                              $resulttext .= '<li>'.&mt('Student credits not in use for courses in this domain').'</li>';
                         } else {                          } else {
                             $resulttext .= '<li>'.&mt('Student credits can be set per course by a Domain Coordinator, with the following defaults applying:').'<ul>'.                              $resulttext .= '<li>'.&mt('Student credits can be set per course by a Domain Coordinator, with the following defaults applying:').'<ul>'.
                                            '<li>'.&mt('Official courses: [_1]',$defaultshash{'coursedefaults'}{'coursecredits'}{'official'}).'</li>'.                                             '<li>'.&mt('Official courses: [_1]',$defaultshash{'coursedefaults'}{'coursecredits'}{'official'}).'</li>'.
                                            '<li>'.&mt('Unofficial courses: [_1]',$defaultshash{'coursedefaults'}{'coursecredits'}{'unofficial'}).'</li>'.                                             '<li>'.&mt('Unofficial courses: [_1]',$defaultshash{'coursedefaults'}{'coursecredits'}{'unofficial'}).'</li>'.
                                              '<li>'.&mt('Textbook courses: [_1]',$defaultshash{'coursedefaults'}{'coursecredits'}{'textbook'}).'</li>'.
                                            '</ul>'.                                             '</ul>'.
                                            '</li>';                                             '</li>';
                         }                          }
Line 8006  sub modify_coursedefaults { Line 9976  sub modify_coursedefaults {
     return $resulttext;      return $resulttext;
 }  }
   
   sub modify_selfenrollment {
       my ($dom,$lastactref,%domconfig) = @_;
       my ($resulttext,$errors,%changes,%selfenrollhash,%ordered);
       my @types = ('official','unofficial','community','textbook');
       my %titles = &tool_titles();
       my %descs = &Apache::lonuserutils::selfenroll_default_descs();
       ($ordered{'admin'},my $titlesref) = &Apache::lonuserutils::get_selfenroll_titles();
       $ordered{'default'} = ['types','registered','approval','limit'];
   
       my (%roles,%shown,%toplevel);
       $roles{'0'} = &Apache::lonnet::plaintext('dc');
   
       if (ref($domconfig{'selfenrollment'}) ne 'HASH') {
           if ($domconfig{'selfenrollment'} eq '') {
               $domconfig{'selfenrollment'} = {};
           }
       }
       %toplevel = (
                     admin      => 'Configuration Rights',
                     default    => 'Default settings',
                     validation => 'Validation of self-enrollment requests',
                   );
       my ($itemsref,$namesref,$fieldsref) = &Apache::lonuserutils::selfenroll_validation_types();
   
       if (ref($ordered{'admin'}) eq 'ARRAY') {
           foreach my $item (@{$ordered{'admin'}}) {
               foreach my $type (@types) {
                   if ($env{'form.selfenrolladmin_'.$item.'_'.$type}) {
                       $selfenrollhash{'admin'}{$type}{$item} = 1;
                   } else {
                       $selfenrollhash{'admin'}{$type}{$item} = 0;
                   }
                   if (ref($domconfig{'selfenrollment'}{'admin'}) eq 'HASH') {
                       if (ref($domconfig{'selfenrollment'}{'admin'}{$type}) eq 'HASH') {
                           if ($selfenrollhash{'admin'}{$type}{$item} ne
                               $domconfig{'selfenrollment'}{'admin'}{$type}{$item})  {
                               push(@{$changes{'admin'}{$type}},$item);
                           }
                       } else {
                           if (!$selfenrollhash{'admin'}{$type}{$item}) {
                               push(@{$changes{'admin'}{$type}},$item);
                           }
                       }
                   } elsif (!$selfenrollhash{'admin'}{$type}{$item}) {
                       push(@{$changes{'admin'}{$type}},$item);
                   }
               }
           }
       }
   
       foreach my $item (@{$ordered{'default'}}) {
           foreach my $type (@types) {
               my $value = $env{'form.selfenrolldefault_'.$item.'_'.$type};
               if ($item eq 'types') {
                   unless (($value eq 'all') || ($value eq 'dom')) {
                       $value = '';
                   }
               } elsif ($item eq 'registered') {
                   unless ($value eq '1') {
                       $value = 0;
                   }
               } elsif ($item eq 'approval') {
                   unless ($value =~ /^[012]$/) {
                       $value = 0;
                   }
               } else {
                   unless (($value eq 'allstudents') || ($value eq 'selfenrolled')) {
                       $value = 'none';
                   }
               }
               $selfenrollhash{'default'}{$type}{$item} = $value;
               if (ref($domconfig{'selfenrollment'}{'default'}) eq 'HASH') {
                   if (ref($domconfig{'selfenrollment'}{'default'}{$type}) eq 'HASH') {
                       if ($selfenrollhash{'default'}{$type}{$item} ne
                            $domconfig{'selfenrollment'}{'default'}{$type}{$item})  {
                            push(@{$changes{'default'}{$type}},$item);
                       }
                   } else {
                       push(@{$changes{'default'}{$type}},$item);
                   }
               } else {
                   push(@{$changes{'default'}{$type}},$item);
               }
               if ($item eq 'limit') {
                   if (($value eq 'allstudents') || ($value eq 'selfenrolled')) {
                       $env{'form.selfenrolldefault_cap_'.$type} =~ s/\D//g;
                       if ($env{'form.selfenrolldefault_cap_'.$type} ne '') {
                           $selfenrollhash{'default'}{$type}{'cap'} = $env{'form.selfenrolldefault_cap_'.$type};
                       }
                   } else {
                       $selfenrollhash{'default'}{$type}{'cap'} = '';
                   }
                   if (ref($domconfig{'selfenrollment'}{'default'}{$type}) eq 'HASH') {
                       if ($selfenrollhash{'default'}{$type}{'cap'} ne
                            $domconfig{'selfenrollment'}{'admin'}{$type}{'cap'})  {
                            push(@{$changes{'default'}{$type}},'cap');
                       }
                   } elsif ($selfenrollhash{'default'}{$type}{'cap'} ne '') {
                       push(@{$changes{'default'}{$type}},'cap');
                   }
               }
           }
       }
   
       foreach my $item (@{$itemsref}) {
           if ($item eq 'fields') {
               my @changed;
               @{$selfenrollhash{'validation'}{$item}} = &Apache::loncommon::get_env_multiple('form.selfenroll_validation_'.$item);
               if (@{$selfenrollhash{'validation'}{$item}} > 0) {
                   @{$selfenrollhash{'validation'}{$item}} = sort(@{$selfenrollhash{'validation'}{$item}});
               }
               if (ref($domconfig{'selfenrollment'}{'validation'}) eq 'HASH') {
                   if (ref($domconfig{'selfenrollment'}{'validation'}{$item}) eq 'ARRAY') {
                       @changed = &Apache::loncommon::compare_arrays($selfenrollhash{'validation'}{$item},
                                                                     $domconfig{'selfenrollment'}{'validation'}{$item});
                   } else {
                       @changed = @{$selfenrollhash{'validation'}{$item}};
                   }
               } else {
                   @changed = @{$selfenrollhash{'validation'}{$item}};
               }
               if (@changed) {
                   if ($selfenrollhash{'validation'}{$item}) { 
                       $changes{'validation'}{$item} = join(', ',@{$selfenrollhash{'validation'}{$item}});
                   } else {
                       $changes{'validation'}{$item} = &mt('None');
                   }
               }
           } else {
               $selfenrollhash{'validation'}{$item} = $env{'form.selfenroll_validation_'.$item};
               if ($item eq 'markup') {
                  if ($env{'form.selfenroll_validation_'.$item}) {
                      $env{'form.selfenroll_validation_'.$item} =~ s/[\n\r\f]+/\s/gs;
                  }
               }
               if (ref($domconfig{'selfenrollment'}{'validation'}) eq 'HASH') {
                   if ($domconfig{'selfenrollment'}{'validation'}{$item} ne $selfenrollhash{'validation'}{$item}) {
                       $changes{'validation'}{$item} = $selfenrollhash{'validation'}{$item};
                   }
               }
           }
       }
   
       my $putresult = &Apache::lonnet::put_dom('configuration',{'selfenrollment' => \%selfenrollhash},
                                                $dom);
       if ($putresult eq 'ok') {
           if (keys(%changes) > 0) {
               my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
               $resulttext = &mt('Changes made:').'<ul>';
               foreach my $key ('admin','default','validation') {
                   if (ref($changes{$key}) eq 'HASH') {
                       $resulttext .= '<li>'.$toplevel{$key}.'<ul>';
                       if ($key eq 'validation') {
                           foreach my $item (@{$itemsref}) {
                               if (exists($changes{$key}{$item})) {
                                   if ($item eq 'markup') {
                                       $resulttext .= '<li>'.&mt('[_1] set to: [_2]',$namesref->{$item},
                                                                 '<br /><pre>'.$changes{$key}{$item}.'</pre>').'</li>';
                                   } else {  
                                       $resulttext .= '<li>'.&mt('[_1] set to: [_2]',$namesref->{$item},
                                                                 '<b>'.$changes{$key}{$item}.'</b>').'</li>';
                                   }
                               }
                           }
                       } else {
                           foreach my $type (@types) {
                               if ($type eq 'community') {
                                   $roles{'1'} = &mt('Community personnel');
                               } else {
                                   $roles{'1'} = &mt('Course personnel');
                               }
                               if (ref($changes{$key}{$type}) eq 'ARRAY') {
                                   if (ref($selfenrollhash{$key}{$type}) eq 'HASH') {
                                       if ($key eq 'admin') {
                                           my @mgrdc = ();
                                           if (ref($ordered{$key}) eq 'ARRAY') {
                                               foreach my $item (@{$ordered{'admin'}}) {
                                                   if (ref($selfenrollhash{$key}{$type}) eq 'HASH') { 
                                                       if ($selfenrollhash{$key}{$type}{$item} eq '0') {
                                                           push(@mgrdc,$item);
                                                       }
                                                   }
                                               }
                                               if (@mgrdc) {
                                                   $domdefaults{$type.'selfenrolladmdc'} = join(',',@mgrdc);
                                               } else {
                                                   delete($domdefaults{$type.'selfenrolladmdc'});
                                               }
                                           }
                                       } else {
                                           if (ref($ordered{$key}) eq 'ARRAY') {
                                               foreach my $item (@{$ordered{$key}}) {
                                                   if (grep(/^\Q$item\E$/,@{$changes{$key}{$type}})) {
                                                       $domdefaults{$type.'selfenroll'.$item} =
                                                           $selfenrollhash{$key}{$type}{$item};
                                                   }
                                               }
                                           }
                                       }
                                   }
                                   $resulttext .= '<li>'.$titles{$type}.'<ul>';
                                   foreach my $item (@{$ordered{$key}}) {
                                       if (grep(/^\Q$item\E$/,@{$changes{$key}{$type}})) {
                                           $resulttext .= '<li>';
                                           if ($key eq 'admin') {
                                               $resulttext .= &mt('[_1] -- management by: [_2]',$titlesref->{$item},
                                                                  '<b>'.$roles{$selfenrollhash{'admin'}{$type}{$item}}.'</b>');
                                           } else {
                                               $resulttext .= &mt('[_1] set to: [_2]',$titlesref->{$item},
                                                                  '<b>'.$descs{$item}{$selfenrollhash{'default'}{$type}{$item}}.'</b>');
                                           }
                                           $resulttext .= '</li>';
                                       }
                                   }
                                   $resulttext .= '</ul></li>';
                               }
                           }
                           $resulttext .= '</ul></li>'; 
                       }
                   }
                   if ((exists($changes{'admin'})) || (exists($changes{'default'}))) {
                       my $cachetime = 24*60*60;
                       &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
                       if (ref($lastactref) eq 'HASH') {
                           $lastactref->{'domdefaults'} = 1;
                       }
                   }
               }
               $resulttext .= '</ul>';
           } else {
               $resulttext = &mt('No changes made to self-enrollment settings');
           }
       } else {
           $resulttext = '<span class="LC_error">'.
               &mt('An error occurred: [_1]',$putresult).'</span>';
       }
       return $resulttext;
   }
   
 sub modify_usersessions {  sub modify_usersessions {
     my ($dom,%domconfig) = @_;      my ($dom,$lastactref,%domconfig) = @_;
     my @hostingtypes = ('version','excludedomain','includedomain');      my @hostingtypes = ('version','excludedomain','includedomain');
     my @offloadtypes = ('primary','default');      my @offloadtypes = ('primary','default');
     my %types = (      my %types = (
Line 8024  sub modify_usersessions { Line 10233  sub modify_usersessions {
     foreach my $prefix (@prefixes) {      foreach my $prefix (@prefixes) {
         $defaultshash{'usersessions'}{$prefix} = {};          $defaultshash{'usersessions'}{$prefix} = {};
     }      }
     my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);      my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
     my $resulttext;      my $resulttext;
     my %iphost = &Apache::lonnet::get_iphost();      my %iphost = &Apache::lonnet::get_iphost();
     foreach my $prefix (@prefixes) {      foreach my $prefix (@prefixes) {
Line 8200  sub modify_usersessions { Line 10409  sub modify_usersessions {
             }              }
             my $cachetime = 24*60*60;              my $cachetime = 24*60*60;
             &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);              &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
               if (ref($lastactref) eq 'HASH') {
                   $lastactref->{'domdefaults'} = 1;
               }
             if (keys(%changes) > 0) {              if (keys(%changes) > 0) {
                 my %lt = &usersession_titles();                  my %lt = &usersession_titles();
                 $resulttext = &mt('Changes made:').'<ul>';                  $resulttext = &mt('Changes made:').'<ul>';
Line 8211  sub modify_usersessions { Line 10423  sub modify_usersessions {
                                 foreach my $lonhost (sort(keys(%{$changes{$prefix}}))) {                                  foreach my $lonhost (sort(keys(%{$changes{$prefix}}))) {
                                     $resulttext .= '<li><b>'.$lonhost.'</b> ';                                      $resulttext .= '<li><b>'.$lonhost.'</b> ';
                                     my $lonhostdom = &Apache::lonnet::host_domain($lonhost);                                      my $lonhostdom = &Apache::lonnet::host_domain($lonhost);
                                     &Apache::lonnet::remote_devalidate_cache($lonhost,'spares',$lonhostdom);                                      my $cachekey = &escape('spares').':'.&escape($lonhostdom);
                                       &Apache::lonnet::remote_devalidate_cache($lonhost,[$cachekey]);
                                     if (ref($changes{$prefix}{$lonhost}) eq 'HASH') {                                      if (ref($changes{$prefix}{$lonhost}) eq 'HASH') {
                                         foreach my $type (@{$types{$prefix}}) {                                          foreach my $type (@{$types{$prefix}}) {
                                             if ($changes{$prefix}{$lonhost}{$type}) {                                              if ($changes{$prefix}{$lonhost}{$type}) {
Line 8393  sub modify_loadbalancing { Line 10606  sub modify_loadbalancing {
         }          }
         my $putresult = &Apache::lonnet::put_dom('configuration',          my $putresult = &Apache::lonnet::put_dom('configuration',
                                                  \%defaultshash,$dom);                                                   \%defaultshash,$dom);
   
         if ($putresult eq 'ok') {          if ($putresult eq 'ok') {
             if (keys(%changes) > 0) {              if (keys(%changes) > 0) {
                 if (ref($changes{'delete'}) eq 'ARRAY') {                  if (ref($changes{'delete'}) eq 'ARRAY') {
                     foreach my $balancer (sort(@{$changes{'delete'}})) {                      foreach my $balancer (sort(@{$changes{'delete'}})) {
                         $resulttext .= '<li>'.&mt('Load Balancing discontinued for: [_1]',$balancer).'</li>';                          $resulttext .= '<li>'.&mt('Load Balancing discontinued for: [_1]',$balancer).'</li>';
                         &Apache::lonnet::remote_devalidate_cache($balancer,'loadbalancing',$dom);                          my $cachekey = &escape('loadbalancing').':'.&escape($dom);
                           &Apache::lonnet::remote_devalidate_cache($balancer,[$cachekey]);
                     }                      }
                 }                  }
                 if (ref($changes{'add'}) eq 'ARRAY') {                  if (ref($changes{'add'}) eq 'ARRAY') {
Line 8444  sub modify_loadbalancing { Line 10657  sub modify_loadbalancing {
                                         my $balancetext;                                          my $balancetext;
                                         if ($rule eq '') {                                          if ($rule eq '') {
                                             $balancetext =  $ruletitles{'default'};                                              $balancetext =  $ruletitles{'default'};
                                         } elsif (($rule eq 'homeserver') || ($rule eq 'externalbalancer')) {                                          } elsif (($rule eq 'homeserver') || ($rule eq 'externalbalancer') ||
                                                    ($rule eq 'balancer') || ($rule eq 'offloadedto')) {
                                             $balancetext =  $ruletitles{$rule};                                              $balancetext =  $ruletitles{$rule};
                                         } else {                                          } else {
                                             $balancetext = &mt('offload to [_1]',$defaultshash{'loadbalancing'}{$balancer}{'rules'}{$type});                                              $balancetext = &mt('offload to [_1]',$defaultshash{'loadbalancing'}{$balancer}{'rules'}{$type});
                                         }                                          }
                                         $resulttext .= '<li>'.&mt('Load Balancer: [_1] -- balancing for [_2] set to - "[_3]"',$balancer,$titles->{$type},$balancetext).'</li>';                                           $resulttext .= '<li>'.&mt('Load Balancer: [_1] -- balancing for [_2] set to - "[_3]"',$balancer,$titles->{$type},$balancetext).'</li>';
                                     }                                      }
                                 }                                  }
                             }                              }
                         }                          }
                         &Apache::lonnet::remote_devalidate_cache($balancer,'loadbalancing',$dom);                          my $cachekey = &escape('loadbalancing').':'.&escape($dom);
                           &Apache::lonnet::remote_devalidate_cache($balancer,[$cachekey]);
                     }                      }
                 }                  }
                 if ($resulttext ne '') {                  if ($resulttext ne '') {
Line 8509  sub recurse_cat_deletes { Line 10724  sub recurse_cat_deletes {
                 delete($coursecategories->{$subitem});                  delete($coursecategories->{$subitem});
                 $deletions->{$subitem} = 1;                  $deletions->{$subitem} = 1;
                 &recurse_cat_deletes($subitem,$coursecategories,$deletions);                  &recurse_cat_deletes($subitem,$coursecategories,$deletions);
             }                }
         }          }
     }      }
     return;      return;
Line 8532  sub get_active_dcs { Line 10747  sub get_active_dcs {
   
 sub active_dc_picker {  sub active_dc_picker {
     my ($dom,$numinrow,$inputtype,$name,%currhash) = @_;      my ($dom,$numinrow,$inputtype,$name,%currhash) = @_;
     my %domcoords = &get_active_dcs($dom);       my %domcoords = &get_active_dcs($dom);
     my @domcoord = keys(%domcoords);      my @domcoord = keys(%domcoords);
     if (keys(%currhash)) {      if (keys(%currhash)) {
         foreach my $dc (keys(%currhash)) {          foreach my $dc (keys(%currhash)) {
Line 8586  sub active_dc_picker { Line 10801  sub active_dc_picker {
                       '<input type="'.$inputtype.'" name="'.$name.'"'.                        '<input type="'.$inputtype.'" name="'.$name.'"'.
                       ' value="'.$domcoord[$i].'"'.$check.' />'.$user;                        ' value="'.$domcoord[$i].'"'.$check.' />'.$user;
             if ($user ne $dcname.':'.$dcdom) {              if ($user ne $dcname.':'.$dcdom) {
                 $table .=  ' ('.$dcname.':'.$dcdom.')'.                  $table .=  ' ('.$dcname.':'.$dcdom.')';
                            '</label></span></td>';  
             }              }
               $table .= '</label></span></td>';
         }          }
         $table .= '</tr></table>';          $table .= '</tr></table>';
     } elsif ($numdcs == 1) {      } elsif ($numdcs == 1) {
           my ($dcname,$dcdom) = split(':',$domcoord[0]);
           my $user = &Apache::loncommon::plainname($dcname,$dcdom);
         if ($inputtype eq 'radio') {          if ($inputtype eq 'radio') {
             $table .= '<input type="hidden" name="'.$name.'" value="'.$domcoord[0].'" />';              $table .= '<input type="hidden" name="'.$name.'" value="'.$domcoord[0].'" />'.$user;
               if ($user ne $dcname.':'.$dcdom) {
                   $table .=  ' ('.$dcname.':'.$dcdom.')';
               }
         } else {          } else {
             my $check;              my $check;
             if (exists($currhash{$domcoord[0]})) {              if (exists($currhash{$domcoord[0]})) {
                 $check = ' checked="checked"';                  $check = ' checked="checked"';
             }              }
             $table .= '<input type="checkbox" name="'.$name.'" '.              $table .= '<span class="LC_nobreak"><label>'.
                       'value="'.$domcoord[0].'"'.$check.' />';                        '<input type="checkbox" name="'.$name.'" '.
                         'value="'.$domcoord[0].'"'.$check.' />'.$user;
               if ($user ne $dcname.':'.$dcdom) {
                   $table .=  ' ('.$dcname.':'.$dcdom.')';
               }
               $table .= '</label></span>';
             $rows ++;              $rows ++;
         }          }
     }      }
Line 8747  function showSpares(balancer,ishomedom,b Line 10972  function showSpares(balancer,ishomedom,b
             } else {              } else {
                 document.getElementById('balanceruletitle_'+balnum+'_'+insttypes[k]).style.display='none';                  document.getElementById('balanceruletitle_'+balnum+'_'+insttypes[k]).style.display='none';
                 document.getElementById('balancerule_'+balnum+'_'+insttypes[k]).style.display='none';                  document.getElementById('balancerule_'+balnum+'_'+insttypes[k]).style.display='none';
   
             }              }
         } else {          } else {
             document.getElementById('balanceruletitle_'+balnum+'_'+insttypes[k]).style.display='block';              document.getElementById('balanceruletitle_'+balnum+'_'+insttypes[k]).style.display='block';
Line 8764  function showSpares(balancer,ishomedom,b Line 10988  function showSpares(balancer,ishomedom,b
                 if ((currBalancers.indexOf(alltargets[m]) == -1) && (alltargets[m] != balancer)) {                  if ((currBalancers.indexOf(alltargets[m]) == -1) && (alltargets[m] != balancer)) {
                     idx ++;                      idx ++;
                     item.options[idx] = new Option(alltargets[m],alltargets[m],false,false);                      item.options[idx] = new Option(alltargets[m],alltargets[m],false,false);
   
                 }                  }
             }              }
         }          }
Line 8837  function singleServerToggle(balnum,type) Line 11060  function singleServerToggle(balnum,type)
   
 function balanceruleChange(formname,balnum,type) {  function balanceruleChange(formname,balnum,type) {
     if (type == '_LC_external') {      if (type == '_LC_external') {
         return;           return;
     }      }
     var typesRules = getIndicesByName(formname,'loadbalancing_rules_'+balnum+'_'+type);      var typesRules = getIndicesByName(formname,'loadbalancing_rules_'+balnum+'_'+type);
     for (var i=0; i<typesRules.length; i++) {      for (var i=0; i<typesRules.length; i++) {
Line 9133  END Line 11356  END
   
 }  }
   
 sub credits_js {  sub toggle_display_js {
     return <<"END";      return <<"END";
   
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
   
 function toggleCredits(domForm) {  function toggleDisplay(domForm,caller) {
     if (document.getElementById('credits')) {      if (document.getElementById(caller)) {
         creditsitem = document.getElementById('credits');          var divitem = document.getElementById(caller);
         var creditsLength = domForm.coursecredits.length;          var optionsElement = domForm.coursecredits;
         if (creditsLength) {          if (caller == 'emailoptions') {
               optionsElement = domForm.cancreate_email; 
           }
           if (optionsElement.length) {
             var currval;              var currval;
             for (var i=0; i<creditsLength; i++) {              for (var i=0; i<optionsElement.length; i++) {
                 if (domForm.coursecredits[i].checked) {                  if (optionsElement[i].checked) {
                    currval = domForm.coursecredits[i].value;                     currval = optionsElement[i].value;
                 }                  }
             }              }
             if (currval == 1) {              if (currval == 1) {
                 creditsitem.style.display = 'block';                  divitem.style.display = 'block';
             } else {              } else {
                 creditsitem.style.display = 'none';                  divitem.style.display = 'none';
             }              }
         }          }
     }      }
Line 9177  sub captcha_phrases { Line 11403  sub captcha_phrases {
     );      );
 }  }
   
   sub devalidate_remote_domconfs {
       my ($dom,$cachekeys) = @_;
       return unless (ref($cachekeys) eq 'HASH');
       my %servers = &Apache::lonnet::internet_dom_servers($dom);
       my %thismachine;
       map { $thismachine{$_} = 1; } &Apache::lonnet::current_machine_ids();
       my @posscached = ('domainconfig','domdefaults');
       if (keys(%servers) > 1) {
           foreach my $server (keys(%servers)) {
               next if ($thismachine{$server});
               my @cached;
               foreach my $name (@posscached) {
                   if ($cachekeys->{$name}) {
                       push(@cached,&escape($name).':'.&escape($dom));
                   }
               }
               if (@cached) {
                   &Apache::lonnet::remote_devalidate_cache($server,\@cached);
               }
           }
       }
       return;
   }
   
 1;  1;

Removed from v.1.160.6.20  
changed lines
  Added in v.1.238


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