Diff for /loncom/interface/domainprefs.pm between versions 1.424 and 1.449

version 1.424, 2023/06/01 18:09:59 version 1.449, 2025/01/12 16:23:33
Line 95  about default quota sizes for portfolio Line 95  about default quota sizes for portfolio
 institutional affiliation in the domain (e.g., Faculty, Staff, Student etc.),   institutional affiliation in the domain (e.g., Faculty, Staff, Student etc.), 
 but is now also used to manage availability of user tools:   but is now also used to manage availability of user tools: 
 i.e., blogs, aboutme page, and portfolios, and the course request tool,  i.e., blogs, aboutme page, and portfolios, and the course request tool,
 used by course owners to request creation of a course, and to display/store  used by course owners to request creation of a course.
 default quota sizes for Authoring Spaces.  
   
 Outputs: 1  Outputs: 1
   
Line 105  $datatable  - HTML containing form eleme Line 104  $datatable  - HTML containing form eleme
 In the case of course requests, radio buttons are displayed for each institutional  In the case of course requests, radio buttons are displayed for each institutional
 affiliate type (and also default, and _LC_adv) for each of the course types   affiliate type (and also default, and _LC_adv) for each of the course types 
 (official, unofficial, community, textbook, placement, and lti).    (official, unofficial, community, textbook, placement, and lti).  
 In each case the radio buttons allow the selection of one of four values:    In each case the radio buttons allow the selection of one of four values:
   
 0, approval, validate, autolimit=N (where N is blank, or a positive integer).  0, approval, validate, autolimit=N (where N is blank, or a positive integer).
 which have the following effects:  which have the following effects:
Line 223  sub handler { Line 222  sub handler {
                 'coursedefaults','usersessions','loadbalancing',                  'coursedefaults','usersessions','loadbalancing',
                 'requestauthor','selfenrollment','inststatus',                  'requestauthor','selfenrollment','inststatus',
                 'ltitools','toolsec','ssl','trust','lti','ltisec',                  'ltitools','toolsec','ssl','trust','lti','ltisec',
                 'privacy','passwords','proctoring','wafproxy','ipaccess'],$dom);                  'privacy','passwords','proctoring','wafproxy',
                   'ipaccess','authordefaults'],$dom);
     my %encconfig =      my %encconfig =
         &Apache::lonnet::get_dom('encconfig',['ltitools','lti','proctoring','linkprot'],$dom,undef,1);          &Apache::lonnet::get_dom('encconfig',['ltitools','lti','proctoring','linkprot'],$dom,undef,1);
     my ($checked_is_home,$is_home);      my ($checked_is_home,$is_home);
