Diff for /loncom/interface/domainprefs.pm between versions 1.24 and 1.30

version 1.24, 2007/07/28 21:23:53 version 1.30, 2007/09/26 12:42:32
Line 61  sub handler { Line 61  sub handler {
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                             ['phase']);                                              ['phase']);
     my $phase = "display";      my $phase = 'pickactions';
     if ( exists($env{'form.phase'}) ) {      if ( exists($env{'form.phase'}) ) {
         $phase = $env{'form.phase'};          $phase = $env{'form.phase'};
     }      }
     my %domconfig =      my %domconfig =
       &Apache::lonnet::get_dom('configuration',['login','rolecolors',        &Apache::lonnet::get_dom('configuration',['login','rolecolors',
                 'quotas','autoenroll','autoupdate','directorysrch'],$dom);                  'quotas','autoenroll','autoupdate','directorysrch',
     my @prefs = (                  'usercreation','contacts'],$dom);
       { text => 'Default color schemes',      my @prefs_order = ('rolecolors','login','quotas','autoenroll',
         help => 'Default_Color_Schemes',                         'autoupdate','directorysrch','contacts',
         action => 'rolecolors',                         'usercreation');
         header => [{col1 => 'Student Settings',      my %prefs = (
                     col2 => '',},          'rolecolors' =>
                    {col1 => 'Coordinator Settings',                     { text => 'Default color schemes',
                     col2 => '',},                       help => 'Default_Color_Schemes',
                    {col1 => 'Author Settings',                       header => [{col1 => 'Student Settings',
                     col2 => '',},                                   col2 => '',},
                    {col1 => 'Administrator Settings',                                  {col1 => 'Coordinator Settings',
                     col2 => '',}],                                   col2 => '',},
         },                                  {col1 => 'Author Settings',
       { text => 'Log-in page options',                                   col2 => '',},
         help => 'Domain_Log-in_Page',                                  {col1 => 'Administrator Settings',
         action => 'login',                                   col2 => '',}],
         header => [{col1 => 'Item',                      },
                     col2 => '',}],          'login' =>  
         },                      { text => 'Log-in page options',
       { text => 'Default quotas for user portfolios',                        help => 'Domain_Log-in_Page',
         help => 'Default_User_Quota',                        header => [{col1 => 'Item',
         action => 'quotas',                                    col2 => '',}],
         header => [{col1 => 'User type',                      },
                     col2 => 'Default quota'}],          'quotas' => 
         },                      { text => 'Default quotas for user portfolios',
       { text => 'Auto-enrollment settings',                        help => 'Default_User_Quota',
         help => 'Domain_Auto_Enrollment',                        header => [{col1 => 'User type',
         action => 'autoenroll',                                    col2 => 'Default quota'}],
         header => [{col1 => 'Configuration setting',                      },
                     col2 => 'Value(s)'}],          'autoenroll' =>
         },                     { text => 'Auto-enrollment settings',
       { text => 'Auto-update settings',                       help => 'Domain_Auto_Enrollment',
         help => 'Domain_Auto_Update',                       header => [{col1 => 'Configuration setting',
         action => 'autoupdate',                                   col2 => 'Value(s)'}],
         header => [{col1 => 'Setting',                     },
                     col2 => 'Value',},          'autoupdate' => 
                    {col1 => 'User Population',                     { text => 'Auto-update settings',
                     col2 => 'Updataeable user data'}],                       help => 'Domain_Auto_Update',
         },                       header => [{col1 => 'Setting',
       { text => 'Institutional directory searches',                                   col2 => 'Value',},
         help => 'Domain_Directory_Search',                                  {col1 => 'User Population',
         action => 'directorysrch',                                   col2 => 'Updataeable user data'}],
         header => [{col1 => 'Setting',                    },
                     col2 => 'Value',}],          'directorysrch' => 
         },                    { text => 'Institutional directory searches',
                       help => 'Domain_Directory_Search',
                       header => [{col1 => 'Setting',
                                   col2 => 'Value',}],
                     },
           'contacts' =>
                     { text => 'Contact Information',
                       help => 'Domain_Contact_Information',
                       header => [{col1 => 'Setting',
                                   col2 => 'Value',}],
                     },
   
           'usercreation' => 
                     { text => 'User creation',
                       help => 'Domain_User_Creation',
                       header => [{col1 => 'Setting',
                                   col2 => 'Value',},
                                  {col1 => 'Context',
                                   col2 => 'Assignable Authentication Types'}],
                     },
     );      );
     my @roles = ('student','coordinator','author','admin');      my @roles = ('student','coordinator','author','admin');
       my @actions = &Apache::loncommon::get_env_multiple('form.actions');
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
     ({href=>"javascript:changePage(document.$phase,'display')",      ({href=>"javascript:changePage(document.$phase,'pickactions')",
       text=>"Domain Configuration"});        text=>"Pick functionality"});
     my $confname = $dom.'-domainconfig';      my $confname = $dom.'-domainconfig';
     if ($phase eq 'process') {      if ($phase eq 'process') {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
           ({href=>"javascript:changePage(document.$phase,'$phase')",            ({href=>"javascript:changePage(document.$phase,'display')",
               text=>"Domain Configuration"},
              {href=>"javascript:changePage(document.$phase,'$phase')",
             text=>"Updated"});              text=>"Updated"});
         &print_header($r,$phase);          &print_header($r,$phase);
         foreach my $item (@prefs) {          foreach my $item (@prefs_order) {
             $r->print('<h3>'.&mt($item->{'text'}).'</h3>'.              if (grep(/^\Q$item\E$/,@actions)) {
                       &process_changes($r,$dom,$confname,                  $r->print('<h3>'.&mt($prefs{$item}{'text'}).'</h3>'.
                         $item->{'action'},\@roles,%domconfig));                            &process_changes($r,$dom,$confname,$item,
                             \@roles,%domconfig));
               }
         }          }
         $r->print('<p>');          $r->print('<p>');
         &print_footer($r,$phase,'display','Back to actions menu');          &print_footer($r,$phase,'display','Back to configuration display',
                         \@actions);
         $r->print('</p>');          $r->print('</p>');
       } elsif ($phase eq 'display') {
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>"javascript:changePage(document.$phase,'display')",
                 text=>"Domain Configuration"});
           &print_header($r,$phase);
           if (@actions > 0) {
               my $rowsum = 0;
               my (%output,%rowtotal,@items);
               my $halfway = @actions/2;
               foreach my $item (@prefs_order) {
                   if (grep(/^\Q$item\E$/,@actions)) {
                       push(@items,$item);
                       ($output{$item},$rowtotal{$item}) = 
                           &print_config_box($r,$dom,$confname,$phase,
                                             $item,$prefs{$item},
                                             $domconfig{$item});
                       $rowsum += $rowtotal{$item};
                   }
               }
               my $colend;
               my $halfway = $rowsum/2;
               my $aggregate = 0;
               my $sumleft = 0;
               my $sumright = 0;
               my $crossover;
               for (my $i=0; $i<@items; $i++) {
                   $aggregate += $rowtotal{$items[$i]};
                   if ($aggregate > $halfway) {
                       $crossover = $i;
                       last;
                   }
               }
               for (my $i=0; $i<$crossover; $i++) {
                   $sumleft += $rowtotal{$items[$i]}; 
               }
               for (my $i=$crossover+1; $i<@items; $i++) {
                   $sumright += $rowtotal{$items[$i]};
               }
               if ((@items > 1) && ($env{'form.numcols'} == 2)) {
                   my $sumdiff = $sumright - $sumleft;
                   if ($sumdiff > 0) {
                       $colend = $crossover + 1;
                   } else {
                       $colend = $crossover;
                   }
               } else {
                   $colend = @items;
               }
               $r->print('<p><table class="LC_double_column"><tr><td class="LC_left_col">');
               for (my $i=0; $i<$colend; $i++) {
                   $r->print($output{$items[$i]});
               }
               $r->print('</td><td></td><td class="LC_right_col">');
               if ($colend < @items) {
                   for (my $i=$colend; $i<@items; $i++) { 
                       $r->print($output{$items[$i]});
                   }
               }
               $r->print('</td></tr></table></p>');
               $r->print(&print_footer($r,$phase,'process','Save',\@actions));
           } else {
               $r->print('<input type="hidden" name="phase" value="" />'.
                         '<input type="hidden" name="numcols" value="'.
                         $env{'form.numcols'}.'" />'."\n".
                         '<span clas="LC_error">'.&mt('No settings chosen').
                         '</span>');
           }
           $r->print('</form>');
           $r->print(&Apache::loncommon::end_page());
     } else {      } else {
         if ($phase eq '') {          if ($phase eq '') {
             $phase = 'display';              $phase = 'pickactions';
         }          }
         my %helphash;             my %helphash;
         my $numprefs = @prefs;  
         &print_header($r,$phase);          &print_header($r,$phase);
         if (keys(%domconfig) == 0) {          if (keys(%domconfig) == 0) {
             my $primarylibserv = &Apache::lonnet::domain($dom,'primary');              my $primarylibserv = &Apache::lonnet::domain($dom,'primary');
             my $perlvarref = &LONCAPA::Configuration::read_conf('loncapa.conf');              my @ids=&Apache::lonnet::current_machine_ids();
             my $hostid = $perlvarref->{'lonHostID'};              if (!grep(/^\Q$primarylibserv\E$/,@ids)) {
             if ($hostid ne $primarylibserv) {  
                 my %designhash = &Apache::loncommon::get_domainconf($dom);                  my %designhash = &Apache::loncommon::get_domainconf($dom);
                 my @loginimages = ('img','logo','domlogo');                  my @loginimages = ('img','logo','domlogo');
                 my $custom_img_count = 0;                  my $custom_img_count = 0;
Line 159  sub handler { Line 251  sub handler {
                 }                  }
                 if ($custom_img_count > 0) {                  if ($custom_img_count > 0) {
                     my $switch_server = &check_switchserver($dom,$confname);                      my $switch_server = &check_switchserver($dom,$confname);
                     $r->print(&mt('Domain configuration settings have yet to be saved for this domain via the web-based domain preferences interface.').'<br />'.&mt("While this remains so, you must switch to the domain's primary library server in order to update settings.").'<br /><br />'.&mt("Thereafter, you will be able to update settings from this screen when logged in to any server in the LON-CAPA network (with a DC role selected in the domain), although you will still need to switch to the domain's primary library server to upload new images or logos.").'<br /><br />'.$switch_server.' '.&mt('to primary library server for domain: [_1]',$dom));                      $r->print(
       &mt('Domain configuration settings have yet to be saved for this domain via the web-based domain preferences interface.').'<br />'.
       &mt("While this remains so, you must switch to the domain's primary library server in order to update settings.").'<br /><br />'.
       &mt("Thereafter, (with a Domain Coordinator role selected in the domain) you will be able to update settings when logged in to any server in the LON-CAPA network.").'<br />'.
       &mt("However, you will still need to switch to the domain's primary library server to upload new images or logos.").'<br /><br />');
                       if ($switch_server) {
                           $r->print($switch_server.' '.&mt('to primary library server for domain: [_1]',$dom));
                       }
                     return OK;                      return OK;
                 }                  }
             }              }
         }          }
         $r->print('<table border="0" width="100%" cellpadding="2" cellspacing="4"><tr><td align="left" valign="top" width="45%">');          $r->print('<h3>'.&mt('Functionality to display/modify').'</h3>');
         foreach my $item (@prefs) {          $r->print('<script type="text/javascript">'."\n".
             if ($item->{'action'} eq 'login') {                &Apache::loncommon::check_uncheck_jscript()."\n".
                 $r->print('</td><td width="6%">&nbsp;</td><td align="left" valign="top" width="47%">');                '</script>'."\n".'<p><input type="button" value="check all" '.
             }                'onclick="javascript:checkAll(document.pickactions.actions)"'.
             &print_config_box($r,$dom,$confname,$phase,$item->{'action'},                ' />&nbsp;&nbsp;'.
                               $item,$domconfig{$item->{'action'}});                '<input type="button" value="uncheck all" '.
         }                'onclick="javascript:uncheckAll(document.pickactions.actions)"'.
         $r->print('                ' /></p>');
       </td>          foreach my $item (@prefs_order) {
     </tr>              $r->print('<p><label><input type="checkbox" name="actions" value="'.$item.'" />&nbsp;'.$prefs{$item}->{'text'}.'</label></p>');
    </table>');          }
         &print_footer($r,$phase,'process','Save changes');          $r->print('<h3>'.&mt('Display options').'</h3>'."\n".
                     '<p><span class="LC_nobreak">'.&mt('Display using: ')."\n".
                     '<label><input type="radio" name="numcols" value="1">'.
                     &mt('one column').'</label>&nbsp;&nbsp;'.
                     '<input type="radio" name="numcols" value="2">'.
                     &mt('two columns').'</label></span></p>');
           $r->print(&print_footer($r,$phase,'display','Go'));
           $r->print('</form>');
           $r->print(&Apache::loncommon::end_page());
     }      }
     return OK;      return OK;
 }  }
