Diff for /loncom/interface/domainprefs.pm between versions 1.86 and 1.102

version 1.86, 2009/02/08 21:04:01 version 1.102, 2009/08/11 23:24:29
Line 28 Line 28
 ###############################################################  ###############################################################
 ##############################################################  ##############################################################
   
   =pod
   
   =head1 NAME
   
   Apache::domainprefs.pm
   
   =head1 SYNOPSIS
   
   Handles configuration of a LON-CAPA domain.  
   
   This is part of the LearningOnline Network with CAPA project
   described at http://www.lon-capa.org.
   
   
   =head1 OVERVIEW
   
   Each institution using LON-CAPA will typically have a single domain designated 
   for use by individuals affliated with the institution.  Accordingly, each domain
   may define a default set of logos and a color scheme which can be used to "brand"
   the LON-CAPA instance. In addition, an institution will typically have a language
   and timezone which are used for the majority of courses.
   
   LON-CAPA provides a mechanism to display and modify these defaults, as well as a 
   host of other domain-wide settings which determine the types of functionality
   available to users and courses in the domain.
   
   There is also a mechanism to configure cataloging of courses in the domain, and
   controls on the operation of automated processes which govern such things as
   roster updates, user directory updates and processing of course requests.
   
   The domain coordination manual which is built dynamically on install/update of 
   LON-CAPA from the relevant help items provides more information about domain 
   configuration.
   
   Most of the domain settings are stored in the configuration.db GDBM file which is
   housed on the primary library server for the domain in /home/httpd/lonUsers/$dom,
   where $dom is the domain.  The configuration.db stores settings in a number of 
   frozen hashes of hashes.  In a few cases, domain information must be uploaded to
   the domain as files (e.g., image files for logos etc., or plain text files for
   bubblesheet formats).  In this case the domainprefs.pm must be running in a user
   session hosted on the primary library server in the domain, as these files are 
   stored in author space belonging to a special $dom-domainconfig user.   
   
   domainprefs.pm in combination with lonconfigsettings.pm will retrieve and display
   the current settings, and provides an interface to make modifications.
   
   =head1 SUBROUTINES
   
   =over
   
   =item print_quotas()
   
   Inputs: 4 
   
   $dom,$settings,$rowtotal,$action.
   
   $dom is the domain, $settings is a reference to a hash of current settings for
   the current context, $rowtotal is a reference to the scalar used to record the 
   number of rows displayed on the page, and $action is the context (either quotas 
   or requestcourses).
   
   The print_quotas routine was orginally created to display/store information
   about default quota sizes for portfolio spaces for the different types of 
   institutional affiliation in the domain (e.g., Faculty, Staff, Student etc.), 
   but is now also used to manage availability of user tools: 
   i.e., blogs, aboutme page, and portfolios, and the course request tool,
   used by course owners to request creation of a course.
   
   Outputs: 1
   
   $datatable  - HTML containing form elements which allow settings to be changed. 
   
   In the case of course requests, radio buttons are displayed for each institutional
   affiliate type (and also default, and _LC_adv) for each of the course types 
   (official, unofficial and community).  In each case the radio buttons allow the 
   selection of one of four values:
   
   0, approve, validate, autolimit=N (where N is blank, or a positive integer).
   which have the following effects:
   
   0
   
   =over
   
   - course requests are not allowed for this course types/affiliation
   
   =back
   
   approve 
   
   =over 
   
   - course requests must be approved by a Doman Coordinator in the 
   course's domain
   
   =back
   
   validate 
   
   =over
   
   - an institutional validation (e.g., check requestor is instructor
   of record) needs to be passed before the course will be created.  The required
   validation is in localenroll.pm on the primary library server for the course 
   domain.
   
   =back
   
   autolimit 
   
   =over
    
   - course requests will be processed autoatically up to a limit of
   N requests for the course type for the particular requestor.
   If N is undefined, there is no limit to the number of course requests
   which a course owner may submit and have processed automatically. 
   
   =back
   
   =item modify_quotas() 
   
   =back
   
   =cut
   
 package Apache::domainprefs;  package Apache::domainprefs;
   
 use strict;  use strict;
Line 37  use Apache::loncommon(); Line 162  use Apache::loncommon();
 use Apache::lonhtmlcommon();  use Apache::lonhtmlcommon();
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonmsg();  use Apache::lonmsg();
   use Apache::lonconfigsettings;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
 use LONCAPA::Enrollment;  use LONCAPA::Enrollment;
 use LONCAPA::lonauthcgi();  use LONCAPA::lonauthcgi();
