Diff for /loncom/interface/domainprefs.pm between versions 1.160.6.6 and 1.162

version 1.160.6.6, 2012/09/25 20:38:47 version 1.162, 2012/06/01 11:39:24
Line 86  $dom,$settings,$rowtotal,$action. Line 86  $dom,$settings,$rowtotal,$action.
   
 $dom is the domain, $settings is a reference to a hash of current settings for  $dom is the domain, $settings is a reference to a hash of current settings for
 the current context, $rowtotal is a reference to the scalar used to record the   the current context, $rowtotal is a reference to the scalar used to record the 
 number of rows displayed on the page, and $action is the context (quotas,  number of rows displayed on the page, and $action is the context (either quotas 
 requestcourses or requestauthor).  or requestcourses).
   
 The print_quotas routine was orginally created to display/store information  The print_quotas routine was orginally created to display/store information
 about default quota sizes for portfolio spaces for the different types of   about default quota sizes for portfolio spaces for the different types of 
Line 210  sub handler { Line 210  sub handler {
                 'quotas','autoenroll','autoupdate','autocreate',                  'quotas','autoenroll','autoupdate','autocreate',
                 'directorysrch','usercreation','usermodification',                  'directorysrch','usercreation','usermodification',
                 'contacts','defaults','scantron','coursecategories',                  'contacts','defaults','scantron','coursecategories',
                 'serverstatuses','requestcourses','usersessions',                  'serverstatuses','requestcourses','helpsettings',
                 'loadbalancing','requestauthor'],$dom);                  'coursedefaults','usersessions','loadbalancing'],$dom);
     my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll',      my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll',
                        'autoupdate','autocreate','directorysrch','contacts',                         'autoupdate','autocreate','directorysrch','contacts',
                        'usercreation','usermodification','scantron',                         'usercreation','usermodification','scantron',
                        'requestcourses','requestauthor','coursecategories',                         'requestcourses','coursecategories','serverstatuses','helpsettings',
                        'serverstatuses','usersessions');                         'coursedefaults','usersessions');
     if (keys(%servers) > 1) {      if (keys(%servers) > 1) {
         push(@prefs_order,'loadbalancing');          push(@prefs_order,'loadbalancing');
     }      }
Line 236  sub handler { Line 236  sub handler {
         'login' =>          'login' =>
                     { text => 'Log-in page options',                      { text => 'Log-in page options',
                       help => 'Domain_Configuration_Login_Page',                        help => 'Domain_Configuration_Login_Page',
                       header => [{col1 => 'Log-in Page Items',                        header => [{col1 => 'Item',
                                   col2 => '',},                                    col2 => '',}],
                                  {col1 => 'Log-in Help',  
                                   col2 => 'Value'}],  
                     },                      },
   
         'defaults' =>           'defaults' => 
                     { text => 'Default authentication/language/timezone/portal',                      { text => 'Default authentication/language/timezone/portal',
                       help => 'Domain_Configuration_LangTZAuth',                        help => 'Domain_Configuration_LangTZAuth',
Line 324  sub handler { Line 323  sub handler {
                              {col1 => 'Setting',                               {col1 => 'Setting',
                               col2 => 'Value'}],                                col2 => 'Value'}],
                  },                   },
         'requestauthor' =>  
                  {text => 'Request authoring space',  
                   help => 'Domain_Configuration_Request_Author',  
                   header => [{col1 => 'User affiliation',  
                               col2 => 'Availability/Processing of requests',},  
                              {col1 => 'Setting',  
                               col2 => 'Value'}],  
                  },  
         'coursecategories' =>          'coursecategories' =>
                   { text => 'Cataloging of courses/communities',                    { text => 'Cataloging of courses/communities',
                     help => 'Domain_Configuration_Cataloging_Courses',                      help => 'Domain_Configuration_Cataloging_Courses',
Line 349  sub handler { Line 340  sub handler {
                               col3 => 'Specific IPs',                                col3 => 'Specific IPs',
                             }],                              }],
                  },                   },
           'helpsettings' =>
                    {text   => 'Help page settings',
                     help   => 'Domain_Configuration_Help_Settings',
                     header => [{col1 => 'Authenticated Help Settings',
                                 col2 => ''},
                                {col1 => 'Unauthenticated Help Settings',
                                 col2 => ''}],
                    },
           'coursedefaults' => 
                    {text => 'Course/Community defaults',
                     help => 'Domain_Configuration_Course_Defaults',
                     header => [{col1 => 'Defaults which can be overridden in each course by a CC',
                                 col2 => 'Value',},
                                {col1 => 'Defaults which can be overridden for each course by a DC',
                                 col2 => 'Value',},],
                    },
           'privacy' => 
                    {text   => 'User Privacy',
                     help   => 'Domain_Configuration_User_Privacy',
                     header => [{col1 => 'Setting',
                                 col2 => 'Value',}],
                    },
         'usersessions' =>          'usersessions' =>
                  {text  => 'User session hosting/offloading',                   {text  => 'User session hosting/offloading',
                   help  => 'Domain_Configuration_User_Sessions',                    help  => 'Domain_Configuration_User_Sessions',
Line 375  sub handler { Line 388  sub handler {
                             header => [{col1 => 'Log-in Service',                              header => [{col1 => 'Log-in Service',
                                         col2 => 'Server Setting',},                                          col2 => 'Server Setting',},
                                        {col1 => 'Log-in Page Items',                                         {col1 => 'Log-in Page Items',
                                         col2 => ''},                                          col2 => ''}],
                                        {col1 => 'Log-in Help',  
                                         col2 => 'Value'}],  
                            };                             };
     }      }
     my @roles = ('student','coordinator','author','admin');      my @roles = ('student','coordinator','author','admin');