Line 197  sub process_changes { Line 304  sub process_changes {
         $output = &modify_autoupdate($dom,%domconfig);          $output = &modify_autoupdate($dom,%domconfig);
     } elsif ($action eq 'directorysrch') {      } elsif ($action eq 'directorysrch') {
         $output = &modify_directorysrch($dom,%domconfig);          $output = &modify_directorysrch($dom,%domconfig);
       } elsif ($action eq 'usercreation') {
           $output = &modify_usercreation($dom,%domconfig);
       } elsif ($action eq 'contacts') {
           $output = &modify_contacts($dom,%domconfig);
     }      }
     return $output;      return $output;
 }  }
   
 sub print_config_box {  sub print_config_box {
     my ($r,$dom,$confname,$phase,$action,$item,$settings) = @_;      my ($r,$dom,$confname,$phase,$action,$item,$settings) = @_;
     $r->print('      my $rowtotal = 0;
          <table class="LC_nested_outer">      my $output = 
            '<table class="LC_nested_outer">
           <tr>            <tr>
            <th>'.&mt($item->{text}).'&nbsp;</th></tr>');             <th align="left"><span class="LC_nobreak">'.&mt($item->{text}).
              '&nbsp;</span></th></tr>';
 #   # 
 # FIXME - put the help link back in when the help files exist  # FIXME - put the help link back in when the help files exist
 #           <th>'.&mt($item->{text}).'&nbsp;'.  #           <th>'.&mt($item->{text}).'&nbsp;'.
 #           &Apache::loncommon::help_open_topic($item->{'help'}).'</th>  #           &Apache::loncommon::help_open_topic($item->{'help'}).'</th>
 #          </tr>');  #          </tr>');
     if (($action eq 'autoupdate') || ($action eq 'rolecolors')) {      $rowtotal ++;
       if (($action eq 'autoupdate') || ($action eq 'rolecolors') || 
           ($action eq 'usercreation')) {
         my $colspan = ($action eq 'rolecolors')?' colspan="2"':'';          my $colspan = ($action eq 'rolecolors')?' colspan="2"':'';
         $r->print('          $output .= '
           <tr>            <tr>
            <td>             <td>
             <table class="LC_nested">              <table class="LC_nested">
              <tr class="LC_info_row">               <tr class="LC_info_row">
               <td class="LC_left_item"'.$colspan.'>'.$item->{'header'}->[0]->{'col1'}.'</td>                <td class="LC_left_item"'.$colspan.'>'.$item->{'header'}->[0]->{'col1'}.'</td>
               <td class="LC_right_item">'.$item->{'header'}->[0]->{'col2'}.'</td>                <td class="LC_right_item">'.$item->{'header'}->[0]->{'col2'}.'</td>
              </tr>');               </tr>';
                $rowtotal ++;
         if ($action eq 'autoupdate') {          if ($action eq 'autoupdate') {
             $r->print(&print_autoupdate('top',$dom,$settings));              $output .= &print_autoupdate('top',$dom,$settings,\$rowtotal);
           } elsif ($action eq 'usercreation') {
               $output .= &print_usercreation('top',$dom,$settings,\$rowtotal); 
         } else {          } else {
             $r->print(&print_rolecolors($phase,'student',$dom,$confname,$settings));              $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal);
         }          }
         $r->print('          $output .= '
            </table>             </table>
           </td>            </td>
          </tr>           </tr>
Line 237  sub print_config_box { Line 355  sub print_config_box {
              <tr class="LC_info_row">               <tr class="LC_info_row">
               <td class="LC_left_item"'.$colspan.'>'.$item->{'header'}->[1]->{'col1'}.'</td>                <td class="LC_left_item"'.$colspan.'>'.$item->{'header'}->[1]->{'col1'}.'</td>
               <td class="LC_right_item">'.$item->{'header'}->[1]->{'col2'}.'</td>                <td class="LC_right_item">'.$item->{'header'}->[1]->{'col2'}.'</td>
              </tr>');               </tr>';
               $rowtotal ++;
         if ($action eq 'autoupdate') {          if ($action eq 'autoupdate') {
             $r->print(&print_autoupdate('bottom',$dom,$settings));              $output .= &print_autoupdate('bottom',$dom,$settings,\$rowtotal);
           } elsif ($action eq 'usercreation') {
               $output .= &print_usercreation('bottom',$dom,$settings,\$rowtotal);
         } else {          } else {
             $r->print(&print_rolecolors($phase,'coordinator',$dom,$confname,$settings).'              $output .= &print_rolecolors($phase,'coordinator',$dom,$confname,$settings,\$rowtotal).'
            </table>             </table>
           </td>            </td>
          </tr>           </tr>
Line 252  sub print_config_box { Line 373  sub print_config_box {
               <td class="LC_left_item"'.$colspan.'>'.$item->{'header'}->[2]->{'col1'}.'</td>                <td class="LC_left_item"'.$colspan.'>'.$item->{'header'}->[2]->{'col1'}.'</td>
               <td class="LC_right_item">'.$item->{'header'}->[2]->{'col2'}.'</td>                <td class="LC_right_item">'.$item->{'header'}->[2]->{'col2'}.'</td>
              </tr>'.               </tr>'.
             &print_rolecolors($phase,'author',$dom,$confname,$settings).'              &print_rolecolors($phase,'author',$dom,$confname,$settings,\$rowtotal).'
            </table>             </table>
           </td>            </td>
          </tr>           </tr>
Line 263  sub print_config_box { Line 384  sub print_config_box {
               <td class="LC_left_item"'.$colspan.'>'.$item->{'header'}->[3]->{'col1'}.'</td>                <td class="LC_left_item"'.$colspan.'>'.$item->{'header'}->[3]->{'col1'}.'</td>
               <td class="LC_right_item">'.$item->{'header'}->[3]->{'col2'}.'</td>                <td class="LC_right_item">'.$item->{'header'}->[3]->{'col2'}.'</td>
              </tr>'.               </tr>'.
             &print_rolecolors($phase,'admin',$dom,$confname,$settings));              &print_rolecolors($phase,'admin',$dom,$confname,$settings,\$rowtotal);
               $rowtotal += 2;
         }          }
     } else {      } else {
         $r->print('          $output .= '
           <tr>            <tr>
            <td>             <td>
             <table class="LC_nested">              <table class="LC_nested">
              <tr class="LC_info_row">');               <tr class="LC_info_row">';
         if (($action eq 'login') || ($action eq 'directorysrch')) {          if (($action eq 'login') || ($action eq 'directorysrch')) {
             $r->print('                $output .= '  
               <td class="LC_left_item" colspan="2">'.$item->{'header'}->[0]->{'col1'}.'</td>');                <td class="LC_left_item" colspan="2">'.$item->{'header'}->[0]->{'col1'}.'</td>';
         } else {          } else {
             $r->print('              $output .= '
               <td class="LC_left_item">'.$item->{'header'}->[0]->{'col1'}.'</td>');                <td class="LC_left_item">'.$item->{'header'}->[0]->{'col1'}.'</td>';
         }          }
         $r->print('          $output .= '
               <td class="LC_right_item">'.$item->{'header'}->[0]->{'col2'}.'</td>                <td class="LC_right_item">'.$item->{'header'}->[0]->{'col2'}.'</td>
              </tr>');               </tr>';
           $rowtotal ++;      
         if ($action eq 'login') {          if ($action eq 'login') {
            $r->print(&print_login($dom,$confname,$phase,$settings));              $output .= &print_login($dom,$confname,$phase,$settings,\$rowtotal);
         } elsif ($action eq 'quotas') {          } elsif ($action eq 'quotas') {
            $r->print(&print_quotas($dom,$settings));              $output .= &print_quotas($dom,$settings,\$rowtotal);
         } elsif ($action eq 'autoenroll') {          } elsif ($action eq 'autoenroll') {
            $r->print(&print_autoenroll($dom,$settings));              $output .= &print_autoenroll($dom,$settings,\$rowtotal);
         } elsif ($action eq 'directorysrch') {          } elsif ($action eq 'directorysrch') {
            $r->print(&print_directorysrch($dom,$settings));              $output .= &print_directorysrch($dom,$settings,\$rowtotal);
         }            } elsif ($action eq 'contacts') {
               $output .= &print_contacts($dom,$settings,\$rowtotal);
           }
     }      }
     $r->print('      $output .= '
    </table>     </table>
   </td>    </td>
  </tr>   </tr>
 </table><br />');  </table><br />';
     return;      return ($output,$rowtotal);
 }  }
   
 sub print_header {  sub print_header {
     my ($r,$phase) = @_;      my ($r,$phase) = @_;
       my $alert = &mt('You must select at least one functionality type to display.'); 
     my $js = '      my $js = '
 <script type="text/javascript">  <script type="text/javascript">
 function changePage(formname,newphase) {  function changePage(formname,newphase) {
     formname.phase.value = newphase;      formname.phase.value = newphase;
       numchecked = 0;
       if (formname == document.pickactions) {
           if (formname.actions.length > 0) {
               for (var i = 0; i <formname.actions.length; i++) {
                   if (formname.actions[i].checked) {
                       numchecked ++;
                   }
               }
           } else {
               if (formname.actions.checked) {
                   numchecked ++;
               }
           }
           if (numchecked > 0) {
               formname.submit();
           } else {
               alert("'.$alert.'");
               return;
           }
       }
     formname.submit();      formname.submit();
 }  }'."\n";
 '.      if ($phase eq 'pickactions') {
 &color_pick_js().'          $js .= 
               &Apache::lonhtmlcommon::set_form_elements({actions => 'checkbox',numcols => 'radio',})."\n".
               &javascript_set_colnums();
       } elsif ($phase eq 'display') {
           $js .= &color_pick_js()."\n";
       }
       $js .= &Apache::lonhtmlcommon::javascript_window_dims().'
 </script>  </script>
 ';  ';
       my $additem;
       if ($phase eq 'pickactions') {
           my %loaditems = (
                       'onload' => "javascript:;getDimensions(document.$phase.width,document.$phase.height);setDisplayColumns();setFormElements(document.pickactions);",
                           );
           $additem = {'add_entries' => \%loaditems,};
       } else {
           my %loaditems = (
                       'onload' => "javascript:getDimensions(document.$phase.width,document.$phase.height)",
                           );
           $additem = {'add_entries' => \%loaditems,};
       }
     $r->print(&Apache::loncommon::start_page('View/Modify Domain Settings',      $r->print(&Apache::loncommon::start_page('View/Modify Domain Settings',
                                            $js));                                             $js,$additem));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Domain Settings'));      $r->print(&Apache::lonhtmlcommon::breadcrumbs('Domain Settings'));
     $r->print('      $r->print('
 <form name="parmform" action="">  <form name="parmform" action="">
Line 327  function changePage(formname,newphase) { Line 491  function changePage(formname,newphase) {
 }  }
   
 sub print_footer {  sub print_footer {
     my ($r,$phase,$newphase,$button_text) = @_;      my ($r,$phase,$newphase,$button_text,$actions) = @_;
     $button_text = &mt($button_text);      $button_text = &mt($button_text);
     $r->print('<input type="hidden" name="phase" value="" />');      $r->print('<input type="hidden" name="phase" value="" />'.
                 '<input type="hidden" name="width" value="'.
                 $env{'form.width'}.'" />'.
                 '<input type="hidden" name="height" value="'.
                 $env{'form.height'}.'" />');
       if (($phase eq 'display') || ($phase eq 'process')) {
           if (ref($actions) eq 'ARRAY') {
               foreach my $item (@{$actions}) {
                   $r->print('<input type="hidden" name="actions" value="'.$item.'" />')."\n";
               }
           }
           $r->print('<input type="hidden" name="numcols" value="'.$env{'form.numcols'}.'" />');
       }
     my $dest='"javascript:changePage(document.'.$phase.','."'$newphase'".')"';      my $dest='"javascript:changePage(document.'.$phase.','."'$newphase'".')"';
     if ($phase eq 'process') {      if ($phase eq 'process') {
         $r->print('<a href='.$dest.'>'.$button_text.'</a>');          $r->print('<p><a href='.$dest.'>'.$button_text.'</a></p>');
     } else {      } else {
         $r->print('<input type="button" name="store" value="'.          my $onclick;
                   $button_text.'" onclick='.$dest.' />');          if ($phase eq 'display') {
               $onclick = '"javascript:changePage(document.'.$phase.','."'$newphase'".')"';
           } else {
               $onclick = '"javascript:changePage(document.'.$phase.','."'$newphase'".')"';
           } 
           $r->print('<p><input type="button" name="store" value="'.
                     $button_text.'" onclick='.$onclick.' /></p>');
       }
       if ($phase eq 'process') {
           $r->print('</form>'.&Apache::loncommon::end_page());
     }      }
     $r->print('</form>');  
     $r->print('<br />'.&Apache::loncommon::end_page());  
     return;      return;
 }  }
   
 sub print_login {  sub print_login {
     my ($dom,$confname,$phase,$settings) = @_;      my ($dom,$confname,$phase,$settings,$rowtotal) = @_;
     my %choices = &login_choices();      my %choices = &login_choices();
     my ($catalogon,$catalogoff,$adminmailon,$adminmailoff);      my ($catalogon,$catalogoff,$adminmailon,$adminmailoff);
     $catalogon = ' checked="checked" ';      $catalogon = ' checked="checked" ';
Line 444  sub print_login { Line 627  sub print_login {
         '<label><input type="radio" name="adminmail"'.          '<label><input type="radio" name="adminmail"'.
         $adminmailoff.'value="0" />'.&mt('No').'</label></span></td></tr>';          $adminmailoff.'value="0" />'.&mt('No').'</label></span></td></tr>';
     $itemcount ++;      $itemcount ++;
     $datatable .= &display_color_options($dom,$confname,$phase,'login',$itemcount,\%choices,\%is_custom,\%defaults,\%designs,\@images,\@bgs,\@links,\%alt_text);      $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 471  sub login_choices { Line 654  sub login_choices {
 }  }
   
 sub print_rolecolors {  sub print_rolecolors {
     my ($phase,$role,$dom,$confname,$settings) = @_;      my ($phase,$role,$dom,$confname,$settings,$rowtotal) = @_;
     my %choices = &color_font_choices();      my %choices = &color_font_choices();
     my @bgs = ('pgbg','tabbg','sidebg');      my @bgs = ('pgbg','tabbg','sidebg');
     my @links = ('link','alink','vlink');      my @links = ('link','alink','vlink');
Line 537  sub print_rolecolors { Line 720  sub print_rolecolors {
         }          }
     }      }
     my $itemcount = 1;      my $itemcount = 1;
     my $datatable = &display_color_options($dom,$confname,$phase,$role,$itemcount,\%choices,\%is_custom,\%defaults,\%designs,\@images,\@bgs,\@links,\%alt_text);      my $datatable = &display_color_options($dom,$confname,$phase,$role,$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;
 }  }
   
 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) = @_;          $images,$bgs,$links,$alt_text,$rowtotal) = @_;
     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>';
     if (!$is_custom->{'font'}) {      if (!$is_custom->{'font'}) {
         $datatable .=  '<td>'.&mt('Default in use:').'&nbsp;'.$defaults->{'font'}.'</td>';          $datatable .=  '<td>'.&mt('Default in use:').'&nbsp;<span id="css_default_'.$role.'_font" style="color: '.$defaults->{'font'}.';">'.$defaults->{'font'}.'</span></td>';
     } else {      } else {
         $datatable .= '<td>&nbsp;</td>';          $datatable .= '<td>&nbsp;</td>';
     }      }
Line 557  sub display_color_options { Line 740  sub display_color_options {
     $datatable .= '<td><span class="LC_nobreak">'.      $datatable .= '<td><span class="LC_nobreak">'.
                   '<input type="text" size="10" name="'.$role.'_font"'.                    '<input type="text" size="10" name="'.$role.'_font"'.
                   ' value="'.$designs->{'font'}.'" />&nbsp;'.$fontlink.                    ' value="'.$designs->{'font'}.'" />&nbsp;'.$fontlink.
                     '&nbsp;<span id="css_'.$role.'_font" style="background-color: '.
                     $designs->{'font'}.';">&nbsp;&nbsp;&nbsp;</span>'.
                   '</span></td></tr>';                    '</span></td></tr>';
     my $switchserver = &check_switchserver($dom,$confname);      my $switchserver = &check_switchserver($dom,$confname);
     foreach my $img (@{$images}) {      foreach my $img (@{$images}) {
Line 652  sub display_color_options { Line 837  sub display_color_options {
     my $bgs_def;      my $bgs_def;
     foreach my $item (@{$bgs}) {      foreach my $item (@{$bgs}) {
         if (!$is_custom->{$item}) {          if (!$is_custom->{$item}) {
             $bgs_def .= '<td>'.$choices->{$item}.'<br />'.$defaults->{'bgs'}{$item}.'</td>';              $bgs_def .= '<td>'.$choices->{$item}.'&nbsp;<span id="css_default_'.$role.'_'.$item.'" style="background-color: '.$defaults->{'bgs'}{$item}.';">&nbsp;&nbsp;&nbsp;</span><br />'.$defaults->{'bgs'}{$item}.'</td>';
         }          }
     }      }
     if ($bgs_def) {      if ($bgs_def) {
Line 666  sub display_color_options { Line 851  sub display_color_options {
         my $link = &color_pick($phase,$role,$item,$choices->{$item},$designs->{'bgs'}{$item});          my $link = &color_pick($phase,$role,$item,$choices->{$item},$designs->{'bgs'}{$item});
         $datatable .= '<td align="center">'.$link;          $datatable .= '<td align="center">'.$link;
         if ($designs->{'bgs'}{$item}) {          if ($designs->{'bgs'}{$item}) {
             $datatable .= '<span style="background-color:'.$designs->{'bgs'}{$item}.'width: 10px">&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}.
                       '" /></td>';                        '" onblur = "javascript:document.display.css_'.$role.'_'.$item.'.style.background-color = document.display.'.$role.'_'.$item.'.value;"/></td>';
     }      }
     $datatable .= '</tr></table></td></tr>';      $datatable .= '</tr></table></td></tr>';
     $itemcount ++;      $itemcount ++;
Line 679  sub display_color_options { Line 864  sub display_color_options {
     my $links_def;      my $links_def;
     foreach my $item (@{$links}) {      foreach my $item (@{$links}) {
         if (!$is_custom->{$item}) {          if (!$is_custom->{$item}) {
             $links_def .= '<td>'.$choices->{$item}.'<br />'.$defaults->{'links'}{$item}.'</td>';              $links_def .= '<td>'.$choices->{$item}.'<br /><span id="css_default_'.$role.'_'.$item.'" style="color: '.$defaults->{'links'}{$item}.';">'.$defaults->{'links'}{$item}.'</span></td>';
         }          }
     }      }
     if ($links_def) {      if ($links_def) {
Line 690  sub display_color_options { Line 875  sub display_color_options {
     $datatable .= '<td class="LC_right_item">'.      $datatable .= '<td class="LC_right_item">'.
                   '<table border="0"><tr>';                    '<table border="0"><tr>';
     foreach my $item (@{$links}) {      foreach my $item (@{$links}) {
         $datatable .= '<td align="center">';          $datatable .= '<td align="center">'."\n".
         my $link = &color_pick($phase,$role,$item,$choices->{$item},$designs->{'links'}{$item});                        &color_pick($phase,$role,$item,$choices->{$item},
                                     $designs->{'links'}{$item});
         if ($designs->{'links'}{$item}) {          if ($designs->{'links'}{$item}) {
             $datatable.='<span style="color: '.$designs->{'links'}{$item}.';">'.              $datatable.='&nbsp;<span id="css_'.$role.'_'.$item.'" style="background-color: '.$designs->{'links'}{$item}.';">&nbsp;&nbsp;&nbsp;</span>';
                         $link.'</span>';  
         } else {  
             $datatable .= $link;  
         }          }
         $datatable .= '<br /><input type="text" size="8" name="'.$role.'_'.$item.'" value="'.$designs->{'links'}{$item}.          $datatable .= '<br /><input type="text" size="8" name="'.$role.'_'.$item.'" value="'.$designs->{'links'}{$item}.
                       '" /></td>';                        '" /></td>';
     }      }
       $$rowtotal += $itemcount;
     return $datatable;      return $datatable;
 }  }
   
Line 740  ENDCOL Line 924  ENDCOL
 }  }
   
 sub print_quotas {  sub print_quotas {
     my ($dom,$settings) = @_;      my ($dom,$settings,$rowtotal) = @_;
     my $datatable;      my $datatable;
     my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);      my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
     my $typecount = 0;      my $typecount = 0;
     my $css_class;      my $css_class;
     if (@{$types} > 0) {      if (ref($types) eq 'ARRAY') {
         foreach my $type (@{$types}) {          foreach my $type (@{$types}) {
             if (defined($usertypes->{$type})) {              if (defined($usertypes->{$type})) {
                 $typecount ++;                  $typecount ++;
Line 768  sub print_quotas { Line 952  sub print_quotas {
     $typecount ++;      $typecount ++;
     $css_class = $typecount%2?' class="LC_odd_row"':'';      $css_class = $typecount%2?' class="LC_odd_row"':'';
     $datatable .= '<tr'.$css_class.'>'.      $datatable .= '<tr'.$css_class.'>'.
                   '<td>'.&mt($othertitle).'</td>'.                    '<td>'.$othertitle.'</td>'.
                   '<td class="LC_right_item"><span class="LC_nobreak">'.                    '<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></tr>';                    $defaultquota.'" size="5" /> Mb</span></td></tr>';
       $$rowtotal += $typecount;
     return $datatable;      return $datatable;
 }  }
   
 sub print_autoenroll {  sub print_autoenroll {
     my ($dom,$settings) = @_;      my ($dom,$settings,$rowtotal) = @_;
     my $autorun = &Apache::lonnet::auto_run(undef,$dom),      my $autorun = &Apache::lonnet::auto_run(undef,$dom),
     my ($defdom,$runon,$runoff);      my ($defdom,$runon,$runoff);
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
Line 825  sub print_autoenroll { Line 1010  sub print_autoenroll {
                   $settings->{'sender_uname'}.                    $settings->{'sender_uname'}.
                   '" size="10" />&nbsp;&nbsp;'.&mt('domain').                    '" size="10" />&nbsp;&nbsp;'.&mt('domain').
                   ':&nbsp;'.$domform.'</span></td></tr>';                    ':&nbsp;'.$domform.'</span></td></tr>';
       $$rowtotal += 2;
     return $datatable;      return $datatable;
 }  }
   
 sub print_autoupdate {  sub print_autoupdate {
     my ($position,$dom,$settings) = @_;      my ($position,$dom,$settings,$rowtotal) = @_;
     my $datatable;      my $datatable;
     if ($position eq 'top') {      if ($position eq 'top') {
         my $updateon = ' ';          my $updateon = ' ';
Line 865  sub print_autoupdate { Line 1051  sub print_autoupdate {
                   '<label><input type="radio" name="classlists"'.                    '<label><input type="radio" name="classlists"'.
                   $classlistsoff.'value="0" />'.&mt('No').'</label></span></td>'.                    $classlistsoff.'value="0" />'.&mt('No').'</label></span></td>'.
                   '</tr>';                    '</tr>';
           $$rowtotal += 2;
     } else {      } else {
         my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);          my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
         my @fields = ('lastname','firstname','middlename','gen',          my @fields = ('lastname','firstname','middlename','gen',
Line 878  sub print_autoupdate { Line 1065  sub print_autoupdate {
                             gen => 'Generation',                              gen => 'Generation',
                       );                        );
         my $numrows = 0;          my $numrows = 0;
         if (@{$types} > 0) {          if (ref($types) eq 'ARRAY') {
             $datatable =               if (@{$types} > 0) {
                 &usertype_update_row($settings,$usertypes,\%fieldtitles,                  $datatable = 
                                      \@fields,$types,\$numrows);                      &usertype_update_row($settings,$usertypes,\%fieldtitles,
                                            \@fields,$types,\$numrows);
                       $$rowtotal += @{$types}; 
               }
         }          }
         $datatable .=           $datatable .= 
             &usertype_update_row($settings,{'default' => $othertitle},              &usertype_update_row($settings,{'default' => $othertitle},
                                  \%fieldtitles,\@fields,['default'],                                   \%fieldtitles,\@fields,['default'],
                                  \$numrows);                                   \$numrows);
           $$rowtotal ++;     
     }      }
     return $datatable;      return $datatable;
 }  }
   
 sub print_directorysrch {  sub print_directorysrch {
     my ($dom,$settings) = @_;      my ($dom,$settings,$rowtotal) = @_;
     my $srchon = ' ';      my $srchon = ' ';
     my $srchoff = ' checked="checked" ';      my $srchoff = ' checked="checked" ';
     my $exacton = '';      my ($exacton,$containson,$beginson);
     my $containson = ' checked="checked" ';  
     my $specifyon = '';  
     my $localon = ' ';      my $localon = ' ';
     my $localoff = ' checked="checked" ';      my $localoff = ' checked="checked" ';
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
Line 909  sub print_directorysrch { Line 1098  sub print_directorysrch {
             $localon = $localoff;              $localon = $localoff;
             $localoff = ' ';              $localoff = ' ';
         }          }
         if ($settings->{'searchtypes'} eq 'exact') {          if (ref($settings->{'searchtypes'}) eq 'ARRAY') {
             $exacton = $containson;              foreach my $type (@{$settings->{'searchtypes'}}) {
             $containson = ' ';                  if ($type eq 'exact') {
         }                      $exacton = ' checked="checked" ';
         if ($settings->{'searchtypes'} eq 'specify') {                  } elsif ($type eq 'contains') {
             $specifyon = $containson;                      $containson = ' checked="checked" ';
             $containson = ' ';                  } elsif ($type eq 'begins') {
                       $beginson = ' checked="checked" ';
                   }
               }
           } else {
               if ($settings->{'searchtypes'} eq 'exact') {
                   $exacton = ' checked="checked" ';
               } elsif ($settings->{'searchtypes'} eq 'contains') {
                   $containson = ' checked="checked" ';
               } elsif ($settings->{'searchtypes'} eq 'specify') {
                   $exacton = ' checked="checked" ';
                   $containson = ' checked="checked" ';
               }
         }          }
     }      }
     my ($searchtitles,$titleorder) = &sorted_searchtitles();      my ($searchtitles,$titleorder) = &sorted_searchtitles();
     my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);      my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
   
     my $numinrow = 4;      my $numinrow = 4;
       my $cansrchrow = 0;
     my $datatable='<tr class="LC_odd_row">'.      my $datatable='<tr class="LC_odd_row">'.
                   '<td colspan="2">'.&mt('Directory search available?').'</td>'.                    '<td colspan="2"><span class ="LC_nobreak">'.&mt('Directory search available?').'</span></td>'.
                   '<td class="LC_right_item"><span class="LC_nobreak"><label>'.                    '<td class="LC_right_item"><span class="LC_nobreak"><label>'.
                   '<input type="radio" name="dirsrch_available"'.                    '<input type="radio" name="dirsrch_available"'.
                   $srchon.' value="1" />'.&mt('Yes').'</label>&nbsp;'.                    $srchon.' value="1" />'.&mt('Yes').'</label>&nbsp;'.
                   '<label><input type="radio" name="dirsrch_available"'.                    '<label><input type="radio" name="dirsrch_available"'.
                   $srchoff.' value="0" />'.&mt('No').'</label></span></td>'.                    $srchoff.' value="0" />'.&mt('No').'</label></span></td>'.
                   '</tr><tr>'.                    '</tr><tr>'.
                   '<td colspan="2">'.&mt('Search latitude').'</td>'.                    '<td colspan="2"><span class ="LC_nobreak">'.&mt('Other domains can search?').'</span></td>'.
                   '<td class="LC_right_item"><span class="LC_nobreak"><label>'.  
                   '<input type="radio" name="searchtypes"'.  
                   $exacton.' value="exact" />'.&mt('Exact match only').'</label>&nbsp;'.  
                   '<label><input type="radio" name="searchtypes"'.  
                   $containson.' value="contains" />'.&mt('Contains is a match').'</label>'.  
                   '&nbsp;<label><input type="radio" name="searchtypes"'.  
                   $specifyon.' value="specify" />'.&mt('Specifiable type').  
                   '</label></span></td></tr>'.  
                   '<tr class="LC_odd_row">'.  
                   '<td colspan="2">'.&mt('Other domains can search').'</td>'.  
                   '<td class="LC_right_item"><span class="LC_nobreak"><label>'.                    '<td class="LC_right_item"><span class="LC_nobreak"><label>'.
                   '<input type="radio" name="dirsrch_localonly"'.                    '<input type="radio" name="dirsrch_localonly"'.
                   $localoff.' value="0" />'.&mt('Yes').'</label>&nbsp;'.                    $localoff.' value="0" />'.&mt('Yes').'</label>&nbsp;'.
                   '<label><input type="radio" name="dirsrch_localonly"'.                    '<label><input type="radio" name="dirsrch_localonly"'.
                   $localon.' value="1" />'.&mt('No').'</label></span></td>'.                    $localon.' value="1" />'.&mt('No').'</label></span></td>'.
                   '</tr><tr>'.                    '</tr>';
                   '<td>'.&mt('Users allowed to search').' ('.$dom.')'.      $$rowtotal += 2;
                   '</td><td class="LC_left_item" colspan="2"><table>';      if (ref($usertypes) eq 'HASH') {
     for (my $i=0; $i<@{$types}; $i++) {          if (keys(%{$usertypes}) > 0) {
         if (defined($usertypes->{$types->[$i]})) {              $datatable .= &users_cansearch_row($settings,$types,$usertypes,$dom,
             my $rem = $i%($numinrow);                                                 $numinrow,$othertitle);
             if ($rem == 0) {              $cansrchrow = 1;
                 if ($i > 0) {          }
                     $datatable .= '</tr>';      }
                 }      if ($cansrchrow) {
                 $datatable .= '<tr>';          $$rowtotal ++;
             }          $datatable .= '<tr>';
             my $check = ' ';  
             if (ref($settings->{'cansearch'}) eq 'ARRAY') {  
                 if (grep(/^\Q$types->[$i]\E$/,@{$settings->{'cansearch'}})) {  
                     $check = ' checked="checked" ';  
                 }  
             }  
             $datatable .= '<td class="LC_left_item">'.  
                           '<span class="LC_nobreak"><label>'.  
                           '<input type="checkbox" name="cansearch" '.  
                           'value="'.$types->[$i].'"'.$check.'/>'.  
                           $usertypes->{$types->[$i]}.'</label></span></td>';  
         }  
     }  
   
     my $rem = @{$types}%($numinrow);  
     my $colsleft = $numinrow - $rem;  
     if ($colsleft > 1) {  
         $datatable .= '<td colspan="'.$colsleft.'" class="LC_left_item">';  
     } else {      } else {
         $datatable .= '<td class="LC_left_item">';          $datatable .= '<tr class="LC_odd_row">';
     }      }
     my $defcheck = ' ';      $datatable .= '<td><span class ="LC_nobreak">'.&mt('Supported search methods').
     if (ref($settings->{'cansearch'}) eq 'ARRAY') {                    '</span></td><td class="LC_left_item" colspan="2"><table><tr>';
          if (grep(/^default$/,@{$settings->{'cansearch'}})) {  
               $defcheck = ' checked="checked" ';  
          }  
     }  
     $datatable .= '<span class="LC_nobreak"><label>'.  
                   '<input type="checkbox" name="cansearch" '.  
                   'value="default"'.$defcheck.'/>'.  
                   $othertitle.'</label></span></td>'.  
                   '</tr></table></td></tr>';  
   
     $datatable .= '<tr class="LC_odd_row">'.  
                   '<td>'.&mt('Supported search methods').  
                   '</td><td class="LC_left_item" colspan="2"><table><tr>';  
     foreach my $title (@{$titleorder}) {      foreach my $title (@{$titleorder}) {
         if (defined($searchtitles->{$title})) {          if (defined($searchtitles->{$title})) {
             my $check = ' ';              my $check = ' ';
Line 1010  sub print_directorysrch { Line 1171  sub print_directorysrch {
         }          }
     }      }
     $datatable .= '</tr></table></td></tr>';      $datatable .= '</tr></table></td></tr>';
       $$rowtotal ++;
       if ($cansrchrow) {
           $datatable .= '<tr class="LC_odd_row">';
       } else {
           $datatable .= '<tr>';
       }
       $datatable .= '<td><span class ="LC_nobreak">'.&mt('Search latitude').'</span></td>'.   
                     '<td class="LC_left_item" colspan="2">'.
                     '<span class="LC_nobreak"><label>'.
                     '<input type="checkbox" name="searchtypes" '.
                     $exacton.' value="exact" />'.&mt('Exact match').
                     '</label>&nbsp;'.
                     '<label><input type="checkbox" name="searchtypes" '.
                     $beginson.' value="begins" />'.&mt('Begins with').
                     '</label>&nbsp;'.
                     '<label><input type="checkbox" name="searchtypes" '.
                     $containson.' value="contains" />'.&mt('Contains').
                     '</label></span></td></tr>';
       $$rowtotal ++;
       return $datatable;
   }
   
   sub print_contacts {
       my ($dom,$settings,$rowtotal) = @_;
       my $datatable;
       my @contacts = ('adminemail','supportemail');
       my (%checked,%to,%otheremails);
       my @mailings = ('errormail','packagesmail','helpdeskmail');
       foreach my $type (@mailings) {
           $otheremails{$type} = '';
       }
       if (ref($settings) eq 'HASH') {
           foreach my $item (@contacts) {
               if (exists($settings->{$item})) {
                   $to{$item} = $settings->{$item};
               }
           }
           foreach my $type (@mailings) {
               if (exists($settings->{$type})) {
                   if (ref($settings->{$type}) eq 'HASH') {
                       foreach my $item (@contacts) {
                           if ($settings->{$type}{$item}) {
                               $checked{$type}{$item} = ' checked="checked" ';
                           }
                       }
                       $otheremails{$type} = $settings->{$type}{'others'};
                   }
               }
           }
       } else {
           $to{'supportemail'} = $Apache::lonnet::perlvar{'lonSupportEMail'};
           $to{'adminemail'} = $Apache::lonnet::perlvar{'lonAdmEMail'};
           $checked{'errormail'}{'adminemail'} = ' checked="checked" ';
           $checked{'packagesmail'}{'adminemail'} = ' checked="checked" ';
           $checked{'helpdeskmail'}{'supportemail'} = ' checked="checked" '; 
       }
       my ($titles,$short_titles) = &contact_titles();
       my $rownum = 0;
       my $css_class;
       foreach my $item (@contacts) {
           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">'.
                     '<input type="text" name="'.$item.'" value="'.
                     $to{$item}.'" /></td></tr>';
           $rownum ++;
       }
       foreach my $type (@mailings) {
           if ($rownum%2) {
               $css_class = '';
           } else {
               $css_class = ' class="LC_odd_row" ';
           }
           $datatable .= '<tr'.$css_class.'>'.
                         '<td><span class="LC_nobreak">'.
                         $titles->{$type}.': </span></td>'.
                         '<td class="LC_left_item">'.
                         '<span class="LC_nobreak">';
           foreach my $item (@contacts) {
               $datatable .= '<label>'.
                             '<input type="checkbox" name="'.$type.'"'.
                             $checked{$type}{$item}.
                             ' value="'.$item.'" />'.$short_titles->{$item}.
                             '</label>&nbsp;';
           }
           $datatable .= '</span><br />'.&mt('Others').':&nbsp;&nbsp;'.
                         '<input type="text" name="'.$type.'_others" '.
                         'value="'.$otheremails{$type}.'"  />'.
                         '</td></tr>'."\n";
           $rownum ++;
       }
       $$rowtotal += $rownum;
       return $datatable;
   }
   
   sub contact_titles {
       my %titles = &Apache::lonlocal::texthash (
                      'supportemail' => 'Support E-mail address',
                      'adminemail'    => 'Default Server Admin E-mail address',
                      'errormail'    => 'Error reports to be e-mailed to',
                      'packagesmail' => 'Package update alerts to be e-mailed to',
                      'helpdeskmail' => 'Helpdesk requests to be e-mailed to'
                    );
       my %short_titles = &Apache::lonlocal::texthash (
                              adminemail   => 'Admin E-mail address',
                              supportemail => 'Support E-mail',
                          );   
       return (\%titles,\%short_titles);
   }
   
   sub print_usercreation {
       my ($position,$dom,$settings,$rowtotal) = @_;
       my $numinrow = 4;
       my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($dom);
       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') {
           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 ++;
           if (ref($rules) eq 'HASH') {
               if (keys(%{$rules}) > 0) {
                   $datatable .= &username_formats_row($settings,$rules,
                                                       $ruleorder,$numinrow);
                   $$rowtotal ++;
               }
           }
       } else {
           my @contexts = ('author','course','domain');
           my @authtypes = ('int','krb4','krb5','loc');
           my %checked;
           if (ref($settings) eq 'HASH') {
               if (ref($settings->{'authtypes'}) eq 'HASH') {
                   foreach my $item (@contexts) {
                       if (ref($settings->{'authtypes'}{$item}) eq 'HASH') {
                           foreach my $auth (@authtypes) {
                               if ($settings->{'authtypes'}{$item}{$auth}) {
                                   $checked{$item}{$auth} = ' checked="checked" ';
                               }
                           }
                       }
                   }
               }
           }
           my @authtypes = ('int','krb4','krb5','loc');
           my %title = &context_names();
           my %authname = &authtype_names();
           my $rownum = 0;
           my $css_class; 
           foreach my $item (@contexts) {
               if ($rownum%2) {
                   $css_class = '';
               } else {
                   $css_class = ' class="LC_odd_row" ';
               }
               $datatable .=   '<tr'.$css_class.'>'.
                               '<td>'.$title{$item}.
                               '</td><td class="LC_left_item">'.
                               '<span class="LC_nobreak">';
               foreach my $auth (@authtypes) {
                   $datatable .= '<label>'. 
                                 '<input type="checkbox" name="'.$item.'_auth" '.
                                 $checked{$item}{$auth}.' value="'.$auth.'" />'.
                                 $authname{$auth}.'</label>&nbsp;';
               }
               $datatable .= '</span></td></tr>';
               $rownum ++;
           }
           $$rowtotal += $rownum;
       }
     return $datatable;      return $datatable;
 }  }
   
   sub username_formats_row {
       my ($settings,$rules,$ruleorder,$numinrow) = @_;
       my $output =  '<tr>'.
                     '<td><span class="LC_nobreak">'.
                     &mt('Format rules to check for new usernames: ').
                     '</span></td>'.
                     '<td class="LC_left_item" colspan="2"><table>';
       my $rem;
       if (ref($ruleorder) eq 'ARRAY') {
           for (my $i=0; $i<@{$ruleorder}; $i++) {
               if (ref($rules->{$ruleorder->[$i]}) eq 'HASH') {
                   my $rem = $i%($numinrow);
                   if ($rem == 0) {
                       if ($i > 0) {
                           $output .= '</tr>';
                       }
                       $output .= '<tr>';
                   }
                   my $check = ' ';
                   if (ref($settings->{'username_rule'}) eq 'ARRAY') {
                       if (grep(/^\Q$ruleorder->[$i]\E$/,@{$settings->{'username_rule'}})) {
                           $check = ' checked="checked" ';
                       }
                   }
                   $output .= '<td class="LC_left_item">'.
                              '<span class="LC_nobreak"><label>'.
                              '<input type="checkbox" name="username_rule" '.
                              'value="'.$ruleorder->[$i].'"'.$check.'/>'.
                              $rules->{$ruleorder->[$i]}{'name'}.'</label></span></td>';
               }
           }
           $rem = @{$ruleorder}%($numinrow);
       }
       my $colsleft = $numinrow - $rem;
       if ($colsleft > 1 ) {
           $output .= '<td colspan="'.$colsleft.'" class="LC_left_item">'.
                      '&nbsp;</td>';
       } elsif ($colsleft == 1) {
           $output .= '<td class="LC_left_item">&nbsp;</td>';
       }
       $output .= '</tr></table></td></tr>';
       return $output;
   }
   
   sub authtype_names {
       my %lt = &Apache::lonlocal::texthash(
                         int    => 'Internal',
                         krb4   => 'Kerberos 4',
                         krb5   => 'Kerberos 5',
                         loc    => 'Local',
                     );
       return %lt;
   }
   
   sub context_names {
       my %context_title = &Apache::lonlocal::texthash(
          author => 'Creating users when an Author',
          course => 'Creating users when in a course',
          domain => 'Creating users when a Domain Coordinator',
       );
       return %context_title;
   }
   
   
   sub users_cansearch_row {
       my ($settings,$types,$usertypes,$dom,$numinrow,$othertitle) = @_;
       my $output =  '<tr class="LC_odd_row">'.
                     '<td>'.&mt('Users allowed to search').' ('.$dom.')'.
                     '</td><td class="LC_left_item" colspan="2"><table>';
       my $rem;
       if (ref($types) eq 'ARRAY') {
           for (my $i=0; $i<@{$types}; $i++) {
               if (defined($usertypes->{$types->[$i]})) {
                   my $rem = $i%($numinrow);
                   if ($rem == 0) {
                       if ($i > 0) {
                           $output .= '</tr>';
                       }
                       $output .= '<tr>';
                   }
                   my $check = ' ';
                   if (ref($settings->{'cansearch'}) eq 'ARRAY') {
                       if (grep(/^\Q$types->[$i]\E$/,@{$settings->{'cansearch'}})) {
                           $check = ' checked="checked" ';
                       }
                   }
                   $output .= '<td class="LC_left_item">'.
                              '<span class="LC_nobreak"><label>'.
                              '<input type="checkbox" name="cansearch" '.
                              'value="'.$types->[$i].'"'.$check.'/>'.
                              $usertypes->{$types->[$i]}.'</label></span></td>';
               }
           }
          
           $rem = @{$types}%($numinrow);
       }
       my $colsleft = $numinrow - $rem;
       if ($colsleft > 1) {
           $output .= '<td colspan="'.$colsleft.'" class="LC_left_item">';
       } else {
           $output .= '<td class="LC_left_item">';
       }
       my $defcheck = ' ';
       if (ref($settings->{'cansearch'}) eq 'ARRAY') {
           if (grep(/^default$/,@{$settings->{'cansearch'}})) {
               $defcheck = ' checked="checked" ';
           }
       }
       $output .= '<span class="LC_nobreak"><label>'.
                  '<input type="checkbox" name="cansearch" '.
                  'value="default"'.$defcheck.'/>'.
                  $othertitle.'</label></span></td>'.
                  '</tr></table></td></tr>';
       return $output;
   }
   
 sub sorted_inst_types {  sub sorted_inst_types {
     my ($dom) = @_;      my ($dom) = @_;
     my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom);      my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom);
     my $othertitle = "All users";      my $othertitle = &mt('All users');
     my @types;      my @types;
     if (ref($order) eq 'ARRAY') {      if (ref($order) eq 'ARRAY') {
         @types = @{$order};          @types = @{$order};
Line 1042  sub sorted_searchtitles { Line 1514  sub sorted_searchtitles {
     return (\%searchtitles,\@titleorder);      return (\%searchtitles,\@titleorder);
 }  }
   
   sub sorted_searchtypes {
       my %srchtypes_desc = (
                              exact    => 'is exact match',
                              contains => 'contains ..',
                              begins   => 'begins with ..',
                            );
       my @srchtypeorder = ('exact','begins','contains');
       return (\%srchtypes_desc,\@srchtypeorder);
   }
   
 sub usertype_update_row {  sub usertype_update_row {
     my ($settings,$usertypes,$fieldtitles,$fields,$types,$rownums) = @_;      my ($settings,$usertypes,$fieldtitles,$fields,$types,$rownums) = @_;
     my $datatable;      my $datatable;
Line 1691  sub check_switchserver { Line 2173  sub check_switchserver {
     return $switchserver;      return $switchserver;
 }  }
   
   sub javascript_set_colnums {
       return <<END;
   function setDisplayColumns() {
       if (document.pickactions.width.value > 1100) {
           document.pickactions.numcols[1].checked = true;
       } else {
           document.pickactions.numcols[0].checked = true;
       }
   }
   END
   }
   
 sub modify_quotas {  sub modify_quotas {
     my ($dom,%domconfig) = @_;      my ($dom,%domconfig) = @_;
     my ($resulttext,%changes);      my ($resulttext,%changes);
     my ($usertypes,$order) =       my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
         &Apache::lonnet::retrieve_inst_usertypes($dom);  
     my %formhash;      my %formhash;
     foreach my $key (keys(%env)) {      foreach my $key (keys(%env)) {
         if ($key =~ /^form\.quota_(.+)$/) {          if ($key =~ /^form\.quota_(.+)$/) {
Line 1729  sub modify_quotas { Line 2222  sub modify_quotas {
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             foreach my $item (sort(keys(%changes))) {              foreach my $type (@{$types},'default') {
                 $resulttext .= '<li>'.&mt('[_1] set to [_2] Mb',$usertypes->{$item},$formhash{$item}).'</li>';                  if (defined($changes{$type})) { 
                       my $typetitle = $usertypes->{$type};
                       if ($type eq 'default') {
                           $typetitle = $othertitle;
                       }
                       $resulttext .= '<li>'.&mt('[_1] set to [_2] Mb',$typetitle,$formhash{$type}).'</li>';
                   }
             }              }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
         } else {          } else {
Line 1824  sub modify_autoupdate { Line 2323  sub modify_autoupdate {
                    run => 'Auto-update:',                     run => 'Auto-update:',
                    classlists => 'Updates to user information in classlists?'                     classlists => 'Updates to user information in classlists?'
                 );                  );
     my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom);      my ($othertitle,$usertypes,$types) = &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 1835  sub modify_autoupdate { Line 2334  sub modify_autoupdate {
                       );                        );
     my $othertitle = &mt('All users');      my $othertitle = &mt('All users');
     if (keys(%{$usertypes}) >  0) {      if (keys(%{$usertypes}) >  0) {
         $othertitle = "Other users";          $othertitle = &mt('Other users');
     }      }
     foreach my $key (keys(%env)) {      foreach my $key (keys(%env)) {
         if ($key =~ /^form\.updateable_(.+)_([^_]+)$/) {          if ($key =~ /^form\.updateable_(.+)_([^_]+)$/) {
Line 1857  sub modify_autoupdate { Line 2356  sub modify_autoupdate {
             }              }
         } elsif ($key eq 'fields') {          } elsif ($key eq 'fields') {
             if (ref($currautoupdate{$key}) eq 'HASH') {              if (ref($currautoupdate{$key}) eq 'HASH') {
                 foreach my $item (keys(%{$currautoupdate{$key}})) {                  foreach my $item (@{$types},'default') {
                     if (ref($currautoupdate{$key}{$item}) eq 'ARRAY') {                      if (ref($currautoupdate{$key}{$item}) eq 'ARRAY') {
                         my $change = 0;                          my $change = 0;
                         foreach my $type (@{$currautoupdate{$key}{$item}}) {                          foreach my $type (@{$currautoupdate{$key}{$item}}) {
                             if (!exists($fields{$item})) {                              if (!exists($fields{$item})) {
                                 $change = 1;                                  $change = 1;
                             } elsif (ref($fields{$item}) eq 'ARRAY') {                              } elsif (ref($fields{$item}) eq 'ARRAY') {
                                 if (!grep/^\Q$type\E$/,@{$fields{$item}}) {                                  if (!grep(/^\Q$type\E$/,@{$fields{$item}})) {
                                     $change = 1;                                      $change = 1;
                                 }                                  }
                             }                              }
Line 1872  sub modify_autoupdate { Line 2371  sub modify_autoupdate {
                         if ($change) {                          if ($change) {
                             push(@{$changes{$key}},$item);                              push(@{$changes{$key}},$item);
                         }                          }
                     }                      } 
                 }                  }
             }              }
         }          }
     }      }
     foreach my $key (keys(%fields)) {      foreach my $item (@{$types},'default') {
         if (ref($currautoupdate{'fields'}) eq 'HASH') {          if (defined($fields{$item})) {
             if (!exists($currautoupdate{'fields'}{$key})) {              if (ref($currautoupdate{'fields'}) eq 'HASH') {
                 push(@{$changes{'fields'}},$key);                  if (!exists($currautoupdate{'fields'}{$item})) {
                       push(@{$changes{'fields'}},$item);
                   }
               } else {
                   push(@{$changes{'fields'}},$item);
             }              }
         } else {  
             push(@{$changes{'fields'}},$key);  
         }          }
     }      }
     my $putresult = &Apache::lonnet::put_dom('configuration',\%updatehash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%updatehash,
Line 1905  sub modify_autoupdate { Line 2406  sub modify_autoupdate {
                             $newvaluestr = &mt('none');                              $newvaluestr = &mt('none');
                         }                          }
                         if ($item eq 'default') {                          if ($item eq 'default') {
                             $resulttext .= '<li>'.&mt("Updates for $othertitle set to: [_1]",$newvaluestr).'</li>';                              $resulttext .= '<li>'.&mt("Updates for '[_1]' set to: '[_2]'",$othertitle,$newvaluestr).'</li>';
                         } else {                          } else {
                             $resulttext .= '<li>'.&mt("Updates for [_1] set to: [_2]",$usertypes->{$item},$newvaluestr).'</li>';                              $resulttext .= '<li>'.&mt("Updates for '[_1]' set to: '[_2]'",$usertypes->{$item},$newvaluestr).'</li>';
                         }                          }
                     }                      }
                 } else {                  } else {
Line 1941  sub modify_directorysrch { Line 2442  sub modify_directorysrch {
         }          }
     }      }
     my %title = ( available => 'Directory search available',      my %title = ( available => 'Directory search available',
                   cansearch => 'Users permitted to search',  
                   localonly => 'Other domains can search',                    localonly => 'Other domains can search',
                   searchby => 'Search types',                    searchby => 'Search types',
                   searchtypes => 'Search latitude');                    searchtypes => 'Search latitude');
     my @offon = ('off','on');      my @offon = ('off','on');
     my @otherdoms = ('Yes','No');      my @otherdoms = ('Yes','No');
   
       my @searchtypes = &Apache::loncommon::get_env_multiple('form.searchtypes');  
     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');
   
     if (ref($currdirsrch{'cansearch'}) eq 'ARRAY') {      my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
         foreach my $type (@{$currdirsrch{'cansearch'}}) {      if (keys(%{$usertypes}) == 0) {
             if (!grep(/^\Q$type\E$/,@cansearch)) {          @cansearch = ('default');
                 push(@{$changes{'cansearch'}},$type);      } else {
           if (ref($currdirsrch{'cansearch'}) eq 'ARRAY') {
               foreach my $type (@{$currdirsrch{'cansearch'}}) {
                   if (!grep(/^\Q$type\E$/,@cansearch)) {
                       push(@{$changes{'cansearch'}},$type);
                   }
             }              }
         }              foreach my $type (@cansearch) {
         foreach my $type (@cansearch) {                  if (!grep(/^\Q$type\E$/,@{$currdirsrch{'cansearch'}})) {
             if (!grep(/^\Q$type\E$/,@{$currdirsrch{'cansearch'}})) {                      push(@{$changes{'cansearch'}},$type);
                 push(@{$changes{'cansearch'}},$type);                  }
             }              }
           } else {
               push(@{$changes{'cansearch'}},@cansearch);
         }          }
     } else {  
         push(@{$changes{'cansearch'}},@cansearch);  
     }      }
   
     if (ref($currdirsrch{'searchby'}) eq 'ARRAY') {      if (ref($currdirsrch{'searchby'}) eq 'ARRAY') {
Line 1980  sub modify_directorysrch { Line 2486  sub modify_directorysrch {
     } else {      } else {
         push(@{$changes{'searchby'}},@searchby);          push(@{$changes{'searchby'}},@searchby);
     }      }
       
       if (ref($currdirsrch{'searchtypes'}) eq 'ARRAY') {
           foreach my $type (@{$currdirsrch{'searchtypes'}}) {
               if (!grep(/^\Q$type\E$/,@searchtypes)) {
                   push(@{$changes{'searchtypes'}},$type);
               }
           }
           foreach my $type (@searchtypes) {
               if (!grep(/^\Q$type\E$/,@{$currdirsrch{'searchtypes'}})) {
                   push(@{$changes{'searchtypes'}},$type);
               }
           }
       } else {
           if (exists($currdirsrch{'searchtypes'})) {
               foreach my $type (@searchtypes) {  
                   if ($type ne $currdirsrch{'searchtypes'}) { 
                       push(@{$changes{'searchtypes'}},$type);
                   }
               }
               if (!grep(/^\Q$currdirsrch{'searchtypes'}\E/,@searchtypes)) {
                   push(@{$changes{'searchtypes'}},$currdirsrch{'searchtypes'});
               }   
           } else {
               push(@{$changes{'searchtypes'}},@searchtypes); 
           }
       }
   
     my %dirsrch_hash =  (      my %dirsrch_hash =  (
             directorysrch => { available => $env{'form.dirsrch_available'},              directorysrch => { available => $env{'form.dirsrch_available'},
                                cansearch => \@cansearch,                                 cansearch => \@cansearch,
                                localonly => $env{'form.dirsrch_localonly'},                                 localonly => $env{'form.dirsrch_localonly'},
                                searchby => \@searchby,                                 searchby => \@searchby,
                                searchtypes => $env{'form.searchtypes'},                                 searchtypes => \@searchtypes,
                              }                               }
             );              );
     my $putresult = &Apache::lonnet::put_dom('configuration',\%dirsrch_hash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%dirsrch_hash,
Line 2010  sub modify_directorysrch { Line 2542  sub modify_directorysrch {
                 $changes{'localonly'} = 1;                  $changes{'localonly'} = 1;
             }              }
         }          }
         if (exists($currdirsrch{'searchtypes'})) {  
              if ($currdirsrch{'searchtypes'} ne $env{'form.searchtypes'}) {  
                  $changes{'searchtypes'} = 1;  
              }  
         } else {  
             if ($env{'form.searchtypes'}) {  
                 $changes{'searchtypes'} = 1;  
             }  
         }  
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             if ($changes{'available'}) {              if ($changes{'available'}) {
Line 2029  sub modify_directorysrch { Line 2552  sub modify_directorysrch {
             }              }
   
             if (ref($changes{'cansearch'}) eq 'ARRAY') {              if (ref($changes{'cansearch'}) eq 'ARRAY') {
                 my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);  
                 my $chgtext;                  my $chgtext;
                 foreach my $type (@cansearch) {                  if (ref($usertypes) eq 'HASH') {
                     if (defined($usertypes->{$type})) {                      if (keys(%{$usertypes}) > 0) {
                         $chgtext .= $usertypes->{$type}.'; ';                          foreach my $type (@{$types}) {
                               if (grep(/^\Q$type\E$/,@cansearch)) {
                                   $chgtext .= $usertypes->{$type}.'; ';
                               }
                           }
                           if (grep(/^default$/,@cansearch)) {
                               $chgtext .= $othertitle;
                           } else {
                               $chgtext =~ s/\; $//;
                           }
                           $resulttext .= '<li>'.&mt("Users from domain '<span class=\"LC_cusr_emph\">[_1]</span>' permitted to search the institutional directory set to: [_2]",$dom,$chgtext).'</li>';
                     }                      }
                 }                  }
                 if (grep(/^default$/,@cansearch)) {  
                     $chgtext .= $othertitle;  
                 } else {  
                     $chgtext =~ s/\; $//;  
                 }  
                 $resulttext .= '<li>'.&mt("$title{'cansearch'} ([_1]) set to: [_2]",$dom,$chgtext).'</li>';  
             }              }
             if (ref($changes{'searchby'}) eq 'ARRAY') {              if (ref($changes{'searchby'}) eq 'ARRAY') {
                 my ($searchtitles,$titleorder) = &sorted_searchtitles();                  my ($searchtitles,$titleorder) = &sorted_searchtitles();
Line 2056  sub modify_directorysrch { Line 2582  sub modify_directorysrch {
                 $chgtext =~ s/\; $//;                  $chgtext =~ s/\; $//;
                 $resulttext .= '<li>'.&mt("$title{'searchby'} set to: [_1]",$chgtext).'</li>';                  $resulttext .= '<li>'.&mt("$title{'searchby'} set to: [_1]",$chgtext).'</li>';
             }              }
             if ($changes{'searchtypes'}) {              if (ref($changes{'searchtypes'}) eq 'ARRAY') {
                 my %srchtypes_desc = (                   my ($srchtypes_desc,$srchtypeorder) = &sorted_searchtypes(); 
                                        exact => 'Exact match only',                  my $chgtext;
                                        contains => 'Contains is a match',                  foreach my $type (@{$srchtypeorder}) {
                                        specify => 'Match type specifiable',                      if (grep(/^\Q$type\E$/,@searchtypes)) {
                                      );                          if (defined($srchtypes_desc->{$type})) {
                 $resulttext .= '<li>'.&mt("$title{'searchtypes'} set to: \"$srchtypes_desc{$env{'form.searchtypes'}}\"").'</li>';                              $chgtext .= $srchtypes_desc->{$type}.'; ';
                           }
                       }
                   }
                   $chgtext =~ s/\; $//;
                   $resulttext .= '<li>'.&mt("$title{'searchtypes'} set to: \"[_1]\"",$chgtext).'</li>';
             }              }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
         } else {          } else {
Line 2070  sub modify_directorysrch { Line 2601  sub modify_directorysrch {
         }          }
     } else {      } else {
         $resulttext = '<span class="LC_error">'.          $resulttext = '<span class="LC_error">'.
                         &mt('An error occurred: [_1]',$putresult).'</span>';
       }
       return $resulttext;
   }
   
   sub modify_contacts {
       my ($dom,%domconfig) = @_;
       my ($resulttext,%currsetting,%newsetting,%changes,%contacts_hash);
       if (ref($domconfig{'contacts'}) eq 'HASH') {
           foreach my $key (keys(%{$domconfig{'contacts'}})) {
               $currsetting{$key} = $domconfig{'contacts'}{$key};
           }
       }
       my (%others,%to);
       my @contacts = ('supportemail','adminemail');
       my @mailings = ('errormail','packagesmail','helpdeskmail');
       foreach my $type (@mailings) {
           @{$newsetting{$type}} = 
               &Apache::loncommon::get_env_multiple('form.'.$type);
           foreach my $item (@contacts) {
               if (grep(/^\Q$item\E$/,@{$newsetting{$type}})) {
                   $contacts_hash{contacts}{$type}{$item} = 1;
               } else {
                   $contacts_hash{contacts}{$type}{$item} = 0;
               }
           }  
           $others{$type} = $env{'form.'.$type.'_others'};
           $contacts_hash{contacts}{$type}{'others'} = $others{$type};
       }
       foreach my $item (@contacts) {
           $to{$item} = $env{'form.'.$item};
           $contacts_hash{'contacts'}{$item} = $to{$item};
       }
       if (keys(%currsetting) > 0) {
           foreach my $item (@contacts) {
               if ($to{$item} ne $currsetting{$item}) {
                   $changes{$item} = 1;
               }
           }
           foreach my $type (@mailings) {
               foreach my $item (@contacts) {
                   if (ref($currsetting{$type}) eq 'HASH') {
                       if ($currsetting{$type}{$item} ne $contacts_hash{contacts}{$type}{$item}) {
                           push(@{$changes{$type}},$item);
                       }
                   } else {
                       push(@{$changes{$type}},@{$newsetting{$type}});
                   }
               }
               if ($others{$type} ne $currsetting{$type}{'others'}) {
                   push(@{$changes{$type}},'others');
               }
           }
       } else {
           my %default;
           $default{'supportemail'} = $Apache::lonnet::perlvar{'lonSupportEMail'};
           $default{'adminemail'} = $Apache::lonnet::perlvar{'lonAdmEMail'};
           $default{'errormail'} = 'adminemail';
           $default{'packagesmail'} = 'adminemail';
           $default{'helpdeskmail'} = 'supportemail';
           foreach my $item (@contacts) {
              if ($to{$item} ne $default{$item}) {
                 $changes{$item} = 1;
              } 
           }
           foreach my $type (@mailings) {
               if ((@{$newsetting{$type}} != 1) || ($newsetting{$type}[0] ne $default{$type})) {
                  
                   push(@{$changes{$type}},@{$newsetting{$type}});
               }
               if ($others{$type} ne '') {
                   push(@{$changes{$type}},'others');
               } 
           }
       }
       my $putresult = &Apache::lonnet::put_dom('configuration',\%contacts_hash,
                                                $dom);
       if ($putresult eq 'ok') {
           if (keys(%changes) > 0) {
               my ($titles,$short_titles)  = &contact_titles();
               $resulttext = &mt('Changes made:').'<ul>';
               foreach my $item (@contacts) {
                   if ($changes{$item}) {
                       $resulttext .= '<li>'.$titles->{$item}.
                                       &mt(' set to: ').
                                       '<span class="LC_cusr_emph">'.
                                       $to{$item}.'</span></li>';
                   }
               }
               foreach my $type (@mailings) {
                   if (ref($changes{$type}) eq 'ARRAY') {
                       $resulttext .= '<li>'.$titles->{$type}.': ';
                       my @text;
                       foreach my $item (@{$newsetting{$type}}) {
                           push(@text,$short_titles->{$item});
                       }
                       if ($others{$type} ne '') {
                           push(@text,$others{$type});
                       }
                       $resulttext .= '<span class="LC_cusr_emph">'.
                                      join(', ',@text).'</span></li>';
                   }
               }
               $resulttext .= '</ul>';
           } else {
               $resulttext = &mt('No changes made to contact information.');
           }
       } else {
           $resulttext = '<span class="LC_error">'.
               &mt('An error occurred: [_1].',$putresult).'</span>';
       }
       return $resulttext;
   }
   
   sub modify_usercreation {
       my ($dom,%domconfig) = @_;
       my ($resulttext,%curr_usercreation,%changes,%authallowed);
       if (ref($domconfig{'usercreation'}) eq 'HASH') {
           foreach my $key (keys(%{$domconfig{'usercreation'}})) {
               $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 @cancreate = &Apache::loncommon::get_env_multiple('form.can_createuser');
       if (ref($curr_usercreation{'cancreate'}) eq 'ARRAY') {
           foreach my $type (@{$curr_usercreation{'cancreate'}}) {
               if (!grep(/^\Q$type\E$/,@cancreate)) {
                   push(@{$changes{'cancreate'}},$type);
               }
           }
           foreach my $type (@cancreate) {
               if (!grep(/^\Q$type\E$/,@{$curr_usercreation{'cancreate'}})) {
                   push(@{$changes{'cancreate'}},$type);
               }
           }
       } else {
           push(@{$changes{'cancreate'}},@cancreate);
       }
       if (ref($curr_usercreation{'username_rule'}) eq 'ARRAY') {
           foreach my $type (@{$curr_usercreation{'username_rule'}}) {
               if (!grep(/^\Q$type\E$/,@username_rule)) {
                   push(@{$changes{'username_rule'}},$type);
               }
           }
           foreach my $type (@username_rule) {
               if (!grep(/^\Q$type\E$/,@{$curr_usercreation{'username_rule'}})) {
                   push(@{$changes{'username_rule'}},$type);
               }
           }
       } else {
           push(@{$changes{'username_rule'}},@username_rule);
       }
   
       my @contexts = ('author','course','domain');
       my @authtypes = ('int','krb4','krb5','loc');
       my %authhash;
       foreach my $item (@contexts) {
           my @authallowed =  &Apache::loncommon::get_env_multiple('form.'.$item.'_auth');
           foreach my $auth (@authtypes) {
               if (grep(/^\Q$auth\E$/,@authallowed)) {
                   $authhash{$item}{$auth} = 1;
               } else {
                   $authhash{$item}{$auth} = 0;
               }
           }
       }
       if (ref($curr_usercreation{'authtypes'}) eq 'HASH') {
           foreach my $item (@contexts) {
               if (ref($curr_usercreation{'authtypes'}{$item}) eq 'HASH') {
                   foreach my $auth (@authtypes) {
                       if ($authhash{$item}{$auth} ne $curr_usercreation{'authtypes'}{$item}{$auth}) {
                           push(@{$changes{'authtypes'}},$item);
                           last;
                       }
                   }
               }
           }
       } else {
           foreach my $item (@contexts) {
               push(@{$changes{'authtypes'}},$item);
           }
       }
   
       my %usercreation_hash =  (
               usercreation => {
                                 cancreate     => \@cancreate,
                                 username_rule => \@username_rule,
                                 authtypes      => \%authhash,
                               }
               );
   
       my $putresult = &Apache::lonnet::put_dom('configuration',\%usercreation_hash,
                                                $dom);
       if ($putresult eq 'ok') {
           if (keys(%changes) > 0) {
               $resulttext = &mt('Changes made:').'<ul>';
               if (ref($changes{'cancreate'}) eq 'ARRAY') {
                   my $chgtext = '<ul>';
                   foreach my $type (@cancreate) {
                       $chgtext .= '<li>'.$title{$type}.'</li>';
                   }
                   $chgtext .= '</ul>';
                   if (@cancreate > 0) {
                       $resulttext .= '<li>'.&mt('Creation of new users is permitted by a Domain Coordinator, and also by other users when: ').$chgtext.'</li>';
                   } else {
                       $resulttext .= '<li>'.&mt("Creation of new users is now only allowed when the user's role is Domain Coordinator.").'</li>';
                   }
               }
               if (ref($changes{'username_rule'}) eq 'ARRAY') {
                   my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($dom);
                   my $chgtext = '<ul>';
                   foreach my $type (@username_rule) {
                       if (ref($rules->{$type}) eq 'HASH') {
                           $chgtext .= '<li>'.$rules->{$type}{'name'}.'</li>';
                       }
                   }
                   $chgtext .= '</ul>';
                   if (@username_rule > 0) {
                       $resulttext .= '<li>'.&mt('Usernames with the following formats are restricted to verified users in the institutional directory: ').$chgtext.'</li>';     
                   } else {
                       $resulttext .= '<li>'.&mt('There are now no username formats restricted to verified users in the institutional directory.').'</li>'; 
                   }
               }
               my %authname = &authtype_names();
               my %context_title = &context_names();
               if (ref($changes{'authtypes'}) eq 'ARRAY') {
                   my @unchanged;
                   my $chgtext = '<ul>';
                   foreach my $type (@{$changes{'authtypes'}}) {
                       my @allowed;
                       $chgtext .= '<li><span class="LC_cusr_emph">'.$context_title{$type}.'</span> - '.&mt('assignable authentication types: ');
                       foreach my $auth (@authtypes) {
                           if ($authhash{$type}{$auth}) {
                               push(@allowed,$authname{$auth});
                           }
                       }
                       $chgtext .= join(', ',@allowed).'</li>';
                   }
                   $chgtext .= '</ul>';
                   $resulttext .= '<li>'.&mt('Authentication types available for assignment to new users').'<br />'.$chgtext;
                   $resulttext .= '</li>';
               }
               $resulttext .= '</ul>';
           } else {
               $resulttext = &mt('No changes made to user creation settings');
           }
       } else {
           $resulttext = '<span class="LC_error">'.
             &mt('An error occurred: [_1]',$putresult).'</span>';              &mt('An error occurred: [_1]',$putresult).'</span>';
     }      }
     return $resulttext;      return $resulttext;
 }  }
   
 1;  1;
   

Removed from v.1.24  
changed lines
  Added in v.1.30


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