Line 53  sub handler { Line 179  sub handler {
         return OK;          return OK;
     }      }
   
       my $context = 'domain';
     my $dom = $env{'request.role.domain'};      my $dom = $env{'request.role.domain'};
     my $domdesc = &Apache::lonnet::domain($dom,'description');      my $domdesc = &Apache::lonnet::domain($dom,'description');
     if (&Apache::lonnet::allowed('mau',$dom)) {      if (&Apache::lonnet::allowed('mau',$dom)) {
Line 106  sub handler { Line 233  sub handler {
                                   col2 => 'Value'}],                                    col2 => 'Value'}],
                     },                      },
         'quotas' =>           'quotas' => 
                     { text => 'User blogs, home pages and portfolios',                      { text => 'User blogs, personal information pages and portfolios',
                       help => 'Domain_Configuration_Quotas',                        help => 'Domain_Configuration_Quotas',
                       header => [{col1 => 'User affiliation',                        header => [{col1 => 'User affiliation',
                                   col2 => 'Available tools',                                    col2 => 'Available tools',
Line 160  sub handler { Line 287  sub handler {
                                 col2 => 'Information settable when self-creating account (if directory data blank)'}],                                  col2 => 'Information settable when self-creating account (if directory data blank)'}],
                   },                    },
         'scantron' =>          'scantron' =>
                   { text => 'Scantron format file',                    { text => 'Bubblesheet format file',
                     help => 'Domain_Configuration_Scantron_Format',                      help => 'Domain_Configuration_Scantron_Format',
                     header => [ {col1 => 'Item',                      header => [ {col1 => 'Item',
                                  col2 => '',                                   col2 => '',
Line 170  sub handler { Line 297  sub handler {
                  {text => 'Request creation of courses',                   {text => 'Request creation of courses',
                   help => 'Domain_Configuration_Request_Courses',                    help => 'Domain_Configuration_Request_Courses',
                   header => [{col1 => 'User affiliation',                    header => [{col1 => 'User affiliation',
                               col2 => 'Requestable course types',}],                                col2 => 'Availability/Processing of requests',},
                                {col1 => 'Setting',
                                 col2 => 'Value'}],
                  },                   },
         'coursecategories' =>          'coursecategories' =>
                   { text => 'Cataloging of courses',                    { text => 'Cataloging of courses',
Line 197  sub handler { Line 326  sub handler {
       text=>"Pick functionality"});        text=>"Pick functionality"});
     my $confname = $dom.'-domainconfig';      my $confname = $dom.'-domainconfig';
     if ($phase eq 'process') {      if ($phase eq 'process') {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonconfigsettings::make_changes($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,\@roles);
           ({href=>"javascript:changePage(document.$phase,'display')",  
             text=>"Domain Configuration"},  
            {href=>"javascript:changePage(document.$phase,'$phase')",  
             text=>"Updated"});  
         &print_header($r,$phase);  
         foreach my $item (@prefs_order) {  
             if (grep(/^\Q$item\E$/,@actions)) {  
                 $r->print('<h3>'.&mt($prefs{$item}{'text'}).'</h3>'.  
                           &process_changes($r,$dom,$confname,$item,  
                           \@roles,%domconfig));  
             }  
         }  
         $r->print('<p>');  
         &print_footer($r,$phase,'display','Back to configuration display',  
                       \@actions);  
         $r->print('</p>');  
     } elsif ($phase eq 'display') {      } elsif ($phase eq 'display') {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname);
             ({href=>"javascript:changePage(document.$phase,'display')",  
               text=>"Domain Configuration"});  
         &print_header($r,$phase);  
         if (@actions > 0) {  
             my $rowsum = 0;  
             my (%output,%rowtotal,@items);  
             my $halfway = @actions/2;  
             foreach my $item (@prefs_order) {  
                 if (grep(/^\Q$item\E$/,@actions)) {  
                     push(@items,$item);  
                     ($output{$item},$rowtotal{$item}) =   
                         &print_config_box($r,$dom,$confname,$phase,  
                                           $item,$prefs{$item},  
                                           $domconfig{$item});  
                     $rowsum += $rowtotal{$item};  
                 }  
             }  
             my $colend;  
             my $halfway = $rowsum/2;  
             my $aggregate = 0;  
             my $sumleft = 0;  
             my $sumright = 0;  
             my $crossover;  
             for (my $i=0; $i<@items; $i++) {  
                 $aggregate += $rowtotal{$items[$i]};  
                 if ($aggregate > $halfway) {  
                     $crossover = $i;  
                     last;  
                 }  
             }  
             for (my $i=0; $i<$crossover; $i++) {  
                 $sumleft += $rowtotal{$items[$i]};   
             }  
             for (my $i=$crossover+1; $i<@items; $i++) {  
                 $sumright += $rowtotal{$items[$i]};  
             }  
             if ((@items > 1) && ($env{'form.numcols'} == 2)) {  
                 my $sumdiff = $sumright - $sumleft;  
                 if ($sumdiff > 0) {  
                     $colend = $crossover + 1;  
                 } else {  
                     $colend = $crossover;  
                 }  
             } else {  
                 $colend = @items;  
             }  
             $r->print('<p><table class="LC_double_column"><tr><td class="LC_left_col">');  
             for (my $i=0; $i<$colend; $i++) {  
                 $r->print($output{$items[$i]});  
             }  
             $r->print('</td><td></td><td class="LC_right_col">');  
             if ($colend < @items) {  
                 for (my $i=$colend; $i<@items; $i++) {   
                     $r->print($output{$items[$i]});  
                 }  
             }  
             $r->print('</td></tr></table></p>');  
             $r->print(&print_footer($r,$phase,'process','Save',\@actions));  
         } else {  
             $r->print('<input type="hidden" name="phase" value="" />'.  
                       '<input type="hidden" name="numcols" value="'.  
                       $env{'form.numcols'}.'" />'."\n".  
                       '<span class="LC_error">'.&mt('No settings chosen').  
                       '</span>');  
         }  
         $r->print('</form>');  
         $r->print(&Apache::loncommon::end_page());  
     } else {      } else {
         if ($phase eq '') {  
             $phase = 'pickactions';  
         }  
         my %helphash;  
         &print_header($r,$phase);  
         if (keys(%domconfig) == 0) {          if (keys(%domconfig) == 0) {
             my $primarylibserv = &Apache::lonnet::domain($dom,'primary');              my $primarylibserv = &Apache::lonnet::domain($dom,'primary');
             my @ids=&Apache::lonnet::current_machine_ids();              my @ids=&Apache::lonnet::current_machine_ids();
Line 307  sub handler { Line 348  sub handler {
                     }                      }
                 }                  }
                 if ($custom_img_count > 0) {                  if ($custom_img_count > 0) {
                       &Apache::lonconfigsettings::print_header($r,$phase,$context);
                     my $switch_server = &check_switchserver($dom,$confname);                      my $switch_server = &check_switchserver($dom,$confname);
                     $r->print(                      $r->print(
     &mt('Domain configuration settings have yet to be saved for this domain via the web-based domain preferences interface.').'<br />'.      &mt('Domain configuration settings have yet to be saved for this domain via the web-based domain preferences interface.').'<br />'.
Line 316  sub handler { Line 358  sub handler {
                     if ($switch_server) {                      if ($switch_server) {
                         $r->print($switch_server.' '.&mt('to primary library server for domain: [_1]',$dom));                          $r->print($switch_server.' '.&mt('to primary library server for domain: [_1]',$dom));
                     }                      }
                       $r->print(&Apache::loncommon::end_page());
                     return OK;                      return OK;
                 }                  }
             }              }
         }          }
         $r->print('<h3>'.&mt('Functionality to display/modify').'</h3>');          &Apache::lonconfigsettings::display_choices($r,$phase,$context,\@prefs_order,\%prefs);
         $r->print('<script type="text/javascript">'."\n".  
               &Apache::loncommon::check_uncheck_jscript()."\n".  
               '</script>'."\n".'<p><input type="button" value="'.&mt('check all').'" '.  
               'onclick="javascript:checkAll(document.pickactions.actions)"'.  
               ' />&nbsp;&nbsp;'.  
               '<input type="button" value="'.&mt('uncheck all').'" '.  
               'onclick="javascript:uncheckAll(document.pickactions.actions)"'.  
               ' /></p><div class="LC_left_float">');  
         my ($numitems,$midpoint,$seconddiv,$count);   
         $numitems = @prefs_order;  
         $midpoint = int($numitems/2);  
         if ($numitems%2) {  
             $midpoint ++;  
         }  
         $count = 0;  
         foreach my $item (@prefs_order) {  
             $r->print('<h4>'.  
                       &Apache::loncommon::help_open_topic($prefs{$item}->{'help'}).  
                       '<label><input type="checkbox" name="actions" value="'.$item.  
                       '" />&nbsp;'.&mt($prefs{$item}->{'text'}).'</label></h4>');  
             $count ++;  
             if ((!$seconddiv) && ($count >= $midpoint)) {  
                 $r->print('</div>'."\n".'<div class="LC_left_float">'."\n");  
                 $seconddiv = 1;  
             }  
         }  
         $r->print('</div><div class="LC_clear_float_footer"></div><h3>'.  
                   &mt('Display options').'</h3>'."\n".  
                   '<p><span class="LC_nobreak">'.&mt('Display using: ')."\n".  
                   '<label><input type="radio" name="numcols" value="1" />'.  
                   &mt('one column').'</label>&nbsp;&nbsp;<label>'.  
                   '<input type="radio" name="numcols" value="2" />'.  
                   &mt('two columns').'</label></span></p>');  
         $r->print(&print_footer($r,$phase,'display','Go'));  
         $r->print('</form>');  
         $r->print(&Apache::loncommon::end_page());  
     }      }
     return OK;      return OK;
 }  }
   
 sub process_changes {  sub process_changes {
     my ($r,$dom,$confname,$action,$roles,%domconfig) = @_;      my ($r,$dom,$confname,$action,$roles,$values) = @_;
       my %domconfig;
       if (ref($values) eq 'HASH') {
           %domconfig = %{$values};
       }
     my $output;      my $output;
     if ($action eq 'login') {      if ($action eq 'login') {
         $output = &modify_login($r,$dom,$confname,%domconfig);          $output = &modify_login($r,$dom,$confname,%domconfig);
Line 403  sub print_config_box { Line 414  sub print_config_box {
     my $output;      my $output;
     if ($action eq 'coursecategories') {      if ($action eq 'coursecategories') {
         $output = &coursecategories_javascript($settings);          $output = &coursecategories_javascript($settings);
     }        }
     $output .=       $output .= 
          '<table class="LC_nested_outer">           '<table class="LC_nested_outer">
           <tr>            <tr>
Line 414  sub print_config_box { Line 425  sub print_config_box {
     $rowtotal ++;      $rowtotal ++;
     if (($action eq 'autoupdate') || ($action eq 'rolecolors') ||       if (($action eq 'autoupdate') || ($action eq 'rolecolors') || 
         ($action eq 'usercreation') || ($action eq 'usermodification') ||          ($action eq 'usercreation') || ($action eq 'usermodification') ||
         ($action eq 'coursecategories')) {          ($action eq 'coursecategories') || ($action eq 'requestcourses')) {
         my $colspan = '';          my $colspan = '';
         if (($action eq 'rolecolors') || ($action eq 'coursecategories')) {          if (($action eq 'rolecolors') || ($action eq 'coursecategories')) {
             $colspan = ' colspan="2"';              $colspan = ' colspan="2"';
Line 436  sub print_config_box { Line 447  sub print_config_box {
             $output .= &print_usermodification('top',$dom,$settings,\$rowtotal);              $output .= &print_usermodification('top',$dom,$settings,\$rowtotal);
         } elsif ($action eq 'coursecategories') {          } elsif ($action eq 'coursecategories') {
             $output .= &print_coursecategories('top',$dom,$item,$settings,\$rowtotal);              $output .= &print_coursecategories('top',$dom,$item,$settings,\$rowtotal);
           } elsif ($action eq 'requestcourses') {
               $output .= &print_quotas($dom,$settings,\$rowtotal,$action);
         } else {          } else {
             $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal);              $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal);
         }          }
Line 483  sub print_config_box { Line 496  sub print_config_box {
             $rowtotal ++;              $rowtotal ++;
         } elsif ($action eq 'coursecategories') {          } elsif ($action eq 'coursecategories') {
             $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal);              $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal);
           } elsif ($action eq 'requestcourses') {
               $output .= &print_courserequestmail($dom,$settings,\$rowtotal);
         } else {          } else {
             $output .= &print_rolecolors($phase,'coordinator',$dom,$confname,$settings,\$rowtotal).'              $output .= &print_rolecolors($phase,'coordinator',$dom,$confname,$settings,\$rowtotal).'
            </table>             </table>
Line 566  sub print_config_box { Line 581  sub print_config_box {
             $output .= &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal);              $output .= &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal);
         } elsif ($action eq 'serverstatuses') {          } elsif ($action eq 'serverstatuses') {
             $output .= &print_serverstatuses($dom,$settings,\$rowtotal);              $output .= &print_serverstatuses($dom,$settings,\$rowtotal);
         } elsif ($action eq 'requestcourses') {  
             $output .= &print_quotas($dom,$settings,\$rowtotal,$action);  
         }          }
     }      }
     $output .= '      $output .= '
Line 578  sub print_config_box { Line 591  sub print_config_box {
     return ($output,$rowtotal);      return ($output,$rowtotal);
 }  }
   
 sub print_header {  
     my ($r,$phase) = @_;  
     my $alert = &mt('You must select at least one functionality type to display.');   
     my $js = '  
 <script type="text/javascript">  
 function changePage(formname,newphase) {  
     formname.phase.value = newphase;  
     numchecked = 0;  
     if (formname == document.pickactions) {  
         if (formname.actions.length > 0) {  
             for (var i = 0; i<formname.actions.length; i++) {  
                 if (formname.actions[i].checked) {  
                     numchecked ++;  
                 }  
             }  
         } else {  
             if (formname.actions.checked) {  
                 numchecked ++;  
             }  
         }  
         if (numchecked > 0) {  
             formname.submit();  
         } else {  
             alert("'.$alert.'");  
             return;  
         }  
     }  
     formname.submit();  
 }'."\n";  
     if ($phase eq 'pickactions') {  
         $js .=   
             &Apache::lonhtmlcommon::set_form_elements({actions => 'checkbox',numcols => 'radio',})."\n".  
             &javascript_set_colnums();  
     } elsif ($phase eq 'display') {  
         $js .= &color_pick_js()."\n";  
     }  
     $js .= &Apache::loncommon::viewport_size_js().'  
 </script>  
 ';  
     my $additem;  
     if ($phase eq 'pickactions') {  
         my %loaditems = (  
                     'onload' => "javascript:getViewportDims(document.$phase.width,document.$phase.height);setDisplayColumns();setFormElements(document.pickactions);",  
                         );  
         $additem = {'add_entries' => \%loaditems,};  
     } else {  
         my %loaditems = (  
                     'onload' => "javascript:getViewportDims(document.$phase.width,document.$phase.height);",  
                         );  
         $additem = {'add_entries' => \%loaditems,};  
     }  
     $r->print(&Apache::loncommon::start_page('View/Modify Domain Settings',  
                                            $js,$additem));  
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Domain Settings'));  
     $r->print('  
 <form name="parmform" action="">  
 <input type="hidden" name="pres_marker" />  
 <input type="hidden" name="pres_type" />  
 <input type="hidden" name="pres_value" />  
 </form>  
 ');  
     $r->print('<form method="post" name="'.$phase.'" action="/adm/domainprefs"'.  
               ' enctype="multipart/form-data">');  
     return;  
 }  
   
 sub print_footer {  
     my ($r,$phase,$newphase,$button_text,$actions) = @_;  
     $button_text = &mt($button_text);  
     $r->print('<input type="hidden" name="phase" value="" />'.  
               '<input type="hidden" name="width" value="'.  
               $env{'form.width'}.'" />'.  
               '<input type="hidden" name="height" value="'.  
               $env{'form.height'}.'" />');  
     if (($phase eq 'display') || ($phase eq 'process')) {  
         if (ref($actions) eq 'ARRAY') {  
             foreach my $item (@{$actions}) {  
                 $r->print('<input type="hidden" name="actions" value="'.$item.'" />')."\n";  
             }  
         }  
         $r->print('<input type="hidden" name="numcols" value="'.$env{'form.numcols'}.'" />');  
     }  
     my $dest='"javascript:changePage(document.'.$phase.','."'$newphase'".')"';  
     if ($phase eq 'process') {  
         $r->print('<p><a href='.$dest.'>'.$button_text.'</a></p>');  
     } else {  
         my $onclick;  
         if ($phase eq 'display') {  
             $onclick = '"javascript:changePage(document.'.$phase.','."'$newphase'".')"';  
         } else {  
             $onclick = '"javascript:changePage(document.'.$phase.','."'$newphase'".')"';  
         }   
         $r->print('<p><input type="button" name="store" value="'.  
                   $button_text.'" onclick='.$onclick.' /></p>');  
     }  
     if ($phase eq 'process') {  
         $r->print('</form>'.&Apache::loncommon::end_page());  
     }  
     return;  
 }  
   
 sub print_login {  sub print_login {
     my ($dom,$confname,$phase,$settings,$rowtotal) = @_;      my ($dom,$confname,$phase,$settings,$rowtotal) = @_;
     my %choices = &login_choices();      my %choices = &login_choices();
Line 851  sub print_rolecolors { Line 763  sub print_rolecolors {
     my %defaults = (      my %defaults = (
                    img => $defaultdesign{$role.'.img'},                     img => $defaultdesign{$role.'.img'},
                    font => $defaultdesign{$role.'.font'},                     font => $defaultdesign{$role.'.font'},
      fontmenu => $defaultdesign{$role.'.fontmenu'},
                    );                     );
     foreach my $item (@bgs) {      foreach my $item (@bgs) {
         $defaults{'bgs'}{$item} = $defaultdesign{$role.'.'.$item};          $defaults{'bgs'}{$item} = $defaultdesign{$role.'.'.$item};
Line 868  sub print_rolecolors { Line 781  sub print_rolecolors {
                 $designs{'font'} = $settings->{$role}->{'font'};                  $designs{'font'} = $settings->{$role}->{'font'};
                 $is_custom{'font'} = 1;                  $is_custom{'font'} = 1;
             }              }
               if ($settings->{$role}->{'fontmenu'} ne '') {
                   $designs{'fontmenu'} = $settings->{$role}->{'fontmenu'};
                   $is_custom{'fontmenu'} = 1;
               }
             foreach my $item (@bgs) {              foreach my $item (@bgs) {
                 if ($settings->{$role}->{$item} ne '') {                  if ($settings->{$role}->{$item} ne '') {
                     $designs{'bgs'}{$item} = $settings->{$role}->{$item};                      $designs{'bgs'}{$item} = $settings->{$role}->{$item};
Line 886  sub print_rolecolors { Line 803  sub print_rolecolors {
             $designs{img} = $designhash{$dom.'.'.$role.'.img'};              $designs{img} = $designhash{$dom.'.'.$role.'.img'};
             $is_custom{'img'} = 1;              $is_custom{'img'} = 1;
         }          }
           if ($designhash{$dom.'.'.$role.'.fontmenu'} ne '') {
               $designs{fontmenu} = $designhash{$dom.'.'.$role.'.fontmenu'};
               $is_custom{'fontmenu'} = 1; 
           }
         if ($designhash{$dom.'.'.$role.'.font'} ne '') {          if ($designhash{$dom.'.'.$role.'.font'} ne '') {
             $designs{font} = $designhash{$dom.'.'.$role.'.font'};              $designs{font} = $designhash{$dom.'.'.$role.'.font'};
             $is_custom{'font'} = 1;              $is_custom{'font'} = 1;
Line 914  sub display_color_options { Line 835  sub display_color_options {
     my ($dom,$confname,$phase,$role,$itemcount,$choices,$is_custom,$defaults,$designs,      my ($dom,$confname,$phase,$role,$itemcount,$choices,$is_custom,$defaults,$designs,
         $images,$bgs,$links,$alt_text,$rowtotal,$logintext,$loginheader) = @_;          $images,$bgs,$links,$alt_text,$rowtotal,$logintext,$loginheader) = @_;
     my $css_class = $itemcount%2?' class="LC_odd_row"':'';      my $css_class = $itemcount%2?' class="LC_odd_row"':'';
     my $datatable = '<tr'.$css_class.'>'.      my $datatable = '<tr>'.
         '<td>'.$choices->{'font'}.'</td>';          '<td>'.$choices->{'font'}.'</td>';
     if (!$is_custom->{'font'}) {      if (!$is_custom->{'font'}) {
         $datatable .=  '<td>'.&mt('Default in use:').'&nbsp;<span id="css_default_'.$role.'_font" style="color: '.$defaults->{'font'}.';">'.$defaults->{'font'}.'</span></td>';          $datatable .=  '<td>'.&mt('Default in use:').'&nbsp;<span id="css_default_'.$role.'_font" style="color: '.$defaults->{'font'}.';">'.$defaults->{'font'}.'</span></td>';
Line 928  sub display_color_options { Line 849  sub display_color_options {
                   '&nbsp;<span id="css_'.$role.'_font" style="background-color: '.                    '&nbsp;<span id="css_'.$role.'_font" style="background-color: '.
                   $designs->{'font'}.';">&nbsp;&nbsp;&nbsp;</span>'.                    $designs->{'font'}.';">&nbsp;&nbsp;&nbsp;</span>'.
                   '</span></td></tr>';                    '</span></td></tr>';
       $datatable .= '<tr'.$css_class.'>'.
           '<td>'.$choices->{'fontmenu'}.'</td>';
       if (!$is_custom->{'fontmenu'}) {
           $datatable .=  '<td>'.&mt('Default in use:').'&nbsp;<span id="css_default_'.$role.'_font" style="color: '.$defaults->{'fontmenu'}.';">'.$defaults->{'fontmenu'}.'</span></td>';
       } else {
           $datatable .= '<td>&nbsp;</td>';
       }
       $fontlink = &color_pick($phase,$role,'fontmenu',$choices->{'fontmenu'},$designs->{'fontmenu'});
       $datatable .= '<td><span class="LC_nobreak">'.
                     '<input type="text" size="10" name="'.$role.'_fontmenu"'.
                     ' value="'.$designs->{'fontmenu'}.'" />&nbsp;'.$fontlink.
                     '&nbsp;<span id="css_'.$role.'_fontmenu" style="background-color: '.
                     $designs->{'fontmenu'}.';">&nbsp;&nbsp;&nbsp;</span>'.
                     '</span></td></tr>';
     my $switchserver = &check_switchserver($dom,$confname);      my $switchserver = &check_switchserver($dom,$confname);
     foreach my $img (@{$images}) {      foreach my $img (@{$images}) {
  $itemcount ++;   $itemcount ++;
Line 1200  sub color_pick { Line 1135  sub color_pick {
     return $link;      return $link;
 }  }
   
 sub color_pick_js {  
     my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();  
     my $output = <<"ENDCOL";  
     function pclose() {  
         parmwin=window.open("/adm/rat/empty.html","LONCAPAparms","height=350,width=350,scrollbars=no,menubar=no");  
         parmwin.close();  
     }  
   
     $pjump_def  
   
     function psub() {  
         pclose();  
         if (document.parmform.pres_marker.value!='') {  
             if (document.parmform.pres_type.value!='') {  
                 eval('document.display.'+  
                      document.parmform.pres_marker.value+  
                      '.value=document.parmform.pres_value.value;');  
             }  
         } else {  
             document.parmform.pres_value.value='';  
             document.parmform.pres_marker.value='';  
         }  
     }  
   
     function get_id (span_id) {  
  if (document.getElementById) {  
             return document.getElementById(span_id);  
         }  
  if (document.all) {  
             return document.all[span_id];  
         }   
  return false;  
     }  
   
     function colchg_span (span_id_str,new_color_item) {  
  var span_ref = get_id(span_id_str);  
  if (span_ref.style) { span_ref = span_ref.style; }  
  span_ref.background = new_color_item.value;  
  span_ref.backgroundColor = new_color_item.value;  
  span_ref.bgColor = new_color_item.value;  
     }  
   
 ENDCOL  
     return $output;  
 }  
   
 sub print_quotas {  sub print_quotas {
     my ($dom,$settings,$rowtotal,$action) = @_;      my ($dom,$settings,$rowtotal,$action) = @_;
     my $context;      my $context;
Line 1254  sub print_quotas { Line 1143  sub print_quotas {
     } else {      } else {
         $context = $action;          $context = $action;
     }      }
     my ($datatable,$defaultquota,@usertools);      my ($datatable,$defaultquota,@usertools,@options,%validations);
     my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);      my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
     my $typecount = 0;      my $typecount = 0;
     my $css_class;      my ($css_class,%titles);
     if ($context eq 'requestcourses') {      if ($context eq 'requestcourses') {
         @usertools = ('official','unofficial');          @usertools = ('official','unofficial','community');
           @options =('norequest','approve','autolimit','validate');
           %validations = &Apache::lonnet::auto_courserequest_checks($dom);
           %titles = &courserequest_titles();
     } else {      } else {
         @usertools = ('aboutme','blog','portfolio');          @usertools = ('aboutme','blog','portfolio');
           %titles = &tool_titles();
     }      }
     my %titles = &tool_titles();  
     if (ref($types) eq 'ARRAY') {      if (ref($types) eq 'ARRAY') {
         foreach my $type (@{$types}) {          foreach my $type (@{$types}) {
             my $currdefquota;              my $currdefquota;
Line 1282  sub print_quotas { Line 1174  sub print_quotas {
                 $datatable .= '<tr'.$css_class.'>'.                  $datatable .= '<tr'.$css_class.'>'.
                               '<td>'.$usertypes->{$type}.'</td>'.                                '<td>'.$usertypes->{$type}.'</td>'.
                               '<td class="LC_left_item">';                                '<td class="LC_left_item">';
                   if ($context eq 'requestcourses') {
                       $datatable .= '<table><tr>';
                   }
                   my %cell;  
                 foreach my $item (@usertools) {                  foreach my $item (@usertools) {
                     my $checked;                      if ($context eq 'requestcourses') {
                     unless ($context eq 'requestcourses') {                          my ($curroption,$currlimit);
                         $checked = 'checked="checked" ';                          if (ref($settings) eq 'HASH') {
                     }                              if (ref($settings->{$item}) eq 'HASH') {
                     if (ref($settings) eq 'HASH') {                                  $curroption = $settings->{$item}->{$type};
                         if (ref($settings->{$item}) eq 'HASH') {                                  if ($curroption =~ /^autolimit=(\d*)$/) {
                             if ($settings->{$item}->{$type} == 0) {                                      $currlimit = $1; 
                                 $checked = '';                                  }
                             } elsif ($settings->{$item}->{$type} == 1) {  
                                 $checked =  'checked="checked" ';  
                             }                              }
                         }                          }
                           if (!$curroption) {
                               $curroption = 'norequest';
                           }
                           $datatable .= '<th>'.$titles{$item}.'</th>';
                           foreach my $option (@options) {
                               my $val = $option;
                               if ($option eq 'norequest') {
                                   $val = 0;  
                               }
                               if ($option eq 'validate') {
                                   my $canvalidate = 0;
                                   if (ref($validations{$item}) eq 'HASH') { 
                                       if ($validations{$item}{$type}) {
                                           $canvalidate = 1;
                                       }
                                   }
                                   next if (!$canvalidate);
                               }
                               my $checked = '';
                               if ($option eq $curroption) {
                                   $checked = ' checked="checked"';
                               } elsif ($option eq 'autolimit') {
                                   if ($curroption =~ /^autolimit/) {
                                       $checked = ' checked="checked"';
                                   }                       
                               } 
                               $cell{$item} .= '<span class="LC_nobreak"><label>'.
                                     '<input type="radio" name="crsreq_'.$item.
                                     '_'.$type.'" value="'.$val.'"'.$checked.' />'.
                                     $titles{$option}.'</label>&nbsp;';
                               if ($option eq 'autolimit') {
                                   $cell{$item} .= '<input type="text" name="crsreq_'.
                                                   $item.'_limit_'.$type.'" size="1" '.
                                                   'value="'.$currlimit.'" />'; 
                               }
                               $cell{$item} .= '</span>&nbsp; ';
                           }
                       } else {
                           my $checked = 'checked="checked" ';
                           if (ref($settings) eq 'HASH') {
                               if (ref($settings->{$item}) eq 'HASH') {
                                   if ($settings->{$item}->{$type} == 0) {
                                       $checked = '';
                                   } elsif ($settings->{$item}->{$type} == 1) {
                                       $checked =  'checked="checked" ';
                                   }
                               }
                           }
                           $datatable .= '<span class="LC_nobreak"><label>'.
                                         '<input type="checkbox" name="'.$context.'_'.$item.
                                         '" value="'.$type.'" '.$checked.'/>'.$titles{$item}.
                                         '</label></span>&nbsp; ';
                       }
                   }
                   if ($context eq 'requestcourses') {
                       $datatable .= '</tr><tr>';
                       foreach my $item (@usertools) {
                           $datatable .= '<td>'.$cell{$item}.'</td>';  
                     }                      }
                     $datatable .= '<span class="LC_nobreak"><label>'.                      $datatable .= '</tr></table>';
                                   '<input type="checkbox" name="'.$context.'_'.$item.  
                                   '" value="'.$type.'" '.$checked.'/>'.$titles{$item}.  
                                   '</label></span>&nbsp; ';  
                 }                  }
                 $datatable .= '</td>';                  $datatable .= '</td>';
                 unless ($context eq 'requestcourses') {                  unless ($context eq 'requestcourses') {
Line 1328  sub print_quotas { Line 1277  sub print_quotas {
     $datatable .= '<tr'.$css_class.'>'.      $datatable .= '<tr'.$css_class.'>'.
                   '<td>'.$othertitle.'</td>'.                    '<td>'.$othertitle.'</td>'.
                   '<td class="LC_left_item">';                    '<td class="LC_left_item">';
       if ($context eq 'requestcourses') {
           $datatable .= '<table><tr>';
       }
       my %defcell;
     foreach my $item (@usertools) {      foreach my $item (@usertools) {
         my $checked;          if ($context eq 'requestcourses') {
         unless ($context eq 'requestcourses') {              my ($curroption,$currlimit);
             $checked = 'checked="checked" ';              if (ref($settings) eq 'HASH') {
         }                  if (ref($settings->{$item}) eq 'HASH') {
         if (ref($settings) eq 'HASH') {                      $curroption = $settings->{$item}->{'default'};
             if (ref($settings->{$item}) eq 'HASH') {                      if ($curroption =~ /^autolimit=(\d*)$/) {
                 if ($settings->{$item}->{'default'} == 0) {                          $currlimit = $1;
                     $checked = '';                      }
                 } elsif ($settings->{$item}->{'default'} == 1) {                  }
                     $checked = 'checked="checked" ';              }
               if (!$curroption) {
                   $curroption = 'norequest';
               }
               $datatable .= '<th>'.$titles{$item}.'</th>';
               foreach my $option (@options) {
                   my $val = $option;
                   if ($option eq 'norequest') {
                       $val = 0;
                   }
                   if ($option eq 'validate') {
                       my $canvalidate = 0;
                       if (ref($validations{$item}) eq 'HASH') {
                           if ($validations{$item}{'default'}) {
                               $canvalidate = 1;
                           }
                       }
                       next if (!$canvalidate);
                   }
                   my $checked = '';
                   if ($option eq $curroption) {
                       $checked = ' checked="checked"';
                   } elsif ($option eq 'autolimit') {
                       if ($curroption =~ /^autolimit/) {
                           $checked = ' checked="checked"';
                       }
                   }
                   $defcell{$item} .= '<span class="LC_nobreak"><label>'.
                                     '<input type="radio" name="crsreq_'.$item.
                                     '_default" value="'.$val.'"'.$checked.' />'.
                                     $titles{$option}.'</label>';
                   if ($option eq 'autolimit') {
                       $defcell{$item} .= '<input type="text" name="crsreq_'.
                                          $item.'_limit_default" size="1" '.
                                          'value="'.$currlimit.'" />';
                   }
                   $defcell{$item} .= '</span>&nbsp; ';
               }
           } else {
               my $checked = 'checked="checked" ';
               if (ref($settings) eq 'HASH') {
                   if (ref($settings->{$item}) eq 'HASH') {
                       if ($settings->{$item}->{'default'} == 0) {
                           $checked = '';
                       } elsif ($settings->{$item}->{'default'} == 1) {
                           $checked = 'checked="checked" ';
                       }
                 }                  }
             }              }
               $datatable .= '<span class="LC_nobreak"><label>'.
                             '<input type="checkbox" name="'.$context.'_'.$item.
                             '" value="default" '.$checked.'/>'.$titles{$item}.
                             '</label></span>&nbsp; ';
         }          }
         $datatable .= '<span class="LC_nobreak"><label>'.      }
                       '<input type="checkbox" name="'.$context.'_'.$item.      if ($context eq 'requestcourses') {
                       '" value="default" '.$checked.'/>'.$titles{$item}.          $datatable .= '</tr><tr>';
                       '</label></span>&nbsp; ';          foreach my $item (@usertools) {
               $datatable .= '<td>'.$defcell{$item}.'</td>';
           }
           $datatable .= '</tr></table>';
     }      }
     $datatable .= '</td>';      $datatable .= '</td>';
     unless ($context eq 'requestcourses') {      unless ($context eq 'requestcourses') {
Line 1357  sub print_quotas { Line 1363  sub print_quotas {
     $typecount ++;      $typecount ++;
     $css_class = $typecount%2?' class="LC_odd_row"':'';      $css_class = $typecount%2?' class="LC_odd_row"':'';
     $datatable .= '<tr'.$css_class.'>'.      $datatable .= '<tr'.$css_class.'>'.
                   '<td><br/>'.&mt('LON-CAPA Advanced Users').'</td>'.                    '<td>'.&mt('LON-CAPA Advanced Users').
                   '<td class="LC_left_item" colspan="2"><br />';                    ' <span class="LC_nobreak">('.
                     &mt('overrides affiliation').')</span></td>'.
                     '<td class="LC_left_item" colspan="2">';
       if ($context eq 'requestcourses') {
           $datatable .= '<table><tr>';
       } else {
           $datatable .= '<br />';
       }
       my %advcell;
     foreach my $item (@usertools) {      foreach my $item (@usertools) {
         my $checked;          if ($context eq 'requestcourses') {
         unless ($context eq 'requestcourses') {              my ($curroption,$currlimit);
             $checked = 'checked="checked" ';              if (ref($settings) eq 'HASH') {
         }                  if (ref($settings->{$item}) eq 'HASH') {
         if (ref($settings) eq 'HASH') {                      $curroption = $settings->{$item}->{'_LC_adv'};
             if (ref($settings->{$item}) eq 'HASH') {                      if ($curroption =~ /^autolimit=(\d*)$/) {
                 if ($settings->{$item}->{'_LC_adv'} == 0) {                          $currlimit = $1;
                     $checked = '';                      }
                 } elsif ($settings->{$item}->{'_LC_adv'} == 1) {                  }
                     $checked = 'checked="checked" ';              }
               if (!$curroption) {
                   $curroption = 'norequest';
               }
               $datatable .= '<th>'.$titles{$item}.'</th>';
               foreach my $option (@options) {
                   my $val = $option;
                   if ($option eq 'norequest') {
                       $val = 0;
                   }
                   if ($option eq 'validate') {
                       my $canvalidate = 0;
                       if (ref($validations{$item}) eq 'HASH') {
                           if ($validations{$item}{'_LC_adv'}) {
                               $canvalidate = 1;
                           }
                       }
                       next if (!$canvalidate);
                   }
                   my $checked = '';
                   if ($option eq $curroption) {
                       $checked = ' checked="checked"';
                   } elsif ($option eq 'autolimit') {
                       if ($curroption =~ /^autolimit/) {
                           $checked = ' checked="checked"';
                       }
                   }
                   $advcell{$item} .= '<span class="LC_nobreak"><label>'.
                                     '<input type="radio" name="crsreq_'.$item.
                                     '__LC_adv" value="'.$val.'"'.$checked.' />'.
                                     $titles{$option}.'</label>';
                   if ($option eq 'autolimit') {
                       $advcell{$item} .= '<input type="text" name="crsreq_'.
                                          $item.'_limit__LC_adv" size="1" '.
                                          'value="'.$currlimit.'" />';
                   }
                   $advcell{$item} .= '</span>&nbsp; ';
               }
           } else {
               my $checked = 'checked="checked" ';
               if (ref($settings) eq 'HASH') {
                   if (ref($settings->{$item}) eq 'HASH') {
                       if ($settings->{$item}->{'_LC_adv'} == 0) {
                           $checked = '';
                       } elsif ($settings->{$item}->{'_LC_adv'} == 1) {
                           $checked = 'checked="checked" ';
                       }
                 }                  }
             }              }
               $datatable .= '<span class="LC_nobreak"><label>'.
                             '<input type="checkbox" name="'.$context.'_'.$item.
                             '" value="_LC_adv" '.$checked.'/>'.$titles{$item}.
                             '</label></span>&nbsp; ';
         }          }
         $datatable .= '<span class="LC_nobreak"><label>'.  
                       '<input type="checkbox" name="'.$context.'_'.$item.  
                       '" value="_LC_adv" '.$checked.'/>'.$titles{$item}.  
                       '</label></span>&nbsp; ';  
     }      }
     $datatable .= '<span class="LC_nobreak">('.&mt('overrides affiliation').      if ($context eq 'requestcourses') {
                   ')</span></td></tr>';          $datatable .= '</tr><tr>';
           foreach my $item (@usertools) {
               $datatable .= '<td>'.$advcell{$item}.'</td>';
           }
           $datatable .= '</tr></table>';
       }
       $datatable .= '</td></tr>';
     $$rowtotal += $typecount;      $$rowtotal += $typecount;
     return $datatable;      return $datatable;
 }  }
   
   sub print_courserequestmail {
       my ($dom,$settings,$rowtotal) = @_;
       my ($now,$datatable,%dompersonnel,@domcoord,@currapprove,$rows);
       $now = time;
       $rows = 0;
       %dompersonnel = &Apache::lonnet::get_domain_roles($dom,['dc'],$now,$now);
       foreach my $server (keys(%dompersonnel)) {
           foreach my $user (sort(keys(%{$dompersonnel{$server}}))) {
               my ($trole,$uname,$udom,$runame,$rudom,$rsec) = split(/:/,$user);
               if (!grep(/^$uname:$udom$/,@domcoord)) {
                   push(@domcoord,$uname.':'.$udom);
               }
           }
       }
       if (ref($settings) eq 'HASH') {
           if (ref($settings->{'notify'}) eq 'HASH') {
               if ($settings->{'notify'}{'approval'} ne '') {
                  @currapprove = split(',',$settings->{'notify'}{'approval'});
               }
           }
       }
       if (@currapprove) {
           foreach my $dc (@currapprove) {
               unless (grep(/^\Q$dc\E$/,@domcoord)) {
                   push(@domcoord,$dc);
               }
           }
       }
       @domcoord = sort(@domcoord);
       my $numinrow = 4;
       my $numdc = @domcoord;
       my $css_class = 'class="LC_odd_row"';
       $datatable = '<tr'.$css_class.'>'.
                    ' <td>'.&mt('Receive notification of course requests requiring approval.').
                    ' </td>'.
                    ' <td class="LC_left_item">';
       if (@domcoord > 0) {
           $datatable .= '<table>';
           for (my $i=0; $i<$numdc; $i++) {
               my $rem = $i%($numinrow);
               if ($rem == 0) {
                   if ($i > 0) {
                       $datatable .= '</tr>';
                   }
                   $datatable .= '<tr>';
                   $rows ++;
               }
               my $check = ' ';
               if (grep(/^\Q$domcoord[$i]\E$/,@currapprove)) {
                   $check = ' checked="checked" ';
               }
               my ($uname,$udom) = split(':',$domcoord[$i]);
               my $fullname = &Apache::loncommon::plainname($uname,$udom);
               if ($i == $numdc-1) {
                   my $colsleft = $numinrow-$rem;
                   if ($colsleft > 1) {
                       $datatable .= '<td colspan="'.$colsleft.'" class="LC_left_item">';
                   } else {
                       $datatable .= '<td class="LC_left_item">';
                   }
               } else {
                   $datatable .= '<td class="LC_left_item">';
               }
               $datatable .= '<span class="LC_nobreak"><label>'.
                             '<input type="checkbox" name="reqapprovalnotify" '.
                             'value="'.$domcoord[$i].'"'.$check.'/>'.
                             $fullname.'</label></span></td>';
           }
           $datatable .= '</tr></table>';
       } else {
           $datatable .= &mt('There are no active Domain Coordinators');
           $rows ++;
       }
       $datatable .='</td></tr>';
       $$rowtotal += $rows;
       return $datatable;
   }
   
 sub print_autoenroll {  sub print_autoenroll {
     my ($dom,$settings,$rowtotal) = @_;      my ($dom,$settings,$rowtotal) = @_;
     my $autorun = &Apache::lonnet::auto_run(undef,$dom),      my $autorun = &Apache::lonnet::auto_run(undef,$dom),
Line 1562  sub print_directorysrch { Line 1706  sub print_directorysrch {
     $$rowtotal += 2;      $$rowtotal += 2;
     if (ref($usertypes) eq 'HASH') {      if (ref($usertypes) eq 'HASH') {
         if (keys(%{$usertypes}) > 0) {          if (keys(%{$usertypes}) > 0) {
             $datatable .= &users_cansearch_row($settings,$types,$usertypes,$dom,              $datatable .= &insttypes_row($settings,$types,$usertypes,$dom,
                                                $numinrow,$othertitle);                                           $numinrow,$othertitle,'cansearch');
             $cansrchrow = 1;              $cansrchrow = 1;
         }          }
     }      }
Line 1578  sub print_directorysrch { Line 1722  sub print_directorysrch {
     foreach my $title (@{$titleorder}) {      foreach my $title (@{$titleorder}) {
         if (defined($searchtitles->{$title})) {          if (defined($searchtitles->{$title})) {
             my $check = ' ';              my $check = ' ';
             if (ref($settings) eq 'HASH') {               if (ref($settings) eq 'HASH') {
                 if (ref($settings->{'searchby'}) eq 'ARRAY') {                  if (ref($settings->{'searchby'}) eq 'ARRAY') {
                     if (grep(/^\Q$title\E$/,@{$settings->{'searchby'}})) {                      if (grep(/^\Q$title\E$/,@{$settings->{'searchby'}})) {
                         $check = ' checked="checked" ';                          $check = ' checked="checked" ';
Line 1620  sub print_contacts { Line 1764  sub print_contacts {
     my $datatable;      my $datatable;
     my @contacts = ('adminemail','supportemail');      my @contacts = ('adminemail','supportemail');
     my (%checked,%to,%otheremails);      my (%checked,%to,%otheremails);
     my @mailings = ('errormail','packagesmail','helpdeskmail');      my @mailings = ('errormail','packagesmail','lonstatusmail','helpdeskmail',
                       'requestsmail');
     foreach my $type (@mailings) {      foreach my $type (@mailings) {
         $otheremails{$type} = '';          $otheremails{$type} = '';
     }      }
Line 1640  sub print_contacts { Line 1785  sub print_contacts {
                     }                      }
                     $otheremails{$type} = $settings->{$type}{'others'};                      $otheremails{$type} = $settings->{$type}{'others'};
                 }                  }
               } elsif ($type eq 'lonstatusmail') {
                   $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" ';
             }              }
         }          }
     } else {      } else {
Line 1647  sub print_contacts { Line 1794  sub print_contacts {
         $to{'adminemail'} = $Apache::lonnet::perlvar{'lonAdmEMail'};          $to{'adminemail'} = $Apache::lonnet::perlvar{'lonAdmEMail'};
         $checked{'errormail'}{'adminemail'} = ' checked="checked" ';          $checked{'errormail'}{'adminemail'} = ' checked="checked" ';
         $checked{'packagesmail'}{'adminemail'} = ' checked="checked" ';          $checked{'packagesmail'}{'adminemail'} = ' checked="checked" ';
         $checked{'helpdeskmail'}{'supportemail'} = ' checked="checked" ';           $checked{'helpdeskmail'}{'supportemail'} = ' checked="checked" ';
           $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; 
           $checked{'requestsmail'}{'adminemail'} = ' checked="checked" ';
     }      }
     my ($titles,$short_titles) = &contact_titles();      my ($titles,$short_titles) = &contact_titles();
     my $rownum = 0;      my $rownum = 0;
Line 1691  sub contact_titles { Line 1840  sub contact_titles {
                    'adminemail'   => 'Default Server Admin E-mail address',                     'adminemail'   => 'Default Server Admin E-mail address',
                    'errormail'    => 'Error reports to be e-mailed to',                     'errormail'    => 'Error reports to be e-mailed to',
                    'packagesmail' => 'Package update alerts to be e-mailed to',                     'packagesmail' => 'Package update alerts to be e-mailed to',
                    'helpdeskmail' => 'Helpdesk requests to be e-mailed to'                     'helpdeskmail' => 'Helpdesk requests to be e-mailed to',
                      'lonstatusmail' => 'E-mail from nightly status check (warnings/errors)',
                      'requestsmail' => 'E-mail from course requests requiring approval',
                  );                   );
     my %short_titles = &Apache::lonlocal::texthash (      my %short_titles = &Apache::lonlocal::texthash (
                            adminemail   => 'Admin E-mail address',                             adminemail   => 'Admin E-mail address',
Line 1702  sub contact_titles { Line 1853  sub contact_titles {
   
 sub tool_titles {  sub tool_titles {
     my %titles = &Apache::lonlocal::texthash (      my %titles = &Apache::lonlocal::texthash (
                      aboutme    => 'Personal Home Page',                       aboutme    => 'Personal Information Page',
                      blog       => 'Blog',                       blog       => 'Blog',
                      portfolio  => 'Portfolio',                       portfolio  => 'Portfolio',
                      official   => 'Official courses (with institutional codes)',                      unofficial => 'Unofficial courses',                       official   => 'Official courses (with institutional codes)',
                        unofficial => 'Unofficial courses',
                        community  => 'Communities',
                  );                   );
     return %titles;      return %titles;
 }  }
   
   sub courserequest_titles {
       my %titles = &Apache::lonlocal::texthash (
                                      official   => 'Official',
                                      unofficial => 'Unofficial',
                                      community  => 'Communities',
                                      norequest  => 'Not allowed',
                                      approve    => 'Approval by Dom. Coord.',
                                      validate   => 'With validation',
                                      autolimit  => 'Numerical limit',
                    );
       return %titles;
   }
   
   sub courserequest_conditions {
       my %conditions = &Apache::lonlocal::texthash (
          approve    => '(Processing of request subject to approval by Domain Coordinator).',
          validate   => '(Processing of request subject to instittutional validation).',
                    );
       return %conditions;
   }
   
   
 sub print_usercreation {  sub print_usercreation {
     my ($position,$dom,$settings,$rowtotal) = @_;      my ($position,$dom,$settings,$rowtotal) = @_;
     my $numinrow = 4;      my $numinrow = 4;
Line 1751  sub print_usercreation { Line 1926  sub print_usercreation {
             $rowcount ++;              $rowcount ++;
         }          }
     } elsif ($position eq 'middle') {      } elsif ($position eq 'middle') {
         my @creators = ('author','course','selfcreate');          my @creators = ('author','course','requestcrs','selfcreate');
         my ($rules,$ruleorder) =          my ($rules,$ruleorder) =
             &Apache::lonnet::inst_userrules($dom,'username');              &Apache::lonnet::inst_userrules($dom,'username');
         my %lt = &usercreation_types();          my %lt = &usercreation_types();
Line 1828  sub print_usercreation { Line 2003  sub print_usercreation {
             }              }
             $datatable .= '</td></tr>';              $datatable .= '</td></tr>';
         }          }
           my ($othertitle,$usertypes,$types) =
               &Apache::loncommon::sorted_inst_types($dom);
           if (ref($usertypes) eq 'HASH') {
               if (keys(%{$usertypes}) > 0) {
                   my $createsettings;
                   if (ref($settings) eq 'HASH') {
                       $createsettings = $settings->{cancreate};
                   }
                   $datatable .= &insttypes_row($createsettings,$types,$usertypes,
                                                $dom,$numinrow,$othertitle,
                                                'statustocreate');
                   $$rowtotal ++;
               }
           }
     } else {      } else {
         my @contexts = ('author','course','domain');          my @contexts = ('author','course','domain');
         my @authtypes = ('int','krb4','krb5','loc');          my @authtypes = ('int','krb4','krb5','loc');
Line 1940  sub usercreation_types { Line 2129  sub usercreation_types {
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                     author     => 'When adding a co-author',                      author     => 'When adding a co-author',
                     course     => 'When adding a user to a course',                      course     => 'When adding a user to a course',
                       requestcrs => 'When requesting a course',
                     selfcreate => 'User creates own account',                       selfcreate => 'User creates own account', 
                     any        => 'Any',                      any        => 'Any',
                     official   => 'Institutional only ',                      official   => 'Institutional only ',
Line 2081  sub print_scantronformat { Line 2271  sub print_scantronformat {
         %confhash);          %confhash);
     my $switchserver = &check_switchserver($dom,$confname);      my $switchserver = &check_switchserver($dom,$confname);
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                 default => 'Default scantron format file error',                  default => 'Default bubblesheet format file error',
                 custom  => 'Custom scantron format file error',                  custom  => 'Custom bubblesheet format file error',
              );               );
     my %scantronfiles = (      my %scantronfiles = (
         default => 'default.tab',          default => 'default.tab',
Line 2155  sub print_scantronformat { Line 2345  sub print_scantronformat {
                 }                  }
             }              }
         } else {          } else {
             $error{'default'} = &mt("Unable to copy default scantron formatfile to domain's RES space: [_1]",$switchserver);              $error{'default'} = &mt("Unable to copy default bubblesheet formatfile to domain's RES space: [_1]",$switchserver);
         }          }
     }      }
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
Line 2718  sub modifiable_userdata_row { Line 2908  sub modifiable_userdata_row {
     return $output;      return $output;
 }  }
   
 sub users_cansearch_row {  sub insttypes_row {
     my ($settings,$types,$usertypes,$dom,$numinrow,$othertitle) = @_;      my ($settings,$types,$usertypes,$dom,$numinrow,$othertitle,$context) = @_;
       my %lt = &Apache::lonlocal::texthash (
                         cansearch => 'Users allowed to search',
                         statustocreate => 'Institutional affiliation(s) able to create own account (login/SSO)',
                );
       my $showdom;
       if ($context eq 'cansearch') {
           $showdom = ' ('.$dom.')';
       }
     my $output =  '<tr class="LC_odd_row">'.      my $output =  '<tr class="LC_odd_row">'.
                   '<td>'.&mt('Users allowed to search').' ('.$dom.')'.                    '<td>'.$lt{$context}.$showdom.
                   '</td><td class="LC_left_item" colspan="2"><table>';                    '</td><td class="LC_left_item" colspan="2"><table>';
     my $rem;      my $rem;
     if (ref($types) eq 'ARRAY') {      if (ref($types) eq 'ARRAY') {
Line 2735  sub users_cansearch_row { Line 2933  sub users_cansearch_row {
                     $output .= '<tr>';                      $output .= '<tr>';
                 }                  }
                 my $check = ' ';                  my $check = ' ';
                 if (ref($settings->{'cansearch'}) eq 'ARRAY') {                  if (ref($settings) eq 'HASH') {
                     if (grep(/^\Q$types->[$i]\E$/,@{$settings->{'cansearch'}})) {                      if (ref($settings->{$context}) eq 'ARRAY') {
                           if (grep(/^\Q$types->[$i]\E$/,@{$settings->{$context}})) {
                               $check = ' checked="checked" ';
                           }
                       } elsif ($context eq 'statustocreate') {
                         $check = ' checked="checked" ';                          $check = ' checked="checked" ';
                     }                      }
                 }                  }
                 $output .= '<td class="LC_left_item">'.                  $output .= '<td class="LC_left_item">'.
                            '<span class="LC_nobreak"><label>'.                             '<span class="LC_nobreak"><label>'.
                            '<input type="checkbox" name="cansearch" '.                             '<input type="checkbox" name="'.$context.'" '.
                            'value="'.$types->[$i].'"'.$check.'/>'.                             'value="'.$types->[$i].'"'.$check.'/>'.
                            $usertypes->{$types->[$i]}.'</label></span></td>';                             $usertypes->{$types->[$i]}.'</label></span></td>';
             }              }
Line 2757  sub users_cansearch_row { Line 2959  sub users_cansearch_row {
         $output .= '<td class="LC_left_item">';          $output .= '<td class="LC_left_item">';
     }      }
     my $defcheck = ' ';      my $defcheck = ' ';
     if (ref($settings->{'cansearch'}) eq 'ARRAY') {      if (ref($settings) eq 'HASH') {  
         if (grep(/^default$/,@{$settings->{'cansearch'}})) {          if (ref($settings->{$context}) eq 'ARRAY') {
               if (grep(/^default$/,@{$settings->{$context}})) {
                   $defcheck = ' checked="checked" ';
               }
           } elsif ($context eq 'statustocreate') {
             $defcheck = ' checked="checked" ';              $defcheck = ' checked="checked" ';
         }          }
     }      }
     $output .= '<span class="LC_nobreak"><label>'.      $output .= '<span class="LC_nobreak"><label>'.
                '<input type="checkbox" name="cansearch" '.                 '<input type="checkbox" name="'.$context.'" '.
                'value="default"'.$defcheck.'/>'.                 'value="default"'.$defcheck.'/>'.
                $othertitle.'</label></span></td>'.                 $othertitle.'</label></span></td>'.
                '</tr></table></td></tr>';                 '</tr></table></td></tr>';
Line 2933  sub color_font_choices { Line 3139  sub color_font_choices {
             links => "Link colors",              links => "Link colors",
             images => "Images",              images => "Images",
             font => "Font color",              font => "Font color",
               fontmenu => "Font Menu",
             pgbg => "Page",              pgbg => "Page",
             tabbg => "Header",              tabbg => "Header",
             sidebg => "Border",              sidebg => "Border",
Line 2999  sub modify_colors { Line 3206  sub modify_colors {
             @bgs = ('pgbg','tabbg','sidebg');               @bgs = ('pgbg','tabbg','sidebg'); 
         }          }
         $confhash->{$role}{'font'} = $env{'form.'.$role.'_font'};          $confhash->{$role}{'font'} = $env{'form.'.$role.'_font'};
    $confhash->{$role}{'fontmenu'} = $env{'form.'.$role.'_fontmenu'};
         foreach my $item (@bgs,@links,@logintext) {          foreach my $item (@bgs,@links,@logintext) {
             $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item};              $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item};
         }          }
Line 3112  sub modify_colors { Line 3320  sub modify_colors {
                         $changes{$role}{'font'} = 1;                          $changes{$role}{'font'} = 1;
                     }                      }
                 }                  }
                   if ($domconfig->{$role}{'fontmenu'} ne '') {
                       if ($confhash->{$role}{'fontmenu'} ne $domconfig->{$role}{'fontmenu'}) {
                           $changes{$role}{'fontmenu'} = 1;
                       }
                   } else {
                       if ($confhash->{$role}{'fontmenu'}) {
                           $changes{$role}{'fontmenu'} = 1;
                       }
                   }
                 foreach my $item (@bgs) {                  foreach my $item (@bgs) {
                     if ($domconfig->{$role}{$item} ne '') {                      if ($domconfig->{$role}{$item} ne '') {
                         if ($confhash->{$role}{$item} ne $domconfig->{$role}{$item}) {                          if ($confhash->{$role}{$item} ne $domconfig->{$role}{$item}) {
Line 3541  sub check_switchserver { Line 3758  sub check_switchserver {
     return $switchserver;      return $switchserver;
 }  }
   
 sub javascript_set_colnums {  
     return <<END;  
 function setDisplayColumns() {  
     if (document.pickactions.width.value > 1100) {  
         document.pickactions.numcols[1].checked = true;  
     } else {  
         document.pickactions.numcols[0].checked = true;  
     }  
 }  
 END  
 }  
   
 sub modify_quotas {  sub modify_quotas {
     my ($dom,$action,%domconfig) = @_;      my ($dom,$action,%domconfig) = @_;
     my ($context,@usertools);      my ($context,@usertools,@options,%validations,%titles,%confhash,%toolshash,
           %limithash,$toolregexp,%conditions,$resulttext,%changes);
     if ($action eq 'quotas') {      if ($action eq 'quotas') {
         $context = 'tools';           $context = 'tools'; 
     } else {       } else { 
         $context = $action;          $context = $action;
     }      }
     if ($context eq 'requestcourses') {      if ($context eq 'requestcourses') {
         @usertools = ('official','unofficial');          @usertools = ('official','unofficial','community');
           @options =('norequest','approve','autolimit','validate');
           %validations = &Apache::lonnet::auto_courserequest_checks($dom);
           %titles = &courserequest_titles();
           $toolregexp = join('|',@usertools);
           %conditions = &courserequest_conditions();
     } else {      } else {
         @usertools = ('aboutme','blog','portfolio');          @usertools = ('aboutme','blog','portfolio');
           %titles = &tool_titles();
     }      }
     my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);      my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
     my ($resulttext,%changes);  
     my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);      my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
     my %titles = &tool_titles();  
     my (%confhash,%toolshash);  
     foreach my $key (keys(%env)) {      foreach my $key (keys(%env)) {
         unless ($context eq 'requestcourses') {          if ($context eq 'requestcourses') {
               if ($key =~ /^form\.crsreq_($toolregexp)_(.+)$/) {
                   my $item = $1;
                   my $type = $2;
                   if ($type =~ /^limit_(.+)/) {
                       $limithash{$item}{$1} = $env{$key};
                   } else {
                       $confhash{$item}{$type} = $env{$key};
                   }
               }
           } else {
             if ($key =~ /^form\.quota_(.+)$/) {              if ($key =~ /^form\.quota_(.+)$/) {
                 $confhash{'defaultquota'}{$1} = $env{$key};                  $confhash{'defaultquota'}{$1} = $env{$key};
             }              }
         }              if ($key =~ /^form\.\Q$context\E_(.+)$/) {
         if ($key =~ /^form\.\Q$context\E_(.+)$/) {                  @{$toolshash{$1}} = &Apache::loncommon::get_env_multiple($key);
             @{$toolshash{$1}} = &Apache::loncommon::get_env_multiple($key);              }
         }          }
     }      }
     unless ($context eq 'requestcourses') {      if ($context eq 'requestcourses') {
           my @approvalnotify = &Apache::loncommon::get_env_multiple('form.reqapprovalnotify');
           @approvalnotify = sort(@approvalnotify);
           $confhash{'notify'}{'approval'} = join(',',@approvalnotify);
           if (ref($domconfig{$action}) eq 'HASH') {
               if (ref($domconfig{$action}{'notify'}) eq 'HASH') {
                   if ($domconfig{$action}{'notify'}{'approval'} ne $confhash{'notify'}{'approval'}) {
                       $changes{'notify'}{'approval'} = 1;
                   }
               } else {
                   if ($domconfig{$action}{'notify'}{'approval'}) {
                       $changes{'notify'}{'approval'} = 1;
                   }
               }
           } else {
               if ($domconfig{$action}{'notify'}{'approval'}) {
                   $changes{'notify'}{'approval'} = 1;
               }
           }
       } else {
         $confhash{'defaultquota'}{'default'} = $env{'form.defaultquota'};          $confhash{'defaultquota'}{'default'} = $env{'form.defaultquota'};
     }      }
     foreach my $item (@usertools) {      foreach my $item (@usertools) {
         foreach my $type (@{$types},'default','_LC_adv') {          foreach my $type (@{$types},'default','_LC_adv') {
             if (grep(/^\Q$type\E$/,@{$toolshash{$item}})) {              if ($context eq 'requestcourses') {
                 $confhash{$item}{$type} = 1;                  if ($confhash{$item}{$type} eq 'autolimit') {
                       $confhash{$item}{$type} .= '=';
                       unless ($limithash{$item}{$type} =~ /\D/) {
                           $confhash{$item}{$type} .= $limithash{$item}{$type};
                       }
                   }
             } else {              } else {
                 $confhash{$item}{$type} = 0;                  if (grep(/^\Q$type\E$/,@{$toolshash{$item}})) {
                       $confhash{$item}{$type} = 1;
                   } else {
                       $confhash{$item}{$type} = 0;
                   }
             }              }
             if (ref($domconfig{$action}) eq 'HASH') {              if (ref($domconfig{$action}) eq 'HASH') {
                 if (ref($domconfig{$action}{$item}) eq 'HASH') {                  if (ref($domconfig{$action}{$item}) eq 'HASH') {
Line 3598  sub modify_quotas { Line 3845  sub modify_quotas {
                     }                      }
                 } else {                  } else {
                     if ($context eq 'requestcourses') {                      if ($context eq 'requestcourses') {
                         if ($confhash{$item}{$type}) {                          if ($confhash{$item}{$type} ne 'norequest') {
                             $changes{$item}{$type} = 1;                              $changes{$item}{$type} = 1;
                         }                          }
                     } else {                      } else {
Line 3609  sub modify_quotas { Line 3856  sub modify_quotas {
                 }                  }
             } else {              } else {
                 if ($context eq 'requestcourses') {                  if ($context eq 'requestcourses') {
                     if ($confhash{$item}{$type}) {                      if ($confhash{$item}{$type} eq 'norequest') {
                         $changes{$item}{$type} = 1;                          $changes{$item}{$type} = 1;
                     }                      }
                 } else {                  } else {
Line 3701  sub modify_quotas { Line 3948  sub modify_quotas {
                                                           $env{'user.domain'},                                                            $env{'user.domain'},
                                                           $item,'reload',$context);                                                            $item,'reload',$context);
                     if ($context eq 'requestcourses') {                      if ($context eq 'requestcourses') {
                         if ($env{'environment.canrequest.'.$item} ne $newacc) {                          if ($env{'environment.crsrequest.'.$item} ne $newacc) {
                             $newenv{'environment.canrequest.'.$item} = $newacc;                              $newenv{'environment.crsrequest.'.$item} = $newacc;
                         }                          }
                     } else {                      } else {
                         if ($env{'environment.availabletools.'.$item} ne $newacc) {                           if ($env{'environment.availabletools.'.$item} ne $newacc) { 
Line 3719  sub modify_quotas { Line 3966  sub modify_quotas {
                                 $typetitle = 'LON-CAPA Advanced Users';                                   $typetitle = 'LON-CAPA Advanced Users'; 
                             }                              }
                             if ($confhash{$item}{$type}) {                              if ($confhash{$item}{$type}) {
                                 $resulttext .= '<li>'.&mt('Set to be available to [_1]',$typetitle).'</li>';                                  if ($context eq 'requestcourses') {
                                       my $cond;
                                       if ($confhash{$item}{$type} =~ /^autolimit=(\d*)$/) {
                                           if ($1 eq '') {
                                               $cond = &mt('(Automatic processing of any request).');
                                           } else {
                                               $cond = &mt('(Automatic processing of requests up to limit of [quant,_1,request] per user).',$1);
                                           }
                                       } else { 
                                           $cond = $conditions{$confhash{$item}{$type}};
                                       }
                                       $resulttext .= '<li>'.&mt('Set to be available to [_1].',$typetitle).' '.$cond.'</li>';
                                   } else {
                                       $resulttext .= '<li>'.&mt('Set to be available to [_1]',$typetitle).'</li>';
                                   }
                             } else {                              } else {
                                 $resulttext .= '<li>'.&mt('Set to be unavailable to [_1]',$typetitle).'</li>';                                  $resulttext .= '<li>'.&mt('Set to be unavailable to [_1]',$typetitle).'</li>';
                             }                              }
Line 3728  sub modify_quotas { Line 3989  sub modify_quotas {
                     $resulttext .= '</ul></li>';                      $resulttext .= '</ul></li>';
                 }                  }
             }              }
               if ($action eq 'requestcourses') {
                   if (ref($changes{'notify'}) eq 'HASH') {
                       if ($changes{'notify'}{'approval'}) {
                           if (ref($confhash{'notify'}) eq 'HASH') {
                               if ($confhash{'notify'}{'approval'}) {
                                   $resulttext .= '<li>'.&mt('Notification of requests requiring approval will be sent to: ').$confhash{'notify'}{'approval'}.'</li>';
                               } else {
                                   $resulttext .= '<li>'.&mt('No Domain Coordinators will receive notification of course requests requiring approval.').'</li>';
                               }
                           }
                       }
                   }
               }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
             if (keys(%newenv)) {              if (keys(%newenv)) {
                 &Apache::lonnet::appenv(\%newenv);                  &Apache::lonnet::appenv(\%newenv);
Line 3736  sub modify_quotas { Line 4010  sub modify_quotas {
             if ($context eq 'requestcourses') {              if ($context eq 'requestcourses') {
                 $resulttext = &mt('No changes made to rights to request creation of courses.');                  $resulttext = &mt('No changes made to rights to request creation of courses.');
             } else {              } else {
                 $resulttext = &mt('No changes made to availability of home pages, blogs, portfolios or default quotas');                  $resulttext = &mt('No changes made to availability of personal information pages, blogs, portfolios or default quotas');
             }              }
         }          }
     } else {      } else {
Line 4120  sub modify_contacts { Line 4394  sub modify_contacts {
     }      }
     my (%others,%to);      my (%others,%to);
     my @contacts = ('supportemail','adminemail');      my @contacts = ('supportemail','adminemail');
     my @mailings = ('errormail','packagesmail','helpdeskmail');      my @mailings = ('errormail','packagesmail','helpdeskmail','lonstatusmail',
                       'requestsmail');
     foreach my $type (@mailings) {      foreach my $type (@mailings) {
         @{$newsetting{$type}} =           @{$newsetting{$type}} = 
             &Apache::loncommon::get_env_multiple('form.'.$type);              &Apache::loncommon::get_env_multiple('form.'.$type);
Line 4165  sub modify_contacts { Line 4440  sub modify_contacts {
         $default{'errormail'} = 'adminemail';          $default{'errormail'} = 'adminemail';
         $default{'packagesmail'} = 'adminemail';          $default{'packagesmail'} = 'adminemail';
         $default{'helpdeskmail'} = 'supportemail';          $default{'helpdeskmail'} = 'supportemail';
           $default{'lonstatusmail'} = 'adminemail';
           $default{'requestsmail'} = 'adminemail';
         foreach my $item (@contacts) {          foreach my $item (@contacts) {
            if ($to{$item} ne $default{$item}) {             if ($to{$item} ne $default{$item}) {
               $changes{$item} = 1;                $changes{$item} = 1;
Line 4231  sub modify_usercreation { Line 4508  sub modify_usercreation {
     my @username_rule = &Apache::loncommon::get_env_multiple('form.username_rule');      my @username_rule = &Apache::loncommon::get_env_multiple('form.username_rule');
     my @id_rule = &Apache::loncommon::get_env_multiple('form.id_rule');      my @id_rule = &Apache::loncommon::get_env_multiple('form.id_rule');
     my @email_rule = &Apache::loncommon::get_env_multiple('form.email_rule');      my @email_rule = &Apache::loncommon::get_env_multiple('form.email_rule');
     my @contexts = ('author','course','selfcreate');      my @contexts = ('author','course','requestcrs','selfcreate');
     foreach my $item(@contexts) {      foreach my $item(@contexts) {
         if ($item eq 'selfcreate') {          if ($item eq 'selfcreate') {
             @{$cancreate{$item}} = &Apache::loncommon::get_env_multiple('form.can_createuser_'.$item);              @{$cancreate{$item}} = &Apache::loncommon::get_env_multiple('form.can_createuser_'.$item);
Line 4247  sub modify_usercreation { Line 4524  sub modify_usercreation {
             $cancreate{$item} = $env{'form.can_createuser_'.$item};              $cancreate{$item} = $env{'form.can_createuser_'.$item};
         }          }
     }      }
       my ($othertitle,$usertypes,$types) = 
           &Apache::loncommon::sorted_inst_types($dom);
       if (ref($types) eq 'ARRAY') {
           if (@{$types} > 0) {
               @{$cancreate{'statustocreate'}} = 
                   &Apache::loncommon::get_env_multiple('form.statustocreate');
           }
           push(@contexts,'statustocreate');
       }
     if (ref($curr_usercreation{'cancreate'}) eq 'HASH') {      if (ref($curr_usercreation{'cancreate'}) eq 'HASH') {
         foreach my $item (@contexts) {          foreach my $item (@contexts) {
             if ($item eq 'selfcreate') {              if (($item eq 'selfcreate') || ($item eq 'statustocreate')) {
                 if (ref($curr_usercreation{'cancreate'}{$item}) eq 'ARRAY') {                   if (ref($curr_usercreation{'cancreate'}{$item}) eq 'ARRAY') {
                     foreach my $curr (@{$curr_usercreation{'cancreate'}{$item}}) {                      foreach my $curr (@{$curr_usercreation{'cancreate'}{$item}}) {
                         if (!grep(/^$curr$/,@{$cancreate{$item}})) {                          if (!grep(/^$curr$/,@{$cancreate{$item}})) {
                             if (!grep(/^$item$/,@{$changes{'cancreate'}})) {                              if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
Line 4426  sub modify_usercreation { Line 4712  sub modify_usercreation {
             if (ref($changes{'cancreate'}) eq 'ARRAY') {              if (ref($changes{'cancreate'}) eq 'ARRAY') {
                 my %lt = &usercreation_types();                  my %lt = &usercreation_types();
                 foreach my $type (@{$changes{'cancreate'}}) {                  foreach my $type (@{$changes{'cancreate'}}) {
                     my $chgtext =  $lt{$type}.', ';                      my $chgtext;
                       unless ($type eq 'statustocreate') {
                           $chgtext = $lt{$type}.', ';
                       }
                     if ($type eq 'selfcreate') {                      if ($type eq 'selfcreate') {
                         if (@{$cancreate{$type}} == 0) {                          if (@{$cancreate{$type}} == 0) {
                             $chgtext .= &mt('creation of a new user account is not permitted.');                              $chgtext .= &mt('creation of a new user account is not permitted.');
                         } else {                          } else {
                             $chgtext .= &mt('creation of a new account is permitted for:<ul>');                              $chgtext .= &mt('creation of a new account is permitted for:').'<ul>';
                             foreach my $case (@{$cancreate{$type}}) {                              foreach my $case (@{$cancreate{$type}}) {
                                 $chgtext .= '<li>'.$selfcreatetypes{$case}.'</li>';                                  $chgtext .= '<li>'.$selfcreatetypes{$case}.'</li>';
                             }                              }
                             $chgtext .= '</ul>';                              $chgtext .= '</ul>';
                               if (ref($cancreate{$type}) eq 'ARRAY') {
                                   if (grep(/^(login|sso)$/,@{$cancreate{$type}})) {
                                       if (ref($cancreate{'statustocreate'}) eq 'ARRAY') {
                                           if (@{$cancreate{'statustocreate'}} == 0) {
                                               $chgtext .= '<br /><span class="LC_warning">'.&mt("However, no institutional affiliations (including 'other') are currently permitted to create accounts.").'</span>';
                                           }
                                       }
                                   }
                               }
                           }
                       } elsif ($type eq 'statustocreate') {
                           if ((ref($cancreate{'selfcreate'}) eq 'ARRAY') &&
                               (ref($cancreate{'statustocreate'}) eq 'ARRAY')) {
                               if (@{$cancreate{'selfcreate'}} > 0) {
                                   if (@{$cancreate{'statustocreate'}} == 0) {
   
                                       $chgtext .= &mt("Institutional affiliations permitted to create accounts set to 'None'.");
                                       if (!grep(/^email$/,@{$cancreate{'selfcreate'}})) {
                                           $chgtext .= '<br /><span class="LC_warning">'.&mt("However, no institutional affiliations (including 'other') are currently permitted to create accounts.").'</span>';
                                       } 
                                   } elsif (ref($usertypes) eq 'HASH') {
                                       if (grep(/^(login|sso)$/,@{$cancreate{'selfcreate'}})) {
                                           $chgtext .= &mt('Creation of a new account for an institutional user is restricted to the following institutional affiliation(s):');
                                       } else {
                                           $chgtext .= &mt('Institutional affiliations permitted to create accounts with institutional authentication were set as follows:');
                                       }
                                       $chgtext .= '<ul>';
                                       foreach my $case (@{$cancreate{$type}}) {
                                           if ($case eq 'default') {
                                               $chgtext .= '<li>'.$othertitle.'</li>';
                                           } else {
                                               $chgtext .= '<li>'.$usertypes->{$case}.'</li>';
                                           }
                                       }
                                       $chgtext .= '</ul>';
                                       if (!grep(/^(login|sso)$/,@{$cancreate{'selfcreate'}})) {
                                           $chgtext .= '<br /><span class="LC_warning">'.&mt('However, users authenticated by institutional login/single sign on are not currently permitted to create accounts.').'</span>';
                                       }
                                   }
                               } else {
                                   if (@{$cancreate{$type}} == 0) {
                                       $chgtext .= &mt("Institutional affiliations permitted to create accounts were set to 'none'.");
                                   } else {
                                       $chgtext .= &mt('Although institutional affiliations permitted to create accounts were changed, self creation of accounts is not currently permitted for any authentication types.');
                                   }
                               }
                         }                          }
                     } else {                      } else {
                         if ($cancreate{$type} eq 'none') {                          if ($cancreate{$type} eq 'none') {
Line 4852  sub modify_coursecategories { Line 5187  sub modify_coursecategories {
     } else {      } else {
         $changes{'togglecats'} = 1;          $changes{'togglecats'} = 1;
         $changes{'categorize'} = 1;          $changes{'categorize'} = 1;
         $domconfig{'coursecategories'}{'togglecats'} = $env{'form.togglecats'};          $domconfig{'coursecategories'} = {
         $domconfig{'coursecategories'}{'categorize'} = $env{'form.categorize'};                                               togglecats => $env{'form.togglecats'},
                                                categorize => $env{'form.categorize'},
                                            };
     }      }
     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)) {

Removed from v.1.86  
changed lines
  Added in v.1.102


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