Line 236  sub handler { Line 236  sub handler {
                     $is_home = 1;                      $is_home = 1;
                 }                  }
             }              }
             $checked_is_home = 1;               $checked_is_home = 1;
             foreach my $id (keys(%{$domconfig{'ltitools'}})) {              foreach my $id (keys(%{$domconfig{'ltitools'}})) {
                 if ((ref($domconfig{'ltitools'}{$id}) eq 'HASH') &&                  if ((ref($domconfig{'ltitools'}{$id}) eq 'HASH') &&
                     (ref($encconfig{'ltitools'}{$id}) eq 'HASH')) {                      (ref($encconfig{'ltitools'}{$id}) eq 'HASH')) {
Line 305  sub handler { Line 305  sub handler {
                        'contacts','privacy','usercreation','selfcreation',                         'contacts','privacy','usercreation','selfcreation',
                        'usermodification','scantron','requestcourses','requestauthor',                         'usermodification','scantron','requestcourses','requestauthor',
                        'coursecategories','serverstatuses','helpsettings','coursedefaults',                         'coursecategories','serverstatuses','helpsettings','coursedefaults',
                        'ltitools','proctoring','selfenrollment','usersessions','ssl',                         'authordefaults','ltitools','proctoring','selfenrollment',
                        'trust','lti');                         'usersessions','ssl','trust','lti');
     my %existing;      my %existing;
     if (ref($domconfig{'loadbalancing'}) eq 'HASH') {      if (ref($domconfig{'loadbalancing'}) eq 'HASH') {
         %existing = %{$domconfig{'loadbalancing'}};          %existing = %{$domconfig{'loadbalancing'}};
Line 382  sub handler { Line 382  sub handler {
                       modify => \&modify_passwords,                        modify => \&modify_passwords,
                     },                      },
         'quotas' =>           'quotas' => 
                     { text => 'Blogs, personal pages/timezones, webDAV/quotas, portfolio',                      { text => 'Blogs, personal pages/timezones, portfolio/quotas',
                       help => 'Domain_Configuration_Quotas',                        help => 'Domain_Configuration_Quotas',
                       header => [{col1 => 'User affiliation',                        header => [{col1 => 'User affiliation',
                                   col2 => 'Available tools',                                    col2 => 'Available tools',
                                   col3 => 'Quotas, MB; (Authoring requires role)',}],                                    col3 => 'Portfolio quota (MB)',}],
                       print => \&print_quotas,                        print => \&print_quotas,
                       modify => \&modify_quotas,                        modify => \&modify_quotas,
                     },                      },
Line 472  sub handler { Line 472  sub handler {
                     header => [{col1 => 'Target user has role',                      header => [{col1 => 'Target user has role',
                                 col2 => 'User information updatable in author context'},                                  col2 => 'User information updatable in author context'},
                                {col1 => 'Target user has role',                                 {col1 => 'Target user has role',
                                   col2 => 'User information updatable by co-author manager'},
                                  {col1 => 'Target user has role',
                                 col2 => 'User information updatable in course context'}],                                  col2 => 'User information updatable in course context'}],
                     print => \&print_usermodification,                      print => \&print_usermodification,
                     modify => \&modify_usermodification,                      modify => \&modify_usermodification,
Line 568  sub handler { Line 570  sub handler {
                   modify => \&modify_selfenrollment,                    modify => \&modify_selfenrollment,
                  },                   },
         'privacy' =>           'privacy' => 
                  {text   => 'Availability of User Information',                   {text   => 'Role assignments and user privacy',
                   help   => 'Domain_Configuration_User_Privacy',                    help   => 'Domain_Configuration_User_Privacy',
                   header => [{col1 => 'Role assigned in different domain',                    header => [{col1 => 'Role assigned in different domain',
                               col2 => 'Approval options'},                                col2 => 'Approval options'},
Line 604  sub handler { Line 606  sub handler {
                   print => \&print_loadbalancing,                    print => \&print_loadbalancing,
                   modify => \&modify_loadbalancing,                    modify => \&modify_loadbalancing,
                  },                   },
         'ltitools' =>           'ltitools' =>
                  {text => 'External Tools (LTI)',                   {text => 'External Tools (LTI)',
                   help => 'Domain_Configuration_LTI_Tools',                    help => 'Domain_Configuration_LTI_Tools',
                   header => [{col1 => 'Encryption of shared secrets',                    header => [{col1 => 'Encryption of shared secrets',
Line 662  sub handler { Line 664  sub handler {
                   print => \&print_trust,                    print => \&print_trust,
                   modify => \&modify_trust,                    modify => \&modify_trust,
                  },                   },
           'lti' =>          'lti' =>
                  {text => 'LTI Link Protection and LTI Consumers',                   {text => 'LTI Link Protection and LTI Consumers',
                   help => 'Domain_Configuration_LTI_Provider',                    help => 'Domain_Configuration_LTI_Provider',
                   header => [{col1 => 'Encryption of shared secrets',                    header => [{col1 => 'Encryption of shared secrets',
                               col2 => 'Settings'},                                col2 => 'Settings'},
                              {col1 => 'Rules for shared secrets',                                {col1 => 'Rules for shared secrets',
                               col2 => 'Settings'},                                col2 => 'Settings'},
                                {col1 => 'Link Protectors in Courses',
                                 col2 => 'Values'},
                              {col1 => 'Link Protectors',                               {col1 => 'Link Protectors',
                               col2 => 'Settings'},                                col2 => 'Settings'},
                              {col1 => 'Consumers',                               {col1 => 'Consumers',
Line 676  sub handler { Line 680  sub handler {
                   print => \&print_lti,                    print => \&print_lti,
                   modify => \&modify_lti,                    modify => \&modify_lti,
                  },                   },
            'ipaccess' =>          'ipaccess' =>
                        {text => 'IP-based access control',                         {text => 'IP-based access control',
                         help => 'Domain_Configuration_IP_Access',                          help => 'Domain_Configuration_IP_Access',
                         header => [{col1 => 'Setting',                          header => [{col1 => 'Setting',
Line 684  sub handler { Line 688  sub handler {
                         print  => \&print_ipaccess,                          print  => \&print_ipaccess,
                         modify => \&modify_ipaccess,                          modify => \&modify_ipaccess,
                        },                         },
           'authordefaults' =>
                               {text => 'Authoring Space defaults',
                                help => 'Domain_Configuration_Author_Defaults',
                                header => [{col1 => 'Defaults which can be overridden by Author',
                                            col2 => 'Settings',},
                                           {col1 => 'Defaults which can be overridden by a Dom. Coord.',
                                            col2 => 'Settings',},],
                                print => \&print_authordefaults,
                                modify => \&modify_authordefaults,
                               },
     );      );
     if (keys(%servers) > 1) {      if (keys(%servers) > 1) {
         $prefs{'login'}  = { text   => 'Log-in page options',          $prefs{'login'}  = { text   => 'Log-in page options',
Line 882  sub process_changes { Line 896  sub process_changes {
     } elsif ($action eq 'lti') {      } elsif ($action eq 'lti') {
         $output = &modify_lti($r,$dom,$action,$lastactref,%domconfig);          $output = &modify_lti($r,$dom,$action,$lastactref,%domconfig);
     } elsif ($action eq 'privacy') {      } elsif ($action eq 'privacy') {
         $output = &modify_privacy($dom,%domconfig);          $output = &modify_privacy($dom,$lastactref,%domconfig);
     } elsif ($action eq 'passwords') {      } elsif ($action eq 'passwords') {
         $output = &modify_passwords($r,$dom,$confname,$lastactref,%domconfig);          $output = &modify_passwords($r,$dom,$confname,$lastactref,%domconfig);
     } elsif ($action eq 'wafproxy') {      } elsif ($action eq 'wafproxy') {
         $output = &modify_wafproxy($dom,$action,$lastactref,%domconfig);          $output = &modify_wafproxy($dom,$action,$lastactref,%domconfig);
     } elsif ($action eq 'ipaccess') {      } elsif ($action eq 'ipaccess') {
         $output = &modify_ipaccess($dom,$lastactref,%domconfig);          $output = &modify_ipaccess($dom,$lastactref,%domconfig);
       } elsif ($action eq 'authordefaults') {
           $output = &modify_authordefaults($dom,$lastactref,%domconfig);
     }      }
     return $output;      return $output;
 }  }
Line 917  sub print_config_box { Line 933  sub print_config_box {
         &Apache::lonuserutils::custom_role_privs(\%privs,\%full,\%levels,\%levelscurrent);          &Apache::lonuserutils::custom_role_privs(\%privs,\%full,\%levels,\%levelscurrent);
         my @templateroles = &Apache::lonuserutils::custom_template_roles($context,$crstype);          my @templateroles = &Apache::lonuserutils::custom_template_roles($context,$crstype);
         $output =          $output =
             &Apache::lonuserutils::custom_roledefs_js($context,$crstype,$formname,\%full,               &Apache::lonuserutils::custom_roledefs_js($context,$crstype,$formname,\%full,
                                                       \@templateroles);                                                        \@templateroles);
     } elsif ($action eq 'ltitools') {      } elsif ($action eq 'ltitools') {
         $output .= &Apache::lonconfigsettings::ltitools_javascript($settings);          $output .= &Apache::lonconfigsettings::ltitools_javascript($settings);
Line 936  sub print_config_box { Line 952  sub print_config_box {
         $output .= &saml_javascript();          $output .= &saml_javascript();
     } elsif ($action eq 'ipaccess') {      } elsif ($action eq 'ipaccess') {
         $output .= &ipaccess_javascript($settings);          $output .= &ipaccess_javascript($settings);
       } elsif ($action eq 'authordefaults') {
           $output .= &authordefaults_javascript();
     }      }
     $output .=      $output .=
          '<table class="LC_nested_outer">           '<table class="LC_nested_outer">
Line 978  sub print_config_box { Line 996  sub print_config_box {
             ($action eq 'selfenrollment') || ($action eq 'usersessions') || ($action eq 'ssl') ||              ($action eq 'selfenrollment') || ($action eq 'usersessions') || ($action eq 'ssl') ||
             ($action eq 'directorysrch') || ($action eq 'trust') || ($action eq 'helpsettings') ||              ($action eq 'directorysrch') || ($action eq 'trust') || ($action eq 'helpsettings') ||
             ($action eq 'contacts') || ($action eq 'privacy') || ($action eq 'wafproxy') ||              ($action eq 'contacts') || ($action eq 'privacy') || ($action eq 'wafproxy') ||
             ($action eq 'lti') || ($action eq 'ltitools')) {              ($action eq 'lti') || ($action eq 'ltitools') || ($action eq 'authordefaults')) {
             $output .= $item->{'print'}->('top',$dom,$settings,\$rowtotal);              $output .= $item->{'print'}->('top',$dom,$settings,\$rowtotal);
         } elsif ($action eq 'passwords') {          } elsif ($action eq 'passwords') {
             $output .= $item->{'print'}->('top',$dom,$confname,$settings,\$rowtotal);              $output .= $item->{'print'}->('top',$dom,$confname,$settings,\$rowtotal);
Line 1015  sub print_config_box { Line 1033  sub print_config_box {
             ($action eq 'usersessions') || ($action eq 'coursecategories') ||               ($action eq 'usersessions') || ($action eq 'coursecategories') || 
             ($action eq 'trust') || ($action eq 'contacts') || ($action eq 'defaults') ||              ($action eq 'trust') || ($action eq 'contacts') || ($action eq 'defaults') ||
             ($action eq 'privacy') || ($action eq 'passwords') || ($action eq 'lti') ||              ($action eq 'privacy') || ($action eq 'passwords') || ($action eq 'lti') ||
             ($action eq 'ltitools')) {              ($action eq 'ltitools') || ($action eq 'usermodification')) {
             if ($action eq 'coursecategories') {              if ($action eq 'coursecategories') {
                 $output .= &print_coursecategories('middle',$dom,$item,$settings,\$rowtotal);                  $output .= &print_coursecategories('middle',$dom,$item,$settings,\$rowtotal);
                 $colspan = ' colspan="2"';                  $colspan = ' colspan="2"';
Line 1023  sub print_config_box { Line 1041  sub print_config_box {
                 $output .= $item->{'print'}->('shared',$dom,$settings,\$rowtotal);                  $output .= $item->{'print'}->('shared',$dom,$settings,\$rowtotal);
             } elsif ($action eq 'passwords') {              } elsif ($action eq 'passwords') {
                 $output .= $item->{'print'}->('middle',$dom,$confname,$settings,\$rowtotal);                  $output .= $item->{'print'}->('middle',$dom,$confname,$settings,\$rowtotal);
               } elsif ($action eq 'lti') {
                   $output .= $item->{'print'}->('upper',$dom,$settings,\$rowtotal).'
                              </table>
                             </td>
                            </tr>
                            <tr>
                             <td>
                             <table class="LC_nested">
                              <tr class="LC_info_row">
                               <td class="LC_left_item"'.$colspan.'>'.&mt($item->{'header'}->[2]->{'col1'}).'</td>
                               <td class="LC_right_item">'.&mt($item->{'header'}->[2]->{'col2'}).'</td>
                              </tr>'."\n".
                              $item->{'print'}->('middle',$dom,$settings,\$rowtotal);
             } else {              } else {
                 $output .= $item->{'print'}->('middle',$dom,$settings,\$rowtotal);                  $output .= $item->{'print'}->('middle',$dom,$settings,\$rowtotal);
             }              }
Line 1055  sub print_config_box { Line 1086  sub print_config_box {
               <td class="LC_right_item"'.$colspan.'>'.&mt($item->{'header'}->[8]->{'col2'}).'</td></tr>'.                <td class="LC_right_item"'.$colspan.'>'.&mt($item->{'header'}->[8]->{'col2'}).'</td></tr>'.
                            $item->{'print'}->('bottom',$dom,$settings,\$rowtotal);                             $item->{'print'}->('bottom',$dom,$settings,\$rowtotal);
             } else {              } else {
                   my $hdridx = 2;
                   if ($action eq 'lti') {
                       $hdridx = 3;
                   }
                 $output .= '                  $output .= '
            </table>             </table>
           </td>            </td>
Line 1063  sub print_config_box { Line 1098  sub print_config_box {
            <td>             <td>
             <table class="LC_nested">              <table class="LC_nested">
              <tr class="LC_info_row">               <tr class="LC_info_row">
               <td class="LC_left_item"'.$colspan.'>'.&mt($item->{'header'}->[2]->{'col1'}).'</td>                <td class="LC_left_item"'.$colspan.'>'.&mt($item->{'header'}->[$hdridx]->{'col1'}).'</td>
               <td class="LC_right_item">'.&mt($item->{'header'}->[2]->{'col2'}).'</td>                <td class="LC_right_item">'.&mt($item->{'header'}->[$hdridx]->{'col2'}).'</td>
              </tr>'."\n";               </tr>'."\n";
                 if ($action eq 'coursecategories') {                  if ($action eq 'coursecategories') {
                     $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal);                      $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal);
Line 1075  sub print_config_box { Line 1110  sub print_config_box {
                     } else {                      } else {
                         $output .= $item->{'print'}->('lower',$dom,$settings,\$rowtotal);                          $output .= $item->{'print'}->('lower',$dom,$settings,\$rowtotal);
                     }                      }
                       $hdridx ++;
                     $output .= '                      $output .= '
              </tr>               </tr>
             </table>              </table>
Line 1084  sub print_config_box { Line 1120  sub print_config_box {
            <td>             <td>
             <table class="LC_nested">              <table class="LC_nested">
              <tr class="LC_info_row">               <tr class="LC_info_row">
               <td class="LC_left_item'.$leftnobr.'"'.$colspan.'>'.&mt($item->{'header'}->[3]->{'col1'}).'</td>                <td class="LC_left_item'.$leftnobr.'"'.$colspan.'>'.&mt($item->{'header'}->[$hdridx]->{'col1'}).'</td>
               <td class="LC_right_item"'.$colspan.'>'.&mt($item->{'header'}->[3]->{'col2'}).'</td></tr>'."\n";                <td class="LC_right_item"'.$colspan.'>'.&mt($item->{'header'}->[$hdridx]->{'col2'}).'</td></tr>'."\n";
                     if ($action eq 'passwords') {                      if ($action eq 'passwords') {
                         $output .= $item->{'print'}->('bottom',$dom,$confname,$settings,\$rowtotal);                          $output .= $item->{'print'}->('bottom',$dom,$confname,$settings,\$rowtotal);
                     } else {                      } else {
Line 1101  sub print_config_box { Line 1137  sub print_config_box {
                 }                  }
             }              }
             $rowtotal ++;              $rowtotal ++;
         } elsif (($action eq 'usermodification') || ($action eq 'coursedefaults') ||          } elsif (($action eq 'coursedefaults') || ($action eq 'authordefaults') ||
                  ($action eq 'directorysrch') || ($action eq 'helpsettings') ||                   ($action eq 'directorysrch') || ($action eq 'helpsettings') ||
                  ($action eq 'wafproxy')) {                   ($action eq 'wafproxy')) {
             $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal);              $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal);
Line 1973  sub commblocktype_text { Line 2009  sub commblocktype_text {
         'passwd' => 'Change Password',          'passwd' => 'Change Password',
         'grades' => 'Gradebook',          'grades' => 'Gradebook',
         'search' => 'Course search',          'search' => 'Course search',
           'index'  => 'Course content index',
         'wishlist' => 'Stored links',          'wishlist' => 'Stored links',
         'annotate' => 'Annotations',          'annotate' => 'Annotations',
     );      );
     my $typeorder = ['com','chat','boards','port','groups','blogs','about','wishlist','printout','grades','search','annotate','passwd'];      my $typeorder = ['com','chat','boards','port','groups','blogs','about','wishlist','printout','grades','search','index','annotate','passwd'];
     return ($typeorder,\%types);      return ($typeorder,\%types);
 }  }
   
Line 1985  sub print_rolecolors { Line 2022  sub print_rolecolors {
     my %choices = &color_font_choices();      my %choices = &color_font_choices();
     my @bgs = ('pgbg','tabbg','sidebg');      my @bgs = ('pgbg','tabbg','sidebg');
     my @links = ('link','alink','vlink');      my @links = ('link','alink','vlink');
     my @images = ('img');      my @images = ();
     my %alt_text = &Apache::lonlocal::texthash(img => "Banner for $role role");      my %alt_text = &Apache::lonlocal::texthash(img => "Banner for $role role");
     my %designhash = &Apache::loncommon::get_domainconf($dom);      my %designhash = &Apache::loncommon::get_domainconf($dom);
     my %defaultdesign = %Apache::loncommon::defaultdesign;      my %defaultdesign = %Apache::loncommon::defaultdesign;
Line 1993  sub print_rolecolors { Line 2030  sub print_rolecolors {
     my %defaults = &role_defaults($role,\@bgs,\@links,\@images);      my %defaults = &role_defaults($role,\@bgs,\@links,\@images);
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         if (ref($settings->{$role}) eq 'HASH') {          if (ref($settings->{$role}) eq 'HASH') {
             if ($settings->{$role}->{'img'} ne '') {  
                 $designs{'img'} = $settings->{$role}->{'img'};  
                 $is_custom{'img'} = 1;  
             }  
             if ($settings->{$role}->{'font'} ne '') {              if ($settings->{$role}->{'font'} ne '') {
                 $designs{'font'} = $settings->{$role}->{'font'};                  $designs{'font'} = $settings->{$role}->{'font'};
                 $is_custom{'font'} = 1;                  $is_custom{'font'} = 1;
Line 2019  sub print_rolecolors { Line 2052  sub print_rolecolors {
             }              }
         }          }
     } else {      } else {
         if ($designhash{$dom.'.'.$role.'.img'} ne '') {  
             $designs{img} = $designhash{$dom.'.'.$role.'.img'};  
             $is_custom{'img'} = 1;  
         }  
         if ($designhash{$dom.'.'.$role.'.fontmenu'} ne '') {          if ($designhash{$dom.'.'.$role.'.fontmenu'} ne '') {
             $designs{fontmenu} = $designhash{$dom.'.'.$role.'.fontmenu'};              $designs{fontmenu} = $designhash{$dom.'.'.$role.'.fontmenu'};
             $is_custom{'fontmenu'} = 1;               $is_custom{'fontmenu'} = 1; 
Line 2072  sub role_defaults { Line 2101  sub role_defaults {
         }          }
     } else {      } else {
         %defaults = (          %defaults = (
                        img => $defaultdesign{$role.'.img'},  
                        font => $defaultdesign{$role.'.font'},                         font => $defaultdesign{$role.'.font'},
                        fontmenu => $defaultdesign{$role.'.fontmenu'},                         fontmenu => $defaultdesign{$role.'.fontmenu'},
                     );                      );
Line 2397  sub print_quotas { Line 2425  sub print_quotas {
     } else {      } else {
         $context = $action;          $context = $action;
     }      }
     my ($datatable,$defaultquota,$authorquota,@usertools,@options,%validations);      my ($datatable,$defaultquota,@usertools,@options,%validations);
     my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);      my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
     my $typecount = 0;      my $typecount = 0;
     my ($css_class,%titles);      my ($css_class,%titles);
Line 2411  sub print_quotas { Line 2439  sub print_quotas {
         @options = ('norequest','approval','automatic');          @options = ('norequest','approval','automatic');
         %titles = &authorrequest_titles();          %titles = &authorrequest_titles();
     } else {      } else {
         @usertools = ('aboutme','blog','webdav','portfolio','timezone');          @usertools = ('aboutme','blog','portfolio','portaccess','timezone');
         %titles = &tool_titles();          %titles = &tool_titles();
     }      }
     if (ref($types) eq 'ARRAY') {      if (ref($types) eq 'ARRAY') {
         foreach my $type (@{$types}) {          foreach my $type (@{$types}) {
             my ($currdefquota,$currauthorquota);              my $currdefquota;
             unless (($context eq 'requestcourses') ||              unless (($context eq 'requestcourses') ||
                     ($context eq 'requestauthor')) {                      ($context eq 'requestauthor')) {
                 if (ref($settings) eq 'HASH') {                  if (ref($settings) eq 'HASH') {
Line 2425  sub print_quotas { Line 2453  sub print_quotas {
                     } else {                      } else {
                         $currdefquota = $settings->{$type};                          $currdefquota = $settings->{$type};
                     }                      }
                     if (ref($settings->{authorquota}) eq 'HASH') {  
                         $currauthorquota = $settings->{authorquota}->{$type};  
                     }  
                 }                  }
             }              }
             if (defined($usertypes->{$type})) {              if (defined($usertypes->{$type})) {
Line 2545  sub print_quotas { Line 2570  sub print_quotas {
                         ($context eq 'requestauthor')) {                          ($context eq 'requestauthor')) {
                     $datatable .=                       $datatable .= 
                               '<td class="LC_right_item">'.                                '<td class="LC_right_item">'.
                               '<span class="LC_nobreak">'.&mt('Portfolio').':&nbsp;'.                                '<span class="LC_nobreak">'.
                               '<input type="text" name="quota_'.$type.                                '<input type="text" name="quota_'.$type.
                               '" value="'.$currdefquota.                                '" value="'.$currdefquota.
                               '" size="5" /></span>'.('&nbsp;' x 2).  
                               '<span class="LC_nobreak">'.&mt('Authoring').':&nbsp;'.  
                               '<input type="text" name="authorquota_'.$type.  
                               '" value="'.$currauthorquota.  
                               '" size="5" /></span></td>';                                '" size="5" /></span></td>';
                 }                  }
                 $datatable .= '</tr>';                  $datatable .= '</tr>';
Line 2560  sub print_quotas { Line 2581  sub print_quotas {
     }      }
     unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) {      unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) {
         $defaultquota = '20';          $defaultquota = '20';
         $authorquota = '500';  
         if (ref($settings) eq 'HASH') {          if (ref($settings) eq 'HASH') {
             if (ref($settings->{'defaultquota'}) eq 'HASH') {              if (ref($settings->{'defaultquota'}) eq 'HASH') {
                 $defaultquota = $settings->{'defaultquota'}->{'default'};                  $defaultquota = $settings->{'defaultquota'}->{'default'};
             } elsif (defined($settings->{'default'})) {              } elsif (defined($settings->{'default'})) {
                 $defaultquota = $settings->{'default'};                  $defaultquota = $settings->{'default'};
             }              }
             if (ref($settings->{'authorquota'}) eq 'HASH') {  
                 $authorquota = $settings->{'authorquota'}->{'default'};  
             }  
         }          }
     }      }
     $typecount ++;      $typecount ++;
Line 2681  sub print_quotas { Line 2698  sub print_quotas {
     $datatable .= '</td>';      $datatable .= '</td>';
     unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) {      unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) {
         $datatable .= '<td class="LC_right_item">'.          $datatable .= '<td class="LC_right_item">'.
                       '<span class="LC_nobreak">'.&mt('Portfolio').':&nbsp;'.                        '<span class="LC_nobreak">'.
                       '<input type="text" name="defaultquota" value="'.                        '<input type="text" name="defaultquota" value="'.
                       $defaultquota.'" size="5" /></span>'.('&nbsp;' x2).                        $defaultquota.'" size="5" /></span></td>';
                       '<span class="LC_nobreak">'.&mt('Authoring').':&nbsp;'.  
                       '<input type="text" name="authorquota" value="'.  
                       $authorquota.'" size="5" /></span></td>';  
     }      }
     $datatable .= '</tr>';      $datatable .= '</tr>';
     $typecount ++;      $typecount ++;
Line 3553  sub lti_toggle_js { Line 3567  sub lti_toggle_js {
     my %servers = &Apache::lonnet::get_servers($dom,'library');      my %servers = &Apache::lonnet::get_servers($dom,'library');
     my $primary = &Apache::lonnet::domain($dom,'primary');      my $primary = &Apache::lonnet::domain($dom,'primary');
     my $course_servers = "'".join("','",keys(%servers))."'";      my $course_servers = "'".join("','",keys(%servers))."'";
   
     return <<"ENDSCRIPT";      return <<"ENDSCRIPT";
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
Line 3652  function toggleLTI(form,setting,item) { Line 3665  function toggleLTI(form,setting,item) {
                            break;                             break;
                        }                         }
                    }                     }
                }                  }
             }              }
             if (!setvis) {              if (!setvis) {
                 if (document.getElementById(divid)) {                  if (document.getElementById(divid)) {
Line 3729  function toggleLTI(form,setting,item) { Line 3742  function toggleLTI(form,setting,item) {
         var divid = 'lti_menufield_'+item;          var divid = 'lti_menufield_'+item;
         var setvis = '';          var setvis = '';
         for (var i=0; i<menus.length; i++) {          for (var i=0; i<menus.length; i++) {
             var radioname = menus[i];                var radioname = menus[i];
             var num = form.elements[radioname].length;              var num = form.elements[radioname].length;
             if (num) {              if (num) {
                 for (var j=0; j<num; j++) {                  for (var j=0; j<num; j++) {
Line 3837  sub saml_javascript { Line 3850  sub saml_javascript {
     return <<"ENDSCRIPT";      return <<"ENDSCRIPT";
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
 function toggleSamlOptions(form,hostid) {   function toggleSamlOptions(form,hostid) {
     var radioname = 'saml_'+hostid;      var radioname = 'saml_'+hostid;
     var tablecellon = 'samloptionson_'+hostid;      var tablecellon = 'samloptionson_'+hostid;
     var tablecelloff = 'samloptionsoff_'+hostid;      var tablecelloff = 'samloptionsoff_'+hostid;
     var num = form.elements[radioname].length;      var num = form.elements[radioname].length;
     if (num) {      if (num) {
         var setvis = '';           var setvis = '';
         for (var i=0; i<num; i++) {          for (var i=0; i<num; i++) {
             if (form.elements[radioname][i].checked) {              if (form.elements[radioname][i].checked) {
                 if (form.elements[radioname][i].value == '1') {                   if (form.elements[radioname][i].value == '1') {
                     if (document.getElementById(tablecellon)) {                      if (document.getElementById(tablecellon)) {
                         document.getElementById(tablecellon).style.display='';                          document.getElementById(tablecellon).style.display='';
                     }                      }
Line 3943  $jstext Line 3956  $jstext
 ENDSCRIPT  ENDSCRIPT
 }  }
   
   sub authordefaults_javascript {
       my %alert = &Apache::lonlocal::texthash (
                       reqd => 'Warning: at least one editor needs to be available.',
                       rest => 'Unchecking this editor disallowed while others unchecked.',
       );
       &js_escape(\%alert);
       return <<"ENDSCRIPT";
   <script type="text/javascript">
   // <![CDATA[
   
   function checkEditors(form,checkbox,current) {
       if (form.elements[checkbox].length != undefined) {
           var count = 0;
           for (var i=0; i<form.elements[checkbox].length; i++) {
               if (form.elements[checkbox][i].checked) {
                   count ++;
               }
           }
           if (count == 0) {
               if (current.type =='radio') {
                   current.checked = true;
                   alert('$alert{reqd}\\n$alert{rest}');
               }
           }
       }
       return;
   }
   // ]]>
   </script>
   
   ENDSCRIPT
   }
   
 sub print_autoenroll {  sub print_autoenroll {
     my ($dom,$settings,$rowtotal) = @_;      my ($dom,$settings,$rowtotal) = @_;
     my $autorun = &Apache::lonnet::auto_run(undef,$dom),      my $autorun = &Apache::lonnet::auto_run(undef,$dom),
Line 4614  sub print_contacts { Line 4660  sub print_contacts {
                 map {$excluded{$_} = 1; } @{$lonstatus{'excluded'}};                  map {$excluded{$_} = 1; } @{$lonstatus{'excluded'}};
             }              }
         }          }
         foreach my $item ('errorthreshold','errorsysmail') {           foreach my $item ('errorthreshold','errorsysmail') {
             $css_class = $rownum%2?' class="LC_odd_row"':'';              $css_class = $rownum%2?' class="LC_odd_row"':'';
             $datatable .= '<tr'.$css_class.'>'.              $datatable .= '<tr'.$css_class.'>'.
                           '<td class="LC_left_item"><span class="LC_nobreak">'.                            '<td class="LC_left_item"><span class="LC_nobreak">'.
Line 4696  sub print_contacts { Line 4742  sub print_contacts {
                             $includeloc{'override_'.$key} = '';                              $includeloc{'override_'.$key} = '';
                             $includestr{'override_'.$key} = '';                              $includestr{'override_'.$key} = '';
                             if ($settings->{'overrides'}{$key}{'include'} ne '') {                              if ($settings->{'overrides'}{$key}{'include'} ne '') {
                                 ($includeloc{'override_'.$key},$includestr{'override_'.$key}) =                                   ($includeloc{'override_'.$key},$includestr{'override_'.$key}) =
                                     split(/:/,$settings->{'overrides'}{$key}{'include'},2);                                      split(/:/,$settings->{'overrides'}{$key}{'include'},2);
                                 $includestr{'override_'.$key} = &unescape($includestr{'override_'.$key});                                  $includestr{'override_'.$key} = &unescape($includestr{'override_'.$key});
                             }                              }
Line 4708  sub print_contacts { Line 4754  sub print_contacts {
             my $optionsprefix = 'LC_options_helpdesk_';              my $optionsprefix = 'LC_options_helpdesk_';
   
             my $onclicktypes = "toggleHelpdeskRow(this.form,'overrides','$customclass','$optionsprefix');";              my $onclicktypes = "toggleHelpdeskRow(this.form,'overrides','$customclass','$optionsprefix');";
    
             $datatable .= &insttypes_row($settings,$types,$usertypes,$dom,              $datatable .= &insttypes_row($settings,$types,$usertypes,$dom,
                                          $numinrow,$othertitle,'overrides',                                           $numinrow,$othertitle,'overrides',
                                          \$rownum,$onclicktypes,$customclass);                                           \$rownum,$onclicktypes,$customclass);
Line 4775  sub overridden_helpdesk { Line 4820  sub overridden_helpdesk {
             }              }
             my $title;              my $title;
             if (ref($short_titles) eq 'HASH') {              if (ref($short_titles) eq 'HASH') {
                 $title = $short_titles->{$item};                   $title = $short_titles->{$item};
             }              }
             $output .= '<label>'.              $output .= '<label>'.
                        '<input type="checkbox" name="override_'.$type.'"'.$check.                         '<input type="checkbox" name="override_'.$type.'"'.$check.
Line 4854  function toggleHelpdeskRow(form,checkbox Line 4899  function toggleHelpdeskRow(form,checkbox
     return;      return;
 }  }
   
   
 // ]]>  // ]]>
 </script>  </script>
   
Line 5365  sub ltitools_names { Line 5409  sub ltitools_names {
                                           'key'            => 'Key',                                            'key'            => 'Key',
                                           'lifetime'       => 'Nonce lifetime (s)',                                            'lifetime'       => 'Nonce lifetime (s)',
                                           'secret'         => 'Secret',                                            'secret'         => 'Secret',
                                           'icon'           => 'Icon',                                               'icon'           => 'Icon',
                                           'user'           => 'User',                                            'user'           => 'User',
                                           'fullname'       => 'Full Name',                                            'fullname'       => 'Full Name',
                                           'firstname'      => 'First Name',                                            'firstname'      => 'First Name',
Line 5383  sub ltitools_names { Line 5427  sub ltitools_names {
                                           'roster'         => 'Tool can retrieve roster:',                                            'roster'         => 'Tool can retrieve roster:',
                                           'crstarget'      => 'Display target',                                            'crstarget'      => 'Display target',
                                           'crslabel'       => 'Course label',                                            'crslabel'       => 'Course label',
                                           'crstitle'       => 'Course title',                                             'crstitle'       => 'Course title',
                                           'crslinktext'    => 'Link Text',                                            'crslinktext'    => 'Link Text',
                                           'crsexplanation' => 'Explanation',                                            'crsexplanation' => 'Explanation',
                                           'crsappend'      => 'Provider URL',                                            'crsappend'      => 'Provider URL',
Line 6146  sub print_lti { Line 6190  sub print_lti {
     my ($position,$dom,$settings,$rowtotal) = @_;      my ($position,$dom,$settings,$rowtotal) = @_;
     my $itemcount = 1;      my $itemcount = 1;
     my ($datatable,$css_class);      my ($datatable,$css_class);
     my (%rules,%encrypt,%privkeys,%linkprot);      my (%rules,%encrypt,%privkeys,%linkprot,%suggestions);
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         if ($position eq 'top') {          if ($position eq 'top') {
             if (exists($settings->{'encrypt'})) {              if (exists($settings->{'encrypt'})) {
Line 6169  sub print_lti { Line 6213  sub print_lti {
                     }                      }
                 }                  }
             }              }
         } elsif ($position eq 'middle') {          } elsif ($position eq 'upper') {
             if (exists($settings->{'rules'})) {              if (exists($settings->{'rules'})) {
                 if (ref($settings->{'rules'}) eq 'HASH') {                  if (ref($settings->{'rules'}) eq 'HASH') {
                     %rules = %{$settings->{'rules'}};                      %rules = %{$settings->{'rules'}};
                 }                  }
             }              }
           } elsif ($position eq 'middle') {
               if (exists($settings->{'suggested'})) {
                   if (ref($settings->{'suggested'}) eq 'HASH') {
                       %suggestions = %{$settings->{'suggested'}};
                   }
               }
         } elsif ($position eq 'lower') {          } elsif ($position eq 'lower') {
             if (exists($settings->{'linkprot'})) {              if (exists($settings->{'linkprot'})) {
                 if (ref($settings->{'linkprot'}) eq 'HASH') {                  if (ref($settings->{'linkprot'}) eq 'HASH') {
Line 6185  sub print_lti { Line 6235  sub print_lti {
                 }                  }
             }              }
         } else {          } else {
             foreach my $key ('encrypt','private','rules','linkprot') {              foreach my $key ('encrypt','private','rules','linkprot','suggestions') {
                 if (exists($settings->{$key})) {                  if (exists($settings->{$key})) {
                     delete($settings->{$key});                      delete($settings->{$key});
                 }                  }
Line 6194  sub print_lti { Line 6244  sub print_lti {
     }      }
     if ($position eq 'top') {      if ($position eq 'top') {
         $datatable = &secrets_form($dom,'ltisec',\%encrypt,\%privkeys,$rowtotal);          $datatable = &secrets_form($dom,'ltisec',\%encrypt,\%privkeys,$rowtotal);
     } elsif ($position eq 'middle') {      } elsif ($position eq 'upper') {
         $datatable = &password_rules('ltisecrets',\$itemcount,\%rules);          $datatable = &password_rules('ltisecrets',\$itemcount,\%rules);
         $$rowtotal += $itemcount;          $$rowtotal += $itemcount;
       } elsif ($position eq 'middle') {
           $datatable = &linkprot_suggestions(\%suggestions,\$itemcount);
           $$rowtotal += $itemcount;
     } elsif ($position eq 'lower') {      } elsif ($position eq 'lower') {
          $datatable .= &Apache::courseprefs::print_linkprotection($dom,'',$settings,$rowtotal,'','','domain');          $datatable .= &Apache::courseprefs::print_linkprotection($dom,'',$settings,$rowtotal,'','','domain');
     } else {      } else {
         my ($switchserver,$switchmessage);          my ($switchserver,$switchmessage);
         $switchserver = &check_switchserver($dom);          $switchserver = &check_switchserver($dom);
Line 6323  sub print_lti { Line 6376  sub print_lti {
                             '<label><input type="checkbox" name="lti_visible_'.$i.'" id="lti_visible_'.$i.'" onclick="if (this.checked) { this.form.lti_secret_'.$i.'.type='."'text'".' } else { this.form.lti_secret_'.$i.'.type='."'password'".' }" />'.&mt('Visible input').'</label>';                              '<label><input type="checkbox" name="lti_visible_'.$i.'" id="lti_visible_'.$i.'" onclick="if (this.checked) { this.form.lti_secret_'.$i.'.type='."'text'".' } else { this.form.lti_secret_'.$i.'.type='."'password'".' }" />'.&mt('Visible input').'</label>';
                     }                      }
                 }                  }
                 $datatable .= '<br /><br />'.                   $datatable .= '<br /><br />'.
                     '<span class="LC_nobreak">'.$lt{'requser'}.':'.                      '<span class="LC_nobreak">'.$lt{'requser'}.':'.
                     '<label><input type="radio" name="lti_requser_'.$i.'" value="1"'.$onclickrequser.$checkedrequser{yes}.' />'.&mt('Yes').'</label>&nbsp;'."\n".                      '<label><input type="radio" name="lti_requser_'.$i.'" value="1"'.$onclickrequser.$checkedrequser{yes}.' />'.&mt('Yes').'</label>&nbsp;'."\n".
                     '<label><input type="radio" name="lti_requser_'.$i.'" value="0"'.$onclickrequser.$checkedrequser{no}.' />'.&mt('No').'</label></span>'."\n".                      '<label><input type="radio" name="lti_requser_'.$i.'" value="0"'.$onclickrequser.$checkedrequser{no}.' />'.&mt('No').'</label></span>'."\n".
Line 6449  sub lti_options { Line 6502  sub lti_options {
         if (($current->{'mapuser'} ne '') && ($current->{'mapuser'} ne 'lis_person_sourcedid')) {          if (($current->{'mapuser'} ne '') && ($current->{'mapuser'} ne 'lis_person_sourcedid')) {
             $checked{'mapuser'}{'sourcedid'} = '';              $checked{'mapuser'}{'sourcedid'} = '';
             if ($current->{'mapuser'} eq 'lis_person_contact_email_primary') {              if ($current->{'mapuser'} eq 'lis_person_contact_email_primary') {
                 $checked{'mapuser'}{'email'} = ' checked="checked"';                   $checked{'mapuser'}{'email'} = ' checked="checked"';
             } else {              } else {
                 $checked{'mapuser'}{'other'} = ' checked="checked"';                  $checked{'mapuser'}{'other'} = ' checked="checked"';
                 $userfield = $current->{'mapuser'};                  $userfield = $current->{'mapuser'};
Line 6459  sub lti_options { Line 6512  sub lti_options {
         if (($current->{'mapcrs'} ne '') && ($current->{'mapcrs'} ne 'course_offering_sourcedid')) {          if (($current->{'mapcrs'} ne '') && ($current->{'mapcrs'} ne 'course_offering_sourcedid')) {
             $checked{'mapcrs'}{'course_offering_sourcedid'} = '';              $checked{'mapcrs'}{'course_offering_sourcedid'} = '';
             if ($current->{'mapcrs'} eq 'context_id') {              if ($current->{'mapcrs'} eq 'context_id') {
                 $checked{'mapcrs'}{'context_id'} = ' checked="checked"';                   $checked{'mapcrs'}{'context_id'} = ' checked="checked"';
             } else {              } else {
                 $checked{'mapcrs'}{'other'} = ' checked="checked"';                  $checked{'mapcrs'}{'other'} = ' checked="checked"';
                 $cidfield = $current->{'mapcrs'};                  $cidfield = $current->{'mapcrs'};
Line 6487  sub lti_options { Line 6540  sub lti_options {
             $checked{'lcauth'}{$1} = ' checked="checked"';              $checked{'lcauth'}{$1} = ' checked="checked"';
             unless (($current->{'lcauth'} eq 'lti') || ($current->{'lcauth'} eq 'internal')) {              unless (($current->{'lcauth'} eq 'lti') || ($current->{'lcauth'} eq 'internal')) {
                 $lcauthparm = $current->{'lcauthparm'};                  $lcauthparm = $current->{'lcauthparm'};
                 $lcauthparmstyle = 'display:table-row';                   $lcauthparmstyle = 'display:table-row';
                 if ($current->{'lcauth'} eq 'localauth') {                  if ($current->{'lcauth'} eq 'localauth') {
                     $lcauthparmtext = &mt('Local auth argument');                      $lcauthparmtext = &mt('Local auth argument');
                 } else {                  } else {
Line 6504  sub lti_options { Line 6557  sub lti_options {
             %rolemaps = %{$current->{'maproles'}};              %rolemaps = %{$current->{'maproles'}};
         }          }
         if ($current->{'section'} ne '') {          if ($current->{'section'} ne '') {
             $checked{'crssec'}{'Y'} = '  checked="checked"';               $checked{'crssec'}{'Y'} = '  checked="checked"';
             $crssecfieldsty = 'inline-block';              $crssecfieldsty = 'inline-block';
             if ($current->{'section'} eq 'course_section_sourcedid') {              if ($current->{'section'} eq 'course_section_sourcedid') {
                 $checked{'crssecsrc'}{'sourcedid'} = ' checked="checked"';                  $checked{'crssecsrc'}{'sourcedid'} = ' checked="checked"';
Line 6550  sub lti_options { Line 6603  sub lti_options {
         $checked{'crssec'}{'N'} = ' checked="checked"';          $checked{'crssec'}{'N'} = ' checked="checked"';
         $checked{'callback'}{'N'} = ' checked="checked"';          $checked{'callback'}{'N'} = ' checked="checked"';
         $checked{'topmenu'}{'N'} = ' checked="checked"';          $checked{'topmenu'}{'N'} = ' checked="checked"';
         $checked{'inlinemenu'}{'Y'} = ' checked="checked"';           $checked{'inlinemenu'}{'Y'} = ' checked="checked"';
         $checked{'menuitem'}{'grades'} = ' checked="checked"';          $checked{'menuitem'}{'grades'} = ' checked="checked"';
         $menusty = 'inline-block';           $menusty = 'inline-block';
     }      }
     my @coursetypes = ('official','unofficial','community','textbook','placement','lti');      my @coursetypes = ('official','unofficial','community','textbook','placement','lti');
     my %coursetypetitles = &Apache::lonlocal::texthash (      my %coursetypetitles = &Apache::lonlocal::texthash (
Line 6605  sub lti_options { Line 6658  sub lti_options {
                '<fieldset class="ltioption_usr_'.$num.'" style="display:'.$optionsty.'"><legend>'.&mt('Roles which may create user accounts').'</legend>';                 '<fieldset class="ltioption_usr_'.$num.'" style="display:'.$optionsty.'"><legend>'.&mt('Roles which may create user accounts').'</legend>';
     foreach my $ltirole (@ltiroles) {      foreach my $ltirole (@ltiroles) {
         $output .= '<span class="LC_nobreak"><label><input type="checkbox" name="lti_makeuser_'.$num.'" value="'.$ltirole.'"'.          $output .= '<span class="LC_nobreak"><label><input type="checkbox" name="lti_makeuser_'.$num.'" value="'.$ltirole.'"'.
                    $checked{'makeuser'}{$ltirole}.' />'.$ltirole.'</label>&nbsp;</span> ';                          $checked{'makeuser'}{$ltirole}.' />'.$ltirole.'</label>&nbsp;</span> ';
     }      }
     $output .= '</fieldset>'.      $output .= '</fieldset>'.
                '<fieldset class="ltioption_usr_'.$num.'" style="display:'.$optionsty.'"><legend>'.&mt('New user accounts created for LTI users').'</legend>'.                 '<fieldset class="ltioption_usr_'.$num.'" style="display:'.$optionsty.'"><legend>'.&mt('New user accounts created for LTI users').'</legend>'.
Line 6737  sub lti_options { Line 6790  sub lti_options {
         if ($extra eq 'passback') {          if ($extra eq 'passback') {
             $pb1p1chk = ' checked="checked"';              $pb1p1chk = ' checked="checked"';
             $pb1p0chk = '';              $pb1p0chk = '';
             $onclickpb = ' onclick="toggleLTI(this.form,'."'passback','$num'".');"';               $onclickpb = ' onclick="toggleLTI(this.form,'."'passback','$num'".');"';
         } else {          } else {
             $onclickpb = '';               $onclickpb = '';
         }          }
         if (ref($current) eq 'HASH') {          if (ref($current) eq 'HASH') {
             if (($current->{$extra})) {              if (($current->{$extra})) {
Line 6785  sub ltimenu_titles { Line 6838  sub ltimenu_titles {
     );      );
 }  }
   
 sub check_switchserver {  sub linkprot_suggestions {
     my ($home) = @_;      my ($suggested,$itemcount) = @_;
     my $switchserver;      my $count = 0;
     if ($home ne '') {      my $next = 1;
         my $allowed;      my %lt = &Apache::lonlocal::texthash(
         my @ids=&Apache::lonnet::current_machine_ids();                                            'name' => 'Suggested Launcher',
         foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }                                            'info' => 'Recommendations',
         if (!$allowed) {                                          );
             $switchserver='<a href="/adm/switchserver?otherserver='.$home.'&amp;role='.      my ($datatable,$css_class,$dest);
                           &HTML::Entities::encode($env{'request.role'},'\'<>"&').      if (ref($suggested) eq 'HASH') {
                           '&amp;destinationurl=/adm/domainprefs">'.&mt('Switch Server').'</a>';          my @current = sort { $a <=> $b } keys(%{$suggested});
           $next += $current[-1];
           for (my $i=0; $i<@current; $i++) {
               my $num = $current[$i];
               my %values;
               if (ref($suggested->{$num}) eq 'HASH') {
                   %values = %{$suggested->{$num}};
               } else {
                   next;
               }
               $css_class = $$itemcount%2?' class="LC_odd_row"':'';
               $datatable .=
                   '<tr '.$css_class.'><td><span class="LC_nobreak">'."\n".
                   '<label><input type="checkbox" name="linkprot_suggested_del" value="'.$i.'" />'."\n".
                   &mt('Delete?').'</label></span></td><td>'."\n".
                   '<div class="LC_floatleft"><fieldset><legend>'.$lt{'name'}.'</legend>'."\n".
                   '<input type="text" size="15" name="linkprot_suggested_name_'.$i.'" value="'.$values{'name'}.'" autocomplete="off" />'."\n".
                   '</fieldset></div>'.
                   '<div class="LC_floatleft"><fieldset><legend>'.$lt{'info'}.'</legend>'."\n".
                   '<textarea cols="55" rows="5" name="linkprot_suggested_info_'.$i.'">'.$values{'info'}.'</textarea>'.
                   '</fieldset></div>'.
                   '<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n".
                   '<input type="hidden" name="linkprot_suggested_id_'.$i.'" value="'.$num.'" /></td></tr>'."\n";
               $$itemcount ++;
         }          }
     }      }
     return $switchserver;      $css_class = $$itemcount%2?' class="LC_odd_row"':'';
       $datatable .= '<tr '.$css_class.'><td><span class="LC_nobreak">'."\n".
                     '<input type="hidden" name="linkprot_suggested_maxnum" value="'.$next.'" />'."\n".
                     '<input type="checkbox" name="linkprot_suggested_add" value="1" />'.&mt('Add').'</span></td>'."\n".
                     '<td>'."\n".
                     '<div class="LC_floatleft"><fieldset><legend>'.$lt{'name'}.'</legend>'."\n".
                     '<input type="text" size="15" name="linkprot_suggested_name_add" value="" autocomplete="off" />'."\n".
                     '</fieldset></div>'.
                     '<div class="LC_floatleft"><fieldset><legend>'.$lt{'info'}.'</legend>'."\n".
                     '<textarea cols="55" rows="5" name="linkprot_suggested_info_add"></textarea>'.
                     '</fieldset></div>'.
                     '<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n".
                     '</td></tr>'."\n";
       return $datatable;
 }  }
   
 sub print_coursedefaults {  sub print_coursedefaults {
Line 6808  sub print_coursedefaults { Line 6897  sub print_coursedefaults {
     my %choices =  &Apache::lonlocal::texthash (      my %choices =  &Apache::lonlocal::texthash (
         canuse_pdfforms      => 'Course/Community users can create/upload PDF forms',          canuse_pdfforms      => 'Course/Community users can create/upload PDF forms',
         uploadquota          => 'Default quota for files uploaded directly to course/community using Course Editor (MB)',          uploadquota          => 'Default quota for files uploaded directly to course/community using Course Editor (MB)',
           coursequota          => 'Default cumulative quota for all group portfolio spaces in course (MB)',
         anonsurvey_threshold => 'Responder count needed before showing submissions for anonymous surveys',          anonsurvey_threshold => 'Responder count needed before showing submissions for anonymous surveys',
         coursecredits        => 'Credits can be specified for courses',          coursecredits        => 'Credits can be specified for courses',
         uselcmath            => 'Math preview uses LON-CAPA previewer (javascript) in place of DragMath (Java)',          uselcmath            => 'Math preview uses LON-CAPA previewer (javascript) in place of DragMath (Java)',
Line 6820  sub print_coursedefaults { Line 6910  sub print_coursedefaults {
         ltiauth              => 'Student username in LTI launch of deep-linked URL can be accepted without re-authentication',          ltiauth              => 'Student username in LTI launch of deep-linked URL can be accepted without re-authentication',
         domexttool           => 'External Tools defined in the domain may be used in courses/communities (by type)',          domexttool           => 'External Tools defined in the domain may be used in courses/communities (by type)',
         exttool              => 'External Tools can be defined and configured in courses/communities (by type)',          exttool              => 'External Tools can be defined and configured in courses/communities (by type)',
           crsauthor            => 'Standard LON-CAPA problems can be created within a course/community (by type)',
           crseditors           => 'Available editors for web pages and/or problems created in a course/community',
     );      );
     my %staticdefaults = (      my %staticdefaults = (
                            anonsurvey_threshold => 10,                             anonsurvey_threshold => 10,
                            uploadquota          => 500,                             uploadquota          => 500,
                              coursequota          => 20,
                            postsubmit           => 60,                             postsubmit           => 60,
                            mysqltables          => 172800,                             mysqltables          => 172800,
                            domexttool           => 1,                             domexttool           => 1,
                            exttool              => 0,                             exttool              => 0,
                              crsauthor            => 1,
                              crseditors           => ['edit','xml'],  
                          );                           );
     if ($position eq 'top') {      if ($position eq 'top') {
         %defaultchecked = (          %defaultchecked = (
Line 6941  sub print_coursedefaults { Line 7036  sub print_coursedefaults {
         $itemcount ++;          $itemcount ++;
     } else {      } else {
         $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';          $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';
         my ($currdefresponder,%defcredits,%curruploadquota,%deftimeout,%currmysql);          my ($currdefresponder,%defcredits,%curruploadquota,%currcoursequota,
               %deftimeout,%currmysql);
         my $currusecredits = 0;          my $currusecredits = 0;
         my $postsubmitclient = 1;          my $postsubmitclient = 1;
         my $ltiauth = 0;          my $ltiauth = 0;
         my %domexttool;          my %domexttool;
         my %exttool;          my %exttool;
           my %crsauthor;
           my %crseditors;
         my @types = ('official','unofficial','community','textbook','placement');          my @types = ('official','unofficial','community','textbook','placement');
         if (ref($settings) eq 'HASH') {          if (ref($settings) eq 'HASH') {
             if ($settings->{'ltiauth'}) {              if ($settings->{'ltiauth'}) {
Line 6972  sub print_coursedefaults { Line 7070  sub print_coursedefaults {
                     }                      }
                 }                  }
             }              }
               if (ref($settings->{'crsauthor'}) eq 'HASH') {
                   foreach my $type (@types) {
                       if ($settings->{'crsauthor'}->{$type}) {
                           $crsauthor{$type} = ' checked="checked"';
                       }
                   }
               } else {
                   foreach my $type (@types) {
                       if ($staticdefaults{'crsauthor'}) {
                           $crsauthor{$type} = ' checked="checked"';
                       }
                   }
               }
               if (ref($settings->{'crseditors'}) eq 'ARRAY') {
                   foreach my $editor (@{$settings->{'crseditors'}}) {
                       $crseditors{$editor} = ' checked="checked"';
                   }
               } else {
                   foreach my $editor (@{$staticdefaults{'crseditors'}}) {
                       $crseditors{$editor} = ' checked="checked"';
                   }
               }
             $currdefresponder = $settings->{'anonsurvey_threshold'};              $currdefresponder = $settings->{'anonsurvey_threshold'};
             if (ref($settings->{'uploadquota'}) eq 'HASH') {              if (ref($settings->{'uploadquota'}) eq 'HASH') {
                 foreach my $type (keys(%{$settings->{'uploadquota'}})) {                  foreach my $type (keys(%{$settings->{'uploadquota'}})) {
                     $curruploadquota{$type} = $settings->{'uploadquota'}{$type};                      $curruploadquota{$type} = $settings->{'uploadquota'}{$type};
                 }                  }
             }              }
               if (ref($settings->{'coursequota'}) eq 'HASH') {
                   foreach my $type (keys(%{$settings->{'coursequota'}})) {
                       $currcoursequota{$type} = $settings->{'coursequota'}{$type};
                   }
               }
             if (ref($settings->{'coursecredits'}) eq 'HASH') {              if (ref($settings->{'coursecredits'}) eq 'HASH') {
                 foreach my $type (@types) {                  foreach my $type (@types) {
                     next if ($type eq 'community');                      next if ($type eq 'community');
Line 7026  sub print_coursedefaults { Line 7151  sub print_coursedefaults {
                 if ($staticdefaults{'domexttool'}) {                  if ($staticdefaults{'domexttool'}) {
                     $domexttool{$type} = ' checked="checked"';                      $domexttool{$type} = ' checked="checked"';
                 }                  }
                   if ($staticdefaults{'crsauthor'}) {
                       $crsauthor{$type} = ' checked="checked"';
                   }
               }
               foreach my $editor (@{$staticdefaults{'crseditors'}}) {
                   $crseditors{$editor} = ' checked="checked"';
             }              }
         }          }
         if (!$currdefresponder) {          if (!$currdefresponder) {
Line 7037  sub print_coursedefaults { Line 7168  sub print_coursedefaults {
             if ($curruploadquota{$type} eq '') {              if ($curruploadquota{$type} eq '') {
                 $curruploadquota{$type} = $staticdefaults{'uploadquota'};                  $curruploadquota{$type} = $staticdefaults{'uploadquota'};
             }              }
               if ($currcoursequota{$type} eq '') {
                   $currcoursequota{$type} = $staticdefaults{'coursequota'};
               }
         }          }
         $datatable .=          $datatable .=
                 '<tr'.$css_class.'><td><span class="LC_nobreak">'.                  '<tr'.$css_class.'><td><span class="LC_nobreak">'.
Line 7060  sub print_coursedefaults { Line 7194  sub print_coursedefaults {
         }          }
         $datatable .= '</tr></table></td></tr>'."\n";          $datatable .= '</tr></table></td></tr>'."\n";
         $itemcount ++;          $itemcount ++;
           $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';
           $datatable .= '<tr'.$css_class.'><td><span class="LC_nobreak">'.
                         $choices{'coursequota'}.
                         '</span></td>'.
                         '<td style="text-align: right" class="LC_right_item">'.
                         '<table><tr>';
           foreach my $type (@types) {
               $datatable .= '<td style="text-align: center">'.&mt($type).'<br />'.
                              '<input type="text" name="coursequota_'.$type.'"'.
                              ' value="'.$currcoursequota{$type}.'" size="5" /></td>';
           }
           $datatable .= '</tr></table></td></tr>'."\n";
           $itemcount ++;
         my $onclick = "toggleDisplay(this.form,'credits');";          my $onclick = "toggleDisplay(this.form,'credits');";
         my $display = 'none';          my $display = 'none';
         if ($currusecredits) {          if ($currusecredits) {
Line 7138  sub print_coursedefaults { Line 7285  sub print_coursedefaults {
         foreach my $type (@types) {          foreach my $type (@types) {
             $datatable .= '<td style="text-align: left">'.              $datatable .= '<td style="text-align: left">'.
                           '<span class="LC_nobreak">'.                            '<span class="LC_nobreak">'.
                           '<input type="checkbox" name="domexttool"'.                            '<label><input type="checkbox" name="domexttool"'.
                           ' value="'.$type.'"'.$domexttool{$type}.' />'.                            ' value="'.$type.'"'.$domexttool{$type}.' />'.
                           &mt($type).'</span></td>'."\n";                            &mt($type).'</label></span></td>'."\n";
         }          }
         $datatable .= '</tr></table></td></tr>'."\n";          $datatable .= '</tr></table></td></tr>'."\n";
         $itemcount ++;          $itemcount ++;
Line 7153  sub print_coursedefaults { Line 7300  sub print_coursedefaults {
         foreach my $type (@types) {          foreach my $type (@types) {
             $datatable .= '<td style="text-align: left">'.              $datatable .= '<td style="text-align: left">'.
                           '<span class="LC_nobreak">'.                            '<span class="LC_nobreak">'.
                           '<input type="checkbox" name="exttool"'.                            '<label><input type="checkbox" name="exttool"'.
                           ' value="'.$type.'"'.$exttool{$type}.' />'.                            ' value="'.$type.'"'.$exttool{$type}.' />'.
                           &mt($type).'</span></td>'."\n";                            &mt($type).'</label></span></td>'."\n";
           }
           $datatable .= '</tr></table></td></tr>'."\n";
           $itemcount ++;
           $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';
           $datatable .= '<tr'.$css_class.'><td><span class="LC_nobreak">'.
                         $choices{'crsauthor'}.
                         '</span></td>'.
                         '<td style="text-align: right" class="LC_right_item">'.
                         '<table><tr>';
           foreach my $type (@types) {
               $datatable .= '<td style="text-align: left">'.
                             '<span class="LC_nobreak">'.
                             '<label><input type="checkbox" name="crsauthor"'.
                             ' value="'.$type.'"'.$crsauthor{$type}.' />'.
                             &mt($type).'</label></span></td>'."\n";
         }          }
         $datatable .= '</tr></table></td></tr>'."\n";          $datatable .= '</tr></table></td></tr>'."\n";
           $itemcount ++;
           $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';
           $datatable .= '<tr'.$css_class.'><td><span class="LC_nobreak">'.
                         $choices{'crseditors'}.
                         '</span></td>'.
                         '<td style="text-align: right" class="LC_right_item">'.
                         '<table><tr>';
           my @editors = ('edit','xml','daxe');
           my %editornames = &crseditor_titles();
           foreach my $editor (@editors) {
               $datatable .= '<td style="text-align: left">'.
                             '<span class="LC_nobreak">'.
                             '<label><input type="checkbox" name="crseditors"'.
                             ' value="'.$editor.'"'.$crseditors{$editor}.' />'.
                             $editornames{$editor}.'</label></span></td>'."\n";
           }
           $datatable .= '</tr></table></td></tr>'."\n";
       }
       $$rowtotal += $itemcount;
       return $datatable;
   }
   
   sub crseditor_titles {
       return &Apache::lonlocal::texthash(
                  edit  => 'Standard editor (Edit)',
                  xml   => 'Text editor (EditXML)',
                  daxe  => 'Daxe editor (Daxe)',
              );
   }
   
   sub print_authordefaults {
       my ($position,$dom,$settings,$rowtotal) = @_;
       my ($css_class,$datatable,%checkedon,%checkedoff);
       my $itemcount = 1;
       my %titles = &authordefaults_titles();
       if ($position eq 'top') {
           my %defaultchecked = (
                               'nocodemirror' => 'off',
                               'daxecollapse' => 'off',
                               'domcoordacc'  => 'on',
                             );
           my @toggles = ('nocodemirror','daxecollapse','domcoordacc');
           ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked,
                                                        \%titles,$itemcount);
           my %staticdefaults = (
                                   'copyright'    => 'default',
                                   'sourceavail'  => 'closed',
                                );
           $css_class = $itemcount%2?' class="LC_odd_row"':'';
           my %currrights;
           foreach my $item ('copyright','sourceavail') {
               $currrights{$item} = $staticdefaults{$item};
               if (ref($settings) eq 'HASH') {
                   if (exists($settings->{$item})) {
                       $currrights{$item} = $settings->{$item};
                   }
               }
           }
           $datatable .= '<tr'.$css_class.'><td style="vertical-align: top">'.
                         '<span class="LC_nobreak">'.$titles{'copyright'}.
                         '</span></td><td class="LC_right_item">'.
                         &selectbox('copyright',$currrights{'copyright'},'',
                                    \&Apache::loncommon::copyrightdescription,
                                    (grep !/^priv|custom$/,(&Apache::loncommon::copyrightids))).
                         '</td></tr>'."\n";
           $itemcount ++;
           $css_class = $itemcount%2?' class="LC_odd_row"':'';
           $datatable .= '<tr'.$css_class.'><td style="vertical-align: top">'.
                         '<span class="LC_nobreak">'.$titles{'sourceavail'}.
                         '</span></td><td class="LC_right_item">'.
                         &selectbox('sourceavail',$currrights{'sourceavail'},'',
                                    \&Apache::loncommon::source_copyrightdescription,
                                    (&Apache::loncommon::source_copyrightids)).
                         '</td></tr>'."\n";        
       } else {
           $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';
           my $curreditors;
           my %staticdefaults = (
                                   editors => ['edit','xml'],
                                   authorquota => 500,
                                   webdav => 0,
                                );
           my $curreditors = $staticdefaults{'editors'};
           if ((ref($settings) eq 'HASH') &&
               (ref($settings->{'editors'}) eq 'ARRAY')) {
               $curreditors = $settings->{'editors'};
           } else {
               $curreditors = $staticdefaults{'editors'};
           }
           my @editors = ('edit','xml','daxe');
           $datatable = '<tr'.$css_class.'>'."\n".
                        '<td>'.$titles{'editors'}.'</td>'."\n".
                        '<td class="LC_left_item">'."\n".
                        '<span class="LC_nobreak">';
           foreach my $editor (@editors) {
               my $checked;
               if (grep(/^\Q$editor\E$/,@{$curreditors})) {
                   $checked = ' checked="checked"';
               }
               $datatable .= '<label>'.
                             '<input type="checkbox" name="author_editors" '.
                             $checked.' value="'.$editor.'" '.
                             'onclick="javascript:checkEditors(this.form,'."'author_editors'".',this);" />'.
                             $titles{$editor}.'</label>&nbsp;';
           }
           $datatable .= '</span>'."\n".'</td>'."\n".'</tr>'."\n";
           $itemcount ++;
           $css_class = $itemcount%2?' class="LC_odd_row"':'';
           my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
           my @insttypes;
           if (ref($types) eq 'ARRAY') {
               @insttypes = @{$types};
           }
           my $typecount = 0;
           my %domconf = &Apache::lonnet::get_dom('configuration',['quotas'],$dom);
           my @items = ('webdav','authorquota');
           my %quotas;
           if (ref($domconf{'quotas'}) eq 'HASH') {
               %quotas = %{$domconf{'quotas'}};
               foreach my $item (@items) {
                   if (ref($quotas{$item}) eq 'HASH') {
                       foreach my $type (@insttypes,'default') {
                           if ($item eq 'authorquota') {
                               if ($quotas{$item}{$type} !~ /^\d+$/) {
                                   $quotas{$item}{$type} = $staticdefaults{$item};
                               }
                           } elsif ($item eq 'webdav') {
                               if ($quotas{$item}{$type} !~ /^(0|1)$/) {
                                   $quotas{$item}{$type} = $staticdefaults{$item};
                               }
                           }
                       }
                   } else {
                       foreach my $type (@insttypes,'default') {
                           $quotas{$item}{$type} = $staticdefaults{$item};
                       }
                   }
               }
           } else {
               foreach my $item (@items) {
                   foreach my $type (@insttypes,'default') {
                       $quotas{$item}{$type} = $staticdefaults{$item};
                   }
               }
           }
           if (ref($usertypes) eq 'HASH') {
               my $numinrow = 4;
               my $onclick = '';
               $datatable .= &insttypes_row(\%quotas,$types,$usertypes,$dom,
                                            $numinrow,$othertitle,'authorquota',
                                            \$itemcount,$onclick);
               $itemcount ++;
               $datatable .= &insttypes_row(\%quotas,$types,$usertypes,$dom,
                                            $numinrow,$othertitle,'webdav',
                                            \$itemcount);
               $itemcount ++;
           }
           my $checkedno = ' checked="checked"';
           my ($checkedon,$checkedoff);
           if (ref($quotas{'webdav'}) eq 'HASH') {
               if ($quotas{'webdav'}{'_LC_adv'} =~ /^0|1$/) {
                   if ($quotas{'webdav'}{'_LC_adv'}) {
                       $checkedon = $checkedno;
                   } else {
                       $checkedoff = $checkedno;
                   }
                   undef($checkedno);
               }
           }
           $css_class = $itemcount%2?' class="LC_odd_row"':'';
           $datatable .= '<tr'.$css_class.'>'.
                         '<td>'.$titles{'webdav_LC_adv'}.'<br />'.
                                $titles{'webdav_LC_adv_over'}.
                         '</td>'.
                         '<td class="LC_left_item">';
           foreach my $option ('none','off','on') {
               my ($text,$val,$checked);
               if ($option eq 'none') {
                   $text = $titles{'none'};
                   $val = '';
                   $checked = $checkedno;
               } elsif ($option eq 'off') {
                   $text = $titles{'overoff'};
                   $val = 0;
                   $checked = $checkedoff;
               } elsif ($option eq 'on') {
                   $text = $titles{'overon'};
                   $val = 1;
                   $checked = $checkedon;
               }
               $datatable .= '<span class="LC_nobreak"><label>'.
                             '<input type="radio" name="webdav_LC_adv"'.
                             ' value="'.$val.'"'.$checked.' />'.
                             $text.'</label></span>&nbsp; ';
           }
           $datatable .= '</td></tr>';
           $itemcount ++;
           my %defchecked = (
                                   'archive' => 'off',
                                );
           my @toggles = ('archive');
           (my $archive,$itemcount) = &radiobutton_prefs($settings,['archive'],
                                                         {'archive' => 'off'},
                                                         \%titles,$itemcount);
           $datatable .= $archive."\n";
           $itemcount ++;
     }      }
     $$rowtotal += $itemcount;      $$rowtotal += $itemcount;
     return $datatable;      return $datatable;
 }  }
   
   sub authordefaults_titles {
       return &Apache::lonlocal::texthash(
                  copyright => 'Copyright/Distribution',
                  sourceavail => ' Source Available',
                  editors => 'Available Editors',
                  webdav => 'WebDAV',
                  authorquota => 'Authoring Space quotas (MB)',
                  nocodemirror => 'Deactivate CodeMirror for EditXML editor',
                  daxecollapse => 'Daxe editor: LON-CAPA standard menus start collapsed',
                  domcoordacc => 'Dom. Coords. can enter Authoring Spaces in domain',
                  edit  => 'Standard editor (Edit)',
                  xml   => 'Text editor (EditXML)',
                  daxe  => 'Daxe editor (Daxe)',
                  webdav_LC_adv => 'WebDAV access for LON-CAPA "advanced" users',
                  webdav_LC_adv_over => '(overrides access based on affiliation, if set)',
                  none => 'No override set',
                  overon => 'Override -- webDAV on',
                  overoff => 'Override -- webDAV off',
                  archive => 'Authors can download tar.gz file of Authoring Space',
       );
   }
   
   sub selectbox {
       my ($name,$value,$readonly,$functionref,@idlist)=@_;
       my $selout = '<select name="'.$name.'">';
       foreach my $id (@idlist) {
           $selout.='<option value="'.$id.'"';
           if ($id eq $value) {
               $selout.=' selected="selected"';
           }
           if ($readonly) {
               $selout .= ' disabled="disabled"';
           }
           $selout.='>'.&{$functionref}($id).'</option>';
       }
       $selout.='</select>';
       return $selout;
   }
   
 sub print_selfenrollment {  sub print_selfenrollment {
     my ($position,$dom,$settings,$rowtotal) = @_;      my ($position,$dom,$settings,$rowtotal) = @_;
     my ($css_class,$datatable);      my ($css_class,$datatable);
Line 7929  sub password_rules { Line 8336  sub password_rules {
         if (ref($settings->{chars}) eq 'ARRAY') {          if (ref($settings->{chars}) eq 'ARRAY') {
             map { $chars{$_} = 1; } (@{$settings->{chars}});              map { $chars{$_} = 1; } (@{$settings->{chars}});
         }          }
         if ($prefix eq 'passwords') {           if ($prefix eq 'passwords') {
             if ($settings->{expire}) {              if ($settings->{expire}) {
                 $expire = $settings->{expire};                  $expire = $settings->{expire};
             }              }
Line 8072  sub print_wafproxy { Line 8479  sub print_wafproxy {
             my %config = &Apache::lonnet::get_dom('configuration',['wafproxy'],$domain);              my %config = &Apache::lonnet::get_dom('configuration',['wafproxy'],$domain);
             if (ref($config{'wafproxy'}) eq 'HASH') {              if (ref($config{'wafproxy'}) eq 'HASH') {
                 $aliases{$domain} = $config{'wafproxy'}{'alias'};                  $aliases{$domain} = $config{'wafproxy'}{'alias'};
                 if (exists($config{'wafproxy'}{'saml'})) {                   if (exists($config{'wafproxy'}{'saml'})) {
                     $saml{$domain} = $config{'wafproxy'}{'saml'};                      $saml{$domain} = $config{'wafproxy'}{'saml'};
                 }                  }
                 foreach my $item ('remoteip','ipheader','trusted','vpnint','vpnext') {                  foreach my $item ('remoteip','ipheader','trusted','vpnint','vpnext') {
Line 8089  sub print_wafproxy { Line 8496  sub print_wafproxy {
             my $dom_in_effect;              my $dom_in_effect;
             my $aliasrows = '<tr>'.              my $aliasrows = '<tr>'.
                             '<td class="LC_left_item" style="vertical-align: baseline;">'.                              '<td class="LC_left_item" style="vertical-align: baseline;">'.
                             &mt('Hostname').':&nbsp;'.                              &mt('Hostname').': '.
                             '<i>'.&Apache::lonnet::hostname($server).'</i></td><td>&nbsp;</td>';                              '<span class="LC_nobreak LC_cusr_emph">'.
                               &Apache::lonnet::hostname($server).
                               '</span></td><td>&nbsp;</td>';
             if ($othercontrol{$server}) {              if ($othercontrol{$server}) {
                 $dom_in_effect = $othercontrol{$server};                  $dom_in_effect = $othercontrol{$server};
                 my ($current,$forsaml);                  my ($current,$forsaml);
Line 8137  sub print_wafproxy { Line 8546  sub print_wafproxy {
                               ('&nbsp;'x2).'<span class="LC_nobreak">'.                                ('&nbsp;'x2).'<span class="LC_nobreak">'.
                               &mt('Alias used for SSO Auth').':&nbsp;<label>'.                                &mt('Alias used for SSO Auth').':&nbsp;<label>'.
                               '<input type="radio" value="0"'.$samloff.' name="wafproxy_alias_saml_'.$server.'" />'.                                '<input type="radio" value="0"'.$samloff.' name="wafproxy_alias_saml_'.$server.'" />'.
                               &mt('No').'</label>&nbsp;<label>'.                                 &mt('No').'</label>&nbsp;<label>'.
                               '<input type="radio" value="1"'.$samlon.' name="wafproxy_alias_saml_'.$server.'" />'.                                '<input type="radio" value="1"'.$samlon.' name="wafproxy_alias_saml_'.$server.'" />'.
                               &mt('Yes').'</label></span>'.                                &mt('Yes').'</label></span>'.
                               '</td>';                                 '</td>';
             }              }
             $aliasrows .= '</tr>';              $aliasrows .= '</tr>';
             $aliasinfo{$dom_in_effect} .= $aliasrows;              $aliasinfo{$dom_in_effect} .= $aliasrows;
Line 9050  sub print_loadbalancing { Line 9459  sub print_loadbalancing {
                                   no => ' checked="checked"',                                    no => ' checked="checked"',
                               );                                );
         my %balcookiechecked = (          my %balcookiechecked = (
                                   no => ' checked="checked"',                                     no => ' checked="checked"',
                                );                                 );
         foreach my $sparetype (@sparestypes) {          foreach my $sparetype (@sparestypes) {
             my $targettable;              my $targettable;
Line 9405  sub tool_titles { Line 9814  sub tool_titles {
     my %titles = &Apache::lonlocal::texthash (      my %titles = &Apache::lonlocal::texthash (
                      aboutme    => 'Personal web page',                       aboutme    => 'Personal web page',
                      blog       => 'Blog',                       blog       => 'Blog',
                      webdav     => 'WebDAV',  
                      portfolio  => 'Portfolio',                       portfolio  => 'Portfolio',
                        portaccess => 'Share portfolio files',
                      timezone   => 'Can set time zone',                       timezone   => 'Can set time zone',
                      official   => 'Official courses (with institutional codes)',                       official   => 'Official courses (with institutional codes)',
                      unofficial => 'Unofficial courses',                       unofficial => 'Unofficial courses',
Line 9637  sub print_selfcreation { Line 10046  sub print_selfcreation {
         ($datatable,$itemcount) = &radiobutton_prefs(\%radiohash,\@toggles,\%defaultchecked,          ($datatable,$itemcount) = &radiobutton_prefs(\%radiohash,\@toggles,\%defaultchecked,
                                                      \%choices,$itemcount,$onclick);                                                       \%choices,$itemcount,$onclick);
         $$rowtotal += $itemcount;          $$rowtotal += $itemcount;
           
         if (ref($usertypes) eq 'HASH') {          if (ref($usertypes) eq 'HASH') {
             if (keys(%{$usertypes}) > 0) {              if (keys(%{$usertypes}) > 0) {
                 $datatable .= &insttypes_row($createsettings,$types,$usertypes,                  $datatable .= &insttypes_row($createsettings,$types,$usertypes,
Line 9774  sub print_selfcreation { Line 10183  sub print_selfcreation {
                 my $currstyle = 'display:none';                  my $currstyle = 'display:none';
                 if (grep(/^\Q$status\E$/,@ordered)) {                  if (grep(/^\Q$status\E$/,@ordered)) {
                     $currstyle = $rowstyle;                      $currstyle = $rowstyle;
                     $hidden = 0;                       $hidden = 0;
                 }                  }
                 $datatable .= &noninst_users($processing,$emailverified,$emailoptions,$emaildomain,                  $datatable .= &noninst_users($processing,$emailverified,$emailoptions,$emaildomain,
                                              $emailrules,$emailruleorder,$settings,$status,$rowid,                                               $emailrules,$emailruleorder,$settings,$status,$rowid,
Line 9801  sub print_selfcreation { Line 10210  sub print_selfcreation {
             foreach my $status (@posstypes) {              foreach my $status (@posstypes) {
                 my $rowid = $classprefix.$status;                  my $rowid = $classprefix.$status;
                 my $datarowstyle = 'display:none';                  my $datarowstyle = 'display:none';
                 if (grep(/^\Q$status\E$/,@ordered)) {                   if (grep(/^\Q$status\E$/,@ordered)) {
                     $datarowstyle = $rowstyle;                       $datarowstyle = $rowstyle;
                 }                  }
                 $datatable .= &modifiable_userdata_row('cancreate','emailusername_'.$status,$settings,                  $datatable .= &modifiable_userdata_row('cancreate','emailusername_'.$status,$settings,
                                                        $numinrow,$$rowtotal,\%usertypeshash,$infofields,                                                         $numinrow,$$rowtotal,\%usertypeshash,$infofields,
Line 9904  function toggleEmailOptions(form,radio,p Line 10313  function toggleEmailOptions(form,radio,p
                     document.getElementById(altprefix+'_inst_'+status).style.display = 'none';                      document.getElementById(altprefix+'_inst_'+status).style.display = 'none';
                     document.getElementById(altprefix+'_noninst_'+status).style.display = 'none';                      document.getElementById(altprefix+'_noninst_'+status).style.display = 'none';
                     if (curr == 'custom') {                      if (curr == 'custom') {
                         if (prefix) {                           if (prefix) {
                             document.getElementById(prefix+'_'+status).style.display = 'inline';                              document.getElementById(prefix+'_'+status).style.display = 'inline';
                         }                          }
                     } else if (curr == 'inst') {                      } else if (curr == 'inst') {
Line 9927  ENDSCRIPT Line 10336  ENDSCRIPT
   
 sub noninst_users {  sub noninst_users {
     my ($processing,$emailverified,$emailoptions,$emaildomain,$emailrules,      my ($processing,$emailverified,$emailoptions,$emaildomain,$emailrules,
         $emailruleorder,$settings,$type,$rowid,$typetitle,$css_class,$rowstyle,$intdom) = @_;           $emailruleorder,$settings,$type,$rowid,$typetitle,$css_class,$rowstyle,$intdom) = @_;
     my $class = 'LC_left_item';      my $class = 'LC_left_item';
     if ($css_class) {      if ($css_class) {
         $css_class = ' class="'.$css_class.'"';           $css_class = ' class="'.$css_class.'"';
     }      }
     if ($rowid) {      if ($rowid) {
         $rowid = ' id="'.$rowid.'"';          $rowid = ' id="'.$rowid.'"';
Line 9945  sub noninst_users { Line 10354  sub noninst_users {
         $description = &mt('Requests for: [_1] (status self-reported)',$typetitle);          $description = &mt('Requests for: [_1] (status self-reported)',$typetitle);
     }      }
     $output = '<tr'.$css_class.$rowid.$rowstyle.'>'.      $output = '<tr'.$css_class.$rowid.$rowstyle.'>'.
               "<td>$description</td>\n".                           "<td>$description</td>\n".
               '<td class="'.$class.'" colspan="2">'.                '<td class="'.$class.'" colspan="2">'.
               '<table><tr>';                '<table><tr>';
     my %headers = &Apache::lonlocal::texthash(       my %headers = &Apache::lonlocal::texthash(
               approve  => 'Processing',                approve  => 'Processing',
               email    => 'E-mail',                email    => 'E-mail',
               username => 'Username',                username => 'Username',
Line 10073  sub noninst_users { Line 10482  sub noninst_users {
                     my $value;                      my $value;
                     if (ref($emaildomain) eq 'HASH') {                      if (ref($emaildomain) eq 'HASH') {
                         if (ref($emaildomain->{$type}) eq 'HASH') {                          if (ref($emaildomain->{$type}) eq 'HASH') {
                             $value = $emaildomain->{$type}->{$option};                               $value = $emaildomain->{$type}->{$option};
                         }                          }
                     }                      }
                     if ($value eq '') {                      if ($value eq '') {
Line 10309  sub print_usermodification { Line 10718  sub print_usermodification {
             $$rowtotal ++;              $$rowtotal ++;
             $rowcount ++;              $rowcount ++;
         }          }
       } elsif ($position eq 'middle') {
           $rowcount = 0;
           $context = 'coauthor';
           foreach my $role ('ca','aa') {
               $datatable .= &modifiable_userdata_row($context,$role,$settings,
                                                      $numinrow,$rowcount);
               $$rowtotal ++;
               $rowcount ++;
           }
     } elsif ($position eq 'bottom') {      } elsif ($position eq 'bottom') {
         $context = 'course';          $context = 'course';
         $rowcount = 0;          $rowcount = 0;
Line 10391  sub print_defaults { Line 10809  sub print_defaults {
                     if ($defaults{$item.'_'.$field}) {                      if ($defaults{$item.'_'.$field}) {
                         $checkedon = $checkedoff;                          $checkedon = $checkedoff;
                         $checkedoff = '';                          $checkedoff = '';
                     }                       }
                     $datatable .= '<div id="'.$item.'_'.$field.'_div" style="display:'.$portalsty.'">'.                      $datatable .= '<div id="'.$item.'_'.$field.'_div" style="display:'.$portalsty.'">'.
                               '<span class="LC_nobreak">'.$titles->{$field}.'&nbsp;'.                                '<span class="LC_nobreak">'.$titles->{$field}.'&nbsp;'.
                               '<label><input type="radio" name="'.$item.'_'.$field.'" value="1"'.$checkedon.'/>'.&mt('Yes').'</label>'.                                '<label><input type="radio" name="'.$item.'_'.$field.'" value="1"'.$checkedon.'/>'.&mt('Yes').'</label>'.
Line 11220  sub defaults_javascript { Line 11638  sub defaults_javascript {
 function portalExtras(caller) {  function portalExtras(caller) {
     var x = caller.value;      var x = caller.value;
     var y = new Array('email','web');      var y = new Array('email','web');
     for (var i=0; i<y.length; i++) {       for (var i=0; i<y.length; i++) {
         if (document.getElementById('portal_def_'+y[i]+'_div')) {          if (document.getElementById('portal_def_'+y[i]+'_div')) {
             var z = document.getElementById('portal_def_'+y[i]+'_div');              var z = document.getElementById('portal_def_'+y[i]+'_div');
             if (x.length > 0) {              if (x.length > 0) {
Line 11324  sub passwords_javascript { Line 11742  sub passwords_javascript {
     }      }
     &js_escape(\%intalert);      &js_escape(\%intalert);
     my $defmin = $Apache::lonnet::passwdmin;      my $defmin = $Apache::lonnet::passwdmin;
     my $intauthjs;       my $intauthjs;
     if ($prefix eq 'passwords') { $intauthjs = <<"ENDSCRIPT";      if ($prefix eq 'passwords') { $intauthjs = <<"ENDSCRIPT";
   
 function warnIntAuth(field) {  function warnIntAuth(field) {
Line 11718  sub modifiable_userdata_row { Line 12136  sub modifiable_userdata_row {
               '<td class="LC_left_item" colspan="2"><table>';                '<td class="LC_left_item" colspan="2"><table>';
     my $rem;      my $rem;
     my %checks;      my %checks;
     my %current;  
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         my $hashref;          my $hashref;
         if ($context eq 'lti') {          if ($context eq 'lti') {
             if (ref($settings) eq 'HASH') {              if (ref($settings) eq 'HASH') {
                 $hashref = $settings->{'instdata'};                  my %instdata;
                   if (ref($settings->{'instdata'}) eq 'ARRAY') {
                       map { $instdata{$_} = 1; } @{$settings->{'instdata'}};
                   }
                   $hashref = \%instdata;
             }              }
         } elsif ($context eq 'privacy') {          } elsif ($context eq 'privacy') {
             my ($key,$inner) = split(/_/,$role);              my ($key,$inner) = split(/_/,$role);
Line 11734  sub modifiable_userdata_row { Line 12155  sub modifiable_userdata_row {
             }              }
         } elsif (ref($settings->{$context}) eq 'HASH') {          } elsif (ref($settings->{$context}) eq 'HASH') {
             if (ref($settings->{$context}->{$role}) eq 'HASH') {              if (ref($settings->{$context}->{$role}) eq 'HASH') {
                 $hashref = $settings->{'lti_instdata'};                  $hashref = $settings->{$context}->{$role};
             }              }
             if ($role eq 'emailusername') {              if ($role eq 'emailusername') {
                 if ($statustype) {                  if ($statustype) {
Line 11744  sub modifiable_userdata_row { Line 12165  sub modifiable_userdata_row {
                 }                  }
             }              }
         }          }
         if (ref($hashref) eq 'HASH') {           if (ref($hashref) eq 'HASH') {
             foreach my $field (@fields) {              foreach my $field (@fields) {
                 if ($hashref->{$field}) {                  if ($hashref->{$field}) {
                     if ($role eq 'emailusername') {                      if ($role eq 'emailusername') {
Line 11756  sub modifiable_userdata_row { Line 12177  sub modifiable_userdata_row {
             }              }
         }          }
     }      }
    
     my $total = scalar(@fields);      my $total = scalar(@fields);
     for (my $i=0; $i<$total; $i++) {      for (my $i=0; $i<$total; $i++) {
         $rem = $i%($numinrow);          $rem = $i%($numinrow);
Line 11816  sub modifiable_userdata_row { Line 12236  sub modifiable_userdata_row {
         } else {          } else {
             if ($context eq 'lti') {              if ($context eq 'lti') {
                 $prefix = 'lti';                  $prefix = 'lti';
               } elsif ($context eq 'coauthor') {
                   $prefix = 'cacanmodify';
             } elsif ($context eq 'privacy') {              } elsif ($context eq 'privacy') {
                 $prefix = 'privacy';                  $prefix = 'privacy';
             }              }
Line 11845  sub insttypes_row { Line 12267  sub insttypes_row {
     my ($settings,$types,$usertypes,$dom,$numinrow,$othertitle,$context,$rowtotal,$onclick,      my ($settings,$types,$usertypes,$dom,$numinrow,$othertitle,$context,$rowtotal,$onclick,
         $customcss,$rowstyle) = @_;          $customcss,$rowstyle) = @_;
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                       cansearch => 'Users allowed to search',                        cansearch      => 'Users allowed to search',
                       statustocreate => 'Institutional affiliation(s) able to create own account (login/SSO)',                        statustocreate => 'Institutional affiliation(s) able to create own account (login/SSO)',
                       lockablenames => 'User preference to lock name',                        lockablenames  => 'User preference to lock name',
                       selfassign    => 'Self-reportable affiliations',                        selfassign     => 'Self-reportable affiliations',
                       overrides     => "Override domain's helpdesk settings based on requester's affiliation",                        overrides      => "Override domain's helpdesk settings based on requester's affiliation",
                         webdav         => 'WebDAV access available',
                         authorquota    => 'Authoring Space quota (MB)',
              );               );
     my $showdom;      my ($showdom,$defaultquota);
     if ($context eq 'cansearch') {      if ($context eq 'cansearch') {
         $showdom = ' ('.$dom.')';          $showdom = ' ('.$dom.')';
       } elsif ($context eq 'authorquota') {
           $defaultquota = 500;
     }      }
     my $class = 'LC_left_item';      my $class = 'LC_left_item';
     if ($context eq 'statustocreate') {      if ($context eq 'statustocreate') {
Line 11890  sub insttypes_row { Line 12316  sub insttypes_row {
                     }                      }
                     $output .= '<tr>';                      $output .= '<tr>';
                 }                  }
                 my $check = ' ';                  if ($context eq 'authorquota') {
                 if (ref($settings) eq 'HASH') {                      my $currquota;
                     if (ref($settings->{$context}) eq 'ARRAY') {                      if ($settings->{$context}->{$types->[$i]} =~ /^\d+$/) {
                         if (grep(/^\Q$types->[$i]\E$/,@{$settings->{$context}})) {                          $currquota = $settings->{$context}->{$types->[$i]};
                             $check = ' checked="checked" ';                      } else {
                         }                          $currquota = $defaultquota;
                     } elsif (ref($settings->{$context}) eq 'HASH') {                      }
                         if (ref($settings->{$context}->{$types->[$i]}) eq 'HASH') {                      $output .= '<td class="LC_left_item">'."\n".
                                  '<label><span class="LC_nobreak">'."\n".
                                  $usertypes->{$types->[$i]}.'</span><br />'."\n".
                                  '<input type="text" name="'.$context.'_'.$types->[$i].'" '.
                                  'value="'.$currquota.'" size="5"'.$onclick.'/>'."\n".
                                  '</label></td>';
                   } else {
                       my $check = ' ';
                       if (ref($settings) eq 'HASH') {
                           if (ref($settings->{$context}) eq 'ARRAY') {
                               if (grep(/^\Q$types->[$i]\E$/,@{$settings->{$context}})) {
                                   $check = ' checked="checked" ';
                               }
                           } elsif (ref($settings->{$context}) eq 'HASH') {
                               if (ref($settings->{$context}->{$types->[$i]}) eq 'HASH') {
                                   $check = ' checked="checked" ';
                               } elsif ($context eq 'webdav') {
                                   if ($settings->{$context}->{$types->[$i]}) {
                                       $check = ' checked="checked" ';
                                   }
                               }
                           } elsif ($context eq 'statustocreate') {
                             $check = ' checked="checked" ';                              $check = ' checked="checked" ';
                         }                          }
                     } elsif ($context eq 'statustocreate') {  
                         $check = ' checked="checked" ';  
                     }                      }
                       $output .= '<td class="LC_left_item">'.
                                  '<span class="LC_nobreak"><label>'.
                                  '<input type="checkbox" name="'.$context.'" '.
                                  'value="'.$types->[$i].'"'.$check.$onclick.'/>'.
                                  $usertypes->{$types->[$i]}.'</label></span></td>';
                 }                  }
                 $output .= '<td class="LC_left_item">'.  
                            '<span class="LC_nobreak"><label>'.  
                            '<input type="checkbox" name="'.$context.'" '.  
                            'value="'.$types->[$i].'"'.$check.$onclick.' />'.  
                            $usertypes->{$types->[$i]}.'</label></span></td>';  
             }              }
         }          }
         $rem = @{$types}%($numinrow);          $rem = @{$types}%($numinrow);
Line 11920  sub insttypes_row { Line 12365  sub insttypes_row {
         } else {          } else {
             $output .= '<td class="LC_left_item">';              $output .= '<td class="LC_left_item">';
         }          }
         $output .= '&nbsp;';            $output .= '&nbsp;';
     } else {      } else {
         if ($rem == 0) {          if ($rem == 0) {
             $output .= '<tr>';              $output .= '<tr>';
Line 11930  sub insttypes_row { Line 12375  sub insttypes_row {
         } else {          } else {
             $output .= '<td class="LC_left_item">';              $output .= '<td class="LC_left_item">';
         }          }
         my $defcheck = ' ';          if ($context eq 'authorquota') {
         if (ref($settings) eq 'HASH') {                my $currquota = 500;
             if (ref($settings->{$context}) eq 'ARRAY') {              if ((ref($settings) eq 'HASH') && (ref($settings->{$context}) eq 'HASH')) {
                 if (grep(/^default$/,@{$settings->{$context}})) {                  if ($settings->{$context}{'default'} =~ /^\d+$/) {
                       $currquota = $settings->{$context}{'default'};
                   }
               }
               $output .= '<label><span class="LC_nobreak">'.$othertitle.'</span><br />'."\n".
                          '<input type="text" name="'.$context.'_default" '.
                          'value="'.$currquota.'" size="5"'.$onclick.'/>'."\n".
                          '</label>';
           } else {
               my $defcheck = ' ';
               if (ref($settings) eq 'HASH') {
                   if (ref($settings->{$context}) eq 'ARRAY') {
                       if (grep(/^default$/,@{$settings->{$context}})) {
                           $defcheck = ' checked="checked" ';
                       }
                   } elsif (ref($settings->{$context}) eq 'HASH') {
                       if (ref($settings->{$context}->{'default'}) eq 'HASH') {
                           $defcheck = ' checked="checked" ';
                       } elsif ($context eq 'webdav') {
                           if ($settings->{$context}->{'default'}) {
                               $defcheck = ' checked="checked" ';
                           }
                       }
                   } elsif ($context eq 'statustocreate') {
                     $defcheck = ' checked="checked" ';                      $defcheck = ' checked="checked" ';
                 }                  }
             } elsif ($context eq 'statustocreate') {  
                 $defcheck = ' checked="checked" ';  
             }              }
               $output .= '<span class="LC_nobreak"><label>'.
                          '<input type="checkbox" name="'.$context.'" '.
                          'value="default"'.$defcheck.$onclick.'/>'.
                          $othertitle.'</label></span>';
         }          }
         $output .= '<span class="LC_nobreak"><label>'.  
                    '<input type="checkbox" name="'.$context.'" '.  
                    'value="default"'.$defcheck.$onclick.' />'.  
                    $othertitle.'</label></span>';  
     }      }
     $output .= '</td></tr></table></td></tr>';      $output .= '</td></tr></table></td></tr>';
     return $output;      return $output;
Line 12196  sub modify_login { Line 12662  sub modify_login {
                     if ($lang eq $env{'form.loginhelpurl_add_lang'}) {                      if ($lang eq $env{'form.loginhelpurl_add_lang'}) {
                         $formelem = 'loginhelpurl_add_file';                          $formelem = 'loginhelpurl_add_file';
                     }                      }
                     (my $result,$newurl{$lang}) =                       (my $result,$newurl{$lang}) =
                         &Apache::lonconfigsettings::publishlogo($r,'upload',$formelem,$dom,$confname,                          &Apache::lonconfigsettings::publishlogo($r,'upload',$formelem,$dom,$confname,
                                                                 "help/$lang",'','',$newfile{$lang},                                                                  "help/$lang",'','',$newfile{$lang},
                                                                 $modified);                                                                  $modified);
Line 12273  sub modify_login { Line 12739  sub modify_login {
                 my $modified = [];                  my $modified = [];
                 foreach my $lonhost (@newhosts) {                  foreach my $lonhost (@newhosts) {
                     my $formelem = 'loginheadtag_'.$lonhost;                      my $formelem = 'loginheadtag_'.$lonhost;
                     (my $result,$newheadtagurls{$lonhost}) =                       (my $result,$newheadtagurls{$lonhost}) =
                         &Apache::lonconfigsettings::publishlogo($r,'upload',$formelem,$dom,$confname,                          &Apache::lonconfigsettings::publishlogo($r,'upload',$formelem,$dom,$confname,
                                                                 "login/headtag/$lonhost",'','',                                                                  "login/headtag/$lonhost",'','',
                                                                 $env{'form.loginheadtag_'.$lonhost.'.filename'},                                                                  $env{'form.loginheadtag_'.$lonhost.'.filename'},
Line 12350  sub modify_login { Line 12816  sub modify_login {
                 $currsaml{$lonhost}{$item} = $env{'form.saml_'.$item.'_'.$lonhost};                  $currsaml{$lonhost}{$item} = $env{'form.saml_'.$item.'_'.$lonhost};
             }              }
         } else {          } else {
             if ($saml{$lonhost}) {                if ($saml{$lonhost}) {
                 $changes{'saml'}{$lonhost} = 1;                  $changes{'saml'}{$lonhost} = 1;
                 delete($currsaml{$lonhost});                  delete($currsaml{$lonhost});
             }              }
         }          }
     }      }
     foreach my $posshost (keys(%currsaml)) {      foreach my $posshost (keys(%currsaml)) {
         unless (exists($domservers{$posshost})) {           unless (exists($domservers{$posshost})) {
             delete($currsaml{$posshost});               delete($currsaml{$posshost});
         }          }
     }      }
     %{$loginhash{'login'}{'saml'}} = %currsaml;      %{$loginhash{'login'}{'saml'}} = %currsaml;
Line 12372  sub modify_login { Line 12838  sub modify_login {
                 my $modified = [];                  my $modified = [];
                 foreach my $lonhost (@newsamlimgs) {                  foreach my $lonhost (@newsamlimgs) {
                     my $formelem = 'saml_img_'.$lonhost;                      my $formelem = 'saml_img_'.$lonhost;
                     my ($result,$imgurl) =                       my ($result,$imgurl) =
                         &Apache::lonconfigsettings::publishlogo($r,'upload',$formelem,$dom,$confname,                          &Apache::lonconfigsettings::publishlogo($r,'upload',$formelem,$dom,$confname,
                                                                 "login/saml/$lonhost",'','',                                                                  "login/saml/$lonhost",'','',
                                                                 $env{'form.saml_img_'.$lonhost.'.filename'},                                                                  $env{'form.saml_img_'.$lonhost.'.filename'},
Line 12664  sub check_exempt_addresses { Line 13130  sub check_exempt_addresses {
 sub color_font_choices {  sub color_font_choices {
     my %choices =      my %choices =
         &Apache::lonlocal::texthash (          &Apache::lonlocal::texthash (
             img => "Header",  
             bgs => "Background colors",              bgs => "Background colors",
             links => "Link colors",              links => "Link colors",
             images => "Images",              images => "Images",
Line 12719  sub modify_ipaccess { Line 13184  sub modify_ipaccess {
     foreach my $idx (@items) {      foreach my $idx (@items) {
         my $itemid = $itemids{$idx};          my $itemid = $itemids{$idx};
         next unless ($itemid);          next unless ($itemid);
         my %current;          my ($position,%current);
         unless ($idx eq 'add') {          if ($idx eq 'add') {
               $position = $env{'form.ipaccess_pos_add'};
           } else {
               $position = $env{'form.ipaccess_pos_'.$itemid};
             if (ref($domconfig{'ipaccess'}{$itemid}) eq 'HASH') {              if (ref($domconfig{'ipaccess'}{$itemid}) eq 'HASH') {
                 %current = %{$domconfig{'ipaccess'}{$itemid}};                  %current = %{$domconfig{'ipaccess'}{$itemid}};
             }              }
         }          }
         my $position = $env{'form.ipaccess_pos_'.$itemid};  
         $position =~ s/\D+//g;          $position =~ s/\D+//g;
         if ($position ne '') {          if ($position ne '') {
             $allpos[$position] = $itemid;              $allpos[$position] = $itemid;
Line 12742  sub modify_ipaccess { Line 13209  sub modify_ipaccess {
             $possrange =~ s/,+/,/g;              $possrange =~ s/,+/,/g;
             if ($possrange ne '') {              if ($possrange ne '') {
                 my (@ok,$count);                  my (@ok,$count);
                 $count = 0;                   $count = 0;
                 foreach my $poss (split(/\,/,$possrange)) {                  foreach my $poss (split(/\,/,$possrange)) {
                     $count ++;                      $count ++;
                     $poss = &validate_ip_pattern($poss);                      $poss = &validate_ip_pattern($poss);
Line 12775  sub modify_ipaccess { Line 13242  sub modify_ipaccess {
             }              }
         }          }
         $confhash{$itemid}{'commblocks'} = {};          $confhash{$itemid}{'commblocks'} = {};
            
         my %commblocks;          my %commblocks;
         map { $commblocks{$_} = 1; } &Apache::loncommon::get_env_multiple('form.ipaccess_block_'.$idx);            map { $commblocks{$_} = 1; } &Apache::loncommon::get_env_multiple('form.ipaccess_block_'.$idx);
         foreach my $type (@{$typeorder}) {          foreach my $type (@{$typeorder}) {
             if ($commblocks{$type}) {              if ($commblocks{$type}) {
                 $confhash{$itemid}{'commblocks'}{$type} = 'on';                  $confhash{$itemid}{'commblocks'}{$type} = 'on';
Line 12809  sub modify_ipaccess { Line 13276  sub modify_ipaccess {
         }          }
         $env{'form.ipaccess_cnum_'.$idx} =~ s/^\s+|\s+$//g;          $env{'form.ipaccess_cnum_'.$idx} =~ s/^\s+|\s+$//g;
         $env{'form.ipaccess_cdom_'.$idx} =~ s/^\s+|\s+$//g;          $env{'form.ipaccess_cdom_'.$idx} =~ s/^\s+|\s+$//g;
         if (($env{'form.ipaccess_cnum_'.$idx} =~ /^$match_courseid$/) &&           if (($env{'form.ipaccess_cnum_'.$idx} =~ /^$match_courseid$/) &&
             ($env{'form.ipaccess_cdom_'.$idx} =~ /^$match_domain$/)) {              ($env{'form.ipaccess_cdom_'.$idx} =~ /^$match_domain$/)) {
             if (&Apache::lonnet::homeserver($env{'form.ipaccess_cnum_'.$idx},              if (&Apache::lonnet::homeserver($env{'form.ipaccess_cnum_'.$idx},
                                             $env{'form.ipaccess_cdom_'.$idx}) eq 'no_host') {                                              $env{'form.ipaccess_cdom_'.$idx}) eq 'no_host') {
Line 12889  sub modify_ipaccess { Line 13356  sub modify_ipaccess {
                     if (keys(%{$confhash{$itemid}{'courses'}})) {                      if (keys(%{$confhash{$itemid}{'courses'}})) {
                         my @courses;                          my @courses;
                         foreach my $cid (sort(keys(%{$confhash{$itemid}{'courses'}}))) {                          foreach my $cid (sort(keys(%{$confhash{$itemid}{'courses'}}))) {
                             my %courseinfo = &Apache::lonnet::coursedescription($cid,{'one_time' => 1});                               my %courseinfo = &Apache::lonnet::coursedescription($cid,{'one_time' => 1});
                             push(@courses,$courseinfo{'description'}.' ('.$cid.')');                              push(@courses,$courseinfo{'description'}.' ('.$cid.')');
                         }                          }
                         $resulttext .= '<li>'.&mt('Courses/Communities allowed').':<ul><li>'.                          $resulttext .= '<li>'.&mt('Courses/Communities allowed').':<ul><li>'.
Line 12957  sub get_ipaccess_id { Line 13424  sub get_ipaccess_id {
     return ($id,$error);      return ($id,$error);
 }  }
   
   sub modify_authordefaults {
       my ($dom,$lastactref,%domconfig) = @_;
   #
   # Retrieve current domain configuration for webDAV and Authoring Space quotas from $domconfig{'quotas'}.
   #
       my (%curr_quotas,%save_quotas,%confhash,%changes,%newvalues);
       if (ref($domconfig{'quotas'}) eq 'HASH') {
           foreach my $key (keys(%{$domconfig{'quotas'}})) {
               if ($key =~ /^webdav|authorquota$/) {
                   $curr_quotas{$key} = $domconfig{'quotas'}{$key};
               } else {
                   $save_quotas{$key} = $domconfig{'quotas'}{$key};
               }
           }
       }
       my %staticdefaults = (
                              'copyright'    => 'default',
                              'sourceavail'  => 'closed',
                              'nocodemirror' => 'off',
                              'daxecollapse' => 'off',
                              'domcoordacc'  => 'on',
                              'editors'      => ['edit','xml'],
                              'authorquota'  => 500,
                              'webdav'       => 0,
                              'archive'      => 'off',
                            );
       my %titles = &authordefaults_titles();
       foreach my $item ('nocodemirror','daxecollapse','domcoordacc','archive') {
           if ($env{'form.'.$item} =~ /^(0|1)$/) {
               $confhash{$item} = $env{'form.'.$item};
           }
       }
       if ($env{'form.copyright'} =~ /^(default|domain|public)$/) {
           $confhash{'copyright'} = $1;
       }
       if ($env{'form.sourceavail'} =~ /^(closed|open)$/) {
           $confhash{'sourceavail'} = $1;
       }
       my @posseditors =  &Apache::loncommon::get_env_multiple('form.author_editors');
       my @okeditors = ('edit','xml','daxe');
       my @editors;
       foreach my $item (@posseditors) {
           if (grep(/^\Q$item\E$/,@okeditors)) {
               push(@editors,$item);
           }
       }
       $confhash{'editors'} = \@editors;
   
       my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
       my @insttypes;
       if (ref($types) eq 'ARRAY') {
           @insttypes = @{$types};
       }
       my @webdavon = &Apache::loncommon::get_env_multiple('form.webdav');
       my %webdav;
       map { $webdav{$_} = 1; } @webdavon;
       foreach my $type (@insttypes,'default') {
           my $possquota = $env{'form.authorquota_'.$type};
           if ($possquota =~ /^\d+$/) {
               $save_quotas{'authorquota'}{$type} = $possquota;
           }
           if ($webdav{$type}) {
               $save_quotas{'webdav'}{$type} = 1;
           } else {
               $save_quotas{'webdav'}{$type} = 0;
           }
       }
       if ($env{'form.webdav_LC_adv'} =~ /^(0|1)$/) {
           $save_quotas{'webdav'}{'_LC_adv'} = $env{'form.webdav_LC_adv'};
       }
       if (ref($domconfig{'authordefaults'}) eq 'HASH') {
           foreach my $item ('nocodemirror','daxecollapse','domcoordacc','copyright','sourceavail','archive') {
               if ($domconfig{'authordefaults'}{$item} ne $confhash{$item}) {
                   $changes{$item} = 1;
                }
           }
           if (ref($domconfig{'authordefaults'}{'editors'}) eq 'ARRAY') {
               my @diffs =
                   &Apache::loncommon::compare_arrays($confhash{'editors'},
                                                      $domconfig{'authordefaults'}{'editors'});
               unless (@diffs == 0) {
                   $changes{'editors'} = 1;
               }
           } else {
               my @diffs =
                   &Apache::loncommon::compare_arrays($confhash{'editors'},
                                                      $staticdefaults{'editors'});
               unless (@diffs == 0) {
                   $changes{'editors'} = 1;
               }
           }
       } else {
           my @offon = ('off','on');
           foreach my $item ('nocodemirror','daxecollapse','domcoordacc','archive') {
               if ($offon[$confhash{$item}] ne $staticdefaults{$item}) {
                   $changes{$item} = 1; 
               }
           }
           foreach my $item ('copyright','sourceavail') {
               if ($confhash{$item} ne $staticdefaults{$item}) {
                   $changes{$item} = 1;
               }
           }
           my @diffs =
               &Apache::loncommon::compare_arrays($confhash{'editors'},
                                                  $staticdefaults{'editors'});
           unless (@diffs == 0) {
               $changes{'editors'} = 1;
           }
       }
       foreach my $key ('authorquota','webdav') {
           if (ref($curr_quotas{$key}) eq 'HASH') {
               foreach my $type (@insttypes,'default') {
                   if (exists($save_quotas{$key}{$type})) {
                       if ($save_quotas{$key}{$type} ne $curr_quotas{$key}{$type}) {
                           $changes{$key}{$type} = 1;
                       }
                   } elsif (exists($curr_quotas{$key}{$type})) {
                       $save_quotas{$key}{$type} = $curr_quotas{$key}{$type};
                   } else {
                       $save_quotas{$key}{$type} = $staticdefaults{$key};
                   }
               }
           } else {
               foreach my $type (@insttypes,'default') {
                   if (exists($save_quotas{$key}{$type})) {
                       unless ($save_quotas{$key}{$type} eq $staticdefaults{$key}) {
                           $changes{$key}{$type} = 1;
                       }
                   } else {
                       $save_quotas{$key}{$type} = $staticdefaults{$key};
                   }
               }
           }
       }
       if (ref($curr_quotas{'webdav'}) eq 'HASH') {
           if (exists($save_quotas{'webdav'}{'_LC_adv'})) {
               if ($save_quotas{'webdav'}{'_LC_adv'} ne $curr_quotas{'webdav'}{'_LC_adv'}) {
                   $changes{'webdav_LC_adv'} = 1;
               }
           } elsif (exists($curr_quotas{'webdav'}{'_LC_adv'})) {
               $changes{'webdav_LC_adv'} = 1;
           }
       } elsif (exists($save_quotas{'webdav'}{'_LC_adv'})) {
           $changes{'webdav_LC_adv'} = 1;
       }
       my %confighash = (
                           quotas  => \%save_quotas,
                           authordefaults => \%confhash,
                        );
       my $putresult = &Apache::lonnet::put_dom('configuration',\%confighash,
                                                $dom);
       my $resulttext;
       if ($putresult eq 'ok') {
           if (keys(%changes)) {
               my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
               if ((exists($changes{'authorquota'})) || (exists($changes{'webdav'})) ||
                   ($changes{'webdav_LC_adv'})) {
                   if ((exists($changes{'authorquota'})) && (ref($save_quotas{'authorquota'}) eq 'HASH')) {
                       $domdefaults{'authorquota'} = $save_quotas{'authorquota'};
                   }
                   if (((exists($changes{'webdav'})) || ($changes{'webdav_LC_adv'})) &&
                       (ref($save_quotas{'webdav'}) eq 'HASH')) {
                       $domdefaults{'webdav'} = $save_quotas{'webdav'};
                   }
               }
               $resulttext = &mt('Changes made:').'<ul>';
               my $authoroverride;
               foreach my $key ('nocodemirror','daxecollapse','domcoordacc','copyright','sourceavail') {
                   if (exists($changes{$key})) {
                       $domdefaults{$key} = $confhash{$key};
                       my $shown;
                       unless ($authoroverride) {
                           $resulttext .= '<li>'.&mt('Defaults which can be overridden by Author').'<ul>';
                           $authoroverride = 1;
                       }
                       if (($key eq 'nocodemirror') || ($key eq 'daxecollapse') || ($key eq 'domcoordacc')) {
                           $shown = ($confhash{$key} ? &mt('Yes') : &mt('No'));
                       } elsif ($key eq 'copyright') {
                           $shown = &Apache::loncommon::copyrightdescription($confhash{$key});
                       } elsif ($key eq 'sourceavail') {
                           $shown = &Apache::loncommon::source_copyrightdescription($confhash{$key});
                       }
                       $resulttext .= '<li>'.&mt('[_1] set to: [_2]',$titles{$key},$shown).'</li>';
                   }
               }
               if ($authoroverride) {
                   $resulttext .= '</ul></li>';
               }
               my $domcoordoverride;
               foreach my $key ('editors','authorquota','webdav','webdav_LC_adv','archive') {
                   if (exists($changes{$key})) {
                       my $shown;
                       unless ($domcoordoverride) {
                           $resulttext .= '<li>'.&mt('Defaults which can be overridden by a Domain Coodinator').'<ul>';
                           $domcoordoverride = 1;
                       }
                       if ($key eq 'editors') {
                           if (ref($confhash{'editors'}) eq 'ARRAY') {
                               $domdefaults{'editors'} = join(',',@{$confhash{'editors'}});
                               if (@{$confhash{'editors'}}) {
                                   $shown = join(', ', map { $titles{$_} } @{$confhash{'editors'}});
                               } else {
                                   $shown = &mt('None');
                               }
                           }
                       } elsif ($key eq 'authorquota') {
                           foreach my $type (@insttypes) {
                               $shown .= $usertypes->{$type}.' -- '.$save_quotas{$key}{$type}.', ';
                           }
                           $shown .= $othertitle.' -- '.$save_quotas{$key}{'default'};
                       } elsif ($key eq 'webdav') {
                           foreach my $type (@insttypes) {
                               $shown .= $usertypes->{$type}.' -- '. ($save_quotas{$key}{$type} ? &mt('Yes') : &mt('No')).', ';
                           }
                           $shown .= $othertitle.' -- '. ($save_quotas{$key}{'default'} ? &mt('Yes') : &mt('No'));
                       } elsif ($key eq 'webdav_LC_adv') {
                           if (exists($save_quotas{'webdav'}{'_LC_adv'})) {
                               $shown = ($save_quotas{'webdav'}{'_LC_adv'} ? $titles{'overon'} : $titles{'overoff'});
                           } else {
                               $shown = $titles{'none'};
                           }
                       } elsif ($key eq 'archive') {
                           $domdefaults{$key} = $confhash{$key};
                           $shown = ($confhash{$key} ? &mt('Yes') : &mt('No'));
                       }
                       $resulttext .= '<li>'.&mt('[_1] set to: [_2]',$titles{$key},$shown).'</li>';
                   }
               }
               if ($domcoordoverride) {
                   $resulttext .= '</ul></li>';
               }
               $resulttext .= '</ul>';
               my $cachetime = 24*60*60;
               &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
               if (ref($lastactref) eq 'HASH') {
                   $lastactref->{'domdefaults'} = 1;
               }
           } else {
               $resulttext = &mt('No changes made to Authoring Space defaults');
           }
       }
       return $resulttext;
   }
   
 sub modify_rolecolors {  sub modify_rolecolors {
     my ($r,$dom,$confname,$roles,$lastactref,%domconfig) = @_;      my ($r,$dom,$confname,$roles,$lastactref,%domconfig) = @_;
     my ($resulttext,%rolehash);      my ($resulttext,%rolehash);
Line 13013  sub modify_colors { Line 13725  sub modify_colors {
             @images = ('img','logo','domlogo','login');              @images = ('img','logo','domlogo','login');
             @bgs = ('pgbg','mainbg','sidebg');              @bgs = ('pgbg','mainbg','sidebg');
         } else {          } else {
             @images = ('img');              @images = ();
             @bgs = ('pgbg','tabbg','sidebg');              @bgs = ('pgbg','tabbg','sidebg');
         }          }
         my %defaults = &role_defaults($role,\@bgs,\@links,\@images,\@logintext);          my %defaults = &role_defaults($role,\@bgs,\@links,\@images,\@logintext);
         unless ($env{'form.'.$role.'_font'} eq $defaults{'font'}) {          $env{'form.'.$role.'_font'} = lc($env{'form.'.$role.'_font'});
           if ($env{'form.'.$role.'_font'} =~ /^\w+/) {
               $env{'form.'.$role.'_font'} = '#'.$env{'form.'.$role.'_font'};
           }
           unless ($env{'form.'.$role.'_font'} eq lc($defaults{'font'})) {
             $confhash->{$role}{'font'} = $env{'form.'.$role.'_font'};              $confhash->{$role}{'font'} = $env{'form.'.$role.'_font'};
         }          }
         if ($role eq 'login') {          if ($role eq 'login') {
Line 13035  sub modify_colors { Line 13751  sub modify_colors {
             if ($env{'form.'.$role.'_fontmenu'} =~ /^\w+/) {              if ($env{'form.'.$role.'_fontmenu'} =~ /^\w+/) {
                 $env{'form.'.$role.'_fontmenu'} = '#'.$env{'form.'.$role.'_fontmenu'};                  $env{'form.'.$role.'_fontmenu'} = '#'.$env{'form.'.$role.'_fontmenu'};
             }              }
             unless($env{'form.'.$role.'_fontmenu'} eq lc($defaults{'fontmenu'})) {              unless ($env{'form.'.$role.'_fontmenu'} eq lc($defaults{'fontmenu'})) {
                 $confhash->{$role}{'fontmenu'} = $env{'form.'.$role.'_fontmenu'};                  $confhash->{$role}{'fontmenu'} = $env{'form.'.$role.'_fontmenu'};
             }              }
         }          }
Line 13496  sub check_switchserver { Line 14212  sub check_switchserver {
     my @ids=&Apache::lonnet::current_machine_ids();      my @ids=&Apache::lonnet::current_machine_ids();
     foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }      foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }
     if (!$allowed) {      if (!$allowed) {
  $switchserver='<a href="/adm/switchserver?otherserver='.$home.'&amp;role=dc./'.$dom.'/&amp;destinationurl=/adm/domainprefs">'.&mt('Switch Server').'</a>';   $switchserver='<a href="/adm/switchserver?otherserver='.$home.'&amp;role='.
                         &HTML::Entities::encode($env{'request.role'},'\'<>"&').
                         '&amp;destinationurl=/adm/domainprefs">'.&mt('Switch Server').'</a>';
     }      }
     return $switchserver;      return $switchserver;
 }  }
Line 13508  sub modify_quotas { Line 14226  sub modify_quotas {
         $author_ok,$switchserver,$errors,$validationitemsref,$validationnamesref,          $author_ok,$switchserver,$errors,$validationitemsref,$validationnamesref,
         $validationfieldsref);          $validationfieldsref);
     if ($action eq 'quotas') {      if ($action eq 'quotas') {
         $context = 'tools';           $context = 'tools';
     } else {      } else {
         $context = $action;          $context = $action;
     }      }
Line 13528  sub modify_quotas { Line 14246  sub modify_quotas {
         @usertools = ('author');          @usertools = ('author');
         %titles = &authorrequest_titles();          %titles = &authorrequest_titles();
     } else {      } else {
         @usertools = ('aboutme','blog','webdav','portfolio','timezone');          @usertools = ('aboutme','blog','portfolio','portaccess','timezone');
         %titles = &tool_titles();          %titles = &tool_titles();
     }      }
     my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);      my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
Line 13551  sub modify_quotas { Line 14269  sub modify_quotas {
         } else {          } else {
             if ($key =~ /^form\.quota_(.+)$/) {              if ($key =~ /^form\.quota_(.+)$/) {
                 $confhash{'defaultquota'}{$1} = $env{$key};                  $confhash{'defaultquota'}{$1} = $env{$key};
             } elsif ($key =~ /^form\.authorquota_(.+)$/) {  
                 $confhash{'authorquota'}{$1} = $env{$key};  
             } elsif ($key =~ /^form\.\Q$context\E_(.+)$/) {              } elsif ($key =~ /^form\.\Q$context\E_(.+)$/) {
                 @{$toolshash{$1}} = &Apache::loncommon::get_env_multiple($key);                  @{$toolshash{$1}} = &Apache::loncommon::get_env_multiple($key);
             }              }
Line 13846  sub modify_quotas { Line 14562  sub modify_quotas {
         }          }
     } else {      } else {
         $confhash{'defaultquota'}{'default'} = $env{'form.defaultquota'};          $confhash{'defaultquota'}{'default'} = $env{'form.defaultquota'};
         $confhash{'authorquota'}{'default'} = $env{'form.authorquota'};  
     }      }
     foreach my $item (@usertools) {      foreach my $item (@usertools) {
         foreach my $type (@{$types},'default','_LC_adv') {          foreach my $type (@{$types},'default','_LC_adv') {
Line 13935  sub modify_quotas { Line 14650  sub modify_quotas {
                 }                  }
             }              }
             if (ref($domconfig{'quotas'}{'authorquota'}) eq 'HASH') {              if (ref($domconfig{'quotas'}{'authorquota'}) eq 'HASH') {
                 foreach my $key (keys(%{$domconfig{'quotas'}{'authorquota'}})) {                  $confhash{'authorquota'} = $domconfig{'quotas'}{'authorquota'};
                     if (exists($confhash{'authorquota'}{$key})) {              }
                         if ($confhash{'authorquota'}{$key} ne $domconfig{'quotas'}{'authorquota'}{$key}) {              if (ref($domconfig{'quotas'}{'webdav'}) eq 'HASH') {
                             $changes{'authorquota'}{$key} = 1;                  $confhash{'webdav'} = $domconfig{'quotas'}{'webdav'};
                         }  
                     } else {  
                         $confhash{'authorquota'}{$key} = $domconfig{'quotas'}{'authorquota'}{$key};  
                     }  
                 }  
             }              }
         }          }
         if (ref($confhash{'defaultquota'}) eq 'HASH') {          if (ref($confhash{'defaultquota'}) eq 'HASH') {
Line 13963  sub modify_quotas { Line 14673  sub modify_quotas {
                 }                  }
             }              }
         }          }
         if (ref($confhash{'authorquota'}) eq 'HASH') {  
             foreach my $key (keys(%{$confhash{'authorquota'}})) {  
                 if (ref($domconfig{'quotas'}) eq 'HASH') {  
                     if (ref($domconfig{'quotas'}{'authorquota'}) eq 'HASH') {  
                         if (!exists($domconfig{'quotas'}{'authorquota'}{$key})) {  
                             $changes{'authorquota'}{$key} = 1;  
                         }  
                     } else {  
                         $changes{'authorquota'}{$key} = 1;  
                     }  
                 } else {  
                     $changes{'authorquota'}{$key} = 1;  
                 }  
             }  
         }  
     }      }
   
     if ($context eq 'requestauthor') {      if ($context eq 'requestauthor') {
Line 14018  sub modify_quotas { Line 14713  sub modify_quotas {
                     }                      }
                     $resulttext .= '</ul></li>';                      $resulttext .= '</ul></li>';
                 }                  }
                 if (ref($changes{'authorquota'}) eq 'HASH') {  
                     $resulttext .= '<li>'.&mt('Authoring Space default quotas').'<ul>';  
                     foreach my $type (@{$types},'default') {  
                         if (defined($changes{'authorquota'}{$type})) {  
                             my $typetitle = $usertypes->{$type};  
                             if ($type eq 'default') {  
                                 $typetitle = $othertitle;  
                             }  
                             $resulttext .= '<li>'.&mt('[_1] set to [_2] MB',$typetitle,$confhash{'authorquota'}{$type}).'</li>';  
                         }  
                     }  
                     $resulttext .= '</ul></li>';  
                 }  
             }              }
             my %newenv;              my %newenv;
             foreach my $item (@usertools) {              foreach my $item (@usertools) {
Line 14182  sub modify_quotas { Line 14864  sub modify_quotas {
                             $resulttext .= '<li>'.&mt('Validated course requests identified as processed by: [_1]',                              $resulttext .= '<li>'.&mt('Validated course requests identified as processed by: [_1]',
                                                      '<b>'.$changes{'validation'}{'dc'}.'</b>').'</li>';                                                       '<b>'.$changes{'validation'}{'dc'}.'</b>').'</li>';
                         }                          }
                           $resulttext .= '</ul></li>';
                     }                      }
                 }                  }
             }              }
Line 14493  sub lti_security_results { Line 15176  sub lti_security_results {
                                        off => &mt('Encryption of stored external tool secrets defined in domain disabled'),                                         off => &mt('Encryption of stored external tool secrets defined in domain disabled'),
                                      },                                       },
                              );                               );
   
             }              }
             my @types= ('crs','dom');              my @types= ('crs','dom');
             if ($context eq 'lti') {              if ($context eq 'lti') {
Line 14589  sub lti_security_results { Line 15271  sub lti_security_results {
             }              }
         } elsif ($item eq 'linkprot') {          } elsif ($item eq 'linkprot') {
             next;              next;
           } elsif ($item eq 'suggested') {
               if ((ref($secchanges->{'suggested'}) eq 'HASH') &&
                   (ref($newsec->{'suggested'}) eq 'HASH')) {
                   my $suggestions;
                   foreach my $id (sort { $a <=> $b } keys(%{$secchanges->{'suggested'}})) {
                       if (ref($newsec->{'suggested'}->{$id}) eq 'HASH') {
                           my $name = $newsec->{'suggested'}->{$id}->{'name'};
                           my $info = $newsec->{'suggested'}->{$id}->{'info'};
                           $suggestions .= '<li>'.&mt('Launcher: [_1]',$name).'<br />'.
                                                  &mt('Recommend: [_1]','<pre>'.$info.'</pre>').
                                           '</li>';
                       } else {
                           $suggestions .= '<li>'.&mt('Recommendations deleted for Launcher: [_1]',
                                                      $newsec->{'suggested'}->{$id}).'</li>';
                       }
                   }
                   if ($suggestions) {
                       $output .= '<li>'.&mt('Hints in Courses for Link Protector Configuration').
                                  '<ul>'.$suggestions.'</ul>'.
                                  '</li>';
                   }
               }
         }          }
     }      }
     if ($needs_update) {      if ($needs_update) {
Line 15193  sub modify_lti { Line 15897  sub modify_lti {
         }          }
     }      }
     if (ref($currltisec{'linkprot'}) eq 'HASH') {      if (ref($currltisec{'linkprot'}) eq 'HASH') {
         foreach my $id (%{$currltisec{'linkprot'}}) {          foreach my $id (keys(%{$currltisec{'linkprot'}})) {
             next if ($id !~ /^\d+$/);              next if ($id !~ /^\d+$/);
             unless (exists($linkprotchg{$id})) {              unless (exists($linkprotchg{$id})) {
                 if (ref($currltisec{'linkprot'}{$id}) eq 'HASH') {                  if (ref($currltisec{'linkprot'}{$id}) eq 'HASH') {
Line 15215  sub modify_lti { Line 15919  sub modify_lti {
     if ($proterror) {      if ($proterror) {
         $errors .= '<li>'.$proterror.'</li>';          $errors .= '<li>'.$proterror.'</li>';
     }      }
   
       my (%delsuggested,%suggids,@suggested);;
       if (ref($currltisec{'suggested'}) eq 'HASH') {
           my $maxnum = $env{'form.linkprot_suggested_maxnum'};
           my @todelete = &Apache::loncommon::get_env_multiple('form.linkprot_suggested_del');
           for (my $i=0; $i<$maxnum; $i++) {
               my $itemid = $env{'form.linkprot_suggested_id_'.$i};
               $itemid =~ s/\D+//g;
               if ($itemid) {
                   if (ref($currltisec{'suggested'}->{$itemid}) eq 'HASH') {
                       push(@suggested,$i);
                       $suggids{$i} = $itemid;
                       if ((@todelete > 0) && (grep(/^$i$/,@todelete))) {
                           if (ref($currltisec{'suggested'}{$itemid}) eq 'HASH') {
                               $delsuggested{$itemid} = $currltisec{'suggested'}{$itemid}{'name'};
                           }
                       } else {
                           if ($env{'form.linkprot_suggested_name_'.$i} eq '') {
                               $delsuggested{$itemid} = $currltisec{'suggested'}{$itemid}{'name'};
                           } else {
                               $env{'form.linkprot_suggested_name_'.$i} =~ s/(`)/'/g;
                               $env{'form.linkprot_suggested_info_'.$i} =~ s/(`)/'/g;
                               $newltisec{'suggested'}{$itemid}{'name'} = $env{'form.linkprot_suggested_name_'.$i};
                               $newltisec{'suggested'}{$itemid}{'info'} = $env{'form.linkprot_suggested_info_'.$i};
                               if (($currltisec{'suggested'}{$itemid}{'name'} ne $newltisec{'suggested'}{$itemid}{'name'}) ||
                                   ($currltisec{'suggested'}{$itemid}{'info'} ne $newltisec{'suggested'}{$itemid}{'info'})) {
                                   $secchanges{'suggested'}{$itemid} = 1;
                               }
                           }
                       }
                   }
               }
           }
       }
       foreach my $key (keys(%delsuggested)) {
           $newltisec{'suggested'}{$key} = $delsuggested{$key};
           $secchanges{'suggested'}{$key} = 1;
       }
       if (($env{'form.linkprot_suggested_add'}) &&
           ($env{'form.linkprot_suggested_name_add'} ne '')) {
           $env{'form.linkprot_suggested_name_add'} =~ s/(`)/'/g;
           $env{'form.linkprot_suggested_info_add'} =~ s/(`)/'/g;
           my ($newsuggid,$errormsg) = &get_lti_id($dom,$env{'form.linkprot_suggested_name_add'},'suggested');
           if ($newsuggid) {
               $newltisec{'suggested'}{$newsuggid}{'name'} = $env{'form.linkprot_suggested_name_add'};
               $newltisec{'suggested'}{$newsuggid}{'info'} = $env{'form.linkprot_suggested_info_add'};
               $secchanges{'suggested'}{$newsuggid} = 1;
           } else {
               my $error = &mt('Failed to acquire unique ID for new Link Protectors in Courses Suggestion');
               if ($errormsg) {
                   $error .= ' ('.$errormsg.')';
               }
               $errors .= '<li><span class="LC_error">'.$error.'</span></li>';
           }
       }
     my (@items,%deletions,%itemids);      my (@items,%deletions,%itemids);
     if ($env{'form.lti_add'}) {      if ($env{'form.lti_add'}) {
         my $consumer = $env{'form.lti_consumer_add'};          my $consumer = $env{'form.lti_consumer_add'};
         $consumer =~ s/(`)/'/g;          $consumer =~ s/(`)/'/g;
         ($newid,my $error) = &get_lti_id($dom,$consumer);          ($newid,my $errormsg) = &get_lti_id($dom,$consumer,'lti');
         if ($newid) {          if ($newid) {
             $itemids{'add'} = $newid;              $itemids{'add'} = $newid;
             push(@items,'add');              push(@items,'add');
             $changes{$newid} = 1;              $changes{$newid} = 1;
         } else {          } else {
             my $error = &mt('Failed to acquire unique ID for new LTI configuration');              my $error = &mt('Failed to acquire unique ID for new LTI configuration');
               if ($errormsg) {
                   $error .= ' ('.$errormsg.')';
               }
             $errors .= '<li><span class="LC_error">'.$error.'</span></li>';              $errors .= '<li><span class="LC_error">'.$error.'</span></li>';
         }          }
     }      }
Line 15329  sub modify_lti { Line 16091  sub modify_lti {
             }              }
             my @possinstdata =  &Apache::loncommon::get_env_multiple('form.lti_instdata_'.$idx);              my @possinstdata =  &Apache::loncommon::get_env_multiple('form.lti_instdata_'.$idx);
             if (@possinstdata) {              if (@possinstdata) {
                 foreach my $field (@possinstdata) {                  foreach my $field (sort(@possinstdata)) {
                     if (exists($fieldtitles{$field})) {                      if (exists($fieldtitles{$field})) {
                         push(@{$confhash{$itemid}{'instdata'}});                          push(@{$confhash{$itemid}{'instdata'}},$field);
                     }                      }
                 }                  }
             }              }
Line 15493  sub modify_lti { Line 16255  sub modify_lti {
                         }                          }
                     }                      }
                     unless ($changes{$itemid}) {                      unless ($changes{$itemid}) {
                         foreach my $field ('makeuser','lcmenu') {                          foreach my $field ('makeuser','lcmenu','instdata') {
                             if (ref($currlti{$field}) eq 'ARRAY') {                              if (ref($currlti{$field}) eq 'ARRAY') {
                                 if (ref($confhash{$itemid}{$field}) eq 'ARRAY') {                                  if (ref($confhash{$itemid}{$field}) eq 'ARRAY') {
                                     my @diffs = &Apache::loncommon::compare_arrays($currlti{$field},                                      my @diffs = &Apache::loncommon::compare_arrays($currlti{$field},
Line 15707  sub modify_lti { Line 16469  sub modify_lti {
                                 $resulttext .= '<li>'.&mt('Institutional data will be used when creating a new user for: [_1]',                                  $resulttext .= '<li>'.&mt('Institutional data will be used when creating a new user for: [_1]',
                                                           join(', ',map { $fieldtitles{$_}; } @{$confhash{$itemid}{'instdata'}})).'</li>';                                                            join(', ',map { $fieldtitles{$_}; } @{$confhash{$itemid}{'instdata'}})).'</li>';
                             } else {                              } else {
                                 $resulttext .= '<li>'.&mt('No institutional data used when creating a new user.').'</li>';                                  $resulttext .= '<li>'.&mt('No institutional data used when creating a new user').'</li>';
                             }                              }
                           } else {
                               $resulttext .= '<li>'.&mt('No institutional data used when creating a new user').'</li>';
                         }                          }
                         foreach my $item ('topmenu','inlinemenu') {                          foreach my $item ('topmenu','inlinemenu') {
                             $resulttext .= '<li>'.$lt{$item}.':&nbsp;';                              $resulttext .= '<li>'.$lt{$item}.':&nbsp;';
Line 15819  sub modify_lti { Line 16583  sub modify_lti {
         }          }
         $resulttext .= '</ul>';          $resulttext .= '</ul>';
         if (ref($lastactref) eq 'HASH') {          if (ref($lastactref) eq 'HASH') {
             if (($secchanges{'encrypt'}) || ($secchanges{'private'})) {              if (($secchanges{'encrypt'}) || ($secchanges{'private'}) || (exists($secchanges{'suggested'}))) {
                   &Apache::lonnet::get_domain_defaults($dom,1);
                 $lastactref->{'domdefaults'} = 1;                  $lastactref->{'domdefaults'} = 1;
             }              }
         }          }
Line 15858  sub get_priv_creds { Line 16623  sub get_priv_creds {
 }  }
   
 sub get_lti_id {  sub get_lti_id {
     my ($domain,$consumer) = @_;      my ($domain,$consumer,$dbname) = @_;
     # get lock on lti db      unless (($dbname eq 'lti') || ($dbname eq 'suggested')) {
           return ('','invalid db');
       }
       # get lock on db
     my $lockhash = {      my $lockhash = {
                       lock => $env{'user.name'}.                        lock => $env{'user.name'}.
                               ':'.$env{'user.domain'},                                ':'.$env{'user.domain'},
                    };                     };
     my $tries = 0;      my $tries = 0;
     my $gotlock = &Apache::lonnet::newput_dom('lti',$lockhash,$domain);      my $gotlock = &Apache::lonnet::newput_dom($dbname,$lockhash,$domain);
     my ($id,$error);      my ($id,$error);
   
     while (($gotlock ne 'ok') && ($tries<10)) {      while (($gotlock ne 'ok') && ($tries<10)) {
         $tries ++;          $tries ++;
         sleep (0.1);          sleep (0.1);
         $gotlock = &Apache::lonnet::newput_dom('lti',$lockhash,$domain);          $gotlock = &Apache::lonnet::newput_dom($dbname,$lockhash,$domain);
     }      }
     if ($gotlock eq 'ok') {      if ($gotlock eq 'ok') {
         my %currids = &Apache::lonnet::dump_dom('lti',$domain);          my %currids = &Apache::lonnet::dump_dom($dbname,$domain);
         if ($currids{'lock'}) {          if ($currids{'lock'}) {
             delete($currids{'lock'});              delete($currids{'lock'});
             if (keys(%currids)) {              if (keys(%currids)) {
Line 15886  sub get_lti_id { Line 16654  sub get_lti_id {
                 $id = 1;                  $id = 1;
             }              }
             if ($id) {              if ($id) {
                 unless (&Apache::lonnet::newput_dom('lti',{ $id => $consumer },$domain) eq 'ok') {                  unless (&Apache::lonnet::newput_dom($dbname,{ $id => $consumer },$domain) eq 'ok') {
                     $error = 'nostore';                      $error = 'nostore';
                 }                  }
             } else {              } else {
                 $error = 'nonumber';                  $error = 'nonumber';
             }              }
         }          }
         my $dellockoutcome = &Apache::lonnet::del_dom('lti',['lock'],$domain);          my $dellockoutcome = &Apache::lonnet::del_dom($dbname,['lock'],$domain);
     } else {      } else {
         $error = 'nolock';          $error = 'nolock';
     }      }
Line 16659  sub modify_contacts { Line 17427  sub modify_contacts {
                     $contacts_hash{'contacts'}{'overrides'}{$type}{'include'} = $includeloc{$type}.':'.&escape($includestr{$type});                      $contacts_hash{'contacts'}{'overrides'}{$type}{'include'} = $includeloc{$type}.':'.&escape($includestr{$type});
                     $newsetting{'override_'.$type}{'include'} = $contacts_hash{'contacts'}{'overrides'}{$type}{'include'};                      $newsetting{'override_'.$type}{'include'} = $contacts_hash{'contacts'}{'overrides'}{$type}{'include'};
                 }                  }
             }                   }
         }          }
     }      }
     if (keys(%currsetting) > 0) {      if (keys(%currsetting) > 0) {
Line 16717  sub modify_contacts { Line 17485  sub modify_contacts {
             }              }
         }          }
         if (@statuses) {          if (@statuses) {
             if (ref($currsetting{'overrides'}) eq 'HASH') {               if (ref($currsetting{'overrides'}) eq 'HASH') {
                 foreach my $key (keys(%{$currsetting{'overrides'}})) {                  foreach my $key (keys(%{$currsetting{'overrides'}})) {
                     if (ref($currsetting{'overrides'}{$key}) eq 'HASH') {                      if (ref($currsetting{'overrides'}{$key}) eq 'HASH') {
                         if (ref($newsetting{'override_'.$key}) eq 'HASH') {                          if (ref($newsetting{'override_'.$key}) eq 'HASH') {
                             foreach my $item (@contacts,'bcc','others','include') {                              foreach my $item (@contacts,'bcc','others','include') {
                                 if ($currsetting{'overrides'}{$key}{$item} ne $newsetting{'override_'.$key}{$item}) {                                   if ($currsetting{'overrides'}{$key}{$item} ne $newsetting{'override_'.$key}{$item}) {
                                     push(@{$changes{'overrides'}},$key);                                      push(@{$changes{'overrides'}},$key);
                                     last;                                      last;
                                 }                                  }
Line 16739  sub modify_contacts { Line 17507  sub modify_contacts {
                 }                  }
             } else {              } else {
                 foreach my $key (@overrides) {                  foreach my $key (@overrides) {
                     push(@{$changes{'overrides'}},$key);                       push(@{$changes{'overrides'}},$key);
                 }                  }
             }              }
         }          }
Line 16921  sub modify_contacts { Line 17689  sub modify_contacts {
                             $resulttext .= $bcctext.': <span class="LC_cusr_emph">'.$bcc{$type}.'</span>';                              $resulttext .= $bcctext.': <span class="LC_cusr_emph">'.$bcc{$type}.'</span>';
                         } elsif (!@text) {                          } elsif (!@text) {
                             $resulttext .= &mt('No one');                              $resulttext .= &mt('No one');
                         }                             }
                         if ($includestr{$type} ne '') {                          if ($includestr{$type} ne '') {
                             if ($includeloc{$type} eq 'b') {                              if ($includeloc{$type} eq 'b') {
                                 $resulttext .= '<br />'.&mt('Text automatically added to e-mail body:').' '.$includestr{$type};                                  $resulttext .= '<br />'.&mt('Text automatically added to e-mail body:').' '.$includestr{$type};
Line 16945  sub modify_contacts { Line 17713  sub modify_contacts {
                             if (ref($newsetting{'override_'.$type}) eq 'HASH') {                              if (ref($newsetting{'override_'.$type}) eq 'HASH') {
                                 my @text;                                  my @text;
                                 foreach my $item (@contacts) {                                  foreach my $item (@contacts) {
                                     if ($newsetting{'override_'.$type}{$item}) {                                       if ($newsetting{'override_'.$type}{$item}) {
                                         push(@text,$short_titles->{$item});                                          push(@text,$short_titles->{$item});
                                     }                                      }
                                 }                                  }
                                 if ($newsetting{'override_'.$type}{'others'} ne '') {                                  if ($newsetting{'override_'.$type}{'others'} ne '') {
                                     push(@text,$newsetting{'override_'.$type}{'others'});                                      push(@text,$newsetting{'override_'.$type}{'others'});
                                 }                                  }
     
                                 if (@text) {                                  if (@text) {
                                     $resulttext .= &mt('Helpdesk e-mail sent to: [_1]',                                      $resulttext .= &mt('Helpdesk e-mail sent to: [_1]',
                                                        '<span class="LC_cusr_emph">'.join(', ',@text).'</span>');                                                         '<span class="LC_cusr_emph">'.join(', ',@text).'</span>');
Line 17115  sub modify_contacts { Line 17883  sub modify_contacts {
 }  }
   
 sub modify_privacy {  sub modify_privacy {
     my ($dom,%domconfig) = @_;      my ($dom,$lastactref,%domconfig) = @_;
     my ($resulttext,%current,%changes);      my ($resulttext,%current,%changes);
     if (ref($domconfig{'privacy'}) eq 'HASH') {      if (ref($domconfig{'privacy'}) eq 'HASH') {
         %current = %{$domconfig{'privacy'}};          %current = %{$domconfig{'privacy'}};
Line 17351  sub modify_privacy { Line 18119  sub modify_privacy {
                 }                  }
             }              }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
               if ($changes{'approval'}) {
                   my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
                   delete($domdefaults{'userapprovals'});
                   if (ref($privacyhash{'approval'}) eq 'HASH') {
                       foreach my $domtype ('instdom','extdom') {
                           if (ref($privacyhash{'approval'}{$domtype}) eq 'HASH') {
                               foreach my $roletype ('domain','author','course','community') {
                                   if ($privacyhash{'approval'}{$domtype}{$roletype} eq 'user') {
                                       $domdefaults{'userapprovals'} = 1;
                                       last;
                                   }
                               }
                           }
                           last if ($domdefaults{'userapprovals'});               
                       }
                   }
                   my $cachetime = 24*60*60;
                   &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
                   if (ref($lastactref) eq 'HASH') {
                       $lastactref->{'domdefaults'} = 1;
                   }
               }
         } else {          } else {
             $resulttext = &mt('No changes made to user information settings');              $resulttext = &mt('No changes made to user information settings');
         }          }
Line 17793  sub modify_passwords { Line 18583  sub modify_passwords {
                                                    );                                                     );
                                 my $needed = '<ul><li>'.                                  my $needed = '<ul><li>'.
                                              join('</li><li>',map {$rulenames{$_} } @{$confighash{'passwords'}{'chars'}}).                                               join('</li><li>',map {$rulenames{$_} } @{$confighash{'passwords'}{'chars'}}).
                                              '</li></ul>';                                                '</li></ul>';
                                 $resulttext .= '<li>'.&mt('[_1] set to: [_2]',$titles{'chars'},$needed).'</li>';                                  $resulttext .= '<li>'.&mt('[_1] set to: [_2]',$titles{'chars'},$needed).'</li>';
                             } else {                              } else {
                                 $resulttext .= '<li>'.&mt('[_1] set to none',$titles{'chars'}).'</li>';                                  $resulttext .= '<li>'.&mt('[_1] set to none',$titles{'chars'}).'</li>';
Line 18276  sub modify_selfcreation { Line 19066  sub modify_selfcreation {
                             if (($chosen eq 'inst') || ($chosen eq 'noninst')) {                              if (($chosen eq 'inst') || ($chosen eq 'noninst')) {
                                 my $emaildom;                                  my $emaildom;
                                 if ($env{'form.cancreate_emaildomain_'.$chosen.'_'.$type} =~ /^\@[^\@]+$/) {                                  if ($env{'form.cancreate_emaildomain_'.$chosen.'_'.$type} =~ /^\@[^\@]+$/) {
                                     $emaildom = $env{'form.cancreate_emaildomain_'.$chosen.'_'.$type};                                       $emaildom = $env{'form.cancreate_emaildomain_'.$chosen.'_'.$type};
                                     $cancreate{'emaildomain'}{$type}{$chosen} = $emaildom;                                      $cancreate{'emaildomain'}{$type}{$chosen} = $emaildom;
                                     if (ref($curremaildom{$type}) eq 'HASH') {                                      if (ref($curremaildom{$type}) eq 'HASH') {
                                         if (exists($curremaildom{$type}{$chosen})) {                                          if (exists($curremaildom{$type}{$chosen})) {
Line 18288  sub modify_selfcreation { Line 19078  sub modify_selfcreation {
                                         }                                          }
                                     } elsif ($emaildom ne '') {                                      } elsif ($emaildom ne '') {
                                         push(@{$changes{'cancreate'}},'emaildomain');                                          push(@{$changes{'cancreate'}},'emaildomain');
                                     }                                       }
                                 }                                  }
                                 $cancreate{'emailoptions'}{$type} = $env{'form.cancreate_emailoptions_'.$type};                                  $cancreate{'emailoptions'}{$type} = $env{'form.cancreate_emailoptions_'.$type};
                             } elsif ($chosen eq 'custom') {                              } elsif ($chosen eq 'custom') {
Line 18715  sub modify_selfcreation { Line 19505  sub modify_selfcreation {
                                                                   );                                                                    );
                         if (@types) {                          if (@types) {
                             if (@statuses) {                              if (@statuses) {
                                 $chgtext .= &mt('Processing of requests to create account with e-mail verification set as follows:').                                   $chgtext .= &mt('Processing of requests to create account with e-mail verification set as follows:').
                                             '<ul>';                                              '<ul>';
                                 foreach my $status (@statuses) {                                  foreach my $status (@statuses) {
                                     if ($status eq 'default') {                                      if ($status eq 'default') {
Line 18923  sub modify_selfcreation { Line 19713  sub modify_selfcreation {
                                 $typename = $othertitle;                                  $typename = $othertitle;
                             } else {                              } else {
                                 $typename = $usertypes{$type};                                  $typename = $usertypes{$type};
                             }                               }
                             $chgtext .= &mt('(Affiliation: [_1])',$typename);                              $chgtext .= &mt('(Affiliation: [_1])',$typename);
                         }                          }
                         if (@{$email_rule{$type}} > 0) {                          if (@{$email_rule{$type}} > 0) {
Line 19107  sub modify_usermodification { Line 19897  sub modify_usermodification {
             }              }
         }          }
     }      }
     my @contexts = ('author','course');      my @contexts = ('author','coauthor','course');
     my %context_title = (      my %context_title = (
                            author => 'In author context',                             author => 'In author context',
                              coauthor => 'As co-author manager',
                            course => 'In course context',                             course => 'In course context',
                         );                          );
     my @fields = ('lastname','firstname','middlename','generation',      my @fields = ('lastname','firstname','middlename','generation',
                   'permanentemail','id');                    'permanentemail','id');
     my %roles = (      my %roles = (
                   author => ['ca','aa'],                    author => ['ca','aa'],
                     coauthor => ['ca','aa'],
                   course => ['st','ep','ta','in','cr'],                    course => ['st','ep','ta','in','cr'],
                 );                  );
     my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();      my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
     foreach my $context (@contexts) {      foreach my $context (@contexts) {
           my $prefix = 'canmodify';
           if ($context eq 'coauthor') {
               $prefix = 'cacanmodify';
           }
         foreach my $role (@{$roles{$context}}) {          foreach my $role (@{$roles{$context}}) {
             my @modifiable =  &Apache::loncommon::get_env_multiple('form.canmodify_'.$role);              my @modifiable =  &Apache::loncommon::get_env_multiple('form.'.$prefix.'_'.$role);
             foreach my $item (@fields) {              foreach my $item (@fields) {
                 if (grep(/^\Q$item\E$/,@modifiable)) {                  if (grep(/^\Q$item\E$/,@modifiable)) {
                     $modifyhash{$context}{$role}{$item} = 1;                      $modifyhash{$context}{$role}{$item} = 1;
Line 19268  sub modify_defaults { Line 20064  sub modify_defaults {
         }          }
         if ($item eq 'portal_def') {          if ($item eq 'portal_def') {
             unless (grep(/^\Q$item\E$/,@errors)) {              unless (grep(/^\Q$item\E$/,@errors)) {
                 if ($newvalues{$item} eq '') {                   if ($newvalues{$item} eq '') {
                     foreach my $field ('email','web') {                      foreach my $field ('email','web') {
                         if (exists($domdefaults{$item.'_'.$field})) {                          if (exists($domdefaults{$item.'_'.$field})) {
                             delete($domdefaults{$item.'_'.$field});                              delete($domdefaults{$item.'_'.$field});
Line 19453  sub modify_defaults { Line 20249  sub modify_defaults {
                             $resulttext =~ s/, $//;                              $resulttext =~ s/, $//;
                             $resulttext .= '</li>';                              $resulttext .= '</li>';
                         } else {                          } else {
                             $resulttext .= '<li>'.&mt('Institutional user status types deleted').'</li>';                               $resulttext .= '<li>'.&mt('Institutional user status types deleted').'</li>';
                         }                          }
                     }                      }
                 } elsif ($item eq 'unamemap_rule') {                  } elsif ($item eq 'unamemap_rule') {
Line 20488  sub modify_coursedefaults { Line 21284  sub modify_coursedefaults {
     my @toggles = ('canuse_pdfforms','uselcmath','usejsme','inline_chem','ltiauth');      my @toggles = ('canuse_pdfforms','uselcmath','usejsme','inline_chem','ltiauth');
     my @numbers = ('anonsurvey_threshold','uploadquota_official','uploadquota_unofficial',      my @numbers = ('anonsurvey_threshold','uploadquota_official','uploadquota_unofficial',
                    'uploadquota_community','uploadquota_textbook','uploadquota_placement',                     'uploadquota_community','uploadquota_textbook','uploadquota_placement',
                    'mysqltables_official','mysqltables_unofficial','mysqltables_community',                     'coursequota_official','coursequota_unofficial','coursequota_community',
                    'mysqltables_textbook','mysqltables_placement');                     'coursequota_textbook','coursequota_placement','mysqltables_official',
                      'mysqltables_unofficial','mysqltables_community','mysqltables_textbook',
                      'mysqltables_placement');
     my @types = ('official','unofficial','community','textbook','placement');      my @types = ('official','unofficial','community','textbook','placement');
     my %staticdefaults = (      my %staticdefaults = (
                            anonsurvey_threshold => 10,                             anonsurvey_threshold => 10,
                            uploadquota          => 500,                             uploadquota          => 500,
                              coursequota          => 20,
                            postsubmit           => 60,                             postsubmit           => 60,
                            mysqltables          => 172800,                             mysqltables          => 172800,
                            domexttool           => 1,                             domexttool           => 1,
                              crsauthor            => 1,
                              crseditors           => ['edit','xml'],
                          );                           );
     my %texoptions = (      my %texoptions = (
                         MathJax  => 'MathJax',                          MathJax  => 'MathJax',
                         mimetex  => &mt('Convert to Images'),                          mimetex  => &mt('Convert to Images'),
                         tth      => &mt('TeX to HTML'),                          tth      => &mt('TeX to HTML'),
                      );                       );
   
       my @editors = ('edit','xml','daxe');
       my %editornames = &crseditor_titles();
   
     $defaultshash{'coursedefaults'} = {};      $defaultshash{'coursedefaults'} = {};
   
     if (ref($domconfig{'coursedefaults'}) ne 'HASH') {      if (ref($domconfig{'coursedefaults'}) ne 'HASH') {
Line 20541  sub modify_coursedefaults { Line 21346  sub modify_coursedefaults {
                 }                  }
                 $defaultshash{'coursedefaults'}{$item} = $newdef;                  $defaultshash{'coursedefaults'}{$item} = $newdef;
             } else {              } else {
                 my ($setting,$type) = ($item =~ /^(uploadquota|mysqltables)_(\w+)$/);                  my ($setting,$type) = ($item =~ /^(uploadquota|coursequota|mysqltables)_(\w+)$/);
                 if (ref($domconfig{'coursedefaults'}{$setting}) eq 'HASH') {                  if (ref($domconfig{'coursedefaults'}{$setting}) eq 'HASH') {
                     $currdef = $domconfig{'coursedefaults'}{$setting}{$type};                      $currdef = $domconfig{'coursedefaults'}{$setting}{$type};
                 }                  }
Line 20553  sub modify_coursedefaults { Line 21358  sub modify_coursedefaults {
                     unless (($currdef eq '') && ($newdef == $staticdefaults{$item})) {                      unless (($currdef eq '') && ($newdef == $staticdefaults{$item})) {
                         $changes{$item} = 1;                          $changes{$item} = 1;
                     }                      }
                 } elsif ($item =~ /^(uploadquota|mysqltables)_/) {                  } elsif ($item =~ /^(uploadquota|coursequota|mysqltables)_/) {
                     my $setting = $1;                      my $setting = $1;
                     unless (($currdef eq '') && ($newdef == $staticdefaults{$setting})) {                      unless (($currdef eq '') && ($newdef == $staticdefaults{$setting})) {
                         $changes{$setting} = 1;                          $changes{$setting} = 1;
Line 20688  sub modify_coursedefaults { Line 21493  sub modify_coursedefaults {
                 $changes{'postsubmit'} = 1;                  $changes{'postsubmit'} = 1;
             }              }
         }          }
         my (%newdomexttool,%newexttool,%olddomexttool,%oldexttool);          my (%newdomexttool,%newexttool,%newcrsauthor,%olddomexttool,%oldexttool,%oldcrsauthor,
               %posscrseditors);
         map { $newdomexttool{$_} = 1; } &Apache::loncommon::get_env_multiple('form.domexttool');          map { $newdomexttool{$_} = 1; } &Apache::loncommon::get_env_multiple('form.domexttool');
         map { $newexttool{$_} = 1; } &Apache::loncommon::get_env_multiple('form.exttool');           map { $newexttool{$_} = 1; } &Apache::loncommon::get_env_multiple('form.exttool');
           map { $newcrsauthor{$_} = 1; } &Apache::loncommon::get_env_multiple('form.crsauthor');
           map { $posscrseditors{$_} = 1; } &Apache::loncommon::get_env_multiple('form.crseditors');
         if (ref($domconfig{'coursedefaults'}{'domexttool'}) eq 'HASH') {          if (ref($domconfig{'coursedefaults'}{'domexttool'}) eq 'HASH') {
             %olddomexttool = %{$domconfig{'coursedefaults'}{'domexttool'}};              %olddomexttool = %{$domconfig{'coursedefaults'}{'domexttool'}};
         } else {          } else {
Line 20703  sub modify_coursedefaults { Line 21511  sub modify_coursedefaults {
             }              }
         }          }
         if (ref($domconfig{'coursedefaults'}{'exttool'}) eq 'HASH') {          if (ref($domconfig{'coursedefaults'}{'exttool'}) eq 'HASH') {
             %oldexttool = %{$domconfig{'coursedefaults'}{'exttool'}};                   %oldexttool = %{$domconfig{'coursedefaults'}{'exttool'}};
         } else {          } else {
             foreach my $type (@types) {              foreach my $type (@types) {
                if ($staticdefaults{'exttool'}) {                 if ($staticdefaults{'exttool'}) {
Line 20713  sub modify_coursedefaults { Line 21521  sub modify_coursedefaults {
                }                 }
             }              }
         }          }
           if (ref($domconfig{'coursedefaults'}{'crsauthor'}) eq 'HASH') {
               %oldcrsauthor = %{$domconfig{'coursedefaults'}{'crsauthor'}};
           } else {
               foreach my $type (@types) {
                  if ($staticdefaults{'crsauthor'}) {
                      $oldcrsauthor{$type} = 1;
                  } else {
                      $oldcrsauthor{$type} = 0;
                  }
               }
           }
           my @newcrseditors = ();
           foreach my $editor (@editors) {
               if ($posscrseditors{$editor}) {
                   push(@newcrseditors,$editor);
               }
           }
           if (ref($domconfig{'coursedefaults'}{'crseditors'}) eq 'ARRAY') {
               my @diffs =
                   &Apache::loncommon::compare_arrays($domconfig{'coursedefaults'}{'crseditors'},
                                                      \@newcrseditors);
               if (@diffs) {
                   $changes{'crseditors'} = 1; 
               }
           } else {
               my @diffs =
                   &Apache::loncommon::compare_arrays($staticdefaults{'crseditors'},
                                                      \@newcrseditors);
               unless (@diffs == 0) {
                   $changes{'crseditors'} = 1;
               }       
           }
         foreach my $type (@types) {          foreach my $type (@types) {
             unless ($newdomexttool{$type}) {              unless ($newdomexttool{$type}) {
                 $newdomexttool{$type} = 0;                  $newdomexttool{$type} = 0;
Line 20720  sub modify_coursedefaults { Line 21560  sub modify_coursedefaults {
             unless ($newexttool{$type}) {              unless ($newexttool{$type}) {
                 $newexttool{$type} = 0;                  $newexttool{$type} = 0;
             }              }
               unless ($newcrsauthor{$type}) {
                   $newcrsauthor{$type} = 0;
               }
             if ($newdomexttool{$type} != $olddomexttool{$type}) {              if ($newdomexttool{$type} != $olddomexttool{$type}) {
                 $changes{'domexttool'} = 1;                  $changes{'domexttool'} = 1;
             }              }
             if ($newexttool{$type} != $oldexttool{$type}) {              if ($newexttool{$type} != $oldexttool{$type}) {
                 $changes{'exttool'} = 1;                  $changes{'exttool'} = 1;
             }              }
               if ($newcrsauthor{$type} != $oldcrsauthor{$type}) {
                   $changes{'crsauthor'} = 1;
               }
         }          }
         $defaultshash{'coursedefaults'}{'domexttool'} = \%newdomexttool;          $defaultshash{'coursedefaults'}{'domexttool'} = \%newdomexttool;
         $defaultshash{'coursedefaults'}{'exttool'} = \%newexttool;          $defaultshash{'coursedefaults'}{'exttool'} = \%newexttool;
           $defaultshash{'coursedefaults'}{'crsauthor'} = \%newcrsauthor;
           $defaultshash{'coursedefaults'}{'crseditors'} = \@newcrseditors;
     }      }
     my $putresult = &Apache::lonnet::put_dom('configuration',\%defaultshash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%defaultshash,
                                              $dom);                                               $dom);
Line 20739  sub modify_coursedefaults { Line 21587  sub modify_coursedefaults {
                 ($changes{'coursecredits'}) || ($changes{'uselcmath'}) || ($changes{'usejsme'}) ||                  ($changes{'coursecredits'}) || ($changes{'uselcmath'}) || ($changes{'usejsme'}) ||
                 ($changes{'canclone'}) || ($changes{'mysqltables'}) || ($changes{'texengine'}) ||                  ($changes{'canclone'}) || ($changes{'mysqltables'}) || ($changes{'texengine'}) ||
                 ($changes{'inline_chem'}) || ($changes{'ltiauth'}) || ($changes{'domexttool'}) ||                  ($changes{'inline_chem'}) || ($changes{'ltiauth'}) || ($changes{'domexttool'}) ||
                 ($changes{'exttool'}) ) {                  ($changes{'exttool'}) || ($changes{'coursequota'}) || ($changes{'crsauthor'})) {
                 foreach my $item ('canuse_pdfforms','uselcmath','usejsme','inline_chem','texengine',                  foreach my $item ('canuse_pdfforms','uselcmath','usejsme','inline_chem','texengine',
                                   'ltiauth') {                                    'ltiauth') {
                     if ($changes{$item}) {                      if ($changes{$item}) {
Line 20772  sub modify_coursedefaults { Line 21620  sub modify_coursedefaults {
                         }                          }
                     }                      }
                 }                  }
                   if ($changes{'coursequota'}) {
                       if (ref($defaultshash{'coursedefaults'}{'coursequota'}) eq 'HASH') {
                           foreach my $type (@types) {
                               $domdefaults{$type.'coursequota'}=$defaultshash{'coursedefaults'}{'coursequota'}{$type};
                           }
                       }
                   }
                 if ($changes{'canclone'}) {                  if ($changes{'canclone'}) {
                     if (ref($defaultshash{'coursedefaults'}{'canclone'}) eq 'HASH') {                      if (ref($defaultshash{'coursedefaults'}{'canclone'}) eq 'HASH') {
                         if (ref($defaultshash{'coursedefaults'}{'canclone'}{'instcode'}) eq 'ARRAY') {                          if (ref($defaultshash{'coursedefaults'}{'canclone'}{'instcode'}) eq 'ARRAY') {
Line 20798  sub modify_coursedefaults { Line 21653  sub modify_coursedefaults {
                         }                          }
                     }                      }
                 }                  }
                   if ($changes{'crsauthor'}) {
                       if (ref($defaultshash{'coursedefaults'}{'crsauthor'}) eq 'HASH') {
                           foreach my $type (@types) {
                               $domdefaults{$type.'crsauthor'}=$defaultshash{'coursedefaults'}{'crsauthor'}{$type};
                           }
                       }
                   }
                   if ($changes{'crseditors'}) {
                       if (ref($defaultshash{'coursedefaults'}{'crseditors'}) eq 'ARRAY') {
                           $domdefaults{'crseditors'}=join(',',@{$defaultshash{'coursedefaults'}{'crseditors'}});
                       }
                   }
                 my $cachetime = 24*60*60;                  my $cachetime = 24*60*60;
                 &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);                  &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
                 if (ref($lastactref) eq 'HASH') {                  if (ref($lastactref) eq 'HASH') {
Line 20850  sub modify_coursedefaults { Line 21717  sub modify_coursedefaults {
                     } else {                      } else {
                         $resulttext .= '<li>'.&mt('Default quota for content uploaded via Course Editor remains default: [_1] MB',$staticdefaults{'uploadquota'}).'</li>';                          $resulttext .= '<li>'.&mt('Default quota for content uploaded via Course Editor remains default: [_1] MB',$staticdefaults{'uploadquota'}).'</li>';
                     }                      }
                   } elsif ($item eq 'coursequota') {
                       if (ref($defaultshash{'coursedefaults'}{'coursequota'}) eq 'HASH') {
                           $resulttext .= '<li>'.&mt('Default cumulative quota for all group portfolio spaces in course set as follows:').'<ul>'.
                                          '<li>'.&mt('Official courses: [_1] MB','<b>'.$defaultshash{'coursedefaults'}{'coursequota'}{'official'}.'</b>').'</li>'.
                                          '<li>'.&mt('Unofficial courses: [_1] MB','<b>'.$defaultshash{'coursedefaults'}{'coursequota'}{'unofficial'}.'</b>').'</li>'.
                                          '<li>'.&mt('Textbook courses: [_1] MB','<b>'.$defaultshash{'coursedefaults'}{'coursequota'}{'textbook'}.'</b>').'</li>'.
                                          '<li>'.&mt('Placement tests: [_1] MB','<b>'.$defaultshash{'coursedefaults'}{'coursequota'}{'placement'}.'</b>').'</li>'.
                                          '<li>'.&mt('Communities: [_1] MB','<b>'.$defaultshash{'coursedefaults'}{'coursequota'}{'community'}.'</b>').'</li>'.
                                          '</ul>'.
                                          '</li>';
                       } else {
                           $resulttext .= '<li>'.&mt('Default cumulative quota for all group portfolio spaces in course remains default: [_1] MB',$staticdefaults{'coursequota'}).'</li>';
                       }
                 } elsif ($item eq 'mysqltables') {                  } elsif ($item eq 'mysqltables') {
                     if (ref($defaultshash{'coursedefaults'}{'mysqltables'}) eq 'HASH') {                      if (ref($defaultshash{'coursedefaults'}{'mysqltables'}) eq 'HASH') {
                         $resulttext .= '<li>'.&mt('Lifetime of "Temporary" MySQL tables (student performance data) on homeserver').'<ul>'.                          $resulttext .= '<li>'.&mt('Lifetime of "Temporary" MySQL tables (student performance data) on homeserver').'<ul>'.
Line 20935  sub modify_coursedefaults { Line 21815  sub modify_coursedefaults {
                     } else {                      } else {
                         $resulttext .= '<li>'.&mt('LTI launch of deep-linked URL will require re-authentication').'</li>';                          $resulttext .= '<li>'.&mt('LTI launch of deep-linked URL will require re-authentication').'</li>';
                     }                      }
                 } elsif ($item eq 'domexttool') {                  } elsif (($item eq 'domexttool') || ($item eq 'exttool') || ($item eq 'crsauthor')) {
                     my @noyes = (&mt('no'),&mt('yes'));                      my @noyes = (&mt('no'),&mt('yes'));
                     if (ref($defaultshash{'coursedefaults'}{'domexttool'}) eq 'HASH') {                      my %status = (
                         $resulttext .= '<li>'.&mt('External Tools defined in the domain may be used as follows:').'<ul>'.                                     domexttool => {
                                        '<li>'.&mt('Official courses: [_1]','<b>'.$noyes[$defaultshash{'coursedefaults'}{'domexttool'}{'official'}].'</b>').'</li>'.                                                    ishash => &mt('External Tools defined in the domain may be used as follows:'), 
                                        '<li>'.&mt('Unofficial courses: [_1]','<b>'.$noyes[$defaultshash{'coursedefaults'}{'domexttool'}{'unofficial'}].'</b>').'</li>'.                                                    default => &mt('External Tools defined in the domain may be used in all course types, by default'),
                                        '<li>'.&mt('Textbook courses: [_1]','<b>'.$noyes[$defaultshash{'coursedefaults'}{'domexttool'}{'textbook'}].'</b>').'</li>'.                                                   },
                                        '<li>'.&mt('Placement tests: [_1]','<b>'.$noyes[$defaultshash{'coursedefaults'}{'domexttool'}{'placement'}].'</b>').'</li>'.                                     exttool => {
                                        '<li>'.&mt('Communities: [_1]','<b>'.$noyes[$defaultshash{'coursedefaults'}{'domexttool'}{'community'}].'</b>').'</li>'.                                                    ishash => &mt('External Tools can be defined and configured in course containers as follows:'),
                                                     default => &mt('External Tools can not be defined in any course types, by default'),
                                                 },
                                      crsauthor => {
                                                     ishash => &mt('Standard Problems can be created within course containers as follows:'),
                                                     default => &mt('Standard Problems can be created within any course type, by default'),
                                                   },
                                    );
                                      
                       if (ref($defaultshash{'coursedefaults'}{$item}) eq 'HASH') {
                           $resulttext .= '<li>'.$status{$item}{'ishash'}.'<ul>'.
                                          '<li>'.&mt('Official courses: [_1]','<b>'.$noyes[$defaultshash{'coursedefaults'}{$item}{'official'}].'</b>').'</li>'.
                                          '<li>'.&mt('Unofficial courses: [_1]','<b>'.$noyes[$defaultshash{'coursedefaults'}{$item}{'unofficial'}].'</b>').'</li>'.
                                          '<li>'.&mt('Textbook courses: [_1]','<b>'.$noyes[$defaultshash{'coursedefaults'}{$item}{'textbook'}].'</b>').'</li>'.
                                          '<li>'.&mt('Placement tests: [_1]','<b>'.$noyes[$defaultshash{'coursedefaults'}{$item}{'placement'}].'</b>').'</li>'.
                                          '<li>'.&mt('Communities: [_1]','<b>'.$noyes[$defaultshash{'coursedefaults'}{$item}{'community'}].'</b>').'</li>'.
                                        '</ul>'.                                         '</ul>'.
                                        '</li>';                                         '</li>';
                     } else {                      } else {
                         $resulttext .= '<li>'.&mt('External Tools defined in the domain may be used in all course types, by default').'</li>';                          $resulttext .= '<li>'.$status{$item}{'default'}.'</li>';
                     }                      }
                 } elsif ($item eq 'exttool') {                  } elsif ($item eq 'crseditors') {
                     my @noyes = (&mt('no'),&mt('yes'));                      if (ref($defaultshash{'coursedefaults'}{$item}) eq 'ARRAY') {
                     if (ref($defaultshash{'coursedefaults'}{'exttool'}) eq 'HASH') {                          my $shown;
                         $resulttext .= '<li>'.&mt('External Tools can be defined and configured in course containers as follows:').'<ul>'.                          if (@{$defaultshash{'coursedefaults'}{$item}}) {
                                        '<li>'.&mt('Official courses: [_1]','<b>'.$noyes[$defaultshash{'coursedefaults'}{'exttool'}{'official'}].'</b>').'</li>'.                              $shown = join(', ', map { $editornames{$_} } @{$defaultshash{'coursedefaults'}{$item}});
                                        '<li>'.&mt('Unofficial courses: [_1]','<b>'.$noyes[$defaultshash{'coursedefaults'}{'exttool'}{'unofficial'}].'</b>').'</li>'.                          } else {
                                        '<li>'.&mt('Textbook courses: [_1]','<b>'.$noyes[$defaultshash{'coursedefaults'}{'exttool'}{'textbook'}].'</b>').'</li>'.                              $shown = &mt('None');
                                        '<li>'.&mt('Placement tests: [_1]','<b>'.$noyes[$defaultshash{'coursedefaults'}{'exttool'}{'placement'}].'</b>').'</li>'.                          }
                                        '<li>'.&mt('Communities: [_1]','<b>'.$noyes[$defaultshash{'coursedefaults'}{'exttool'}{'community'}].'</b>').'</li>'.                          $resulttext .= '<li>'.&mt('Available editors for course/community resources: [_1]',$shown).'</li>';
                                        '</ul>'.  
                                        '</li>';  
                     } else {  
                         $resulttext .= '<li>'.&mt('External Tools can not be defined in any course types, by default').'</li>';  
                     }                      }
                 }                  }
             }              }
Line 21356  sub modify_wafproxy { Line 22247  sub modify_wafproxy {
                 }                  }
             } elsif ($currvalue{$item}) {              } elsif ($currvalue{$item}) {
                 $changes{$item} = 1;                  $changes{$item} = 1;
             }               }
         }          }
     } else {      } else {
         if (keys(%curralias)) {          if (keys(%curralias)) {
Line 21364  sub modify_wafproxy { Line 22255  sub modify_wafproxy {
         }          }
         if (keys(%currsaml)) {          if (keys(%currsaml)) {
             $changes{'saml'} = 1;              $changes{'saml'} = 1;
         }           }
         if (keys(%currvalue)) {          if (keys(%currvalue)) {
             foreach my $key (keys(%currvalue)) {              foreach my $key (keys(%currvalue)) {
                 $changes{$key} = 1;                  $changes{$key} = 1;
Line 21374  sub modify_wafproxy { Line 22265  sub modify_wafproxy {
     if (keys(%changes)) {      if (keys(%changes)) {
         my %defaultshash = (          my %defaultshash = (
                               wafproxy => \%wafproxy,                                wafproxy => \%wafproxy,
                            );                              );
         my $putresult = &Apache::lonnet::put_dom('configuration',\%defaultshash,          my $putresult = &Apache::lonnet::put_dom('configuration',\%defaultshash,
                                                  $dom);                                                   $dom);
         if ($putresult eq 'ok') {          if ($putresult eq 'ok') {
Line 21390  sub modify_wafproxy { Line 22281  sub modify_wafproxy {
                         $domdefaults{'waf_'.$item} = $wafproxy{$item};                          $domdefaults{'waf_'.$item} = $wafproxy{$item};
                     } elsif (exists($domdefaults{'waf_'.$item})) {                      } elsif (exists($domdefaults{'waf_'.$item})) {
                         delete($domdefaults{'waf_'.$item});                          delete($domdefaults{'waf_'.$item});
                     }                       }
                 }                  }
             }              }
             if ($updatedomdefs) {              if ($updatedomdefs) {
Line 21457  sub modify_wafproxy { Line 22348  sub modify_wafproxy {
                             $output .= '<li>'.&mt('Aliases deleted for hostnames').'</li>';                              $output .= '<li>'.&mt('Aliases deleted for hostnames').'</li>';
                         }                          }
                     } elsif ($item eq 'saml') {                      } elsif ($item eq 'saml') {
                         my $shown;                           my $shown;
                         if (ref($wafproxy{'saml'}) eq 'HASH') {                          if (ref($wafproxy{'saml'}) eq 'HASH') {
                             if (keys(%{$wafproxy{'saml'}})) {                              if (keys(%{$wafproxy{'saml'}})) {
                                 $shown = join(', ',sort(keys(%{$wafproxy{'saml'}})));                                  $shown = join(', ',sort(keys(%{$wafproxy{'saml'}})));
Line 21787  sub modify_usersessions { Line 22678  sub modify_usersessions {
                 if (($offload eq 'offloadoth') && (@okoffloadoth)) {                  if (($offload eq 'offloadoth') && (@okoffloadoth)) {
                     $changes{'offloadoth'} = 1;                      $changes{'offloadoth'} = 1;
                 }                  }
             }               }
         }          }
     } else {      } else {
         if (@okoffload) {          if (@okoffload) {
Line 22325  sub modify_loadbalancing { Line 23216  sub modify_loadbalancing {
         }          }
         if ($env{'form.loadbalancing_cookie_'.$i}) {          if ($env{'form.loadbalancing_cookie_'.$i}) {
             $defaultshash{'loadbalancing'}{$balancer}{'cookie'} = 1;              $defaultshash{'loadbalancing'}{$balancer}{'cookie'} = 1;
             if (exists($currbalancer{$balancer})) {               if (exists($currbalancer{$balancer})) {
                 unless ($currcookies{$balancer}) {                  unless ($currcookies{$balancer}) {
                     $changes{'curr'}{$balancer}{'cookie'} = 1;                      $changes{'curr'}{$balancer}{'cookie'} = 1;
                 }                  }
Line 23011  function balancerChange(balnum,baltotal, Line 23902  function balancerChange(balnum,baltotal,
 END  END
 }  }
   
   
 sub new_spares_js {  sub new_spares_js {
     my @sparestypes = ('primary','default');      my @sparestypes = ('primary','default');
     my $types = join("','",@sparestypes);      my $types = join("','",@sparestypes);

Removed from v.1.424  
changed lines
  Added in v.1.449


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