Diff for /loncom/interface/domainprefs.pm between versions 1.33 and 1.45

version 1.33, 2007/12/11 00:44:23 version 1.45, 2008/02/29 21:01:36
Line 36  use Apache::lonnet; Line 36  use Apache::lonnet;
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonhtmlcommon();  use Apache::lonhtmlcommon();
 use Apache::lonlocal;  use Apache::lonlocal;
   use Apache::lonmsg();
 use LONCAPA();  use LONCAPA();
 use LONCAPA::Enrollment;  use LONCAPA::Enrollment;
 use File::Copy;  use File::Copy;
   use Locale::Language;
   
 sub handler {  sub handler {
     my $r=shift;      my $r=shift;
Line 68  sub handler { Line 70  sub handler {
     my %domconfig =      my %domconfig =
       &Apache::lonnet::get_dom('configuration',['login','rolecolors',        &Apache::lonnet::get_dom('configuration',['login','rolecolors',
                 'quotas','autoenroll','autoupdate','directorysrch',                  'quotas','autoenroll','autoupdate','directorysrch',
                 'usercreation','usermodification','contacts'],$dom);                  'usercreation','usermodification','contacts','defaults'],$dom);
     my @prefs_order = ('rolecolors','login','quotas','autoenroll',      my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll',
                        'autoupdate','directorysrch','contacts',                         'autoupdate','directorysrch','contacts',
                        'usercreation','usermodification');                         'usercreation','usermodification');
     my %prefs = (      my %prefs = (
Line 91  sub handler { Line 93  sub handler {
                       header => [{col1 => 'Item',                        header => [{col1 => 'Item',
                                   col2 => '',}],                                    col2 => '',}],
                     },                      },
           'defaults' => 
                       { text => 'Default authentication/language',
                         help => '',
                         header => [{col1 => 'Setting',
                                     col2 => 'Value'}],
                       },
         'quotas' =>           'quotas' => 
                     { text => 'Default quotas for user portfolios',                      { text => 'Default quotas for user portfolios',
                       help => 'Default_User_Quota',                        help => 'Default_User_Quota',
Line 108  sub handler { Line 116  sub handler {
                      help => 'Domain_Auto_Update',                       help => 'Domain_Auto_Update',
                      header => [{col1 => 'Setting',                       header => [{col1 => 'Setting',
                                  col2 => 'Value',},                                   col2 => 'Value',},
                                 {col1 => 'User Population',                                  {col1 => 'User population',
                                  col2 => 'Updataeable user data'}],                                   col2 => 'Updataeable user data'}],
                   },                    },
         'directorysrch' =>           'directorysrch' => 
Line 127  sub handler { Line 135  sub handler {
         'usercreation' =>           'usercreation' => 
                   { text => 'User creation',                    { text => 'User creation',
                     help => 'Domain_User_Creation',                      help => 'Domain_User_Creation',
                     header => [{col1 => 'Setting',                      header => [{col1 => 'Format rule type',
                                 col2 => 'Value',},                                  col2 => 'Format rules in force'},
                                  {col1 => 'User account creation',
                                   col2 => 'Usernames which may be created',},
                                {col1 => 'Context',                                 {col1 => 'Context',
                                 col2 => 'Assignable Authentication Types'}],                                  col2 => 'Assignable authentication types'}],
                   },                    },
         'usermodification' =>           'usermodification' => 
                   { text => 'User modification',                    { text => 'User modification',
Line 245  sub handler { Line 255  sub handler {
             my @ids=&Apache::lonnet::current_machine_ids();              my @ids=&Apache::lonnet::current_machine_ids();
             if (!grep(/^\Q$primarylibserv\E$/,@ids)) {              if (!grep(/^\Q$primarylibserv\E$/,@ids)) {
                 my %designhash = &Apache::loncommon::get_domainconf($dom);                  my %designhash = &Apache::loncommon::get_domainconf($dom);
                 my @loginimages = ('img','logo','domlogo');                  my @loginimages = ('img','logo','domlogo','login');
                 my $custom_img_count = 0;                  my $custom_img_count = 0;
                 foreach my $img (@loginimages) {                  foreach my $img (@loginimages) {
                     if ($designhash{$dom.'.login.'.$img} ne '') {                      if ($designhash{$dom.'.login.'.$img} ne '') {
Line 279  sub handler { Line 289  sub handler {
               ' />  '.                ' />  '.
               '<input type="button" value="uncheck all" '.                '<input type="button" value="uncheck all" '.
               'onclick="javascript:uncheckAll(document.pickactions.actions)"'.                'onclick="javascript:uncheckAll(document.pickactions.actions)"'.
               ' /></p>');                ' /></p><div class="LC_left_float">');
           my ($numitems,$midpoint,$seconddiv,$count); 
           $numitems = @prefs_order;
           $midpoint = int($numitems/2);
           if ($numitems%2) {
               $midpoint ++;
           }
           $count = 0;
         foreach my $item (@prefs_order) {          foreach my $item (@prefs_order) {
             $r->print('<p><label><input type="checkbox" name="actions" value="'.$item.'" />&nbsp;'.$prefs{$item}->{'text'}.'</label></p>');              $r->print('<h4><label><input type="checkbox" name="actions" value="'.$item.'" />&nbsp;'.$prefs{$item}->{'text'}.'</label></h4>');
               $count ++;
               if ((!$seconddiv) && ($count >= $midpoint)) {
                   $r->print('</div>'."\n".'<div class="LC_left_float">'."\n");
                   $seconddiv = 1;
               }
         }          }
         $r->print('<h3>'.&mt('Display options').'</h3>'."\n".          $r->print('</div><div class="LC_clear_float_footer"></div><h3>'.
                     &mt('Display options').'</h3>'."\n".
                   '<p><span class="LC_nobreak">'.&mt('Display using: ')."\n".                    '<p><span class="LC_nobreak">'.&mt('Display using: ')."\n".
                   '<label><input type="radio" name="numcols" value="1">'.                    '<label><input type="radio" name="numcols" value="1">'.
                   &mt('one column').'</label>&nbsp;&nbsp;'.                    &mt('one column').'</label>&nbsp;&nbsp;'.
Line 318  sub process_changes { Line 341  sub process_changes {
         $output = &modify_usermodification($dom,%domconfig);          $output = &modify_usermodification($dom,%domconfig);
     } elsif ($action eq 'contacts') {      } elsif ($action eq 'contacts') {
         $output = &modify_contacts($dom,%domconfig);          $output = &modify_contacts($dom,%domconfig);
       } elsif ($action eq 'defaults') {
           $output = &modify_defaults($dom,$r);
     }      }
     return $output;      return $output;
 }  }
Line 372  sub print_config_box { Line 397  sub print_config_box {
         if ($action eq 'autoupdate') {          if ($action eq 'autoupdate') {
             $output .= &print_autoupdate('bottom',$dom,$settings,\$rowtotal);              $output .= &print_autoupdate('bottom',$dom,$settings,\$rowtotal);
         } elsif ($action eq 'usercreation') {          } elsif ($action eq 'usercreation') {
             $output .= &print_usercreation('bottom',$dom,$settings,\$rowtotal);              $output .= &print_usercreation('middle',$dom,$settings,\$rowtotal).'
              </table>
             </td>
            </tr>
            <tr>
              <td>
               <table class="LC_nested">
                <tr class="LC_info_row">
                 <td class="LC_left_item"'.$colspan.'>'.$item->{'header'}->[2]->{'col1'}.'</td>
                 <td class="LC_right_item">'.$item->{'header'}->[2]->{'col2'}.'</td>             </tr>'.
               &print_usercreation('bottom',$dom,$settings,\$rowtotal);
               $rowtotal ++;
         } elsif ($action eq 'usermodification') {          } elsif ($action eq 'usermodification') {
             $output .= &print_usermodification('bottom',$dom,$settings,\$rowtotal);              $output .= &print_usermodification('bottom',$dom,$settings,\$rowtotal);
         } else {          } else {
Line 428  sub print_config_box { Line 464  sub print_config_box {
             $output .= &print_directorysrch($dom,$settings,\$rowtotal);              $output .= &print_directorysrch($dom,$settings,\$rowtotal);
         } elsif ($action eq 'contacts') {          } elsif ($action eq 'contacts') {
             $output .= &print_contacts($dom,$settings,\$rowtotal);              $output .= &print_contacts($dom,$settings,\$rowtotal);
           } elsif ($action eq 'defaults') {
               $output .= &print_defaults($dom,\$rowtotal);
         }          }
     }      }
     $output .= '      $output .= '
Line 542  sub print_footer { Line 580  sub print_footer {
 sub print_login {  sub print_login {
     my ($dom,$confname,$phase,$settings,$rowtotal) = @_;      my ($dom,$confname,$phase,$settings,$rowtotal) = @_;
     my %choices = &login_choices();      my %choices = &login_choices();
     my ($catalogon,$catalogoff,$adminmailon,$adminmailoff);      my %defaultchecked = ( 
     $catalogon = ' checked="checked" ';                             'coursecatalog' => 'on',
     $adminmailoff = ' checked="checked" ';                             'adminmail'     => 'off',
     my @images = ('img','logo','domlogo');                             'newuser'       => 'off',
                            );
       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 $loginheader = 'image';
       my @images = ('img','logo','domlogo','login');
       my @logintext = ('textcol','bgcol');
     my @bgs = ('pgbg','mainbg','sidebg');      my @bgs = ('pgbg','mainbg','sidebg');
     my @links = ('link','alink','vlink');      my @links = ('link','alink','vlink');
     my %designhash = &Apache::loncommon::get_domainconf($dom);      my %designhash = &Apache::loncommon::get_domainconf($dom);
Line 560  sub print_login { Line 613  sub print_login {
     foreach my $item (@bgs) {      foreach my $item (@bgs) {
         $defaults{'bgs'}{$item} = $defaultdesign{'login.'.$item};          $defaults{'bgs'}{$item} = $defaultdesign{'login.'.$item};
     }      }
       foreach my $item (@logintext) {
           $defaults{'logintext'}{$item} = $defaultdesign{'login.'.$item};
       }
     foreach my $item (@links) {      foreach my $item (@links) {
         $defaults{'links'}{$item} = $defaultdesign{'login.'.$item};          $defaults{'links'}{$item} = $defaultdesign{'login.'.$item};
     }      }
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         if ($settings->{'coursecatalog'} eq '0') {          foreach my $item (@toggles) {
             $catalogoff = $catalogon;              if ($settings->{$item} eq '1') {
             $catalogon = ' ';                  $checkedon{$item} =  ' checked="checked" ';
         }                  $checkedoff{$item} = ' ';
         if ($settings->{'adminmail'} eq '1') {              } elsif ($settings->{$item} eq '0') {
             $adminmailon = $adminmailoff;                  $checkedoff{$item} =  ' checked="checked" ';
             $adminmailoff = ' ';                  $checkedon{$item} = ' ';
               }
         }          }
         foreach my $item (@images) {          foreach my $item (@images) {
             if ($settings->{$item} ne '') {              if ($settings->{$item} ne '') {
Line 578  sub print_login { Line 635  sub print_login {
                 $is_custom{$item} = 1;                  $is_custom{$item} = 1;
             }              }
         }          }
           foreach my $item (@logintext) {
               if ($settings->{$item} ne '') {
                   $designs{'logintext'}{$item} = $settings->{$item};
                   $is_custom{$item} = 1;
               }
           }
           if ($settings->{'loginheader'} ne '') {
               $loginheader = $settings->{'loginheader'};
           }
         if ($settings->{'font'} ne '') {          if ($settings->{'font'} ne '') {
             $designs{'font'} = $settings->{'font'};              $designs{'font'} = $settings->{'font'};
             $is_custom{'font'} = 1;              $is_custom{'font'} = 1;
Line 620  sub print_login { Line 686  sub print_login {
     }      }
     my %alt_text = &Apache::lonlocal::texthash  ( img => 'Log-in banner',      my %alt_text = &Apache::lonlocal::texthash  ( img => 'Log-in banner',
                                                   logo => 'Institution Logo',                                                    logo => 'Institution Logo',
                                                   domlogo => 'Domain Logo');                                                    domlogo => 'Domain Logo',
                                                     login => 'Login box');
     my $itemcount = 1;      my $itemcount = 1;
     my $css_class = $itemcount%2?' class="LC_odd_row"':'';      my ($css_class,$datatable);
     my $datatable =       foreach my $item (@toggles) {
         '<tr'.$css_class.'><td colspan="2">'.$choices{'coursecatalog'}.          $css_class = $itemcount%2?' class="LC_odd_row"':'';
         '</td><td>'.          $datatable .=  
         '<span class="LC_nobreak"><label><input type="radio" name="coursecatalog"'.              '<tr'.$css_class.'><td colspan="2">'.$choices{$item}.
         $catalogon.' value="1" />'.&mt('Yes').'</label>&nbsp;'.              '</td><td>'.
         '<label><input type="radio" name="coursecatalog"'.              '<span class="LC_nobreak"><label><input type="radio" name="'.
         $catalogoff.'value="0" />'.&mt('No').'</label></span></td>'.              $item.'"'.$checkedon{$item}.' value="1" />'.&mt('Yes').
         '</tr>';              '</label>&nbsp;<label><input type="radio" name="'.$item.'"'.
     $itemcount ++;              $checkedoff{$item}.' value="0" />'.&mt('No').'</label></span></td>'.
     $css_class = $itemcount%2?' class="LC_odd_row"':'';              '</tr>';
     $datatable .= '<tr'.$css_class.'>'.          $itemcount ++;
         '<td colspan="2">'.$choices{'adminmail'}.'</td>'.      }
         '<td><span class="LC_nobreak">'.      $datatable .= &display_color_options($dom,$confname,$phase,'login',$itemcount,\%choices,\%is_custom,\%defaults,\%designs,\@images,\@bgs,\@links,\%alt_text,$rowtotal,\@logintext,$loginheader);
         '<label><input type="radio" name="adminmail"'.  
         $adminmailon.' value="1" />'.&mt('Yes').'</label>&nbsp;'.  
         '<label><input type="radio" name="adminmail"'.  
         $adminmailoff.'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);  
     $datatable .= '</tr></table></td></tr>';      $datatable .= '</tr></table></td></tr>';
     return $datatable;      return $datatable;
 }  }
Line 651  sub login_choices { Line 712  sub login_choices {
         &Apache::lonlocal::texthash (          &Apache::lonlocal::texthash (
             coursecatalog => 'Display Course Catalog link?',              coursecatalog => 'Display Course Catalog link?',
             adminmail => "Display Administrator's E-mail Address?",              adminmail => "Display Administrator's E-mail Address?",
               newuser   => "Link to create a user account",
             img => "Header",              img => "Header",
             logo => "Main Logo",              logo => "Main Logo",
             domlogo => "Domain Logo",              domlogo => "Domain Logo",
               login => "Log-in Header", 
               textcol => "Text color",
               bgcol   => "Box color",
             bgs => "Background colors",              bgs => "Background colors",
             links => "Link colors",              links => "Link colors",
             font => "Font color",              font => "Font color",
Line 741  sub print_rolecolors { Line 806  sub print_rolecolors {
   
 sub display_color_options {  sub display_color_options {
     my ($dom,$confname,$phase,$role,$itemcount,$choices,$is_custom,$defaults,$designs,      my ($dom,$confname,$phase,$role,$itemcount,$choices,$is_custom,$defaults,$designs,
         $images,$bgs,$links,$alt_text,$rowtotal) = @_;          $images,$bgs,$links,$alt_text,$rowtotal,$logintext,$loginheader) = @_;
     my $css_class = $itemcount%2?' class="LC_odd_row"':'';      my $css_class = $itemcount%2?' class="LC_odd_row"':'';
     my $datatable = '<tr'.$css_class.'>'.      my $datatable = '<tr'.$css_class.'>'.
         '<td>'.$choices->{'font'}.'</td>';          '<td>'.$choices->{'font'}.'</td>';
Line 763  sub display_color_options { Line 828  sub display_color_options {
         $css_class = $itemcount%2?' class="LC_odd_row"':'';          $css_class = $itemcount%2?' class="LC_odd_row"':'';
         $datatable .= '<tr'.$css_class.'>'.          $datatable .= '<tr'.$css_class.'>'.
                       '<td>'.$choices->{$img}.'</td>';                        '<td>'.$choices->{$img}.'</td>';
         my ($imgfile, $img_import);          my ($imgfile,$img_import,$login_hdr_pick,$logincolors);
         if ($designs->{$img} ne '') {          if ($designs->{$img} ne '') {
             $imgfile = $designs->{$img};              $imgfile = $designs->{$img};
     $img_import = ($imgfile =~ m{^/adm/});      $img_import = ($imgfile =~ m{^/adm/});
         } else {          } else {
             $imgfile = $defaults->{$img};              $imgfile = $defaults->{$img};
         }          }
           if ($img eq 'login') {
               $login_hdr_pick = &login_header_options($img,$role,$defaults,$is_custom,$choices,
                                                       $loginheader);
               $logincolors =
                   &login_text_colors($img,$role,$logintext,$phase,$choices,$designs);
           }
         if ($imgfile) {          if ($imgfile) {
             my ($showfile,$fullsize);              my ($showfile,$fullsize);
             if ($imgfile =~ m-^(/res/\Q$dom\E/\Q$confname\E/\Q$img\E)/([^/]+)$-) {              if ($imgfile =~ m-^(/res/\Q$dom\E/\Q$confname\E/\Q$img\E)/([^/]+)$-) {
Line 810  sub display_color_options { Line 881  sub display_color_options {
                 }                  }
             }              }
             if ($showfile) {              if ($showfile) {
                 $showfile = &Apache::loncommon::lonhttpdurl($showfile);                  if ($showfile =~ m{^/(adm|res)/}) {
                 $fullsize =  &Apache::loncommon::lonhttpdurl($imgfile);                      if ($showfile =~ m{^/res/}) {
                 $datatable.= '<td>';                          my $local_showfile =
                 if (!$is_custom->{$img}) {                              &Apache::lonnet::filelocation('',$showfile);
                     $datatable .= &mt('Default in use:').'<br />';                          &Apache::lonnet::repcopy($local_showfile);
                 }                      }
  if ($img_import) {                      $showfile = &Apache::loncommon::lonhttpdurl($showfile);
     $datatable.= '<input type="hidden" name="'.$role.'_import_'.$img.'" value="'.$imgfile.'" />';                  }
  }                  if ($imgfile) {
                 $datatable.= '<a href="'.$fullsize.'" target="_blank"><img src="'.                      if ($imgfile  =~ m{^/(adm|res)/}) {
                              $showfile.'" alt="'.$alt_text->{$img}.                          if ($imgfile =~ m{^/res/}) {
                              '" border="0" /></a></td>';                              my $local_imgfile =
                 if ($is_custom->{$img}) {                                  &Apache::lonnet::filelocation('',$imgfile);
                     $datatable.='<td><span class="LC_nobreak"><label><input type="checkbox" name="'.                              &Apache::lonnet::repcopy($local_imgfile);
                                 $role.'_del_'.$img.'" value="1" />'.&mt('Delete?').                          }
                                 '</label>&nbsp;'.&mt('Replace:').'</span><br />';                          $fullsize = &Apache::loncommon::lonhttpdurl($imgfile);
                 } else {                      } else {
                     $datatable.='<td valign="bottom">'.&mt('Upload:').'<br />';                          $fullsize = $imgfile;
                       }
                 }                  }
                   $datatable .= '<td>';
                   if ($img eq 'login') {
                       $datatable .= $login_hdr_pick;    
                   }
                   $datatable .= &image_changes($is_custom->{$img},$alt_text->{$img},$img_import,
                                                $showfile,$fullsize,$role,$img,$imgfile,$logincolors);
             } else {              } else {
                 $datatable .= '<td colspan="2" class="LC_right_item"><br />'.                  $datatable .= '<td colspan="2" class="LC_right_item"><br />'.
                               &mt('Upload:');                                &mt('Upload:');
Line 868  sub display_color_options { Line 946  sub display_color_options {
             $datatable .= '&nbsp;<span id="css_'.$role.'_'.$item.'" style="background-color: '.$designs->{'bgs'}{$item}.';">&nbsp;&nbsp;&nbsp;</span>';              $datatable .= '&nbsp;<span id="css_'.$role.'_'.$item.'" style="background-color: '.$designs->{'bgs'}{$item}.';">&nbsp;&nbsp;&nbsp;</span>';
         }          }
         $datatable .= '<br /><input type="text" size="8" name="'.$role.'_'.$item.'" value="'.$designs->{'bgs'}{$item}.          $datatable .= '<br /><input type="text" size="8" name="'.$role.'_'.$item.'" value="'.$designs->{'bgs'}{$item}.
                       '" onblur = "javascript:document.display.css_'.$role.'_'.$item.'.style.background-color = document.display.'.$role.'_'.$item.'.value;"/></td>';                        '" onblur = "javascript:colchg_span('."'css_".$role.'_'.$item."'".',this);" /></td>';
     }      }
     $datatable .= '</tr></table></td></tr>';      $datatable .= '</tr></table></td></tr>';
     $itemcount ++;      $itemcount ++;
Line 902  sub display_color_options { Line 980  sub display_color_options {
     return $datatable;      return $datatable;
 }  }
   
   sub login_header_options  {
       my ($img,$role,$defaults,$is_custom,$choices,$loginheader) = @_;
       my $image_checked = ' checked="checked" ';
       my $text_checked = ' ';
       if ($loginheader eq 'text') {
           $image_checked = ' ';
           $text_checked = ' checked="checked" ';
       }
       my $output = '<span class="LC_nobreak"><label><input type="radio" name="'.
                 'loginheader" value="image" '.$image_checked.'/>'.
                 &mt('use image').'</label>&nbsp;&nbsp;&nbsp;'.
                 '<label><input type="radio" name="loginheader" value="text"'.
                 $text_checked.'/>'.&mt('use text').'</label><br />'."\n";
       if ((!$is_custom->{'textcol'}) || (!$is_custom->{'bgcol'})) {
           $output .= &mt('Text default(s)').':<br />';
           if (!$is_custom->{'textcol'}) {
               $output .= $choices->{'textcol'}.':&nbsp;'.$defaults->{'logintext'}{'textcol'}.
                          '&nbsp;&nbsp;&nbsp;';
           }
           if (!$is_custom->{'bgcol'}) {
               $output .= $choices->{'bgcol'}.':&nbsp;'.
                          '<span id="css_'.$role.'_font" style="background-color: '.
                          $defaults->{'logintext'}{'bgcol'}.';">&nbsp;&nbsp;&nbsp;</span>';
           }
           $output .= '<br />';
       }
       $output .='<br />';
       return $output;
   }
   
   sub login_text_colors {
       my ($img,$role,$logintext,$phase,$choices,$designs) = @_;
       my $color_menu = '<table border="0"><tr>';
       foreach my $item (@{$logintext}) {
           my $link = &color_pick($phase,$role,$item,$choices->{$item},$designs->{'logintext'}{$item});
           $color_menu .= '<td align="center">'.$link;
           if ($designs->{'logintext'}{$item}) {
               $color_menu .= '&nbsp;<span id="css_'.$role.'_'.$item.'" style="background-color: '.$designs->{'logintext'}{$item}.';">&nbsp;&nbsp;&nbsp;</span>';
           }
           $color_menu .= '<br /><input type="text" size="8" name="'.$role.'_'.$item.'" value="'.
                          $designs->{'logintext'}{$item}.'" onblur = "javascript:colchg_span('."'css_".$role.'_'.$item."'".',this);" /></td>'.
                          '<td>&nbsp;</td>';
       }
       $color_menu .= '</tr></table><br />';
       return $color_menu;
   }
   
   sub image_changes {
       my ($is_custom,$alt_text,$img_import,$showfile,$fullsize,$role,$img,$imgfile,$logincolors) = @_;
       my $output;
       if (!$is_custom) {
           if ($img eq 'login') {
               $output .= &mt('Default image:').'<br />';
           } else {
               $output .= &mt('Default in use:').'<br />';
           }
       }
       if ($img_import) {
           $output .= '<input type="hidden" name="'.$role.'_import_'.$img.'" value="'.$imgfile.'" />';
       }
       $output .= '<a href="'.$fullsize.'" target="_blank"><img src="'.
                  $showfile.'" alt="'.$alt_text.'" border="0" /></a></td>';
       if ($is_custom) {
           $output .= '<td>'.$logincolors.'<span class="LC_nobreak"><label>'.
                      '<input type="checkbox" name="'.
                      $role.'_del_'.$img.'" value="1" />'.&mt('Delete?').
                      '</label>&nbsp;'.&mt('Replace:').'</span><br />';
       } else {
           $output .= '<td valign="bottom">'.$logincolors.&mt('Upload:').'<br />';
       }
       return $output;
   }
   
 sub color_pick {  sub color_pick {
     my ($phase,$role,$item,$desc,$curcol) = @_;      my ($phase,$role,$item,$desc,$curcol) = @_;
     my $link = '<a href="javascript:pjump('."'color_custom','".$desc.      my $link = '<a href="javascript:pjump('."'color_custom','".$desc.
Line 933  sub color_pick_js { Line 1084  sub color_pick_js {
             document.parmform.pres_marker.value='';              document.parmform.pres_marker.value='';
         }          }
     }      }
   
       function get_id (span_id) {
    if (document.getElementById) {
               return document.getElementById(span_id);
           }
    if (document.all) {
               return document.all[span_id];
           } 
    return false;
       }
   
       function colchg_span (span_id_str,new_color_item) {
    var span_ref = get_id(span_id_str);
    if (span_ref.style) { span_ref = span_ref.style; }
    span_ref.background = new_color_item.value;
    span_ref.backgroundColor = new_color_item.value;
    span_ref.bgColor = new_color_item.value;
       }
   
 ENDCOL  ENDCOL
     return $output;      return $output;
 }  }
Line 940  ENDCOL Line 1110  ENDCOL
 sub print_quotas {  sub print_quotas {
     my ($dom,$settings,$rowtotal) = @_;      my ($dom,$settings,$rowtotal) = @_;
     my $datatable;      my $datatable;
     my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);      my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
     my $typecount = 0;      my $typecount = 0;
     my $css_class;      my $css_class;
     if (ref($types) eq 'ARRAY') {      if (ref($types) eq 'ARRAY') {
Line 1009  sub print_autoenroll { Line 1179  sub print_autoenroll {
         }          }
     }      }
     my $domform = &Apache::loncommon::select_dom_form($defdom,'sender_domain',1);      my $domform = &Apache::loncommon::select_dom_form($defdom,'sender_domain',1);
       my $notif_sender;
       if (ref($settings) eq 'HASH') {
           $notif_sender = $settings->{'sender_uname'};
       }
     my $datatable='<tr class="LC_odd_row">'.      my $datatable='<tr class="LC_odd_row">'.
                   '<td>'.&mt('Auto-enrollment active?').'</td>'.                    '<td>'.&mt('Auto-enrollment active?').'</td>'.
                   '<td class="LC_right_item"><span class="LC_nobreak"><label>'.                    '<td class="LC_right_item"><span class="LC_nobreak"><label>'.
Line 1021  sub print_autoenroll { Line 1195  sub print_autoenroll {
                   '</td><td class="LC_right_item"><span class="LC_nobreak">'.                    '</td><td class="LC_right_item"><span class="LC_nobreak">'.
                   &mt('username').':&nbsp;'.                    &mt('username').':&nbsp;'.
                   '<input type="text" name="sender_uname" value="'.                    '<input type="text" name="sender_uname" value="'.
                   $settings->{'sender_uname'}.                    $notif_sender.'" size="10" />&nbsp;&nbsp;'.&mt('domain').
                   '" size="10" />&nbsp;&nbsp;'.&mt('domain').  
                   ':&nbsp;'.$domform.'</span></td></tr>';                    ':&nbsp;'.$domform.'</span></td></tr>';
     $$rowtotal += 2;      $$rowtotal += 2;
     return $datatable;      return $datatable;
Line 1067  sub print_autoupdate { Line 1240  sub print_autoupdate {
                   '</tr>';                    '</tr>';
         $$rowtotal += 2;          $$rowtotal += 2;
     } else {      } else {
         my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);          my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
         my @fields = ('lastname','firstname','middlename','gen',          my @fields = ('lastname','firstname','middlename','gen',
                       'permanentemail','id');                        'permanentemail','id');
         my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();          my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
Line 1127  sub print_directorysrch { Line 1300  sub print_directorysrch {
         }          }
     }      }
     my ($searchtitles,$titleorder) = &sorted_searchtitles();      my ($searchtitles,$titleorder) = &sorted_searchtitles();
     my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);      my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
   
     my $numinrow = 4;      my $numinrow = 4;
     my $cansrchrow = 0;      my $cansrchrow = 0;
Line 1165  sub print_directorysrch { Line 1338  sub print_directorysrch {
     foreach my $title (@{$titleorder}) {      foreach my $title (@{$titleorder}) {
         if (defined($searchtitles->{$title})) {          if (defined($searchtitles->{$title})) {
             my $check = ' ';              my $check = ' ';
             if (ref($settings->{'searchby'}) eq 'ARRAY') {              if (ref($settings) eq 'HASH') { 
                 if (grep(/^\Q$title\E$/,@{$settings->{'searchby'}})) {                  if (ref($settings->{'searchby'}) eq 'ARRAY') {
                     $check = ' checked="checked" ';                      if (grep(/^\Q$title\E$/,@{$settings->{'searchby'}})) {
                           $check = ' checked="checked" ';
                       }
                 }                  }
             }              }
             $datatable .= '<td class="LC_left_item">'.              $datatable .= '<td class="LC_left_item">'.
Line 1297  sub print_usercreation { Line 1472  sub print_usercreation {
     my ($position,$dom,$settings,$rowtotal) = @_;      my ($position,$dom,$settings,$rowtotal) = @_;
     my $numinrow = 4;      my $numinrow = 4;
     my $datatable;      my $datatable;
     my %lt = &Apache::lonlocal::texthash (  
                         nondc => 'User creation other than by Domain Coordinator: ',  
                         author => 'When adding a co-author/assistant author',  
                         course => 'When adding users to a course',  
     );  
     if ($position eq 'top') {      if ($position eq 'top') {
         my %checked;  
         if (ref($settings) eq 'HASH') {  
             if (ref($settings->{'cancreate'}) eq 'ARRAY') {  
                 foreach my $item (@{$settings->{'cancreate'}}) {  
                     $checked{$item} = ' checked="checked" ';  
                 }  
             }  
         }  
         $datatable = '<tr class="LC_odd_row">'.  
                      '<td><span class="LC_nobreak">'.$lt{'nondc'}.  
                      '</span></td><td class="LC_left_item"><table>';  
         foreach my $item ('author','course') {  
             $datatable .= '<tr><td><span class="LC_nobreak"><label>'.  
                           '<input type="checkbox" name="can_createuser" '.  
                           $checked{$item}.' value="'.$item.'" />'.  
                           $lt{$item}.'</label><span></td></tr>';  
         }  
         $datatable .= '</table></td></tr>';  
         $$rowtotal ++;          $$rowtotal ++;
         my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($dom,'username');  
         my $rowcount = 0;          my $rowcount = 0;
           my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($dom,'username');
         if (ref($rules) eq 'HASH') {          if (ref($rules) eq 'HASH') {
             if (keys(%{$rules}) > 0) {              if (keys(%{$rules}) > 0) {
                 $datatable .= &user_formats_row('username',$settings,$rules,                  $datatable .= &user_formats_row('username',$settings,$rules,
Line 1341  sub print_usercreation { Line 1493  sub print_usercreation {
                 $rowcount ++;                  $rowcount ++;
             }              }
         }          }
           my ($emailrules,$emailruleorder) = 
               &Apache::lonnet::inst_userrules($dom,'email');
           if (ref($emailrules) eq 'HASH') {
               if (keys(%{$emailrules}) > 0) {
                   $datatable .= &user_formats_row('email',$settings,$emailrules,
                                                   $emailruleorder,$numinrow,$rowcount);
                   $$rowtotal ++;
                   $rowcount ++;
               }
           }
           if ($rowcount == 0) {
               $datatable .= '<tr><td colspan="2">'.&mt('No format rules have been defined for usernames or IDs in this domain.').'</td></tr>';  
               $$rowtotal ++;
               $rowcount ++;
           }
       } elsif ($position eq 'middle') {
           my @creators = ('author','course','selfcreate');
           my ($rules,$ruleorder) =
               &Apache::lonnet::inst_userrules($dom,'username');
           my %lt = &usercreation_types();
           my %checked;
           if (ref($settings) eq 'HASH') {
               if (ref($settings->{'cancreate'}) eq 'HASH') {
                   foreach my $item (@creators) {
                       $checked{$item} = $settings->{'cancreate'}{$item};
                   }
               } elsif (ref($settings->{'cancreate'}) eq 'ARRAY') {
                   foreach my $item (@creators) {
                       if (grep(/^\Q$item\E$/,@{$settings->{'cancreate'}})) {
                           $checked{$item} = 'none';
                       }
                   }
               }
           }
           my $rownum = 0;
           foreach my $item (@creators) {
               $rownum ++;
               if ($checked{$item} eq '') {
                   if ($item eq 'selfcreate') {
                       $checked{$item} = 'none';
                   } else {
                       $checked{$item} = 'any';
                   }
               }
               my $css_class;
               if ($rownum%2) {
                   $css_class = '';
               } else {
                   $css_class = ' class="LC_odd_row" ';
               }
               $datatable .= '<tr'.$css_class.'>'.
                            '<td><span class="LC_nobreak">'.$lt{$item}.
                            '</span></td><td align="right">';
               my @options = ('any');
               if ($item eq 'selfcreate') {
                   push(@options,('email','login','sso'));
               } else {
                   if (ref($rules) eq 'HASH') {
                       if (keys(%{$rules}) > 0) {
                           push(@options,('official','unofficial'));
                       }
                   }
               }
               push(@options,'none');
               foreach my $option (@options) {
                   my $check = ' ';
                   if ($checked{$item} eq $option) {
                       $check = ' checked="checked" ';
                   } 
                   $datatable .= '<span class="LC_nobreak"><label>'.
                                 '<input type="radio" name="can_createuser_'.
                                 $item.'" value="'.$option.'"'.$check.'/>&nbsp;'.
                                 $lt{$option}.'</label>&nbsp;&nbsp;</span>';
               }
               $datatable .= '</td></tr>';
           }
     } 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 1357  sub print_usercreation { Line 1585  sub print_usercreation {
                     }                      }
                 }                  }
             }              }
           } else {
               foreach my $item (@contexts) {
                   foreach my $auth (@authtypes) {
                       $checked{$item}{$auth} = ' checked="checked" ';
                   }
               }
         }          }
         my @authtypes = ('int','krb4','krb5','loc');  
         my %title = &context_names();          my %title = &context_names();
         my %authname = &authtype_names();          my %authname = &authtype_names();
         my $rownum = 0;          my $rownum = 0;
Line 1393  sub user_formats_row { Line 1626  sub user_formats_row {
     my %text = (      my %text = (
                    'username' => 'new usernames',                     'username' => 'new usernames',
                    'id'       => 'IDs',                     'id'       => 'IDs',
                      'email'    => 'self-created accounts (e-mail)',
                );                 );
     my $css_class = $rowcount%2?' class="LC_odd_row"':'';      my $css_class = $rowcount%2?' class="LC_odd_row"':'';
     $output = '<tr '.$css_class.'>'.      $output = '<tr '.$css_class.'>'.
Line 1412  sub user_formats_row { Line 1646  sub user_formats_row {
                     $output .= '<tr>';                      $output .= '<tr>';
                 }                  }
                 my $check = ' ';                  my $check = ' ';
                 if (ref($settings->{$type.'_rule'}) eq 'ARRAY') {                  if (ref($settings) eq 'HASH') {
                     if (grep(/^\Q$ruleorder->[$i]\E$/,@{$settings->{$type.'_rule'}})) {                      if (ref($settings->{$type.'_rule'}) eq 'ARRAY') {
                         $check = ' checked="checked" ';                          if (grep(/^\Q$ruleorder->[$i]\E$/,@{$settings->{$type.'_rule'}})) {
                               $check = ' checked="checked" ';
                           }
                     }                      }
                 }                  }
                 $output .= '<td class="LC_left_item">'.                  $output .= '<td class="LC_left_item">'.
Line 1437  sub user_formats_row { Line 1673  sub user_formats_row {
     return $output;      return $output;
 }  }
   
   sub usercreation_types {
       my %lt = &Apache::lonlocal::texthash (
                       author     => 'When adding a co-author',
                       course     => 'When adding a user to a course',
                       selfcreate => 'User creates own account', 
                       any        => 'Any',
                       official   => 'Institutional only ',
                       unofficial => 'Non-institutional only',
                       email      => 'Email address',
                       login      => 'Institutional Login',
                       sso        => 'SSO', 
                       none       => 'None',
       );
       return %lt;
   } 
   
 sub authtype_names {  sub authtype_names {
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                       int    => 'Internal',                        int    => 'Internal',
Line 1482  sub print_usermodification { Line 1734  sub print_usermodification {
     return $datatable;      return $datatable;
 }  }
   
   sub print_defaults {
       my ($dom,$rowtotal) = @_;
       my @items = ('auth_def','auth_arg_def','lang_def');
       my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
       my $titles = &defaults_titles();
       my $rownum = 0;
       my ($datatable,$css_class);
       foreach my $item (@items) {
           if ($rownum%2) {
               $css_class = '';
           } else {
               $css_class = ' class="LC_odd_row" ';
           }
           $datatable .= '<tr'.$css_class.'>'.
                     '<td><span class="LC_nobreak">'.$titles->{$item}.
                     '</span></td><td class="LC_right_item">';
           if ($item eq 'auth_def') {
               my @authtypes = ('internal','krb4','krb5','localauth');
               my %shortauth = (
                                internal => 'int',
                                krb4 => 'krb4',
                                krb5 => 'krb5',
                                localauth  => 'loc'
                              );
               my %authnames = &authtype_names();
               foreach my $auth (@authtypes) {
                   my $checked = ' ';
                   if ($domdefaults{$item} eq $auth) {
                       $checked = ' checked="checked" ';
                   }
                   $datatable .= '<label><input type="radio" name="'.$item.
                                 '" value="'.$auth.'"'.$checked.'/>'.
                                 $authnames{$shortauth{$auth}}.'</label>&nbsp;&nbsp;';
               }
           } else {
               $datatable .= '<input type="text" name="'.$item.'" value="'.
                             $domdefaults{$item}.'" />';
           }
           $datatable .= '</td></tr>';
           $rownum ++;
       }
       $$rowtotal += $rownum;
       return $datatable;
   }
   
   sub defaults_titles {
       my %titles = &Apache::lonlocal::texthash (
                      'auth_def'      => 'Default authentication type',
                      'auth_arg_def'  => 'Default authentication argument',
                      'lang_def'      => 'Default language',
                    );
       return (\%titles);
   }
   
   
 sub modifiable_userdata_row {  sub modifiable_userdata_row {
     my ($context,$role,$settings,$numinrow,$rowcount) = @_;      my ($context,$role,$settings,$numinrow,$rowcount) = @_;
     my $rolename;      my $rolename;
Line 1599  sub users_cansearch_row { Line 1906  sub users_cansearch_row {
     return $output;      return $output;
 }  }
   
 sub sorted_inst_types {  
     my ($dom) = @_;  
     my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom);  
     my $othertitle = &mt('All users');  
     my @types;  
     if (ref($order) eq 'ARRAY') {  
         @types = @{$order};  
     }  
     if (@types == 0) {  
         if (ref($usertypes) eq 'HASH') {  
             @types = sort(keys(%{$usertypes}));  
         }  
     }  
     if (keys(%{$usertypes}) > 0) {  
         $othertitle = &mt('Other users');  
     }  
     return ($othertitle,$usertypes,\@types);  
 }  
   
 sub sorted_searchtitles {  sub sorted_searchtitles {
     my %searchtitles = &Apache::lonlocal::texthash(      my %searchtitles = &Apache::lonlocal::texthash(
                          'uname' => 'username',                           'uname' => 'username',
Line 1657  sub usertype_update_row { Line 1945  sub usertype_update_row {
                     $datatable .= '<tr>';                      $datatable .= '<tr>';
                 }                  }
                 my $check = ' ';                  my $check = ' ';
                 if (ref($settings->{'fields'}) eq 'HASH') {                  if (ref($settings) eq 'HASH') {
                     if (ref($settings->{'fields'}{$type}) eq 'ARRAY') {                      if (ref($settings->{'fields'}) eq 'HASH') {
                         if (grep(/^\Q$fields->[$i]\E$/,@{$settings->{'fields'}{$type}})) {                          if (ref($settings->{'fields'}{$type}) eq 'ARRAY') {
                             $check = ' checked="checked" ';                              if (grep(/^\Q$fields->[$i]\E$/,@{$settings->{'fields'}{$type}})) {
                                   $check = ' checked="checked" ';
                               }
                         }                          }
                     }                      }
                 }                  }
Line 1690  sub modify_login { Line 1980  sub modify_login {
     my ($r,$dom,$confname,%domconfig) = @_;      my ($r,$dom,$confname,%domconfig) = @_;
     my ($resulttext,$errors,$colchgtext,%changes,%colchanges);      my ($resulttext,$errors,$colchgtext,%changes,%colchanges);
     my %title = ( coursecatalog => 'Display course catalog',      my %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',
                     loginheader => 'Log-in box header');
     my @offon = ('off','on');      my @offon = ('off','on');
     my %loginhash;      my %loginhash;
     ($errors,%colchanges) = &modify_colors($r,$dom,$confname,['login'],      ($errors,%colchanges) = &modify_colors($r,$dom,$confname,['login'],
                                            \%domconfig,\%loginhash);                                             \%domconfig,\%loginhash);
     $loginhash{login}{coursecatalog} = $env{'form.coursecatalog'};      my @toggles = ('coursecatalog','adminmail','newuser');
     $loginhash{login}{adminmail} = $env{'form.adminmail'};      foreach my $item (@toggles) {
           $loginhash{login}{$item} = $env{'form.'.$item};
       }
       $loginhash{login}{loginheader} = $env{'form.loginheader'};
     if (ref($colchanges{'login'}) eq 'HASH') {        if (ref($colchanges{'login'}) eq 'HASH') {  
         $colchgtext = &display_colorchgs($dom,\%colchanges,['login'],          $colchgtext = &display_colorchgs($dom,\%colchanges,['login'],
                                          \%loginhash);                                           \%loginhash);
Line 1704  sub modify_login { Line 1999  sub modify_login {
     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') {
         if (($domconfig{'login'}{'coursecatalog'} eq '0') &&          my @toggles = ('coursecatalog','adminmail','newuser');
             ($env{'form.coursecatalog'} eq '1')) {          my %defaultchecked = (
             $changes{'coursecatalog'} = 1;                      'coursecatalog' => 'on',
         } elsif (($domconfig{'login'}{'coursecatalog'} eq '' ||                      'adminmail'     => 'off',
                  $domconfig{'login'}{'coursecatalog'} eq '1') &&                      'newuser'       => 'off',
                  ($env{'form.coursecatalog'} eq '0')) {          );
             $changes{'coursecatalog'} = 1;          foreach my $item (@toggles) {
         }              if ($defaultchecked{$item} eq 'on') { 
         if (($domconfig{'login'}{'adminmail'} eq '1') &&                  if (($domconfig{'login'}{$item} eq '0') &&
                 ($env{'form.adminmail'} eq '0')) {                      ($env{'form.'.$item} eq '1')) {
             $changes{'adminmail'} = 1;                      $changes{$item} = 1;
         } elsif (($domconfig{'login'}{'adminmail'} eq '' ||                  } elsif (($domconfig{'login'}{$item} eq '' ||
                  $domconfig{'login'}{'adminmail'} eq '0') &&                            $domconfig{'login'}{$item} eq '1') &&
                  ($env{'form.adminmail'} eq '1')) {                           ($env{'form.'.$item} eq '0')) {
             $changes{'adminmail'} = 1;                      $changes{$item} = 1;
                   }
               } elsif ($defaultchecked{$item} eq 'off') {
                   if (($domconfig{'login'}{$item} eq '1') &&
                       ($env{'form.'.$item} eq '0')) {
                       $changes{$item} = 1;
                   } elsif (($domconfig{'login'}{$item} eq '' ||
                             $domconfig{'login'}{$item} eq '0') &&
                            ($env{'form.'.$item} eq '1')) {
                       $changes{$item} = 1;
                   }
               }
           }
           if (($domconfig{'login'}{'loginheader'} eq 'text') && 
               ($env{'form.loginheader'} eq 'image')) {
               $changes{'loginheader'} = 1;
           } elsif (($domconfig{'login'}{'loginheader'} eq '' ||
                     $domconfig{'login'}{'loginheader'} eq 'image') &&
                    ($env{'form.loginheader'} eq 'text')) {
               $changes{'loginheader'} = 1;
         }          }
         if (keys(%changes) > 0 || $colchgtext) {          if (keys(%changes) > 0 || $colchgtext) {
               &Apache::loncommon::devalidate_domconfig_cache($dom);
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             foreach my $item (sort(keys(%changes))) {              foreach my $item (sort(keys(%changes))) {
                 $resulttext .= '<li>'.&mt("$title{$item} set to $offon[$env{'form.'.$item}]").'</li>';                  if ($item eq 'loginheader') {
                       $resulttext .= '<li>'.&mt("$title{$item} set to $env{'form.loginheader'}").'</li>';
                   } else {
                       $resulttext .= '<li>'.&mt("$title{$item} set to $offon[$env{'form.'.$item}]").'</li>';
                   }
             }              }
             $resulttext .= $colchgtext.'</ul>';              $resulttext .= $colchgtext.'</ul>';
         } else {          } else {
Line 1767  sub modify_rolecolors { Line 2086  sub modify_rolecolors {
                                              $dom);                                               $dom);
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
               &Apache::loncommon::devalidate_domconfig_cache($dom);
             $resulttext = &display_colorchgs($dom,\%changes,$roles,              $resulttext = &display_colorchgs($dom,\%changes,$roles,
                                              $rolehash{'rolecolors'});                                               $rolehash{'rolecolors'});
         } else {          } else {
Line 1788  sub modify_colors { Line 2108  sub modify_colors {
     my (%changes,%choices);      my (%changes,%choices);
     my @bgs = ('pgbg','mainbg','sidebg');      my @bgs = ('pgbg','mainbg','sidebg');
     my @links = ('link','alink','vlink');      my @links = ('link','alink','vlink');
       my @logintext;
     my @images;      my @images;
     my $servadm = $r->dir_config('lonAdmEMail');      my $servadm = $r->dir_config('lonAdmEMail');
     my $errors;      my $errors;
     foreach my $role (@{$roles}) {      foreach my $role (@{$roles}) {
         if ($role eq 'login') {          if ($role eq 'login') {
             %choices = &login_choices();              %choices = &login_choices();
               @logintext = ('textcol','bgcol');
         } else {          } else {
             %choices = &color_font_choices();              %choices = &color_font_choices();
         }          }
         if ($role eq 'login') {          if ($role eq 'login') {
             @images = ('img','logo','domlogo');              @images = ('img','logo','domlogo','login');
         } else {          } else {
             @images = ('img');              @images = ('img');
         }          }
         $confhash->{$role}{'font'} = $env{'form.'.$role.'_font'};          $confhash->{$role}{'font'} = $env{'form.'.$role.'_font'};
         foreach my $item (@bgs,@links) {          foreach my $item (@bgs,@links,@logintext) {
             $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item};              $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item};
         }          }
         my ($configuserok,$author_ok,$switchserver,%currroles);          my ($configuserok,$author_ok,$switchserver,%currroles);
Line 1817  sub modify_colors { Line 2139  sub modify_colors {
             }              }
         }          }
         my ($width,$height) = &thumb_dimensions();          my ($width,$height) = &thumb_dimensions();
           if (ref($domconfig->{$role}) ne 'HASH') {
               $domconfig->{$role} = {};
           }
         foreach my $img (@images) {          foreach my $img (@images) {
     if ( ! $env{'form.'.$role.'_'.$img.'.filename'}       if ( ! $env{'form.'.$role.'_'.$img.'.filename'} 
  && !defined($domconfig->{$role}{$img})   && !defined($domconfig->{$role}{$img})
Line 1924  sub modify_colors { Line 2249  sub modify_colors {
                         }                          }
                     }                      }
                 }                  }
                   foreach my $item (@logintext) {
                       if ($domconfig->{$role}{$item} ne '') {
                           if ($confhash->{$role}{$item} ne $domconfig->{$role}{$item}) {
                               $changes{$role}{'logintext'}{$item} = 1;
                           }
                       } else {
                           if ($confhash->{$role}{$item}) {
                               $changes{$role}{'logintext'}{$item} = 1;
                           }
                       }
                   }
             } else {              } else {
                 &default_change_checker($role,\@images,\@links,\@bgs,                  &default_change_checker($role,\@images,\@links,\@bgs,
                                         $confhash,\%changes);                                           \@logintext,$confhash,\%changes); 
             }              }
         } else {          } else {
             &default_change_checker($role,\@images,\@links,\@bgs,              &default_change_checker($role,\@images,\@links,\@bgs,
                                     $confhash,\%changes);                                       \@logintext,$confhash,\%changes); 
         }          }
     }      }
     return ($errors,%changes);      return ($errors,%changes);
 }  }
   
 sub default_change_checker {  sub default_change_checker {
     my ($role,$images,$links,$bgs,$confhash,$changes) = @_;      my ($role,$images,$links,$bgs,$logintext,$confhash,$changes) = @_;
     foreach my $item (@{$links}) {      foreach my $item (@{$links}) {
         if ($confhash->{$role}{$item}) {          if ($confhash->{$role}{$item}) {
             $changes->{$role}{'links'}{$item} = 1;              $changes->{$role}{'links'}{$item} = 1;
Line 1948  sub default_change_checker { Line 2284  sub default_change_checker {
             $changes->{$role}{'bgs'}{$item} = 1;              $changes->{$role}{'bgs'}{$item} = 1;
         }          }
     }      }
       foreach my $item (@{$logintext}) {
           if ($confhash->{$role}{$item}) {
               $changes->{$role}{'logintext'}{$item} = 1;
           }
       }
     foreach my $img (@{$images}) {      foreach my $img (@{$images}) {
         if ($env{'form.'.$role.'_del_'.$img}) {          if ($env{'form.'.$role.'_del_'.$img}) {
             $confhash->{$role}{$img} = '';              $confhash->{$role}{$img} = '';
Line 1962  sub default_change_checker { Line 2303  sub default_change_checker {
 sub display_colorchgs {  sub display_colorchgs {
     my ($dom,$changes,$roles,$confhash) = @_;      my ($dom,$changes,$roles,$confhash) = @_;
     my (%choices,$resulttext);      my (%choices,$resulttext);
     &Apache::loncommon::devalidate_domconfig_cache($dom);  
     if (!grep(/^login$/,@{$roles})) {      if (!grep(/^login$/,@{$roles})) {
         $resulttext = &mt('Changes made:').'<br />';          $resulttext = &mt('Changes made:').'<br />';
     }      }
Line 2302  END Line 2642  END
 sub modify_quotas {  sub modify_quotas {
     my ($dom,%domconfig) = @_;      my ($dom,%domconfig) = @_;
     my ($resulttext,%changes);      my ($resulttext,%changes);
     my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);      my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
     my %formhash;      my %formhash;
     foreach my $key (keys(%env)) {      foreach my $key (keys(%env)) {
         if ($key =~ /^form\.quota_(.+)$/) {          if ($key =~ /^form\.quota_(.+)$/) {
Line 2437  sub modify_autoupdate { Line 2777  sub modify_autoupdate {
                    run => 'Auto-update:',                     run => 'Auto-update:',
                    classlists => 'Updates to user information in classlists?'                     classlists => 'Updates to user information in classlists?'
                 );                  );
     my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);      my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
     my %fieldtitles = &Apache::lonlocal::texthash (      my %fieldtitles = &Apache::lonlocal::texthash (
                         id => 'Student/Employee ID',                          id => 'Student/Employee ID',
                         permanentemail => 'E-mail address',                          permanentemail => 'E-mail address',
Line 2566  sub modify_directorysrch { Line 2906  sub modify_directorysrch {
     my @cansearch = &Apache::loncommon::get_env_multiple('form.cansearch');      my @cansearch = &Apache::loncommon::get_env_multiple('form.cansearch');
     my @searchby = &Apache::loncommon::get_env_multiple('form.searchby');      my @searchby = &Apache::loncommon::get_env_multiple('form.searchby');
   
     my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);      my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
     if (keys(%{$usertypes}) == 0) {      if (keys(%{$usertypes}) == 0) {
         @cansearch = ('default');          @cansearch = ('default');
     } else {      } else {
Line 2820  sub modify_contacts { Line 3160  sub modify_contacts {
             }              }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
         } else {          } else {
             $resulttext = &mt('No changes made to contact information.');              $resulttext = &mt('No changes made to contact information');
         }          }
     } else {      } else {
         $resulttext = '<span class="LC_error">'.          $resulttext = '<span class="LC_error">'.
Line 2831  sub modify_contacts { Line 3171  sub modify_contacts {
   
 sub modify_usercreation {  sub modify_usercreation {
     my ($dom,%domconfig) = @_;      my ($dom,%domconfig) = @_;
     my ($resulttext,%curr_usercreation,%changes,%authallowed);      my ($resulttext,%curr_usercreation,%changes,%authallowed,%cancreate);
       my $warningmsg;
     if (ref($domconfig{'usercreation'}) eq 'HASH') {      if (ref($domconfig{'usercreation'}) eq 'HASH') {
         foreach my $key (keys(%{$domconfig{'usercreation'}})) {          foreach my $key (keys(%{$domconfig{'usercreation'}})) {
             $curr_usercreation{$key} = $domconfig{'usercreation'}{$key};              $curr_usercreation{$key} = $domconfig{'usercreation'}{$key};
         }          }
     }      }
     my %title = &Apache::lonlocal::texthash (  
                    author => 'adding co-authors/assistant authors',  
                    course => 'adding users to a course',  
                 );  
     my @username_rule = &Apache::loncommon::get_env_multiple('form.username_rule');      my @username_rule = &Apache::loncommon::get_env_multiple('form.username_rule');
     my @id_rule = &Apache::loncommon::get_env_multiple('form.id_rule');      my @id_rule = &Apache::loncommon::get_env_multiple('form.id_rule');
     my @cancreate = &Apache::loncommon::get_env_multiple('form.can_createuser');      my @email_rule = &Apache::loncommon::get_env_multiple('form.email_rule');
     if (ref($curr_usercreation{'cancreate'}) eq 'ARRAY') {      my @contexts = ('author','course','selfcreate');
         foreach my $type (@{$curr_usercreation{'cancreate'}}) {      foreach my $item(@contexts) {
             if (!grep(/^\Q$type\E$/,@cancreate)) {          $cancreate{$item} = $env{'form.can_createuser_'.$item};
                 push(@{$changes{'cancreate'}},$type);          if ($item eq 'selfcreate') {
               my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
               if (!((($domdefaults{'auth_def'} =~/^krb/) && ($domdefaults{'auth_arg_def'} ne '')) || ($domdefaults{'auth_def'} eq 'localauth'))) {
                   if (($cancreate{$item} eq 'any') || ($cancreate{$item} eq 'login')) {
                       $warningmsg = &mt('Although account creation has been set to be available for institutional logins, currently default authentication in this domain has not been set to support this.').' '.&mt('You need to set the default authentication type to Kerberos 4 or 5 (with a Kerberos domain specified), or to Local authentication, if the localauth module has been customized in your domain to authenticate institutional logins.');   
                   }
             }              }
         }          }
         foreach my $type (@cancreate) {      }
             if (!grep(/^\Q$type\E$/,@{$curr_usercreation{'cancreate'}})) {      if (ref($curr_usercreation{'cancreate'}) eq 'HASH') {
                 push(@{$changes{'cancreate'}},$type);          foreach my $item (@contexts) {
               if ($curr_usercreation{'cancreate'}{$item} ne $cancreate{$item}) {
                   push(@{$changes{'cancreate'}},$item);
               } 
           }
       } elsif (ref($curr_usercreation{'cancreate'}) eq 'ARRAY') {
           foreach my $item (@contexts) {
               if (!grep(/^\Q$item\E$/,@{$curr_usercreation{'cancreate'}})) {
                   if ($cancreate{$item} ne 'any') {
                       push(@{$changes{'cancreate'}},$item);
                   }
               } else {
                   if ($cancreate{$item} ne 'none') {
                       push(@{$changes{'cancreate'}},$item);
                   }
             }              }
         }          }
     } else {      } else {
         push(@{$changes{'cancreate'}},@cancreate);          foreach my $item (@contexts)  {
               push(@{$changes{'cancreate'}},$item);
           }
     }      }
   
     if (ref($curr_usercreation{'username_rule'}) eq 'ARRAY') {      if (ref($curr_usercreation{'username_rule'}) eq 'ARRAY') {
         foreach my $type (@{$curr_usercreation{'username_rule'}}) {          foreach my $type (@{$curr_usercreation{'username_rule'}}) {
             if (!grep(/^\Q$type\E$/,@username_rule)) {              if (!grep(/^\Q$type\E$/,@username_rule)) {
Line 2888  sub modify_usercreation { Line 3247  sub modify_usercreation {
         push(@{$changes{'id_rule'}},@id_rule);          push(@{$changes{'id_rule'}},@id_rule);
     }      }
   
     my @contexts = ('author','course','domain');      if (ref($curr_usercreation{'email_rule'}) eq 'ARRAY') {
           foreach my $type (@{$curr_usercreation{'email_rule'}}) {
               if (!grep(/^\Q$type\E$/,@email_rule)) {
                   push(@{$changes{'email_rule'}},$type);
               }
           }
           foreach my $type (@email_rule) {
               if (!grep(/^\Q$type\E$/,@{$curr_usercreation{'email_rule'}})) {
                   push(@{$changes{'email_rule'}},$type);
               }
           }
       } else {
           push(@{$changes{'email_rule'}},@email_rule);
       }
   
       my @authen_contexts = ('author','course','domain');
     my @authtypes = ('int','krb4','krb5','loc');      my @authtypes = ('int','krb4','krb5','loc');
     my %authhash;      my %authhash;
     foreach my $item (@contexts) {      foreach my $item (@authen_contexts) {
         my @authallowed =  &Apache::loncommon::get_env_multiple('form.'.$item.'_auth');          my @authallowed =  &Apache::loncommon::get_env_multiple('form.'.$item.'_auth');
         foreach my $auth (@authtypes) {          foreach my $auth (@authtypes) {
             if (grep(/^\Q$auth\E$/,@authallowed)) {              if (grep(/^\Q$auth\E$/,@authallowed)) {
Line 2902  sub modify_usercreation { Line 3276  sub modify_usercreation {
         }          }
     }      }
     if (ref($curr_usercreation{'authtypes'}) eq 'HASH') {      if (ref($curr_usercreation{'authtypes'}) eq 'HASH') {
         foreach my $item (@contexts) {          foreach my $item (@authen_contexts) {
             if (ref($curr_usercreation{'authtypes'}{$item}) eq 'HASH') {              if (ref($curr_usercreation{'authtypes'}{$item}) eq 'HASH') {
                 foreach my $auth (@authtypes) {                  foreach my $auth (@authtypes) {
                     if ($authhash{$item}{$auth} ne $curr_usercreation{'authtypes'}{$item}{$auth}) {                      if ($authhash{$item}{$auth} ne $curr_usercreation{'authtypes'}{$item}{$auth}) {
Line 2913  sub modify_usercreation { Line 3287  sub modify_usercreation {
             }              }
         }          }
     } else {      } else {
         foreach my $item (@contexts) {          foreach my $item (@authen_contexts) {
             push(@{$changes{'authtypes'}},$item);              push(@{$changes{'authtypes'}},$item);
         }          }
     }      }
   
     my %usercreation_hash =  (      my %usercreation_hash =  (
             usercreation => {              usercreation => {
                               cancreate     => \@cancreate,                                cancreate     => \%cancreate,
                               username_rule => \@username_rule,                                username_rule => \@username_rule,
                               id_rule       => \@id_rule,                                id_rule       => \@id_rule,
                                 email_rule    => \@email_rule,
                               authtypes     => \%authhash,                                authtypes     => \%authhash,
                             }                              }
             );              );
Line 2933  sub modify_usercreation { Line 3308  sub modify_usercreation {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             if (ref($changes{'cancreate'}) eq 'ARRAY') {              if (ref($changes{'cancreate'}) eq 'ARRAY') {
                 my $chgtext = '<ul>';                  my %lt = &usercreation_types();
                 foreach my $type (@cancreate) {                  foreach my $type (@{$changes{'cancreate'}}) {
                     $chgtext .= '<li>'.$title{$type}.'</li>';                      my $chgtext =  $lt{$type}.', ';
                 }                      if ($type eq 'selfcreate') {
                 $chgtext .= '</ul>';                          if ($cancreate{$type} eq 'none') {
                 if (@cancreate > 0) {                              $chgtext .= &mt('creation of a new user account is not permitted.');
                     $resulttext .= '<li>'.&mt('Creation of new users is permitted by a Domain Coordinator, and also by other users when: ').$chgtext.'</li>';                          } elsif ($cancreate{$type} eq 'any') {
                 } else {                              $chgtext .= &mt('creation of a new account is permitted for users authenticated by institutional log-in and SSO, and also for e-mail addresses used as usernames.');
                     $resulttext .= '<li>'.&mt("Creation of new users is now only allowed when the user's role is Domain Coordinator.").'</li>';                          } elsif ($cancreate{$type} eq 'login') {
                               $chgtext .= &mt('creation of a new account is only permitted for users authenticated by institutional log-in.');
                           } elsif ($cancreate{$type} eq 'sso') {
                               $chgtext .= &mt('creation of a new account is only permitted for users authenticated by institutional single sign on.');
                           } elsif ($cancreate{$type} eq 'email') {
                               $chgtext .= &mt('creation of a new account is only permitted for users who provide a valid e-mail address for use as the username.');
                           }
                       } else {
                           if ($cancreate{$type} eq 'none') {
                               $chgtext .= &mt('creation of new users is not permitted, except by a Domain Coordinator.');
                           } elsif ($cancreate{$type} eq 'any') {
                               $chgtext .= &mt('creation of new users is permitted for both institutional and non-institutional usernames.');
                           } elsif ($cancreate{$type} eq 'official') {
                               $chgtext .= &mt('creation of new users is only permitted for institutional usernames.');
                           } elsif ($cancreate{$type} eq 'unofficial') {
                               $chgtext .= &mt('creation of new users is only permitted for non-institutional usernames.');
                           }
                       }
                       $resulttext .= '<li>'.$chgtext.'</li>';
                 }                  }
             }              }
             if (ref($changes{'username_rule'}) eq 'ARRAY') {              if (ref($changes{'username_rule'}) eq 'ARRAY') {
Line 2976  sub modify_usercreation { Line 3369  sub modify_usercreation {
                     $resulttext .= '<li>'.&mt('There are now no ID formats restricted to verified users in the institutional directory.').'</li>';                      $resulttext .= '<li>'.&mt('There are now no ID formats restricted to verified users in the institutional directory.').'</li>';
                 }                  }
             }              }
               if (ref($changes{'email_rule'}) eq 'ARRAY') {
                   my ($emailrules,$emailruleorder) =
                       &Apache::lonnet::inst_userrules($dom,'email');
                   my $chgtext = '<ul>';
                   foreach my $type (@email_rule) {
                       if (ref($emailrules->{$type}) eq 'HASH') {
                           $chgtext .= '<li>'.$emailrules->{$type}{'name'}.'</li>';
                       }
                   }
                   $chgtext .= '</ul>';
                   if (@email_rule > 0) {
                       $resulttext .= '<li>'.&mt('Accounts may not be created by users self-enrolling with e-mail addresses of the following types: ').$chgtext.'</li>';
                   } else {
                       $resulttext .= '<li>'.&mt('There are now no restrictions on e-mail addresses which may be used as a username when self-enrolling.').'</li>';
                   }
               }
   
             my %authname = &authtype_names();              my %authname = &authtype_names();
             my %context_title = &context_names();              my %context_title = &context_names();
             if (ref($changes{'authtypes'}) eq 'ARRAY') {              if (ref($changes{'authtypes'}) eq 'ARRAY') {
Line 2988  sub modify_usercreation { Line 3398  sub modify_usercreation {
                             push(@allowed,$authname{$auth});                              push(@allowed,$authname{$auth});
                         }                          }
                     }                      }
                     $chgtext .= join(', ',@allowed).'</li>';                      if (@allowed > 0) {
                           $chgtext .= join(', ',@allowed).'</li>';
                       } else {
                           $chgtext .= &mt('none').'</li>';
                       }
                 }                  }
                 $chgtext .= '</ul>';                  $chgtext .= '</ul>';
                 $resulttext .= '<li>'.&mt('Authentication types available for assignment to new users').'<br />'.$chgtext;                  $resulttext .= '<li>'.&mt('Authentication types available for assignment to new users').'<br />'.$chgtext;
Line 3002  sub modify_usercreation { Line 3416  sub modify_usercreation {
         $resulttext = '<span class="LC_error">'.          $resulttext = '<span class="LC_error">'.
             &mt('An error occurred: [_1]',$putresult).'</span>';              &mt('An error occurred: [_1]',$putresult).'</span>';
     }      }
       if ($warningmsg ne '') {
           $resulttext .= '<br /><span class="LC_warning">'.$warningmsg.'</span><br />';
       }
     return $resulttext;      return $resulttext;
 }  }
   
Line 3104  sub modify_usermodification { Line 3521  sub modify_usermodification {
     }      }
     return $resulttext;      return $resulttext;
 }  }
   
   sub modify_defaults {
       my ($dom,$r) = @_;
       my ($resulttext,$mailmsgtxt,%newvalues,%changes,@errors);
       my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
       my @items = ('auth_def','auth_arg_def','lang_def');
       my @authtypes = ('internal','krb4','krb5','localauth');
       foreach my $item (@items) {
           $newvalues{$item} = $env{'form.'.$item};
           if ($item eq 'auth_def') {
               if ($newvalues{$item} ne '') {
                   if (!grep(/^\Q$newvalues{$item}\E$/,@authtypes)) {
                       push(@errors,$item);
                   }
               }
           } elsif ($item eq 'lang_def') {
               if ($newvalues{$item} ne '') {
                   if ($newvalues{$item} =~ /^(\w+)/) {
                       my $langcode = $1;
                       if (code2language($langcode) eq '') {
                           push(@errors,$item);
                       }
                   } else {
                       push(@errors,$item);
                   }
               }
           }
           if (grep(/^\Q$item\E$/,@errors)) {
               $newvalues{$item} = $domdefaults{$item};
           } elsif ($domdefaults{$item} ne $newvalues{$item}) {
               $changes{$item} = 1;
           }
       }
       my %defaults_hash = (
                            defaults => { auth_def => $newvalues{'auth_def'},
                                          auth_arg_def => $newvalues{'auth_arg_def'},
                                          lang_def => $newvalues{'lang_def'},
                                        }
                          );
       my $title = &defaults_titles();
       my $putresult = &Apache::lonnet::put_dom('configuration',\%defaults_hash,
                                                $dom);
       if ($putresult eq 'ok') {
           if (keys(%changes) > 0) {
               $resulttext = &mt('Changes made:').'<ul>';
               my $version = $r->dir_config('lonVersion');
               my $mailmsgtext = "Changes made to domain settings in a LON-CAPA installation - domain: $dom (running version: $version) - dns_domain.tab needs to be updated with the following changes, to support legacy 2.4, 2.5 and 2.6 versions of LON-CAPA.\n\n";
               foreach my $item (sort(keys(%changes))) {
                   my $value = $env{'form.'.$item};
                   if ($value eq '') {
                       $value = &mt('none');
                   } elsif ($item eq 'auth_def') {
                       my %authnames = &authtype_names();
                       my %shortauth = (
                                internal => 'int',
                                krb4 => 'krb4',
                                krb5 => 'krb5',
                                localauth  => 'loc',
                       );
                       $value = $authnames{$shortauth{$value}};
                   }
                   $resulttext .= '<li>'.&mt('[_1] set to "[_2]"',$title->{$item},$value).'</li>';
                   $mailmsgtext .= "$title->{$item} set to $value\n";  
               }
               $resulttext .= '</ul>';
               $mailmsgtext .= "\n";
               my $cachetime = 24*60*60;
               &Apache::lonnet::do_cache_new('domdefaults',$dom,
                                             $defaults_hash{'defaults'},$cachetime);
               my $sysmail = $r->dir_config('lonSysEMail');
               &Apache::lonmsg::sendemail($sysmail,"LON-CAPA Domain Settings Change - $dom",$mailmsgtext);
           } else {
               $resulttext = &mt('No changes made to default authentication/language settings');
           }
       } else {
           $resulttext = '<span class="LC_error">'.
               &mt('An error occurred: [_1]',$putresult).'</span>';
       }
       if (@errors > 0) {
           $resulttext .= '<br />'.&mt('The following were left unchanged because the values entered were invalid:');
           foreach my $item (@errors) {
               $resulttext .= ' "'.$title->{$item}.'",';
           }
           $resulttext =~ s/,$//;
       }
       return $resulttext;
   }
   
 1;  1;

Removed from v.1.33  
changed lines
  Added in v.1.45


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