Line 389  sub handler { Line 400  sub handler {
     if ($phase eq 'process') {      if ($phase eq 'process') {
         &Apache::lonconfigsettings::make_changes($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,\@roles);          &Apache::lonconfigsettings::make_changes($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,\@roles);
     } elsif ($phase eq 'display') {      } elsif ($phase eq 'display') {
         my $js = &recaptcha_js();          my $js;
         if (keys(%servers) > 1) {          if (keys(%servers) > 1) {
             my ($othertitle,$usertypes,$types) =              my ($othertitle,$usertypes,$types) =
                 &Apache::loncommon::sorted_inst_types($dom);                  &Apache::loncommon::sorted_inst_types($dom);
             $js .= &lonbalance_targets_js($dom,$types,\%servers).              $js = &lonbalance_targets_js($dom,$types,\%servers).
                    &new_spares_js().                    &new_spares_js().
                    &common_domprefs_js().                    &common_domprefs_js().
                    &Apache::loncommon::javascript_array_indexof();                    &Apache::loncommon::javascript_array_indexof();
         }          }
         &Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,$js);          &Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,$js);
     } else {      } else {
Line 476  sub process_changes { Line 487  sub process_changes {
         $output = &modify_serverstatuses($dom,%domconfig);          $output = &modify_serverstatuses($dom,%domconfig);
     } elsif ($action eq 'requestcourses') {      } elsif ($action eq 'requestcourses') {
         $output = &modify_quotas($dom,$action,%domconfig);          $output = &modify_quotas($dom,$action,%domconfig);
     } elsif ($action eq 'requestauthor') {      } elsif ($action eq 'helpsettings') {
         $output = &modify_quotas($dom,$action,%domconfig);          $output = &modify_helpsettings($r,$dom,$confname,%domconfig);
       } elsif ($action eq 'coursedefaults') {
           $output = &modify_coursedefaults($dom,%domconfig);
     } elsif ($action eq 'usersessions') {      } elsif ($action eq 'usersessions') {
         $output = &modify_usersessions($dom,%domconfig);          $output = &modify_usersessions($dom,%domconfig);
     } elsif ($action eq 'loadbalancing') {      } elsif ($action eq 'loadbalancing') {
Line 508  sub print_config_box { Line 521  sub print_config_box {
     if ($numheaders > 1) {      if ($numheaders > 1) {
         my $colspan = '';          my $colspan = '';
         my $rightcolspan = '';          my $rightcolspan = '';
         if (($action eq 'rolecolors') || ($action eq 'coursecategories') ||          if (($action eq 'rolecolors') || ($action eq 'coursecategories') || ($action eq 'helpsettings')) {
             (($action eq 'login') && ($numheaders < 3))) {  
             $colspan = ' colspan="2"';              $colspan = ' colspan="2"';
         }          }
         if ($action eq 'usersessions') {          if ($action eq 'usersessions') {
Line 533  sub print_config_box { Line 545  sub print_config_box {
         } elsif ($action eq 'coursecategories') {          } elsif ($action eq 'coursecategories') {
             $output .= &print_coursecategories('top',$dom,$item,$settings,\$rowtotal);              $output .= &print_coursecategories('top',$dom,$item,$settings,\$rowtotal);
         } elsif ($action eq 'login') {          } elsif ($action eq 'login') {
             if ($numheaders == 3) {              $output .= &print_login('top',$dom,$confname,$phase,$settings,\$rowtotal);
                 $colspan = ' colspan="2"';              $colspan = ' colspan="2"';
                 $output .= &print_login('service',$dom,$confname,$phase,$settings,\$rowtotal);  
             } else {  
                 $output .= &print_login('page',$dom,$confname,$phase,$settings,\$rowtotal);  
             }  
         } elsif ($action eq 'requestcourses') {          } elsif ($action eq 'requestcourses') {
             $output .= &print_quotas($dom,$settings,\$rowtotal,$action);              $output .= &print_quotas($dom,$settings,\$rowtotal,$action);
         } elsif ($action eq 'requestauthor') {          } elsif ($action eq 'helpsettings') {
             $output .= &print_quotas($dom,$settings,\$rowtotal,$action);              $output .= &print_helpsettings('top',$dom,$confname,$settings,\$rowtotal);
         } elsif ($action eq 'usersessions') {          } elsif ($action eq 'usersessions') {
             $output .= &print_usersessions('top',$dom,$settings,\$rowtotal);               $output .= &print_usersessions('top',$dom,$settings,\$rowtotal); 
         } elsif ($action eq 'rolecolors') {          } elsif ($action eq 'rolecolors') {
             $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal);              $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal);
           } elsif ($action eq 'coursedefaults') {
               $output .= &print_coursedefaults('top',$dom,$settings,\$rowtotal);
         }          }
         $output .= '          $output .= '
            </table>             </table>
Line 603  sub print_config_box { Line 613  sub print_config_box {
         } elsif ($action eq 'coursecategories') {          } elsif ($action eq 'coursecategories') {
             $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal);              $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal);
         } elsif ($action eq 'login') {          } elsif ($action eq 'login') {
             if ($numheaders == 3) {              $output .= &print_login('bottom',$dom,$confname,$phase,$settings,\$rowtotal);
                 $output .= &print_login('page',$dom,$confname,$phase,$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"'.$colspan.'>'.&mt($item->{'header'}->[2]->{'col2'}).'</td>      </tr>'.  
                        &print_login('help',$dom,$confname,$phase,$settings,\$rowtotal);  
                 $rowtotal ++;  
             } else {  
                 $output .= &print_login('help',$dom,$confname,$phase,$settings,\$rowtotal);  
             }  
         } elsif ($action eq 'requestcourses') {          } elsif ($action eq 'requestcourses') {
             $output .= &print_requestmail($dom,$action,$settings,\$rowtotal);              $output .= &print_courserequestmail($dom,$settings,\$rowtotal);
         } elsif ($action eq 'requestauthor') {          } elsif ($action eq 'helpsettings') {
             $output .= &print_requestmail($dom,$action,$settings,\$rowtotal);              $output .= &print_helpsettings('bottom',$dom,$confname,$settings,\$rowtotal);
         } elsif ($action eq 'usersessions') {          } elsif ($action eq 'usersessions') {
             $output .= &print_usersessions('middle',$dom,$settings,\$rowtotal).'              $output .= &print_usersessions('middle',$dom,$settings,\$rowtotal).'
            </table>             </table>
Line 714  sub print_config_box { Line 709  sub print_config_box {
         }          }
         $output .= '</tr>';          $output .= '</tr>';
         $rowtotal ++;          $rowtotal ++;
         if ($action eq 'quotas') {          if ($action eq 'login') {
               $output .= &print_login('bottom',$dom,$confname,$phase,$settings,
                                       \$rowtotal);
           } elsif ($action eq 'quotas') {
             $output .= &print_quotas($dom,$settings,\$rowtotal,$action);              $output .= &print_quotas($dom,$settings,\$rowtotal,$action);
         } elsif ($action eq 'autoenroll') {          } elsif ($action eq 'autoenroll') {
             $output .= &print_autoenroll($dom,$settings,\$rowtotal);              $output .= &print_autoenroll($dom,$settings,\$rowtotal);
Line 731  sub print_config_box { Line 729  sub print_config_box {
         } elsif ($action eq 'serverstatuses') {          } elsif ($action eq 'serverstatuses') {
             $output .= &print_serverstatuses($dom,$settings,\$rowtotal);              $output .= &print_serverstatuses($dom,$settings,\$rowtotal);
         } elsif ($action eq 'helpsettings') {          } elsif ($action eq 'helpsettings') {
             $output .= &print_helpsettings($dom,$confname,$settings,\$rowtotal);              $output .= &print_helpsettings('top',$dom,$confname,$settings,\$rowtotal);
         } elsif ($action eq 'loadbalancing') {          } elsif ($action eq 'loadbalancing') {
             $output .= &print_loadbalancing($dom,$settings,\$rowtotal);              $output .= &print_loadbalancing($dom,$settings,\$rowtotal);
         }          }
Line 745  sub print_config_box { Line 743  sub print_config_box {
 }  }
   
 sub print_login {  sub print_login {
     my ($caller,$dom,$confname,$phase,$settings,$rowtotal) = @_;      my ($position,$dom,$confname,$phase,$settings,$rowtotal) = @_;
     my ($css_class,$datatable);      my ($css_class,$datatable);
     my %choices = &login_choices();      my %choices = &login_choices();
   
     if ($caller eq 'service') {      if ($position eq 'top') {
         my %servers = &Apache::lonnet::internet_dom_servers($dom);          my %servers = &Apache::lonnet::internet_dom_servers($dom);
         my $choice = $choices{'disallowlogin'};          my $choice = $choices{'disallowlogin'};
         $css_class = ' class="LC_odd_row"';          $css_class = ' class="LC_odd_row"';
Line 816  sub print_login { Line 814  sub print_login {
         }          }
         $datatable .= '</table></td></tr>';          $datatable .= '</table></td></tr>';
         return $datatable;          return $datatable;
     } elsif ($caller eq 'page') {      }
         my %defaultchecked = (   
                                'coursecatalog' => 'on',      my %defaultchecked = ( 
                                'adminmail'     => 'off',                             'coursecatalog' => 'on',
                                'newuser'       => 'off',                             'adminmail'     => 'off',
                              );                             'newuser'       => 'off',
         my @toggles = ('coursecatalog','adminmail','newuser');                           );
         my (%checkedon,%checkedoff);      my @toggles = ('coursecatalog','adminmail','newuser');
       my (%checkedon,%checkedoff);
       foreach my $item (@toggles) {
           if ($defaultchecked{$item} eq 'on') { 
               $checkedon{$item} = ' checked="checked" ';
               $checkedoff{$item} = ' ';
           } elsif ($defaultchecked{$item} eq 'off') {
               $checkedoff{$item} = ' checked="checked" ';
               $checkedon{$item} = ' ';
           }
       }
       my @images = ('img','logo','domlogo','login');
       my @logintext = ('textcol','bgcol');
       my @bgs = ('pgbg','mainbg','sidebg');
       my @links = ('link','alink','vlink');
       my %designhash = &Apache::loncommon::get_domainconf($dom);
       my %defaultdesign = %Apache::loncommon::defaultdesign;
       my (%is_custom,%designs);
       my %defaults = (
                      font => $defaultdesign{'login.font'},
                      );
       foreach my $item (@images) {
           $defaults{$item} = $defaultdesign{'login.'.$item};
           $defaults{'showlogo'}{$item} = 1;
       }
       foreach my $item (@bgs) {
           $defaults{'bgs'}{$item} = $defaultdesign{'login.'.$item};
       }
       foreach my $item (@logintext) {
           $defaults{'logintext'}{$item} = $defaultdesign{'login.'.$item};
       }
       foreach my $item (@links) {
           $defaults{'links'}{$item} = $defaultdesign{'login.'.$item};
       }
       if (ref($settings) eq 'HASH') {
         foreach my $item (@toggles) {          foreach my $item (@toggles) {
             if ($defaultchecked{$item} eq 'on') {               if ($settings->{$item} eq '1') {
                 $checkedon{$item} = ' checked="checked" ';                  $checkedon{$item} =  ' checked="checked" ';
                 $checkedoff{$item} = ' ';                  $checkedoff{$item} = ' ';
             } elsif ($defaultchecked{$item} eq 'off') {              } elsif ($settings->{$item} eq '0') {
                 $checkedoff{$item} = ' checked="checked" ';                  $checkedoff{$item} =  ' checked="checked" ';
                 $checkedon{$item} = ' ';                  $checkedon{$item} = ' ';
             }              }
         }          }
         my @images = ('img','logo','domlogo','login');  
         my @logintext = ('textcol','bgcol');  
         my @bgs = ('pgbg','mainbg','sidebg');  
         my @links = ('link','alink','vlink');  
         my %designhash = &Apache::loncommon::get_domainconf($dom);  
         my %defaultdesign = %Apache::loncommon::defaultdesign;  
         my (%is_custom,%designs);  
         my %defaults = (  
                        font => $defaultdesign{'login.font'},  
                        );  
         foreach my $item (@images) {          foreach my $item (@images) {
             $defaults{$item} = $defaultdesign{'login.'.$item};              if (defined($settings->{$item})) {
             $defaults{'showlogo'}{$item} = 1;                  $designs{$item} = $settings->{$item};
         }                  $is_custom{$item} = 1;
         foreach my $item (@bgs) {              }
             $defaults{'bgs'}{$item} = $defaultdesign{'login.'.$item};              if (defined($settings->{'showlogo'}{$item})) {
                   $designs{'showlogo'}{$item} = $settings->{'showlogo'}{$item};
               }
         }          }
         foreach my $item (@logintext) {          foreach my $item (@logintext) {
             $defaults{'logintext'}{$item} = $defaultdesign{'login.'.$item};              if ($settings->{$item} ne '') {
                   $designs{'logintext'}{$item} = $settings->{$item};
                   $is_custom{$item} = 1;
               }
         }          }
         foreach my $item (@links) {          if ($settings->{'font'} ne '') {
             $defaults{'links'}{$item} = $defaultdesign{'login.'.$item};              $designs{'font'} = $settings->{'font'};
               $is_custom{'font'} = 1;
         }          }
         if (ref($settings) eq 'HASH') {          foreach my $item (@bgs) {
             foreach my $item (@toggles) {              if ($settings->{$item} ne '') {
                 if ($settings->{$item} eq '1') {                  $designs{'bgs'}{$item} = $settings->{$item};
                     $checkedon{$item} =  ' checked="checked" ';                  $is_custom{$item} = 1;
                     $checkedoff{$item} = ' ';  
                 } elsif ($settings->{$item} eq '0') {  
                     $checkedoff{$item} =  ' checked="checked" ';  
                     $checkedon{$item} = ' ';  
                 }  
             }  
             foreach my $item (@images) {  
                 if (defined($settings->{$item})) {  
                     $designs{$item} = $settings->{$item};  
                     $is_custom{$item} = 1;  
                 }  
                 if (defined($settings->{'showlogo'}{$item})) {  
                     $designs{'showlogo'}{$item} = $settings->{'showlogo'}{$item};  
                 }  
             }  
             foreach my $item (@logintext) {  
                 if ($settings->{$item} ne '') {  
                     $designs{'logintext'}{$item} = $settings->{$item};  
                     $is_custom{$item} = 1;  
                 }  
             }  
             if ($settings->{'font'} ne '') {  
                 $designs{'font'} = $settings->{'font'};  
                 $is_custom{'font'} = 1;  
             }  
             foreach my $item (@bgs) {  
                 if ($settings->{$item} ne '') {  
                     $designs{'bgs'}{$item} = $settings->{$item};  
                     $is_custom{$item} = 1;  
                 }  
             }  
             foreach my $item (@links) {  
                 if ($settings->{$item} ne '') {  
                     $designs{'links'}{$item} = $settings->{$item};  
                     $is_custom{$item} = 1;  
                 }  
             }  
         } else {  
             if ($designhash{$dom.'.login.font'} ne '') {  
                 $designs{'font'} = $designhash{$dom.'.login.font'};  
                 $is_custom{'font'} = 1;  
             }  
             foreach my $item (@images) {  
                 if ($designhash{$dom.'.login.'.$item} ne '') {  
                     $designs{$item} = $designhash{$dom.'.login.'.$item};  
                     $is_custom{$item} = 1;  
                 }  
             }  
             foreach my $item (@bgs) {  
                 if ($designhash{$dom.'.login.'.$item} ne '') {  
                     $designs{'bgs'}{$item} = $designhash{$dom.'.login.'.$item};  
                     $is_custom{$item} = 1;  
                 }  
             }              }
             foreach my $item (@links) {          }
                 if ($designhash{$dom.'.login.'.$item} ne '') {          foreach my $item (@links) {
                     $designs{'links'}{$item} = $designhash{$dom.'.login.'.$item};              if ($settings->{$item} ne '') {
                     $is_custom{$item} = 1;                  $designs{'links'}{$item} = $settings->{$item};
                 }                  $is_custom{$item} = 1;
             }              }
         }          }
         my %alt_text = &Apache::lonlocal::texthash  ( img => 'Log-in banner',      } else {
                                                       logo => 'Institution Logo',          if ($designhash{$dom.'.login.font'} ne '') {
                                                       domlogo => 'Domain Logo',              $designs{'font'} = $designhash{$dom.'.login.font'};
                                                       login => 'Login box');              $is_custom{'font'} = 1;
         my $itemcount = 1;  
         foreach my $item (@toggles) {  
             $css_class = $itemcount%2?' class="LC_odd_row"':'';  
             $datatable .=    
                 '<tr'.$css_class.'><td colspan="2">'.$choices{$item}.  
                 '</td><td>'.  
                 '<span class="LC_nobreak"><label><input type="radio" name="'.  
                 $item.'"'.$checkedon{$item}.' value="1" />'.&mt('Yes').  
                 '</label>&nbsp;<label><input type="radio" name="'.$item.'"'.  
                 $checkedoff{$item}.' value="0" />'.&mt('No').'</label></span></td>'.  
                 '</tr>';  
             $itemcount ++;  
         }          }
         $datatable .= &display_color_options($dom,$confname,$phase,'login',$itemcount,\%choices,\%is_custom,\%defaults,\%designs,\@images,\@bgs,\@links,\%alt_text,$rowtotal,\@logintext);          foreach my $item (@images) {
         $datatable .= '</tr></table></td></tr>';              if ($designhash{$dom.'.login.'.$item} ne '') {
     } elsif ($caller eq 'help') {                  $designs{$item} = $designhash{$dom.'.login.'.$item};
         my ($defaulturl,$defaulttype,%url,%type,%lt,%langchoices);                  $is_custom{$item} = 1;
         my $switchserver = &check_switchserver($dom,$confname);  
         my $itemcount = 1;  
         $defaulturl = '/adm/loginproblems.html';  
         $defaulttype = 'default';  
         %lt = &Apache::lonlocal::texthash (  
                      del     => 'Delete?',  
                      rep     => 'Replace:',  
                      upl     => 'Upload:',  
                      default => 'Default',  
                      custom  => 'Custom',  
                                              );  
         %langchoices = &Apache::lonlocal::texthash(&get_languages_hash());  
         my @currlangs;  
         if (ref($settings) eq 'HASH') {  
             if (ref($settings->{'helpurl'}) eq 'HASH') {  
                 foreach my $key (sort(keys(%{$settings->{'helpurl'}}))) {  
                     next if ($settings->{'helpurl'}{$key} eq '');  
                     $url{$key} = $settings->{'helpurl'}{$key}.'?inhibitmenu=yes';  
                     $type{$key} = 'custom';  
                     unless ($key eq 'nolang') {  
                         push(@currlangs,$key);  
                     }  
                 }  
             } elsif ($settings->{'helpurl'} ne '') {  
                 $type{'nolang'} = 'custom';  
                 $url{'nolang'} = $settings->{'helpurl'}.'?inhibitmenu=yes';  
             }              }
         }          }
         foreach my $lang ('nolang',sort(@currlangs)) {          foreach my $item (@bgs) {
             $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';              if ($designhash{$dom.'.login.'.$item} ne '') {
             $datatable .= '<tr'.$css_class.'>';                  $designs{'bgs'}{$item} = $designhash{$dom.'.login.'.$item};
             if ($url{$lang} eq '') {                  $is_custom{$item} = 1;
                 $url{$lang} = $defaulturl;  
             }  
             if ($type{$lang} eq '') {  
                 $type{$lang} = $defaulttype;  
             }  
             $datatable .= '<td colspan="2"><span class="LC_nobreak">';  
             if ($lang eq 'nolang') {  
                 $datatable .= &mt('Log-in help page if no specific language file: [_1]',  
                                   &Apache::loncommon::modal_link($url{$lang},$lt{$type{$lang}},600,500));  
             } else {  
                 $datatable .= &mt('Log-in help page for language: [_1] is [_2]',  
                                   $langchoices{$lang},  
                                   &Apache::loncommon::modal_link($url{$lang},$lt{$type{$lang}},600,500));  
             }  
             $datatable .= '</span></td>'."\n".  
                           '<td class="LC_left_item">';  
             if ($type{$lang} eq 'custom') {  
                 $datatable .= '<span class="LC_nobreak"><label>'.  
                               '<input type="checkbox" name="loginhelpurl_del" value="'.$lang.'" />'.  
                               $lt{'del'}.'</label>&nbsp;'.$lt{'rep'}.'</span>';  
             } else {  
                 $datatable .= $lt{'upl'};  
             }  
             $datatable .='<br />';  
             if ($switchserver) {  
                 $datatable .= &mt('Upload to library server: [_1]',$switchserver);  
             } else {  
                 $datatable .= '<input type="file" name="loginhelpurl_'.$lang.'" />';  
             }              }
             $datatable .= '</td></tr>';  
             $itemcount ++;  
         }          }
         my @addlangs;          foreach my $item (@links) {
         foreach my $lang (sort(keys(%langchoices))) {              if ($designhash{$dom.'.login.'.$item} ne '') {
             next if ((grep(/^\Q$lang\E$/,@currlangs)) || ($lang eq 'x_chef'));                  $designs{'links'}{$item} = $designhash{$dom.'.login.'.$item};
             push(@addlangs,$lang);                  $is_custom{$item} = 1;
         }  
         if (@addlangs > 0) {  
             my %toadd;  
             map { $toadd{$_} = $langchoices{$_} ; } @addlangs;  
             $toadd{''} = &mt('Select');  
             $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';  
             $datatable .= '<tr'.$css_class.'><td class="LC_left_item" colspan="2">'.  
                           &mt('Add log-in help page for a specific language:').'&nbsp;'.  
                           &Apache::loncommon::select_form('','loginhelpurl_add_lang',\%toadd).  
                           '</td><td class="LC_left_item">'.$lt{'upl'}.'<br />';  
             if ($switchserver) {  
                 $datatable .= &mt('Upload to library server: [_1]',$switchserver);  
             } else {  
                 $datatable .= '<input type="file" name="loginhelpurl_add_file" />';  
             }              }
             $datatable .= '</td></tr>';  
             $itemcount ++;  
         }          }
         $datatable .= &captcha_choice('login',$settings,$itemcount);  
     }      }
       my %alt_text = &Apache::lonlocal::texthash  ( img => 'Log-in banner',
                                                     logo => 'Institution Logo',
                                                     domlogo => 'Domain Logo',
                                                     login => 'Login box');
       my $itemcount = 1;
       foreach my $item (@toggles) {
           $css_class = $itemcount%2?' class="LC_odd_row"':'';
           $datatable .=  
               '<tr'.$css_class.'><td colspan="2">'.$choices{$item}.
               '</td><td>'.
               '<span class="LC_nobreak"><label><input type="radio" name="'.
               $item.'"'.$checkedon{$item}.' value="1" />'.&mt('Yes').
               '</label>&nbsp;<label><input type="radio" name="'.$item.'"'.
               $checkedoff{$item}.' value="0" />'.&mt('No').'</label></span></td>'.
               '</tr>';
           $itemcount ++;
       }
       $datatable .= &display_color_options($dom,$confname,$phase,'login',$itemcount,\%choices,\%is_custom,\%defaults,\%designs,\@images,\@bgs,\@links,\%alt_text,$rowtotal,\@logintext);
       $datatable .= '</tr></table></td></tr>';
     return $datatable;      return $datatable;
 }  }
   
Line 1467  sub print_quotas { Line 1376  sub print_quotas {
         @options =('norequest','approval','validate','autolimit');          @options =('norequest','approval','validate','autolimit');
         %validations = &Apache::lonnet::auto_courserequest_checks($dom);          %validations = &Apache::lonnet::auto_courserequest_checks($dom);
         %titles = &courserequest_titles();          %titles = &courserequest_titles();
     } elsif ($context eq 'requestauthor') {  
         @usertools = ('author');  
         @options = ('norequest','approval','automatic');  
         %titles = &authorrequest_titles();  
     } else {      } else {
         @usertools = ('aboutme','blog','webdav','portfolio');          @usertools = ('aboutme','blog','webdav','portfolio');
         %titles = &tool_titles();          %titles = &tool_titles();
Line 1478  sub print_quotas { Line 1383  sub print_quotas {
     if (ref($types) eq 'ARRAY') {      if (ref($types) eq 'ARRAY') {
         foreach my $type (@{$types}) {          foreach my $type (@{$types}) {
             my $currdefquota;              my $currdefquota;
             unless (($context eq 'requestcourses') ||              unless ($context eq 'requestcourses') {
                     ($context eq 'requestauthor')) {  
                 if (ref($settings) eq 'HASH') {                  if (ref($settings) eq 'HASH') {
                     if (ref($settings->{defaultquota}) eq 'HASH') {                      if (ref($settings->{defaultquota}) eq 'HASH') {
                         $currdefquota = $settings->{defaultquota}->{$type};                           $currdefquota = $settings->{defaultquota}->{$type}; 
Line 1549  sub print_quotas { Line 1453  sub print_quotas {
                                 $cell{$item} .= $titles{'unlimited'};                                  $cell{$item} .= $titles{'unlimited'};
                             }                              }
                         }                          }
                     } elsif ($context eq 'requestauthor') {  
                         my $curroption;  
                         if (ref($settings) eq 'HASH') {  
                             $curroption = $settings->{$type};  
                         }  
                         if (!$curroption) {  
                             $curroption = 'norequest';  
                         }  
                         foreach my $option (@options) {  
                             my $val = $option;  
                             if ($option eq 'norequest') {  
                                 $val = 0;  
                             }  
                             my $checked = '';  
                             if ($option eq $curroption) {  
                                 $checked = ' checked="checked"';  
                             }  
                             $datatable .= '<span class="LC_nobreak"><label>'.  
                                   '<input type="radio" name="authorreq_'.$type.  
                                   '" value="'.$val.'"'.$checked.' />'.  
                                   $titles{$option}.'</label></span>&nbsp; ';  
                         }  
                     } else {                      } else {
                         my $checked = 'checked="checked" ';                          my $checked = 'checked="checked" ';
                         if (ref($settings) eq 'HASH') {                          if (ref($settings) eq 'HASH') {
Line 1596  sub print_quotas { Line 1478  sub print_quotas {
                     $datatable .= '</tr></table>';                      $datatable .= '</tr></table>';
                 }                  }
                 $datatable .= '</td>';                  $datatable .= '</td>';
                 unless (($context eq 'requestcourses') ||                  unless ($context eq 'requestcourses') {
                         ($context eq 'requestauthor')) {  
                     $datatable .=                       $datatable .= 
                               '<td class="LC_right_item"><span class="LC_nobreak">'.                                '<td class="LC_right_item"><span class="LC_nobreak">'.
                               '<input type="text" name="quota_'.$type.                                '<input type="text" name="quota_'.$type.
Line 1608  sub print_quotas { Line 1489  sub print_quotas {
             }              }
         }          }
     }      }
     unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) {      unless ($context eq 'requestcourses') {
         $defaultquota = '20';          $defaultquota = '20';
         if (ref($settings) eq 'HASH') {          if (ref($settings) eq 'HASH') {
             if (ref($settings->{'defaultquota'}) eq 'HASH') {              if (ref($settings->{'defaultquota'}) eq 'HASH') {
Line 1678  sub print_quotas { Line 1559  sub print_quotas {
                     $defcell{$item} .= $titles{'unlimited'};                      $defcell{$item} .= $titles{'unlimited'};
                 }                  }
             }              }
         } elsif ($context eq 'requestauthor') {  
             my $curroption;  
             if (ref($settings) eq 'HASH') {  
                 if (ref($settings->{'requestauthor'}) eq 'HASH') {  
                     $curroption = $settings->{'requestauthor'};  
                 }  
             }  
             if (!$curroption) {  
                 $curroption = 'norequest';  
             }  
             foreach my $option (@options) {  
                 my $val = $option;  
                 if ($option eq 'norequest') {  
                     $val = 0;  
                 }  
                 my $checked = '';  
                 if ($option eq $curroption) {  
                     $checked = ' checked="checked"';  
                 }  
                 $datatable .= '<span class="LC_nobreak"><label>'.  
                               '<input type="radio" name="authorreq_default"'.  
                               ' value="'.$val.'"'.$checked.' />'.  
                               $titles{$option}.'</label></span>&nbsp; ';  
             }  
         } else {          } else {
             my $checked = 'checked="checked" ';              my $checked = 'checked="checked" ';
             if (ref($settings) eq 'HASH') {              if (ref($settings) eq 'HASH') {
Line 1727  sub print_quotas { Line 1584  sub print_quotas {
         $datatable .= '</tr></table>';          $datatable .= '</tr></table>';
     }      }
     $datatable .= '</td>';      $datatable .= '</td>';
     unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) {      unless ($context eq 'requestcourses') {
         $datatable .= '<td class="LC_right_item"><span class="LC_nobreak">'.          $datatable .= '<td class="LC_right_item"><span class="LC_nobreak">'.
                       '<input type="text" name="defaultquota" value="'.                        '<input type="text" name="defaultquota" value="'.
                       $defaultquota.'" size="5" /> Mb</span></td>';                        $defaultquota.'" size="5" /> Mb</span></td>';
Line 1805  sub print_quotas { Line 1662  sub print_quotas {
                     $advcell{$item} .= $titles{'unlimited'};                      $advcell{$item} .= $titles{'unlimited'};
                 }                  }
             }              }
         } elsif ($context eq 'requestauthor') {  
             my $curroption;  
             if (ref($settings) eq 'HASH') {  
                 $curroption = $settings->{'_LC_adv'};  
             }  
             my $checked = '';  
             if ($curroption eq '') {  
                 $checked = ' checked="checked"';  
             }  
             $datatable .= '<span class="LC_nobreak"><label>'.  
                           '<input type="radio" name="authorreq__LC_adv"'.  
                           ' value=""'.$checked.' />'.  
                           &mt('No override set').'</label></span>&nbsp; ';  
             foreach my $option (@options) {  
                 my $val = $option;  
                 if ($option eq 'norequest') {  
                     $val = 0;  
                 }  
                 my $checked = '';  
                 if ($val eq $curroption) {  
                     $checked = ' checked="checked"';  
                 }  
                 $datatable .= '<span class="LC_nobreak"><label>'.  
                               '<input type="radio" name="crsreq_'.$item.  
                               '__LC_adv" value="'.$val.'"'.$checked.' />'.  
                               $titles{$option}.'</label></span>&nbsp; ';  
             }  
         } else {          } else {
             my $checked = 'checked="checked" ';              my $checked = 'checked="checked" ';
             if (ref($settings) eq 'HASH') {              if (ref($settings) eq 'HASH') {
Line 1861  sub print_quotas { Line 1691  sub print_quotas {
     return $datatable;      return $datatable;
 }  }
   
 sub print_requestmail {  sub print_courserequestmail {
     my ($dom,$action,$settings,$rowtotal) = @_;      my ($dom,$settings,$rowtotal) = @_;
     my ($now,$datatable,%dompersonnel,@domcoord,@currapproval,$rows);      my ($now,$datatable,%dompersonnel,@domcoord,@currapproval,$rows);
     $now = time;      $now = time;
     $rows = 0;      $rows = 0;
Line 1893  sub print_requestmail { Line 1723  sub print_requestmail {
     my $numinrow = 4;      my $numinrow = 4;
     my $numdc = @domcoord;      my $numdc = @domcoord;
     my $css_class = 'class="LC_odd_row"';      my $css_class = 'class="LC_odd_row"';
     my $text;      $datatable = '<tr'.$css_class.'>'.
     if ($action eq 'requestcourses') {                   ' <td>'.&mt('Receive notification of course requests requiring approval.').
         $text = &mt('Receive notification of course requests requiring approval');                   ' </td>'.
     } else {  
         $text = &mt('Receive notification of authoring space requests requiring approval')  
     }  
     $datatable = '<tr '.$css_class.'>'.  
                  ' <td>'.$text.'</td>'.  
                  ' <td class="LC_left_item">';                   ' <td class="LC_left_item">';
     if (@domcoord > 0) {      if (@domcoord > 0) {
         $datatable .= '<table>';          $datatable .= '<table>';
Line 2338  sub print_contacts { Line 2163  sub print_contacts {
 }  }
   
 sub print_helpsettings {  sub print_helpsettings {
     my ($dom,$confname,$settings,$rowtotal) = @_;  
     my ($datatable,$itemcount);  
     $itemcount = 1;  
     my (%choices,%defaultchecked,@toggles);  
     $choices{'submitbugs'} = &mt('Display link to: [_1]?',  
                                  &Apache::loncommon::modal_link('http://bugs.loncapa.org',  
                                  &mt('LON-CAPA bug tracker'),600,500));  
     %defaultchecked = ('submitbugs' => 'on');  
     @toggles = ('submitbugs',);  
   
     ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked,   my ($position,$dom,$confname,$settings,$rowtotal) = @_;
                                                  \%choices,$itemcount);   my ($css_class,$datatable);
     return $datatable;  
    my $switchserver = &check_switchserver($dom,$confname);
   
    my $itemcount = 1;
   
    if ($position eq 'top') {
   
    my (%checkedon,%checkedoff,%choices,%defaultchecked,@toggles);
   
    %choices =
    &Apache::lonlocal::texthash (
    submitbugs => 'Display &quot;Submit a bug&quot; link?',
    );
   
    %defaultchecked = ('submitbugs' => 'on');
   
    @toggles = ('submitbugs',);
   
    foreach my $item (@toggles) {
    if ($defaultchecked{$item} eq 'on') { 
    $checkedon{$item} = ' checked="checked" ';
    $checkedoff{$item} = ' ';
    } elsif ($defaultchecked{$item} eq 'off') {
    $checkedoff{$item} = ' checked="checked" ';
    $checkedon{$item} = ' ';
    }
    }
   
    if (ref($settings) eq 'HASH') {
    foreach my $item (@toggles) {
    if ($settings->{$item} eq '1') {
    $checkedon{$item} =  ' checked="checked" ';
    $checkedoff{$item} = ' ';
    } elsif ($settings->{$item} eq '0') {
    $checkedoff{$item} =  ' checked="checked" ';
    $checkedon{$item} = ' ';
    }
    }
    }
   
    foreach my $item (@toggles) {
    $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';
    $datatable .=  
    '<tr'.$css_class.'>
    <td><span class="LC_nobreak">'.$choices{$item}.'</span></td>
    <td><span class="LC_nobreak">&nbsp;</span></td>
    <td class="LC_right_item"><span class="LC_nobreak">
    <label><input type="radio" name="'.$item.'" '.$checkedon{$item}.' value="1" />'.&mt('Yes').'</label>&nbsp;
    <label><input type="radio" name="'.$item.'" '.$checkedoff{$item}.' value="0" />'.&mt('No').'</label>'.
    '</span></td>'.
    '</tr>';
    $itemcount ++;
    }
        
        } else {
        
         $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';
        
         $datatable .= '<tr'.$css_class.'>';
        
         if (ref($settings) eq 'HASH') {
    if ($settings->{'loginhelpurl'} ne '') {
    my($directory, $filename) = $settings->{'loginhelpurl'} =~ m/(.*\/)(.*)$/;
    $datatable .= '<td width="33%"><span class="LC_left_item"><label><a href="'.$settings->{'loginhelpurl'}.'" target="_blank">'.&mt('Custom Login Page Help File In Use').'</a></label></span></td>';
    $datatable .= '<td width="33%"><span class="LC_right_item"><label><input type="checkbox" name="loginhelpurl_del" value="1" />'.&mt('Delete?').'</label></span></td>'
    } else {
    $datatable .= '<td width="33%"><span class="LC_left_item"><label>'.&mt('Default Login Page Help File In Use').'</label></span></td>';
    $datatable .= '<td width="33%"><span class="LC_right_item">&nbsp;</span></td>';
    }
    } else {
    $datatable .= '<td><span class="LC_left_item">&nbsp;</span></td>';
    $datatable .= '<td><span class="LC_right_item">&nbsp;</span></td>';
    }
      
         $datatable .= '<td width="33%"><span class="LC_right_item">';
         if ($switchserver) {
               $datatable .= &mt('Upload to library server: [_1]',$switchserver);
           } else {
           $datatable .= &mt('Upload Custom Login Page Help File:');
               $datatable .='<input type="file" name="loginhelpurl" />';
           }
           $datatable .= '</span></td></tr>';
           
        }
        
        return $datatable;
   
 }  }
   
   
 sub radiobutton_prefs {  sub radiobutton_prefs {
     my ($settings,$toggles,$defaultchecked,$choices,$itemcount) = @_;      my ($settings,$toggles,$defaultchecked,$choices,$itemcount) = @_;
     return unless ((ref($toggles) eq 'ARRAY') && (ref($defaultchecked) eq 'HASH') &&      return unless ((ref($toggles) eq 'ARRAY') && (ref($defaultchecked) eq 'HASH') &&
Line 3125  sub courserequest_titles { Line 3028  sub courserequest_titles {
     return %titles;      return %titles;
 }  }
   
 sub authorrequest_titles {  
     my %titles = &Apache::lonlocal::texthash (  
                                    norequest  => 'Not allowed',  
                                    approval   => 'Approval by Dom. Coord.',  
                                    automatic  => 'Automatic approval',  
                  );  
     return %titles;  
 }  
   
 sub courserequest_conditions {  sub courserequest_conditions {
     my %conditions = &Apache::lonlocal::texthash (      my %conditions = &Apache::lonlocal::texthash (
        approval    => '(Processing of request subject to approval by Domain Coordinator).',         approval    => '(Processing of request subject to approval by Domain Coordinator).',
Line 3263  sub print_usercreation { Line 3157  sub print_usercreation {
         }          }
         my ($othertitle,$usertypes,$types) =          my ($othertitle,$usertypes,$types) =
             &Apache::loncommon::sorted_inst_types($dom);              &Apache::loncommon::sorted_inst_types($dom);
         my $createsettings;  
         if (ref($settings) eq 'HASH') {  
             $createsettings = $settings->{cancreate};  
         }  
         if (ref($usertypes) eq 'HASH') {          if (ref($usertypes) eq 'HASH') {
             if (keys(%{$usertypes}) > 0) {              if (keys(%{$usertypes}) > 0) {
                   my $createsettings;
                   if (ref($settings) eq 'HASH') {
                       $createsettings = $settings->{cancreate};
                   }
                 $datatable .= &insttypes_row($createsettings,$types,$usertypes,                  $datatable .= &insttypes_row($createsettings,$types,$usertypes,
                                              $dom,$numinrow,$othertitle,                                               $dom,$numinrow,$othertitle,
                                              'statustocreate');                                               'statustocreate');
                 $$rowtotal ++;                  $$rowtotal ++;
                 $rownum ++;  
             }              }
         }          }
         $datatable .= &captcha_choice('cancreate',$createsettings,$rownum);  
     } else {      } else {
         my @contexts = ('author','course','domain');          my @contexts = ('author','course','domain');
         my @authtypes = ('int','krb4','krb5','loc');          my @authtypes = ('int','krb4','krb5','loc');
Line 3328  sub print_usercreation { Line 3220  sub print_usercreation {
     return $datatable;      return $datatable;
 }  }
   
 sub captcha_choice {  
     my ($context,$settings,$itemcount) = @_;  
     my ($keyentry,$currpub,$currpriv,%checked,$rowname,$pubtext,$privtext);  
     my %lt = &captcha_phrases();  
     $keyentry = 'hidden';  
     if ($context eq 'cancreate') {  
         $rowname = &mt('CAPTCHA validation (e-mail as username)');  
     } elsif ($context eq 'login') {  
         $rowname =  &mt('"Contact helpdesk" CAPTCHA validation');  
     }  
     if (ref($settings) eq 'HASH') {  
         if ($settings->{'captcha'}) {  
             $checked{$settings->{'captcha'}} = ' checked="checked"';  
         } else {  
             $checked{'original'} = ' checked="checked"';  
         }  
         if ($settings->{'captcha'} eq 'recaptcha') {  
             $pubtext = $lt{'pub'};  
             $privtext = $lt{'priv'};  
             $keyentry = 'text';  
         }  
         if (ref($settings->{'recaptchakeys'}) eq 'HASH') {  
             $currpub = $settings->{'recaptchakeys'}{'public'};  
             $currpriv = $settings->{'recaptchakeys'}{'private'};  
         }  
     } else {  
         $checked{'original'} = ' checked="checked"';  
     }  
     my $css_class = $itemcount%2?' class="LC_odd_row"':'';  
     my $output = '<tr'.$css_class.'>'.  
                  '<td class="LC_left_item">'.$rowname.'</td><td class="LC_left_item" colspan="2">'."\n".  
                  '<table><tr><td>'."\n";  
     foreach my $option ('original','recaptcha','notused') {  
         $output .= '<span class="LC_nobreak"><label><input type="radio" name="'.$context.'_captcha" value="'.  
                    $option.'" '.$checked{$option}.' onchange="javascript:updateCaptcha('."this,'$context'".');" />'.  
                    $lt{$option}.'</label></span>';  
         unless ($option eq 'notused') {  
             $output .= ('&nbsp;'x2)."\n";  
         }  
     }  
 #  
 # Note: If reCAPTCHA is to be used for LON-CAPA servers in a domain, a domain coordinator should visit:  
 # https://www.google.com/recaptcha and generate a Public and Private key. For domains with multiple  
 # servers a single key pair will be used for all servers, so the internet domain (e.g., yourcollege.edu)  
 # specified for use with the key should be broad enough to accommodate all servers in the LON-CAPA domain.  
 #  
     $output .= '</td></tr>'."\n".  
                '<tr><td>'."\n".  
                '<span class="LC_nobreak"><span id="'.$context.'_recaptchapubtxt">'.$pubtext.'</span>&nbsp;'."\n".  
                '<input type="'.$keyentry.'" id="'.$context.'_recaptchapub" name="'.$context.'_recaptchapub" value="'.  
                $currpub.'" size="40" /></span><br />'."\n".  
                '<span class="LC_nobreak"><span id="'.$context.'_recaptchaprivtxt">'.$privtext.'</span>&nbsp;'."\n".  
                '<input type="'.$keyentry.'" id="'.$context.'_recaptchapriv" name="'.$context.'_recaptchapriv" value="'.  
                $currpriv.'" size="40" /></span></td></tr></table>'."\n".  
                '</td></tr>';  
     return $output;  
 }  
   
 sub user_formats_row {  sub user_formats_row {
     my ($type,$settings,$rules,$ruleorder,$numinrow,$rowcount) = @_;      my ($type,$settings,$rules,$ruleorder,$numinrow,$rowcount) = @_;
     my $output;      my $output;
Line 3560  sub print_defaults { Line 3394  sub print_defaults {
         } elsif ($item eq 'datelocale_def') {          } elsif ($item eq 'datelocale_def') {
             my $includeempty = 1;              my $includeempty = 1;
             $datatable .= &Apache::loncommon::select_datelocale($item,$domdefaults{$item},undef,$includeempty);              $datatable .= &Apache::loncommon::select_datelocale($item,$domdefaults{$item},undef,$includeempty);
         } elsif ($item eq 'lang_def') {  
             my %langchoices = &get_languages_hash();  
             $langchoices{''} = 'No language preference';  
             %langchoices = &Apache::lonlocal::texthash(%langchoices);  
             $datatable .= &Apache::loncommon::select_form($domdefaults{$item},$item,  
                                                           \%langchoices);  
         } else {          } else {
             my $size;              my $size;
             if ($item eq 'portal_def') {              if ($item eq 'portal_def') {
Line 3581  sub print_defaults { Line 3409  sub print_defaults {
     return $datatable;      return $datatable;
 }  }
   
 sub get_languages_hash {  
     my %langchoices;  
     foreach my $id (&Apache::loncommon::languageids()) {  
         my $code = &Apache::loncommon::supportedlanguagecode($id);  
         if ($code ne '') {  
             $langchoices{$code} =  &Apache::loncommon::plainlanguagedescription($id);  
         }  
     }  
     return %langchoices;  
 }  
   
 sub defaults_titles {  sub defaults_titles {
     my ($dom) = @_;      my ($dom) = @_;
     my %titles = &Apache::lonlocal::texthash (      my %titles = &Apache::lonlocal::texthash (
Line 4367  sub insttypes_row { Line 4184  sub insttypes_row {
     if ($context eq 'cansearch') {      if ($context eq 'cansearch') {
         $showdom = ' ('.$dom.')';          $showdom = ' ('.$dom.')';
     }      }
     my $class = 'LC_left_item';  
     if ($context eq 'statustocreate') {  
         $class = 'LC_right_item';  
     }  
     my $output =  '<tr class="LC_odd_row">'.      my $output =  '<tr class="LC_odd_row">'.
                   '<td>'.$lt{$context}.$showdom.                    '<td>'.$lt{$context}.$showdom.
                   '</td><td class="'.$class.'" colspan="2"><table>';                    '</td><td class="LC_left_item" colspan="2"><table>';
     my $rem;      my $rem;
     if (ref($types) eq 'ARRAY') {      if (ref($types) eq 'ARRAY') {
         for (my $i=0; $i<@{$types}; $i++) {          for (my $i=0; $i<@{$types}; $i++) {
Line 4503  sub usertype_update_row { Line 4316  sub usertype_update_row {
   
 sub modify_login {  sub modify_login {
     my ($r,$dom,$confname,%domconfig) = @_;      my ($r,$dom,$confname,%domconfig) = @_;
     my ($resulttext,$errors,$colchgtext,%changes,%colchanges,%newfile,%newurl,      my ($resulttext,$errors,$colchgtext,%changes,%colchanges);
         %curr_loginvia,%loginhash,@currlangs,@newlangs,$addedfile,%title,@offon);      my %title = ( coursecatalog => 'Display course catalog',
     %title = ( coursecatalog => 'Display course catalog',                    adminmail => 'Display administrator E-mail address',
                adminmail => 'Display administrator E-mail address',                    newuser => 'Link for visitors to create a user account',
                newuser => 'Link for visitors to create a user account',                    loginheader => 'Log-in box header');
                loginheader => 'Log-in box header');      my @offon = ('off','on');
     @offon = ('off','on');      my %curr_loginvia;
     if (ref($domconfig{login}) eq 'HASH') {      if (ref($domconfig{login}) eq 'HASH') {
         if (ref($domconfig{login}{loginvia}) eq 'HASH') {          if (ref($domconfig{login}{loginvia}) eq 'HASH') {
             foreach my $lonhost (keys(%{$domconfig{login}{loginvia}})) {              foreach my $lonhost (keys(%{$domconfig{login}{loginvia}})) {
Line 4517  sub modify_login { Line 4330  sub modify_login {
             }              }
         }          }
     }      }
       my %loginhash;
     ($errors,%colchanges) = &modify_colors($r,$dom,$confname,['login'],      ($errors,%colchanges) = &modify_colors($r,$dom,$confname,['login'],
                                            \%domconfig,\%loginhash);                                             \%domconfig,\%loginhash);
     my @toggles = ('coursecatalog','adminmail','newuser');      my @toggles = ('coursecatalog','adminmail','newuser');
Line 4589  sub modify_login { Line 4403  sub modify_login {
                                 $new = '';                                   $new = ''; 
                             }                              }
                         }                          }
   
                         $loginhash{login}{loginvia}{$lonhost}{$item} = $new;                          $loginhash{login}{loginvia}{$lonhost}{$item} = $new;
                     }                      }
                 }                  }
Line 4614  sub modify_login { Line 4429  sub modify_login {
         }          }
     }      }
   
     my $servadm = $r->dir_config('lonAdmEMail');  
     my %langchoices = &Apache::lonlocal::texthash(&get_languages_hash());  
     if (ref($domconfig{'login'}) eq 'HASH') {  
         if (ref($domconfig{'login'}{'helpurl'}) eq 'HASH') {  
             foreach my $lang (sort(keys(%{$domconfig{'login'}{'helpurl'}}))) {  
                 if ($lang eq 'nolang') {  
                     push(@currlangs,$lang);  
                 } elsif (defined($langchoices{$lang})) {  
                     push(@currlangs,$lang);  
                 } else {  
                     next;  
                 }  
             }  
         }  
     }  
     my @delurls = &Apache::loncommon::get_env_multiple('form.loginhelpurl_del');  
     if (@currlangs > 0) {  
         foreach my $lang (@currlangs) {  
             if (grep(/^\Q$lang\E$/,@delurls)) {  
                 $changes{'helpurl'}{$lang} = 1;  
             } elsif ($env{'form.loginhelpurl_'.$lang.'.filename'}) {  
                 $changes{'helpurl'}{$lang} = 1;  
                 $newfile{$lang} = $env{'form.loginhelpurl_'.$lang.'.filename'};  
                 push(@newlangs,$lang);  
             } else {  
                 $loginhash{'login'}{'helpurl'}{$lang} = $domconfig{'login'}{'helpurl'}{$lang};  
             }  
         }  
     }  
     unless (grep(/^nolang$/,@currlangs)) {  
         if ($env{'form.loginhelpurl_nolang.filename'}) {  
             $changes{'helpurl'}{'nolang'} = 1;  
             $newfile{'nolang'} = $env{'form.loginhelpurl_nolang.filename'};  
             push(@newlangs,'nolang');  
         }  
     }  
     if ($env{'form.loginhelpurl_add_lang'}) {  
         if ((defined($langchoices{$env{'form.loginhelpurl_add_lang'}})) &&  
             ($env{'form.loginhelpurl_add_file.filename'})) {  
             $newfile{$env{'form.loginhelpurl_add_lang'}} = $env{'form.loginhelpurl_add_file.filename'};  
             $addedfile = $env{'form.loginhelpurl_add_lang'};  
         }  
     }  
     if ((@newlangs > 0) || ($addedfile)) {  
         my $error;  
         my ($configuserok,$author_ok,$switchserver) = &config_check($dom,$confname,$servadm);  
         if ($configuserok eq 'ok') {  
             if ($switchserver) {  
                 $error = &mt("Upload of custom help file is not permitted to this server: [_1]",$switchserver);  
             } elsif ($author_ok eq 'ok') {  
                 my @allnew = @newlangs;  
                 if ($addedfile ne '') {  
                     push(@allnew,$addedfile);  
                 }  
                 foreach my $lang (@allnew) {  
                     my $formelem = 'loginhelpurl_'.$lang;  
                     if ($lang eq $env{'form.loginhelpurl_add_lang'}) {  
                         $formelem = 'loginhelpurl_add_file';  
                     }  
                     (my $result,$newurl{$lang}) = &publishlogo($r,'upload',$formelem,$dom,$confname,  
                                                                "help/$lang",'','',$newfile{$lang});  
                     if ($result eq 'ok') {  
                         $loginhash{'login'}{'helpurl'}{$lang} = $newurl{$lang};  
                         $changes{'helpurl'}{$lang} = 1;  
                     } else {  
                         my $puberror = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$newfile{$lang},$result);  
                         $errors .= '<li><span class="LC_error">'.$puberror.'</span></li>';  
                         if ((grep(/^\Q$lang\E$/,@currlangs)) &&  
                             (!grep(/^\Q$lang\E$/,@delurls))) {  
   
                             $loginhash{'login'}{'helpurl'}{$lang} = $domconfig{'login'}{'helpurl'}{$lang};  
                         }  
                     }  
                 }  
             } else {  
                 $error = &mt("Upload of custom log-in help file(s) failed because an author role could not be assigned to a Domain Configuration user ([_1]) in domain: [_2].  Error was: [_3].",$confname,$dom,$author_ok);  
             }  
         } else {  
             $error = &mt("Upload of custom log-in help file(s) failed because a Domain Configuration user ([_1]) could not be created in domain: [_2].  Error was: [_3].",$confname,$dom,$configuserok);  
         }  
         if ($error) {  
             &Apache::lonnet::logthis($error);  
             $errors .= '<li><span class="LC_error">'.$error.'</span></li>';  
         }  
     }  
     &process_captcha('login',\%changes,$loginhash{'login'},$domconfig{'login'});  
   
     my $defaulthelpfile = '/adm/loginproblems.html';  
     my $defaulttext = &mt('Default in use');  
   
     my $putresult = &Apache::lonnet::put_dom('configuration',\%loginhash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%loginhash,
                                              $dom);                                               $dom);
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
Line 4769  sub modify_login { Line 4494  sub modify_login {
                         }                          }
                         $resulttext .= '</ul></li>';                          $resulttext .= '</ul></li>';
                     }                      }
                 } elsif ($item eq 'helpurl') {  
                     if (ref($changes{$item}) eq 'HASH') {  
                         foreach my $lang (sort(keys(%{$changes{$item}}))) {  
                             if (grep(/^\Q$lang\E$/,@delurls)) {  
                                 my ($chg,$link);  
                                 $link = &Apache::loncommon::modal_link($defaulthelpfile,$defaulttext,600,500);  
                                 if ($lang eq 'nolang') {  
                                     $chg = &mt('custom log-in help file removed for no preferred language; [_1]',$link);  
                                 } else {  
                                     $chg = &mt('custom log-in help file removed for specific language: [_1]; [_2]',$langchoices{$lang},$link);  
                                 }  
                                 $resulttext .= '<li>'.$chg.'</li>';  
                             } else {  
                                 my $chg;  
                                 if ($lang eq 'nolang') {  
                                     $chg = &mt('custom log-in help file for no preferred language');  
                                 } else {  
                                     $chg = &mt('custom log-in help file for specific language: [_1]',$langchoices{$lang});  
                                 }  
                                 $resulttext .= '<li>'.&Apache::loncommon::modal_link(  
                                                       $loginhash{'login'}{'helpurl'}{$lang}.  
                                                       '?inhibitmenu=yes',$chg,600,500).  
                                                '</li>';  
                             }  
                         }  
                     }  
                 } elsif ($item eq 'captcha') {  
                     if (ref($loginhash{'login'}) eq 'HASH') {  
                         my $chgtxt;  
                         if ($loginhash{'login'}{$item} eq 'notused') {  
                             $chgtxt .= &mt('No CAPTCHA validation in use for helpdesk form.');  
                         } else {  
                             my %captchas = &captcha_phrases();  
                             if ($captchas{$loginhash{'login'}{$item}}) {  
                                 $chgtxt .= &mt("Validation for helpdesk form set to $captchas{$loginhash{'login'}{$item}}.");  
                             } else {  
                                 $chgtxt .= &mt('Validation for helpdesk form set to unknown type.');  
                             }  
                         }  
                         $resulttext .= '<li>'.$chgtxt.'</li>';  
                     }  
                 } elsif ($item eq 'recaptchakeys') {  
                     if (ref($loginhash{'login'}) eq 'HASH') {  
                         my ($privkey,$pubkey);  
                         if (ref($loginhash{'login'}{$item}) eq 'HASH') {  
                             $pubkey = $loginhash{'login'}{$item}{'public'};  
                             $privkey = $loginhash{'login'}{$item}{'private'};  
                         }  
                         my $chgtxt .= &mt('ReCAPTCHA keys changes').'<ul>';  
                         if (!$pubkey) {  
                             $chgtxt .= '<li>'.&mt('Public key deleted').'</li>';  
                         } else {  
                             $chgtxt .= '<li>'.&mt('Public key set to [_1]',$pubkey).'</li>';  
                         }  
                         if (!$privkey) {  
                             $chgtxt .= '<li>'.&mt('Private key deleted').'</li>';  
                         } else {  
                             $chgtxt .= '<li>'.&mt('Private key set to [_1]',$pubkey).'</li>';  
                         }  
                         $chgtxt .= '</ul>';  
                         $resulttext .= '<li>'.$chgtxt.'</li>';  
                     }  
                 } else {                  } else {
                     $resulttext .= '<li>'.&mt("$title{$item} set to $offon[$env{'form.'.$item}]").'</li>';                      $resulttext .= '<li>'.&mt("$title{$item} set to $offon[$env{'form.'.$item}]").'</li>';
                 }                  }
Line 5275  sub publishlogo { Line 4938  sub publishlogo {
 # See if there is anything left  # See if there is anything left
     unless ($fname) { return ('error: no uploaded file'); }      unless ($fname) { return ('error: no uploaded file'); }
     $fname="$subdir/$fname";      $fname="$subdir/$fname";
     my $docroot=$r->dir_config('lonDocRoot');      my $filepath=$r->dir_config('lonDocRoot')."/priv/$dom/$confname";
     my $filepath="$docroot/priv";  
     my $relpath = "$dom/$confname";  
     my ($fnamepath,$file,$fetchthumb);      my ($fnamepath,$file,$fetchthumb);
     $file=$fname;      $file=$fname;
     if ($fname=~m|/|) {      if ($fname=~m|/|) {
         ($fnamepath,$file) = ($fname =~ m|^(.*)/([^/]+)$|);          ($fnamepath,$file) = ($fname =~ m|^(.*)/([^/]+)$|);
     }      }
     my @parts=split(/\//,"$filepath/$relpath/$fnamepath");        my @parts=split(/\//,$filepath.'/'.$fnamepath);
     my $count;      my $count;
     for ($count=5;$count<=$#parts;$count++) {      for ($count=4;$count<=$#parts;$count++) {
         $filepath.="/$parts[$count]";          $filepath.="/$parts[$count]";
         if ((-e $filepath)!=1) {          if ((-e $filepath)!=1) {
             mkdir($filepath,02770);              mkdir($filepath,02770);
Line 5332  $env{'user.name'}.':'.$env{'user.domain' Line 4993  $env{'user.name'}.':'.$env{'user.domain'
         close(FH);          close(FH);
         chmod(0660, $source); # Permissions to rw-rw---.          chmod(0660, $source); # Permissions to rw-rw---.
   
           my $docroot=$r->dir_config('lonDocRoot');
         my $targetdir=$docroot.'/res/'.$dom.'/'.$confname .'/'.$fnamepath;          my $targetdir=$docroot.'/res/'.$dom.'/'.$confname .'/'.$fnamepath;
         my $copyfile=$targetdir.'/'.$file;          my $copyfile=$targetdir.'/'.$file;
   
Line 5559  sub modify_quotas { Line 5221  sub modify_quotas {
         %titles = &courserequest_titles();          %titles = &courserequest_titles();
         $toolregexp = join('|',@usertools);          $toolregexp = join('|',@usertools);
         %conditions = &courserequest_conditions();          %conditions = &courserequest_conditions();
     } elsif ($context eq 'requestauthor') {  
         @usertools = ('author');  
         %titles = &authorrequest_titles();  
     } else {      } else {
         @usertools = ('aboutme','blog','webdav','portfolio');          @usertools = ('aboutme','blog','webdav','portfolio');
         %titles = &tool_titles();          %titles = &tool_titles();
Line 5579  sub modify_quotas { Line 5238  sub modify_quotas {
                     $confhash{$item}{$type} = $env{$key};                      $confhash{$item}{$type} = $env{$key};
                 }                  }
             }              }
         } elsif ($context eq 'requestauthor') {  
             if ($key =~ /^\Qform.authorreq_\E(.+)$/) {  
                 $confhash{$1} = $env{$key};  
             }  
         } else {          } else {
             if ($key =~ /^form\.quota_(.+)$/) {              if ($key =~ /^form\.quota_(.+)$/) {
                 $confhash{'defaultquota'}{$1} = $env{$key};                  $confhash{'defaultquota'}{$1} = $env{$key};
Line 5592  sub modify_quotas { Line 5247  sub modify_quotas {
             }              }
         }          }
     }      }
     if (($context eq 'requestcourses') || ($context eq 'requestauthor')) {      if ($context eq 'requestcourses') {
         my @approvalnotify = &Apache::loncommon::get_env_multiple('form.reqapprovalnotify');          my @approvalnotify = &Apache::loncommon::get_env_multiple('form.reqapprovalnotify');
         @approvalnotify = sort(@approvalnotify);          @approvalnotify = sort(@approvalnotify);
         $confhash{'notify'}{'approval'} = join(',',@approvalnotify);          $confhash{'notify'}{'approval'} = join(',',@approvalnotify);
Line 5628  sub modify_quotas { Line 5283  sub modify_quotas {
                         $confhash{$item}{$type} .= $limithash{$item}{$type};                          $confhash{$item}{$type} .= $limithash{$item}{$type};
                     }                      }
                 }                  }
             } elsif ($context eq 'requestauthor') {  
                 $unset = '0';  
                 if ($type eq '_LC_adv') {  
                     $unset = '';  
                 }  
             } else {              } else {
                 if (grep(/^\Q$type\E$/,@{$toolshash{$item}})) {                  if (grep(/^\Q$type\E$/,@{$toolshash{$item}})) {
                     $confhash{$item}{$type} = 1;                      $confhash{$item}{$type} = 1;
Line 5641  sub modify_quotas { Line 5291  sub modify_quotas {
                 }                  }
             }              }
             if (ref($domconfig{$action}) eq 'HASH') {              if (ref($domconfig{$action}) eq 'HASH') {
                 if ($action eq 'requestauthor') {                  if (ref($domconfig{$action}{$item}) eq 'HASH') {
                     if ($domconfig{$action}{$type} ne $confhash{$type}) {  
                         $changes{$type} = 1;  
                     }  
                 } elsif (ref($domconfig{$action}{$item}) eq 'HASH') {  
                     if ($domconfig{$action}{$item}{$type} ne $confhash{$item}{$type}) {                      if ($domconfig{$action}{$item}{$type} ne $confhash{$item}{$type}) {
                         $changes{$item}{$type} = 1;                          $changes{$item}{$type} = 1;
                     }                      }
Line 5665  sub modify_quotas { Line 5311  sub modify_quotas {
                     if ($confhash{$item}{$type} ne $unset) {                      if ($confhash{$item}{$type} ne $unset) {
                         $changes{$item}{$type} = 1;                          $changes{$item}{$type} = 1;
                     }                      }
                 } elsif ($context eq 'requestauthor') {  
                     if ($confhash{$type} ne $unset) {  
                         $changes{$type} = 1;  
                     }  
                 } else {                  } else {
                     if (!$confhash{$item}{$type}) {                      if (!$confhash{$item}{$type}) {
                         $changes{$item}{$type} = 1;                          $changes{$item}{$type} = 1;
Line 5677  sub modify_quotas { Line 5319  sub modify_quotas {
             }              }
         }          }
     }      }
     unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) {      unless ($context eq 'requestcourses') {
         if (ref($domconfig{'quotas'}) eq 'HASH') {          if (ref($domconfig{'quotas'}) eq 'HASH') {
             if (ref($domconfig{'quotas'}{'defaultquota'}) eq 'HASH') {              if (ref($domconfig{'quotas'}{'defaultquota'}) eq 'HASH') {
                 foreach my $key (keys(%{$domconfig{'quotas'}{'defaultquota'}})) {                  foreach my $key (keys(%{$domconfig{'quotas'}{'defaultquota'}})) {
Line 5720  sub modify_quotas { Line 5362  sub modify_quotas {
         }          }
     }      }
   
     if ($context eq 'requestauthor') {      foreach my $key (keys(%confhash)) {
         $domdefaults{'requestauthor'} = \%confhash;          $domdefaults{$key} = $confhash{$key};
     } else {  
         foreach my $key (keys(%confhash)) {  
             $domdefaults{$key} = $confhash{$key};  
         }  
     }      }
      
     my %quotahash = (      my %quotahash = (
                       $action => { %confhash }                        $action => { %confhash }
                     );                      );
Line 5739  sub modify_quotas { Line 5377  sub modify_quotas {
             &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);              &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
   
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             unless (($context eq 'requestcourses') ||              unless ($context eq 'requestcourses') {
                     ($context eq 'requestauthor')) {  
                 if (ref($changes{'defaultquota'}) eq 'HASH') {                  if (ref($changes{'defaultquota'}) eq 'HASH') {
                     $resulttext .= '<li>'.&mt('Portfolio default quotas').'<ul>';                      $resulttext .= '<li>'.&mt('Portfolio default quotas').'<ul>';
                     foreach my $type (@{$types},'default') {                      foreach my $type (@{$types},'default') {
Line 5757  sub modify_quotas { Line 5394  sub modify_quotas {
             }              }
             my %newenv;              my %newenv;
             foreach my $item (@usertools) {              foreach my $item (@usertools) {
                 my (%haschgs,%inconf);                  if (ref($changes{$item}) eq 'HASH') {
                 if ($context eq 'requestauthor') {  
                     %haschgs = %changes;  
                     %inconf = %confhash;  
                 } else {  
                     if (ref($changes{$item}) eq 'HASH') {  
                         %haschgs = %{$changes{$item}};  
                     }  
                     if (ref($confhash{$item}) eq 'HASH') {  
                         %inconf = %{$confhash{$item}};  
                     }  
                 }  
                 if (keys(%haschgs) > 0) {  
                     my $newacc =                       my $newacc = 
                         &Apache::lonnet::usertools_access($env{'user.name'},                          &Apache::lonnet::usertools_access($env{'user.name'},
                                                           $env{'user.domain'},                                                            $env{'user.domain'},
                                                           $item,'reload',$context);                                                            $item,'reload',$context);
                     if (($context eq 'requestcourses') ||                      if ($context eq 'requestcourses') {
                         ($context eq 'requestauthor')) {  
                         if ($env{'environment.canrequest.'.$item} ne $newacc) {                          if ($env{'environment.canrequest.'.$item} ne $newacc) {
                             $newenv{'environment.canrequest.'.$item} = $newacc;                              $newenv{'environment.canrequest.'.$item} = $newacc;
                         }                          }
Line 5784  sub modify_quotas { Line 5408  sub modify_quotas {
                             $newenv{'environment.availabletools.'.$item} = $newacc;                              $newenv{'environment.availabletools.'.$item} = $newacc;
                         }                          }
                     }                      }
                     unless ($context eq 'requestauthor') {                      $resulttext .= '<li>'.$titles{$item}.'<ul>';
                         $resulttext .= '<li>'.$titles{$item}.'<ul>';  
                     }  
                     foreach my $type (@{$types},'default','_LC_adv') {                      foreach my $type (@{$types},'default','_LC_adv') {
                         if ($haschgs{$type}) {                          if ($changes{$item}{$type}) {
                             my $typetitle = $usertypes->{$type};                              my $typetitle = $usertypes->{$type};
                             if ($type eq 'default') {                              if ($type eq 'default') {
                                 $typetitle = $othertitle;                                  $typetitle = $othertitle;
                             } elsif ($type eq '_LC_adv') {                              } elsif ($type eq '_LC_adv') {
                                 $typetitle = 'LON-CAPA Advanced Users';                                   $typetitle = 'LON-CAPA Advanced Users'; 
                             }                              }
                             if ($inconf{$type}) {                              if ($confhash{$item}{$type}) {
                                 if ($context eq 'requestcourses') {                                  if ($context eq 'requestcourses') {
                                     my $cond;                                      my $cond;
                                     if ($inconf{$type} =~ /^autolimit=(\d*)$/) {                                      if ($confhash{$item}{$type} =~ /^autolimit=(\d*)$/) {
                                         if ($1 eq '') {                                          if ($1 eq '') {
                                             $cond = &mt('(Automatic processing of any request).');                                              $cond = &mt('(Automatic processing of any request).');
                                         } else {                                          } else {
                                             $cond = &mt('(Automatic processing of requests up to limit of [quant,_1,request] per user).',$1);                                              $cond = &mt('(Automatic processing of requests up to limit of [quant,_1,request] per user).',$1);
                                         }                                          }
                                     } else {                                       } else { 
                                         $cond = $conditions{$inconf{$type}};                                          $cond = $conditions{$confhash{$item}{$type}};
                                     }                                      }
                                     $resulttext .= '<li>'.&mt('Set to be available to [_1].',$typetitle).' '.$cond.'</li>';                                      $resulttext .= '<li>'.&mt('Set to be available to [_1].',$typetitle).' '.$cond.'</li>';
                                 } else {                                  } else {
Line 5813  sub modify_quotas { Line 5435  sub modify_quotas {
                                 }                                  }
                             } else {                              } else {
                                 if ($type eq '_LC_adv') {                                  if ($type eq '_LC_adv') {
                                     if ($inconf{$type} eq '0') {                                      if ($confhash{$item}{$type} eq '0') {
                                         $resulttext .= '<li>'.&mt('Set to be unavailable to [_1]',$typetitle).'</li>';                                          $resulttext .= '<li>'.&mt('Set to be unavailable to [_1]',$typetitle).'</li>';
                                     } else {                                       } else { 
                                         $resulttext .= '<li>'.&mt('No override set for [_1]',$typetitle).'</li>';                                          $resulttext .= '<li>'.&mt('No override set for [_1]',$typetitle).'</li>';
Line 5824  sub modify_quotas { Line 5446  sub modify_quotas {
                             }                              }
                         }                          }
                     }                      }
                     unless ($context eq 'requestauthor') {                      $resulttext .= '</ul></li>';
                         $resulttext .= '</ul></li>';  
                     }  
                 }                  }
             }              }
             if (($action eq 'requestcourses') || ($action eq 'requestauthor')) {              if ($action eq 'requestcourses') {
                 if (ref($changes{'notify'}) eq 'HASH') {                  if (ref($changes{'notify'}) eq 'HASH') {
                     if ($changes{'notify'}{'approval'}) {                      if ($changes{'notify'}{'approval'}) {
                         if (ref($confhash{'notify'}) eq 'HASH') {                          if (ref($confhash{'notify'}) eq 'HASH') {
                             if ($confhash{'notify'}{'approval'}) {                              if ($confhash{'notify'}{'approval'}) {
                                 $resulttext .= '<li>'.&mt('Notification of requests requiring approval will be sent to: ').$confhash{'notify'}{'approval'}.'</li>';                                  $resulttext .= '<li>'.&mt('Notification of requests requiring approval will be sent to: ').$confhash{'notify'}{'approval'}.'</li>';
                             } else {                              } else {
                                 $resulttext .= '<li>'.&mt('No Domain Coordinators will receive notification of requests requiring approval.').'</li>';                                  $resulttext .= '<li>'.&mt('No Domain Coordinators will receive notification of course requests requiring approval.').'</li>';
                             }                              }
                         }                          }
                     }                      }
Line 5849  sub modify_quotas { Line 5469  sub modify_quotas {
         } else {          } else {
             if ($context eq 'requestcourses') {              if ($context eq 'requestcourses') {
                 $resulttext = &mt('No changes made to rights to request creation of courses.');                  $resulttext = &mt('No changes made to rights to request creation of courses.');
             } elsif ($context eq 'requestauthor') {  
                 $resulttext = &mt('No changes made to rights to request author space.');  
             } else {              } else {
                 $resulttext = &mt('No changes made to availability of personal information pages, blogs, portfolios or default quotas');                  $resulttext = &mt('No changes made to availability of personal information pages, blogs, portfolios or default quotas');
             }              }
Line 6545  sub modify_usercreation { Line 6163  sub modify_usercreation {
         }          }
         push(@contexts,'statustocreate');          push(@contexts,'statustocreate');
     }      }
     &process_captcha('cancreate',\%changes,\%cancreate,\%curr_usercreation);  
     if (ref($curr_usercreation{'cancreate'}) eq 'HASH') {      if (ref($curr_usercreation{'cancreate'}) eq 'HASH') {
         foreach my $item (@contexts) {          foreach my $item (@contexts) {
             if (($item eq 'selfcreate') || ($item eq 'statustocreate')) {              if (($item eq 'selfcreate') || ($item eq 'statustocreate')) {
Line 6728  sub modify_usercreation { Line 6345  sub modify_usercreation {
                 my %lt = &usercreation_types();                  my %lt = &usercreation_types();
                 foreach my $type (@{$changes{'cancreate'}}) {                  foreach my $type (@{$changes{'cancreate'}}) {
                     my $chgtext;                      my $chgtext;
                     unless (($type eq 'statustocreate') || ($type eq 'captcha') || ($type eq 'recaptchakeys')) {                      unless ($type eq 'statustocreate') {
                         $chgtext = $lt{$type}.', ';                          $chgtext = $lt{$type}.', ';
                     }                      }
                     if ($type eq 'selfcreate') {                      if ($type eq 'selfcreate') {
Line 6787  sub modify_usercreation { Line 6404  sub modify_usercreation {
                                 }                                  }
                             }                              }
                         }                          }
                     } elsif ($type eq 'captcha') {  
                         if ($cancreate{$type} eq 'notused') {  
                             $chgtext .= &mt('No CAPTCHA validation in use for self-creation screen.');  
                         } else {  
                             my %captchas = &captcha_phrases();  
                             if ($captchas{$cancreate{$type}}) {  
                                 $chgtext .= &mt("Validation for self-creation screen set to $captchas{$cancreate{$type}}.");  
                             } else {  
                                 $chgtext .= &mt('Validation for self-creation screen set to unknown type.');  
                             }  
                         }  
                     } elsif ($type eq 'recaptchakeys') {  
                         my ($privkey,$pubkey);  
                         if (ref($cancreate{$type}) eq 'HASH') {  
                             $pubkey = $cancreate{$type}{'public'};  
                             $privkey = $cancreate{$type}{'private'};  
                         }  
                         $chgtext .= &mt('ReCAPTCHA keys changes').'<ul>';  
                         if (!$pubkey) {  
                             $chgtext .= '<li>'.&mt('Public key deleted').'</li>';  
                         } else {  
                             $chgtext .= '<li>'.&mt('Public key set to [_1]',$pubkey).'</li>';  
                         }  
                         if (!$privkey) {  
                             $chgtext .= '<li>'.&mt('Private key deleted').'</li>';  
                         } else {  
                             $chgtext .= '<li>'.&mt('Private key set to [_1]',$pubkey).'</li>';  
                         }  
                         $chgtext .= '</ul>';  
                     } else {                      } else {
                         if ($cancreate{$type} eq 'none') {                          if ($cancreate{$type} eq 'none') {
                             $chgtext .= &mt('creation of new users is not permitted, except by a Domain Coordinator.');                              $chgtext .= &mt('creation of new users is not permitted, except by a Domain Coordinator.');
Line 6915  sub modify_usercreation { Line 6503  sub modify_usercreation {
     return $resulttext;      return $resulttext;
 }  }
   
 sub process_captcha {  
     my ($container,$changes,$newsettings,$current) = @_;  
     return unless ((ref($changes) eq 'HASH') && (ref($newsettings) eq 'HASH') || (ref($current) eq 'HASH'));  
     $newsettings->{'captcha'} = $env{'form.'.$container.'_captcha'};  
     unless ($newsettings->{'captcha'} eq 'recaptcha' || $newsettings->{'captcha'} eq 'notused') {  
         $newsettings->{'captcha'} = 'original';  
     }  
     if ($current->{'captcha'} ne $newsettings->{'captcha'}) {  
         if ($container eq 'cancreate') {  
             if (ref($changes->{'cancreate'}) eq 'ARRAY') {  
                 push(@{$changes->{'cancreate'}},'captcha');  
             } elsif (!defined($changes->{'cancreate'})) {  
                 $changes->{'cancreate'} = ['captcha'];  
             }  
         } else {  
             $changes->{'captcha'} = 1;  
         }  
     }  
     my ($newpub,$newpriv,$currpub,$currpriv);  
     if ($newsettings->{'captcha'} eq 'recaptcha') {  
         $newpub = $env{'form.'.$container.'_recaptchapub'};  
         $newpriv = $env{'form.'.$container.'_recaptchapriv'};  
         $newpub =~ s/\W//g;  
         $newpriv =~ s/\W//g;  
         $newsettings->{'recaptchakeys'} = {  
                                              public  => $newpub,  
                                              private => $newpriv,  
                                           };  
     }  
     if (ref($current->{'recaptchakeys'}) eq 'HASH') {  
         $currpub = $current->{'recaptchakeys'}{'public'};  
         $currpriv = $current->{'recaptchakeys'}{'private'};  
         $newsettings->{'recaptchakeys'} = {  
                                              public  => '',  
                                              private => '',  
                                           }  
     }  
     if (($newpub ne $currpub) || ($newpriv ne $currpriv)) {  
         if ($container eq 'cancreate') {  
             if (ref($changes->{'cancreate'}) eq 'ARRAY') {  
                 push(@{$changes->{'cancreate'}},'recaptchakeys');  
             } elsif (!defined($changes->{'cancreate'})) {  
                 $changes->{'cancreate'} = ['recaptchakeys'];  
             }  
         } else {  
             $changes->{'recaptchakeys'} = 1;  
         }  
     }  
     return;  
 }  
   
 sub modify_usermodification {  sub modify_usermodification {
     my ($dom,%domconfig) = @_;      my ($dom,%domconfig) = @_;
     my ($resulttext,%curr_usermodification,%changes);      my ($resulttext,%curr_usermodification,%changes);
Line 7622  sub modify_serverstatuses { Line 7159  sub modify_serverstatuses {
   
 sub modify_helpsettings {  sub modify_helpsettings {
     my ($r,$dom,$confname,%domconfig) = @_;      my ($r,$dom,$confname,%domconfig) = @_;
     my ($resulttext,$errors,%changes,%helphash);    my ($resulttext,$errors,%changes,%helphash);
     my %defaultchecked = ('submitbugs' => 'on');   
     my @offon = ('off','on');    my $customhelpfile  = $env{'form.loginhelpurl.filename'};
       my $defaulthelpfile = 'defaulthelp.html';
     my $servadm = $r->dir_config('lonAdmEMail');
       my ($configuserok,$author_ok,$switchserver) = 
           &config_check($dom,$confname,$servadm);
    
     my %defaultchecked = ('submitbugs' => 'on');
     my @offon = ('off','on');
       my %title = ( submitbugs     => 'Display link for users to submit a bug', 
        loginhelpurl  => 'Unauthenticated login help page set to custom file');
        
     my @toggles = ('submitbugs');      my @toggles = ('submitbugs');
   
       $helphash{'helpsettings'} = {};
       
       if (ref($domconfig{'helpsettings'}) ne 'HASH') {
           if ($domconfig{'helpsettings'} eq '') {
               $domconfig{'helpsettings'} = {};
           }
       }
       
     if (ref($domconfig{'helpsettings'}) eq 'HASH') {      if (ref($domconfig{'helpsettings'}) eq 'HASH') {
      
         foreach my $item (@toggles) {          foreach my $item (@toggles) {
             if ($defaultchecked{$item} eq 'on') {          
                 if ($domconfig{'helpsettings'}{$item} eq '') {   if ($defaultchecked{$item} eq 'on') { 
                     if ($env{'form.'.$item} eq '0') {   if (($domconfig{'helpsettings'}{$item} eq '') &&
                         $changes{$item} = 1;   ($env{'form.'.$item} eq '0')) {
                     }   $changes{$item} = 1;
                 } elsif ($domconfig{'helpsettings'}{$item} ne $env{'form.'.$item}) {   } elsif ($domconfig{'helpsettings'}{$item} ne $env{'form.'.$item}) {
                     $changes{$item} = 1;   $changes{$item} = 1;
                 }   }
             } elsif ($defaultchecked{$item} eq 'off') {   } elsif ($defaultchecked{$item} eq 'off') {
                 if ($domconfig{'helpsettings'}{$item} eq '') {   if (($domconfig{'helpsettings'}{$item} eq '') &&
                     if ($env{'form.'.$item} eq '1') {   ($env{'form.'.$item} eq '1')) {
                         $changes{$item} = 1;   $changes{$item} = 1;
                     }   } elsif ($domconfig{'helpsettings'}{$item} ne $env{'form.'.$item}) {
                 } elsif ($domconfig{'helpsettings'}{$item} ne $env{'form.'.$item}) {   $changes{$item} = 1;
                     $changes{$item} = 1;   }
                 }   }
     }   $helphash{'helpsettings'}{$item} = $env{'form.'.$item};
             if (($env{'form.'.$item} eq '0') || ($env{'form.'.$item} eq '1')) {   }
                 $helphash{'helpsettings'}{$item} = $env{'form.'.$item};  
    if ($customhelpfile ne '') {
    my $error;
    if ($configuserok eq 'ok') {
    if ($switchserver) {
    $error = &mt("Upload of custom help file is not permitted to this server: [_1]",$switchserver);
    } else {
    if ($author_ok eq 'ok') {
    my ($result,$loginhelpurl) =
    &publishlogo($r,'upload','loginhelpurl',$dom,
    $confname,'help','','',$customhelpfile);
    if ($result eq 'ok') {
    $helphash{'helpsettings'}{'loginhelpurl'} = $loginhelpurl;
    $changes{'loginhelpurl'} = 1;
    } else {
    $error = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$customhelpfile,$result);
    }
    } else {
    $error = &mt("Upload of [_1] failed because an author role could not be assigned to a Domain Configuration user ([_2]) in domain: [_3].  Error was: [_4].",$customhelpfile,$confname,$dom,$author_ok);
    }
    }
    } else {
    $error = &mt("Upload of [_1] failed because a Domain Configuration user ([_2]) could not be created in domain: [_3].  Error was: [_4].",$customhelpfile,$confname,$dom,$configuserok);
    }
    if ($error) {
    &Apache::lonnet::logthis($error);
    $errors .= '<li><span class="LC_error">'.$error.'</span></li>';
    }
    }
   
           if ($domconfig{'helpsettings'}{'loginhelpurl'} ne '') {
               if ($env{'form.loginhelpurl_del'}) {
                   $helphash{'helpsettings'}{'loginhelpurl'} = '';
                   $changes{'loginhelpurl'} = 1;
             }              }
         }          }
     }      }
       
       
     my $putresult;      my $putresult;
       
     if (keys(%changes) > 0) {      if (keys(%changes) > 0) {
         $putresult = &Apache::lonnet::put_dom('configuration',\%helphash,$dom);      $putresult = &Apache::lonnet::put_dom('configuration',\%helphash,$dom);
         if ($putresult eq 'ok') {      } else {
             $resulttext = &mt('Changes made:').'<ul>';      $putresult = 'ok';
             foreach my $item (sort(keys(%changes))) {      }
                 if ($item eq 'submitbugs') {                                               
                     $resulttext .= '<li>'.&mt('Display link to: [_1] set to "'.$offon[$env{'form.'.$item}].'".',      if ($putresult eq 'ok') {
                                               &Apache::loncommon::modal_link('http://bugs.loncapa.org',          if (keys(%changes) > 0) {
                                               &mt('LON-CAPA bug tracker'),600,500)).'</li>';   $resulttext = &mt('Changes made:').'<ul>';
                 }   foreach my $item (sort(keys(%changes))) {
             }   if ($item eq 'submitbugs') {
             $resulttext .= '</ul>';   $resulttext .= '<li>'.&mt("$title{$item} set to $offon[$env{'form.'.$item}]").'</li>';
         } else {   }
             $resulttext = &mt('No changes made to help settings');   if ($item eq 'loginhelpurl') {
             $errors .= '<li><span class="LC_error">'.   if ($helphash{'helpsettings'}{'loginhelpurl'} eq '') {
                        &mt('An error occurred storing the settings: [_1]',                          $resulttext .= '<li>'.&mt('[_1] help file removed; [_2] file will be used for the unathorized help page in this domain.',$customhelpfile,$defaulthelpfile).'</li>';
                            $putresult).'</span></li>';                      } else {
         }                          $resulttext .= '<li>'.&mt("$title{$item} [_1]",$customhelpfile).'</li>';
                       }
    }
    }
    $resulttext .= '</ul>';
    } else {
    $resulttext = &mt('No changes made to help settings');
    }
       } else {
           $resulttext = '<span class="LC_error">'.
       &mt('An error occurred: [_1]',$putresult).'</span>';
     }      }
     if ($errors) {      if ($errors) {
         $resulttext .= '<br />'.&mt('The following errors occurred: ').'<ul>'.          $resulttext .= &mt('The following errors occurred: ').'<ul>'.
                        $errors.'</ul>';                         $errors.'</ul>';
     }      }
     return $resulttext;      return $resulttext;
Line 8665  END Line 8268  END
   
 }  }
   
 sub recaptcha_js {  
     my %lt = &captcha_phrases();  
     return <<"END";  
   
 <script type="text/javascript">  
 // <![CDATA[  
   
 function updateCaptcha(caller,context) {  
     var privitem;  
     var pubitem;  
     var privtext;  
     var pubtext;  
     if (document.getElementById(context+'_recaptchapub')) {  
         pubitem = document.getElementById(context+'_recaptchapub');  
     } else {  
         return;  
     }  
     if (document.getElementById(context+'_recaptchapriv')) {  
         privitem = document.getElementById(context+'_recaptchapriv');  
     } else {  
         return;  
     }  
     if (document.getElementById(context+'_recaptchapubtxt')) {  
         pubtext = document.getElementById(context+'_recaptchapubtxt');  
     } else {  
         return;  
     }  
     if (document.getElementById(context+'_recaptchaprivtxt')) {  
         privtext = document.getElementById(context+'_recaptchaprivtxt');  
     } else {  
         return;  
     }  
     if (caller.checked) {  
         if (caller.value == 'recaptcha') {  
             pubitem.type = 'text';  
             privitem.type = 'text';  
             pubitem.size = '40';  
             privitem.size = '40';  
             pubtext.innerHTML = "$lt{'pub'}";  
             privtext.innerHTML = "$lt{'priv'}";  
         } else {  
             pubitem.type = 'hidden';  
             privitem.type = 'hidden';  
             pubtext.innerHTML = '';  
             privtext.innerHTML = '';  
         }  
     }  
     return;  
 }  
   
 // ]]>  
 </script>  
   
 END  
   
 }  
   
 sub captcha_phrases {  
     return &Apache::lonlocal::texthash (  
                  priv => 'Private key',  
                  pub  => 'Public key',  
                  original  => 'original (CAPTCHA)',  
                  recaptcha => 'successor (ReCAPTCHA)',  
                  notused   => 'unused',  
     );  
 }  
   
 1;  1;

Removed from v.1.160.6.6  
changed lines
  Added in v.1.162


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