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

version 1.10, 2007/04/10 21:40:12 version 1.33, 2007/12/11 00:44:23
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'],$dom);                  'quotas','autoenroll','autoupdate','directorysrch',
     my @prefs = (                  'usercreation','usermodification','contacts'],$dom);
       { text => 'Default color schemes',      my @prefs_order = ('rolecolors','login','quotas','autoenroll',
         help => 'Default_Color_Schemes',                         'autoupdate','directorysrch','contacts',
         action => 'rolecolors',                         'usercreation','usermodification');
         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',
                                    col2 => 'Value',},
                                   {col1 => 'User Population',
                                    col2 => 'Updataeable user data'}],
                     },
           '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'}],
                     },
           'usermodification' => 
                     { text => 'User modification',
                       help => 'Domain_User_Modification',
                       header => [{col1 => 'Target user has role',
                                   col2 => 'User information updateable in author context'},
                                  {col1 => 'Target user has role',
                                   col2 => 'User information updateable in course context'}],
                     },
     );      );
     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);
         $r->print('<table border="0" width="100%" cellpadding="2" cellspacing="4"><tr><td align="left" valign="top" width="45%">');          if (keys(%domconfig) == 0) {
         foreach my $item (@prefs) {              my $primarylibserv = &Apache::lonnet::domain($dom,'primary');
             if ($item->{'action'} eq 'login') {              my @ids=&Apache::lonnet::current_machine_ids();
                 $r->print('</td><td width="6%">&nbsp;</td><td align="left" valign="top" width="47%">');              if (!grep(/^\Q$primarylibserv\E$/,@ids)) {
             }                  my %designhash = &Apache::loncommon::get_domainconf($dom);
             &print_config_box($r,$dom,$confname,$phase,$item->{'action'},                  my @loginimages = ('img','logo','domlogo');
                               $item,$domconfig{$item->{'action'}});                  my $custom_img_count = 0;
         }                  foreach my $img (@loginimages) {
         $r->print('                      if ($designhash{$dom.'.login.'.$img} ne '') {
       </td>                          $custom_img_count ++;
     </tr>                      }
    </table>');                  }
         &print_footer($r,$phase,'process','Store changes');                  foreach my $role (@roles) {
                       if ($designhash{$dom.'.'.$role.'.img'} ne '') {
                           $custom_img_count ++;
                       }
                   }
                   if ($custom_img_count > 0) {
                       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, (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;
                   }
               }
           }
           $r->print('<h3>'.&mt('Functionality to display/modify').'</h3>');
           $r->print('<script type="text/javascript">'."\n".
                 &Apache::loncommon::check_uncheck_jscript()."\n".
                 '</script>'."\n".'<p><input type="button" value="check all" '.
                 'onclick="javascript:checkAll(document.pickactions.actions)"'.
                 ' />&nbsp;&nbsp;'.
                 '<input type="button" value="uncheck all" '.
                 'onclick="javascript:uncheckAll(document.pickactions.actions)"'.
                 ' /></p>');
           foreach my $item (@prefs_order) {
               $r->print('<p><label><input type="checkbox" name="actions" value="'.$item.'" />&nbsp;'.$prefs{$item}->{'text'}.'</label></p>');
           }
           $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 164  sub process_changes { Line 310  sub process_changes {
         $output = &modify_autoenroll($dom,%domconfig);          $output = &modify_autoenroll($dom,%domconfig);
     } elsif ($action eq 'autoupdate') {      } elsif ($action eq 'autoupdate') {
         $output = &modify_autoupdate($dom,%domconfig);          $output = &modify_autoupdate($dom,%domconfig);
       } elsif ($action eq 'directorysrch') {
           $output = &modify_directorysrch($dom,%domconfig);
       } elsif ($action eq 'usercreation') {
           $output = &modify_usercreation($dom,%domconfig);
       } elsif ($action eq 'usermodification') {
           $output = &modify_usermodification($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 align="left"><span class="LC_nobreak">'.&mt($item->{text}).
            &Apache::loncommon::help_open_topic($item->{'help'}).'</th>             '&nbsp;</span></th></tr>';
           </tr>');  # 
     if (($action eq 'autoupdate') || ($action eq 'rolecolors')) {  # FIXME - put the help link back in when the help files exist
   #           <th>'.&mt($item->{text}).'&nbsp;'.
   #           &Apache::loncommon::help_open_topic($item->{'help'}).'</th>
   #          </tr>');
       $rowtotal ++;
       if (($action eq 'autoupdate') || ($action eq 'rolecolors') || 
           ($action eq 'usercreation') || ($action eq 'usermodification')) {
         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);
           } elsif ($action eq 'usermodification') {
               $output .= &print_usermodification('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 201  sub print_config_box { Line 367  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);
           } elsif ($action eq 'usermodification') {
               $output .= &print_usermodification('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 216  sub print_config_box { Line 387  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 227  sub print_config_box { Line 398  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') {          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') {
               $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::loncommon::viewport_size_js().'
 </script>  </script>
 ';  ';
       my $additem;
       if ($phase eq 'pickactions') {
           my %loaditems = (
                       'onload' => "javascript:getViewportDims(document.$phase.width,document.$phase.height);setDisplayColumns();setFormElements(document.pickactions);",
                           );
           $additem = {'add_entries' => \%loaditems,};
       } else {
           my %loaditems = (
                       'onload' => "javascript:getViewportDims(document.$phase.width,document.$phase.height);",
                           );
           $additem = {'add_entries' => \%loaditems,};
       }
     $r->print(&Apache::loncommon::start_page('View/Modify Domain Settings',      $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 289  function changePage(formname,newphase) { Line 505  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 406  sub print_login { Line 641  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 433  sub login_choices { Line 668  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 499  sub print_rolecolors { Line 734  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 519  sub display_color_options { Line 754  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}) {
         $itemcount ++;   $itemcount ++;
         $css_class = $itemcount%2?' class="LC_odd_row"':'';          $css_class = $itemcount%2?' class="LC_odd_row"':'';
         $datatable .= '<tr'.$css_class.'>'.          $datatable .= '<tr'.$css_class.'>'.
                       '<td>'.$choices->{$img}.'</td>';                        '<td>'.$choices->{$img}.'</td>';
         my $imgfile;          my ($imgfile, $img_import);
         if ($designs->{$img} ne '') {          if ($designs->{$img} ne '') {
             $imgfile = $designs->{$img};              $imgfile = $designs->{$img};
       $img_import = ($imgfile =~ m{^/adm/});
         } else {          } else {
             $imgfile = $defaults->{$img};              $imgfile = $defaults->{$img};
         }          }
Line 550  sub display_color_options { Line 788  sub display_color_options {
                     $showfile = '';                      $showfile = '';
                 }                  }
             } elsif ($imgfile =~ m-^/(adm/[^/]+)/([^/]+)$-) {              } elsif ($imgfile =~ m-^/(adm/[^/]+)/([^/]+)$-) {
                   $showfile = $imgfile;
                 my $imgdir = $1;                  my $imgdir = $1;
                 my $filename = $2;                  my $filename = $2;
                 if (-e "/home/httpd/html/$imgdir/tn-".$filename) {                  if (-e "/home/httpd/html/$imgdir/tn-".$filename) {
Line 559  sub display_color_options { Line 798  sub display_color_options {
                     my $output = '/home/httpd/html/'.$imgdir.'/tn-'.$filename;                      my $output = '/home/httpd/html/'.$imgdir.'/tn-'.$filename;
                     if (!-e $output) {                      if (!-e $output) {
                         my ($width,$height) = &thumb_dimensions();                          my ($width,$height) = &thumb_dimensions();
                         my $size = $width.'x'.$height;                          my ($fullwidth,$fullheight) = &check_dimensions($input);
                         system("convert -sample $size $input $output");                          if ($fullwidth ne '' && $fullheight ne '') {
                               if ($fullwidth > $width && $fullheight > $height) { 
                                   my $size = $width.'x'.$height;
                                   system("convert -sample $size $input $output");
                                   $showfile = '/'.$imgdir.'/tn-'.$filename;
                               }
                           }
                     }                      }
                     $showfile = '/'.$imgdir.'/tn-'.$filename;  
                 }                  }
             }               }
             if ($showfile) {              if ($showfile) {
                 $showfile = &Apache::loncommon::lonhttpdurl($showfile);                  $showfile = &Apache::loncommon::lonhttpdurl($showfile);
                 $fullsize =  &Apache::loncommon::lonhttpdurl($imgfile);                  $fullsize =  &Apache::loncommon::lonhttpdurl($imgfile);
Line 572  sub display_color_options { Line 816  sub display_color_options {
                 if (!$is_custom->{$img}) {                  if (!$is_custom->{$img}) {
                     $datatable .= &mt('Default in use:').'<br />';                      $datatable .= &mt('Default in use:').'<br />';
                 }                  }
    if ($img_import) {
       $datatable.= '<input type="hidden" name="'.$role.'_import_'.$img.'" value="'.$imgfile.'" />';
    }
                 $datatable.= '<a href="'.$fullsize.'" target="_blank"><img src="'.                  $datatable.= '<a href="'.$fullsize.'" target="_blank"><img src="'.
                              $showfile.'" alt="'.$alt_text->{$img}.                               $showfile.'" alt="'.$alt_text->{$img}.
                              '" border="0" /></a></td>';                               '" border="0" /></a></td>';
Line 604  sub display_color_options { Line 851  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 618  sub display_color_options { Line 865  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 631  sub display_color_options { Line 878  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 642  sub display_color_options { Line 889  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 692  ENDCOL Line 938  ENDCOL
 }  }
   
 sub print_quotas {  sub print_quotas {
     my ($dom,$settings) = @_;      my ($dom,$settings,$rowtotal) = @_;
     my $datatable;      my $datatable;
     my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom);      my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
     my $othertitle = "All users";  
     my @types;  
     if (ref($order) eq 'ARRAY') {  
         @types = @{$order};  
     }  
     if (@types == 0) {  
         if (ref($usertypes) eq 'HASH') {  
             @types = sort(keys(%{$usertypes}));  
         }  
     }  
     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 ++;
                 $css_class = $typecount%2?' class="LC_odd_row"':'';                  $css_class = $typecount%2?' class="LC_odd_row"':'';
Line 720  sub print_quotas { Line 956  sub print_quotas {
                               '" size="5" /> Mb</span></td></tr>';                                '" size="5" /> Mb</span></td></tr>';
             }              }
         }          }
         $othertitle = "Other users";  
     }      }
     my $defaultquota = '20';      my $defaultquota = '20';
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
Line 731  sub print_quotas { Line 966  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="default" 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 $defdom = $dom;  
     my $autorun = &Apache::lonnet::auto_run(undef,$dom),      my $autorun = &Apache::lonnet::auto_run(undef,$dom),
     my ($runon,$runoff);      my ($defdom,$runon,$runoff);
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         if (exists($settings->{'run'})) {          if (exists($settings->{'run'})) {
             if ($settings->{'run'} eq '0') {              if ($settings->{'run'} eq '0') {
Line 764  sub print_autoenroll { Line 999  sub print_autoenroll {
         if (exists($settings->{'sender_domain'})) {          if (exists($settings->{'sender_domain'})) {
             $defdom = $settings->{'sender_domain'};              $defdom = $settings->{'sender_domain'};
         }          }
       } else {
           if ($autorun) {
               $runon = ' checked="checked" ';
               $runoff = ' ';
           } else {
               $runoff = ' checked="checked" ';
               $runon = ' ';
           }
     }      }
     my $domform = &Apache::loncommon::select_dom_form($defdom,'sender_domain',1);      my $domform = &Apache::loncommon::select_dom_form($defdom,'sender_domain',1);
     my $datatable='<tr class="LC_odd_row">'.      my $datatable='<tr class="LC_odd_row">'.
Line 772  sub print_autoenroll { Line 1015  sub print_autoenroll {
                   '<input type="radio" name="autoenroll_run"'.                    '<input type="radio" name="autoenroll_run"'.
                   $runon.' value="1" />'.&mt('Yes').'</label>&nbsp;'.                    $runon.' value="1" />'.&mt('Yes').'</label>&nbsp;'.
                   '<label><input type="radio" name="autoenroll_run"'.                    '<label><input type="radio" name="autoenroll_run"'.
                   $runoff.'value="0" />'.&mt('No').'</label></span></td>'.                    $runoff.' value="0" />'.&mt('No').'</label></span></td>'.
                   '</tr><tr>'.                    '</tr><tr>'.
                   '<td>'.&mt('Notification messages - sender').                    '<td>'.&mt('Notification messages - sender').
                   '</td><td class="LC_right_item"><span class="LC_nobreak">'.                    '</td><td class="LC_right_item"><span class="LC_nobreak">'.
Line 781  sub print_autoenroll { Line 1024  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 821  sub print_autoupdate { Line 1065  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 ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom);          my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
         my @types;          my @fields = ('lastname','firstname','middlename','gen',
         if (ref($order) eq 'ARRAY') {                        'permanentemail','id');
             @types = @{$order};          my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
         }  
         if (@types == 0) {  
             if (ref($usertypes) eq 'HASH') {  
                 @types = sort(keys(%{$usertypes}));  
             }  
         }  
         my $othertitle = &mt('All users');  
         if (keys(%{$usertypes}) > 0) {  
             $othertitle = &mt('Other users');  
         }  
         my @fields = ('lastname','firstname','middlename','gen','email','id');  
         my %fieldtitles = &Apache::lonlocal::texthash (  
                             id => 'Student/Employee ID',  
                             email => 'E-mail address',  
                             lastname => 'Last Name',  
                             firstname => 'First Name',  
                             middlename => 'Middle Name',  
                             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 {
       my ($dom,$settings,$rowtotal) = @_;
       my $srchon = ' ';
       my $srchoff = ' checked="checked" ';
       my ($exacton,$containson,$beginson);
       my $localon = ' ';
       my $localoff = ' checked="checked" ';
       if (ref($settings) eq 'HASH') {
           if ($settings->{'available'} eq '1') {
               $srchon = $srchoff;
               $srchoff = ' ';
           }
           if ($settings->{'localonly'} eq '1') {
               $localon = $localoff;
               $localoff = ' ';
           }
           if (ref($settings->{'searchtypes'}) eq 'ARRAY') {
               foreach my $type (@{$settings->{'searchtypes'}}) {
                   if ($type eq 'exact') {
                       $exacton = ' checked="checked" ';
                   } elsif ($type eq 'contains') {
                       $containson = ' checked="checked" ';
                   } 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 ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
   
       my $numinrow = 4;
       my $cansrchrow = 0;
       my $datatable='<tr class="LC_odd_row">'.
                     '<td colspan="2"><span class ="LC_nobreak">'.&mt('Directory search available?').'</span></td>'.
                     '<td class="LC_right_item"><span class="LC_nobreak"><label>'.
                     '<input type="radio" name="dirsrch_available"'.
                     $srchon.' value="1" />'.&mt('Yes').'</label>&nbsp;'.
                     '<label><input type="radio" name="dirsrch_available"'.
                     $srchoff.' value="0" />'.&mt('No').'</label></span></td>'.
                     '</tr><tr>'.
                     '<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="dirsrch_localonly"'.
                     $localoff.' value="0" />'.&mt('Yes').'</label>&nbsp;'.
                     '<label><input type="radio" name="dirsrch_localonly"'.
                     $localon.' value="1" />'.&mt('No').'</label></span></td>'.
                     '</tr>';
       $$rowtotal += 2;
       if (ref($usertypes) eq 'HASH') {
           if (keys(%{$usertypes}) > 0) {
               $datatable .= &users_cansearch_row($settings,$types,$usertypes,$dom,
                                                  $numinrow,$othertitle);
               $cansrchrow = 1;
           }
       }
       if ($cansrchrow) {
           $$rowtotal ++;
           $datatable .= '<tr>';
       } else {
           $datatable .= '<tr class="LC_odd_row">';
       }
       $datatable .= '<td><span class ="LC_nobreak">'.&mt('Supported search methods').
                     '</span></td><td class="LC_left_item" colspan="2"><table><tr>';
       foreach my $title (@{$titleorder}) {
           if (defined($searchtitles->{$title})) {
               my $check = ' ';
               if (ref($settings->{'searchby'}) eq 'ARRAY') {
                   if (grep(/^\Q$title\E$/,@{$settings->{'searchby'}})) {
                       $check = ' checked="checked" ';
                   }
               }
               $datatable .= '<td class="LC_left_item">'.
                             '<span class="LC_nobreak"><label>'.
                             '<input type="checkbox" name="searchby" '.
                             'value="'.$title.'"'.$check.'/>'.
                             $searchtitles->{$title}.'</label></span></td>';
           }
       }
       $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 $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 ++;
           my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($dom,'username');
           my $rowcount = 0;
           if (ref($rules) eq 'HASH') {
               if (keys(%{$rules}) > 0) {
                   $datatable .= &user_formats_row('username',$settings,$rules,
                                                   $ruleorder,$numinrow,$rowcount);
                   $$rowtotal ++;
                   $rowcount ++;
               }
           }
           my ($idrules,$idruleorder) = &Apache::lonnet::inst_userrules($dom,'id');
           if (ref($idrules) eq 'HASH') {
               if (keys(%{$idrules}) > 0) {
                   $datatable .= &user_formats_row('id',$settings,$idrules,
                                                   $idruleorder,$numinrow,$rowcount);
                   $$rowtotal ++;
                   $rowcount ++;
               }
           }
       } 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;
   }
   
   sub user_formats_row {
       my ($type,$settings,$rules,$ruleorder,$numinrow,$rowcount) = @_;
       my $output;
       my %text = (
                      'username' => 'new usernames',
                      'id'       => 'IDs',
                  );
       my $css_class = $rowcount%2?' class="LC_odd_row"':'';
       $output = '<tr '.$css_class.'>'.
                 '<td><span class="LC_nobreak">'.
                 &mt("Format rules to check for $text{$type}: ").
                 '</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->{$type.'_rule'}) eq 'ARRAY') {
                       if (grep(/^\Q$ruleorder->[$i]\E$/,@{$settings->{$type.'_rule'}})) {
                           $check = ' checked="checked" ';
                       }
                   }
                   $output .= '<td class="LC_left_item">'.
                              '<span class="LC_nobreak"><label>'.
                              '<input type="checkbox" name="'.$type.'_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 print_usermodification {
       my ($position,$dom,$settings,$rowtotal) = @_;
       my $numinrow = 4;
       my ($context,$datatable,$rowcount);
       if ($position eq 'top') {
           $rowcount = 0;
           $context = 'author'; 
           foreach my $role ('ca','aa') {
               $datatable .= &modifiable_userdata_row($context,$role,$settings,
                                                      $numinrow,$rowcount);
               $$rowtotal ++;
               $rowcount ++;
           }
       } else {
           $context = 'course';
           $rowcount = 0;
           foreach my $role ('st','ep','ta','in','cr') {
               $datatable .= &modifiable_userdata_row($context,$role,$settings,
                                                      $numinrow,$rowcount);
               $$rowtotal ++;
               $rowcount ++;
           }
       }
       return $datatable;
   }
   
   sub modifiable_userdata_row {
       my ($context,$role,$settings,$numinrow,$rowcount) = @_;
       my $rolename;
       if ($role eq 'cr') {
           $rolename = &mt('Custom role');
       } else {
           $rolename = &Apache::lonnet::plaintext($role);
       }
       my @fields = ('lastname','firstname','middlename','generation',
                     'permanentemail','id');
       my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
       my $output;
       my $css_class = $rowcount%2?' class="LC_odd_row"':'';
       $output = '<tr '.$css_class.'>'.
                 '<td><span class="LC_nobreak">'.$rolename.'</span></td>'.
                 '<td class="LC_left_item" colspan="2"><table>';
       my $rem;
       my %checks;
       if (ref($settings) eq 'HASH') {
           if (ref($settings->{$context}) eq 'HASH') {
               if (ref($settings->{$context}->{$role}) eq 'HASH') {
                   foreach my $field (@fields) {
                       if ($settings->{$context}->{$role}->{$field}) {
                           $checks{$field} = ' checked="checked" ';
                       }
                   }
               }
           }
       }
       for (my $i=0; $i<@fields; $i++) {
           my $rem = $i%($numinrow);
           if ($rem == 0) {
               if ($i > 0) {
                   $output .= '</tr>';
               }
               $output .= '<tr>';
           }
           my $check = ' ';
           if (exists($checks{$fields[$i]})) {
               $check = $checks{$fields[$i]}
           } else {
               if ($role eq 'st') {
                   if (ref($settings) ne 'HASH') {
                       $check = ' checked="checked" '; 
                   }
               }
           }
           $output .= '<td class="LC_left_item">'.
                      '<span class="LC_nobreak"><label>'.
                      '<input type="checkbox" name="canmodify_'.$role.'" '.
                      'value="'.$fields[$i].'"'.$check.'/>'.$fieldtitles{$fields[$i]}.
                      '</label></span></td>';
           $rem = @fields%($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 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 {
       my ($dom) = @_;
       my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom);
       my $othertitle = &mt('All users');
       my @types;
       if (ref($order) eq 'ARRAY') {
           @types = @{$order};
       }
       if (@types == 0) {
           if (ref($usertypes) eq 'HASH') {
               @types = sort(keys(%{$usertypes}));
           }
       }
       if (keys(%{$usertypes}) > 0) {
           $othertitle = &mt('Other users');
       }
       return ($othertitle,$usertypes,\@types);
   }
   
   sub sorted_searchtitles {
       my %searchtitles = &Apache::lonlocal::texthash(
                            'uname' => 'username',
                            'lastname' => 'last name',
                            'lastfirst' => 'last name, first name',
                        );
       my @titleorder = ('uname','lastname','lastfirst');
       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 951  sub modify_login { Line 1730  sub modify_login {
             $resulttext = &mt('No changes made to log-in page settings');              $resulttext = &mt('No changes made to log-in page settings');
         }          }
     } else {      } else {
         $resulttext = &mt('An error occurred: [_1]',$putresult);          $resulttext = '<span class="LC_error">'.
       &mt('An error occurred: [_1]',$putresult).'</span>';
     }      }
     if ($errors) {      if ($errors) {
         $resulttext .= '<br />'.&mt('The following errors occurred: ').'<ul>'.          $resulttext .= '<br />'.&mt('The following errors occurred: ').'<ul>'.
Line 993  sub modify_rolecolors { Line 1773  sub modify_rolecolors {
             $resulttext = &mt('No changes made to default color schemes');              $resulttext = &mt('No changes made to default color schemes');
         }          }
     } else {      } else {
         $resulttext = &mt('An error occurred: [_1]',$putresult);          $resulttext = '<span class="LC_error">'.
       &mt('An error occurred: [_1]',$putresult).'</span>';
     }      }
     if ($errors) {      if ($errors) {
         $resulttext .= &mt('The following errors occurred: ').'<ul>'.          $resulttext .= &mt('The following errors occurred: ').'<ul>'.
Line 1004  sub modify_rolecolors { Line 1785  sub modify_rolecolors {
   
 sub modify_colors {  sub modify_colors {
     my ($r,$dom,$confname,$roles,$domconfig,$confhash) = @_;      my ($r,$dom,$confname,$roles,$domconfig,$confhash) = @_;
     my %changes;      my (%changes,%choices);
     my @bgs = ('pgbg','mainbg','sidebg');      my @bgs = ('pgbg','mainbg','sidebg');
     my @links = ('link','alink','vlink');      my @links = ('link','alink','vlink');
     my @images;      my @images;
Line 1012  sub modify_colors { Line 1793  sub modify_colors {
     my $errors;      my $errors;
     foreach my $role (@{$roles}) {      foreach my $role (@{$roles}) {
         if ($role eq 'login') {          if ($role eq 'login') {
               %choices = &login_choices();
           } else {
               %choices = &color_font_choices();
           }
           if ($role eq 'login') {
             @images = ('img','logo','domlogo');              @images = ('img','logo','domlogo');
         } else {          } else {
             @images = ('img');              @images = ('img');
Line 1032  sub modify_colors { Line 1818  sub modify_colors {
         }          }
         my ($width,$height) = &thumb_dimensions();          my ($width,$height) = &thumb_dimensions();
         foreach my $img (@images) {          foreach my $img (@images) {
       if ( ! $env{'form.'.$role.'_'.$img.'.filename'} 
    && !defined($domconfig->{$role}{$img})
    && !$env{'form.'.$role.'_del_'.$img}
    && $env{'form.'.$role.'_import_'.$img}) {
    # import the old configured image from the .tab setting
    # if they haven't provided a new one 
    $domconfig->{$role}{$img} = 
       $env{'form.'.$role.'_import_'.$img};
       }
             if ($env{'form.'.$role.'_'.$img.'.filename'} ne '') {              if ($env{'form.'.$role.'_'.$img.'.filename'} ne '') {
                 my $error;                  my $error;
                 if ($configuserok eq 'ok') {                  if ($configuserok eq 'ok') {
                     if ($switchserver) {                      if ($switchserver) {
                         $error = &mt("Upload of image [_1] for $role page(s) is not permitted to this server: [_2]",$img,$switchserver);                          $error = &mt("Upload of [_1] image for $role page(s) is not permitted to this server: [_2]",$choices{$img},$switchserver);
                     } else {                      } else {
                         if ($author_ok eq 'ok') {                          if ($author_ok eq 'ok') {
                             my ($result,$logourl) =                               my ($result,$logourl) = 
Line 1044  sub modify_colors { Line 1839  sub modify_colors {
                                            $dom,$confname,$img,$width,$height);                                             $dom,$confname,$img,$width,$height);
                             if ($result eq 'ok') {                              if ($result eq 'ok') {
                                 $confhash->{$role}{$img} = $logourl;                                  $confhash->{$role}{$img} = $logourl;
                                 $changes{$role}{$img} = 1;                                  $changes{$role}{'images'}{$img} = 1;
                             } else {                              } else {
                                 $error = &mt("Upload of image [_1] for $role page(s) failed because an error occurred publshing the file in RES space. Error was: [_2].",$img,$result);                                  $error = &mt("Upload of [_1] image for $role page(s) failed because an error occurred publishing the file in RES space. Error was: [_2].",$choices{img},$result);
                             }                              }
                         } else {                          } else {
                             $error = &mt("Upload of image [_1] for $role page(s) failed because an author role could not be assigned to a Domain Configuation user ([_2]) in domain: [_3].  Error was: [_4].",$img,$confname,$dom,$author_ok);                              $error = &mt("Upload of [_1] image for $role page(s) failed because an author role could not be assigned to a Domain Configuation user ([_2]) in domain: [_3].  Error was: [_4].",$choices{$img},$confname,$dom,$author_ok);
                         }                          }
                     }                      }
                 } else {                  } else {
                     $error = &mt("Upload of image [_1] for $role page(s) failed because a Domain Configuation user ([_2]) could not be created in domain: [_3].  Error was: [_4].",$img,$confname,$dom,$configuserok);                      $error = &mt("Upload of [_1] image for $role page(s) failed because a Domain Configuation user ([_2]) could not be created in domain: [_3].  Error was: [_4].",$choices{$img},$confname,$dom,$configuserok);
                 }                  }
                 if ($error) {                  if ($error) {
                     &Apache::lonnet::logthis($error);                      &Apache::lonnet::logthis($error);
                     $errors .= '<li>'.$error.'</li>';                      $errors .= '<li><span class="LC_error">'.$error.'</span></li>';
                 }                  }
             } elsif ($domconfig->{$role}{$img} ne '') {              } elsif ($domconfig->{$role}{$img} ne '') {
                 if ($domconfig->{$role}{$img} !~ m-^(/res/\Q$dom\E/\Q$confname\E/\Q$img\E)/([^/]+)$-) {                  if ($domconfig->{$role}{$img} !~ m-^(/res/\Q$dom\E/\Q$confname\E/\Q$img\E)/([^/]+)$-) {
Line 1071  sub modify_colors { Line 1866  sub modify_colors {
                                             $dom,$confname,$img,$width,$height);                                              $dom,$confname,$img,$width,$height);
                                 if ($result eq 'ok') {                                  if ($result eq 'ok') {
                                     $confhash->{$role}{$img} = $logourl;                                      $confhash->{$role}{$img} = $logourl;
       $changes{$role}{'images'}{$img} = 1;
                                 }                                  }
                             }                              }
                         }                          }
Line 1084  sub modify_colors { Line 1880  sub modify_colors {
                     if ($domconfig->{$role}{$img} ne '') {                      if ($domconfig->{$role}{$img} ne '') {
                         if ($env{'form.'.$role.'_del_'.$img}) {                          if ($env{'form.'.$role.'_del_'.$img}) {
                             $confhash->{$role}{$img} = '';                              $confhash->{$role}{$img} = '';
                             $changes{$role}{$img} = 1;                              $changes{$role}{'images'}{$img} = 1;
                         } else {                          } else {
                             if ($confhash->{$role}{$img} eq '') {                              if ($confhash->{$role}{$img} eq '') {
                                 $confhash->{$role}{$img} = $domconfig->{$role}{$img};                                  $confhash->{$role}{$img} = $domconfig->{$role}{$img};
Line 1093  sub modify_colors { Line 1889  sub modify_colors {
                     } else {                      } else {
                         if ($env{'form.'.$role.'_del_'.$img}) {                          if ($env{'form.'.$role.'_del_'.$img}) {
                             $confhash->{$role}{$img} = '';                              $confhash->{$role}{$img} = '';
                             $changes{$role}{$img} = 1;                              $changes{$role}{'images'}{$img} = 1;
                         }                           } 
                     }                      }
                 }                    }  
Line 1155  sub default_change_checker { Line 1951  sub default_change_checker {
     foreach my $img (@{$images}) {      foreach my $img (@{$images}) {
         if ($env{'form.'.$role.'_del_'.$img}) {          if ($env{'form.'.$role.'_del_'.$img}) {
             $confhash->{$role}{$img} = '';              $confhash->{$role}{$img} = '';
             $changes->{$role}{$img} = 1;              $changes->{$role}{'images'}{$img} = 1;
         }          }
     }      }
     if ($confhash->{$role}{'font'}) {      if ($confhash->{$role}{'font'}) {
Line 1192  sub display_colorchgs { Line 1988  sub display_colorchgs {
                         if ($confhash->{$role}{$item} eq '') {                          if ($confhash->{$role}{$item} eq '') {
                             $resulttext .= '<li>'.&mt("$choices{$item} set to default").'</li>';                              $resulttext .= '<li>'.&mt("$choices{$item} set to default").'</li>';
                         } else {                          } else {
                             $resulttext .= '<li>'.&mt("$choices{$item} set to [_1]",$confhash->{$role}{$item}).'</li>';                              my $newitem = $confhash->{$role}{$item};
                               if ($key eq 'images') {
                                   $newitem = '<img src="'.$confhash->{$role}{$item}.'" alt="'.$choices{$item}.'" valign="bottom" />';
                               }
                               $resulttext .= '<li>'.&mt("$choices{$item} set to [_1]",$newitem).'</li>';
                         }                          }
                     }                      }
                     if ($role ne 'login') {                      if ($role ne 'login') {
Line 1218  sub thumb_dimensions { Line 2018  sub thumb_dimensions {
     return ('200','50');      return ('200','50');
 }  }
   
   sub check_dimensions {
       my ($inputfile) = @_;
       my ($fullwidth,$fullheight);
       if ($inputfile =~ m|^[/\w.\-]+$|) {
           if (open(PIPE,"identify $inputfile 2>&1 |")) {
               my $imageinfo = <PIPE>;
               if (!close(PIPE)) {
                   &Apache::lonnet::logthis("Failed to close PIPE opened to retrieve image information for $inputfile");
               }
               chomp($imageinfo);
               my ($fullsize) = 
                   ($imageinfo =~ /^\Q$inputfile\E\s+\w+\s+(\d+x\d+)/);
               if ($fullsize) {
                   ($fullwidth,$fullheight) = split(/x/,$fullsize);
               }
           }
       }
       return ($fullwidth,$fullheight);
   }
   
 sub check_configuser {  sub check_configuser {
     my ($uhome,$dom,$confname,$servadm) = @_;      my ($uhome,$dom,$confname,$servadm) = @_;
     my ($configuserok,%currroles);      my ($configuserok,%currroles);
Line 1350  $env{'user.name'}.':'.$env{'user.domain' Line 2170  $env{'user.name'}.':'.$env{'user.domain'
             if (($thumbwidth =~ /^\d+$/) && ($thumbheight =~ /^\d+$/)) {              if (($thumbwidth =~ /^\d+$/) && ($thumbheight =~ /^\d+$/)) {
                 my $inputfile = $filepath.'/'.$file;                  my $inputfile = $filepath.'/'.$file;
                 my $outfile = $filepath.'/'.'tn-'.$file;                  my $outfile = $filepath.'/'.'tn-'.$file;
                 my $thumbsize = $thumbwidth.'x'.$thumbheight;                  my ($fullwidth,$fullheight) = &check_dimensions($inputfile);
                 system("convert -sample $thumbsize $inputfile $outfile");                  if ($fullwidth ne '' && $fullheight ne '') { 
                 chmod(0660, $filepath.'/tn-'.$file);                      if ($fullwidth > $thumbwidth && $fullheight > $thumbheight) {
                 if (-e $outfile) {                          my $thumbsize = $thumbwidth.'x'.$thumbheight;
                     my $copyfile=$targetdir.'/tn-'.$file;                          system("convert -sample $thumbsize $inputfile $outfile");
                     if (copy($outfile,$copyfile)) {                          chmod(0660, $filepath.'/tn-'.$file);
                         print $logfile "\nCopied source to ".$copyfile."\n";                          if (-e $outfile) {
                         &write_metadata($dom,$confname,$formname,$targetdir,                              my $copyfile=$targetdir.'/tn-'.$file;
                                         'tn-'.$file,$logfile);                              if (copy($outfile,$copyfile)) {
                     } else {                                  print $logfile "\nCopied source to ".$copyfile."\n";
                         print $logfile "\nUnable to write ".$copyfile.':'.$!."\n";                                  &write_metadata($dom,$confname,$formname,
                                                   $targetdir,'tn-'.$file,$logfile);
                               } else {
                                   print $logfile "\nUnable to write ".$copyfile.
                                                  ':'.$!."\n";
                               }
                           }
                     }                      }
                 }                  }
             }              }
Line 1461  sub check_switchserver { Line 2287  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_(.+)$/) {
             $formhash{$1} = $env{$key};              $formhash{$1} = $env{$key};
         }          }
     }      }
       $formhash{'default'} = $env{'form.defaultquota'};
     if (ref($domconfig{'quotas'}) eq 'HASH') {      if (ref($domconfig{'quotas'}) eq 'HASH') {
         foreach my $key (keys(%{$domconfig{'quotas'}})) {          foreach my $key (keys(%{$domconfig{'quotas'}})) {
             if (exists($formhash{$key})) {              if (exists($formhash{$key})) {
Line 1498  sub modify_quotas { Line 2336  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 {
             $resulttext = &mt('No changes made to default quotas');              $resulttext = &mt('No changes made to default quotas');
         }          }
     } else {      } else {
         $resulttext = &mt('An error occurred: [_1]',$putresult);          $resulttext = '<span class="LC_error">'.
       &mt('An error occurred: [_1]',$putresult).'</span>';
     }      }
     return $resulttext;      return $resulttext;
 }  }
Line 1524  sub modify_autoenroll { Line 2369  sub modify_autoenroll {
     my %title = ( run => 'Auto-enrollment active',      my %title = ( run => 'Auto-enrollment active',
                   sender => 'Sender for notification messages');                    sender => 'Sender for notification messages');
     my @offon = ('off','on');      my @offon = ('off','on');
       my $sender_uname = $env{'form.sender_uname'};
       my $sender_domain = $env{'form.sender_domain'};
       if ($sender_domain eq '') {
           $sender_uname = '';
       } elsif ($sender_uname eq '') {
           $sender_domain = '';
       }
     my %autoenrollhash =  (      my %autoenrollhash =  (
                        autoenroll => { run => $env{'form.autoenroll_run'},                         autoenroll => { run => $env{'form.autoenroll_run'},
                                        sender_uname => $env{'form.sender_uname'},                                         sender_uname => $sender_uname,
                                        sender_domain => $env{'form.sender_domain'},                                         sender_domain => $sender_domain,
   
                                 }                                  }
                      );                       );
Line 1540  sub modify_autoenroll { Line 2392  sub modify_autoenroll {
              }               }
         } elsif ($autorun) {          } elsif ($autorun) {
             if ($env{'form.autoenroll_run'} ne '1') {              if ($env{'form.autoenroll_run'} ne '1') {
                 $changes{'run'} = 1;                   $changes{'run'} = 1;
             }              }
         }          }
         if (exists($currautoenroll{sender_uname})) {          if ($currautoenroll{'sender_uname'} ne $sender_uname) {
             if ($currautoenroll{'sender_uname'} ne $env{'form.sender_uname'}) {  
                 $changes{'sender'} = 1;  
             }  
         } else {  
             $changes{'sender'} = 1;              $changes{'sender'} = 1;
         }          }
         if (exists($currautoenroll{sender_domain})) {          if ($currautoenroll{'sender_domain'} ne $sender_domain) {
             if ($currautoenroll{'sender_domain'} ne $env{'form.sender_domain'}) {  
                 $changes{'sender'} = 1;  
             }  
         } else {  
             $changes{'sender'} = 1;              $changes{'sender'} = 1;
         }          }
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
Line 1563  sub modify_autoenroll { Line 2407  sub modify_autoenroll {
                 $resulttext .= '<li>'.&mt("$title{'run'} set to $offon[$env{'form.autoenroll_run'}]").'</li>';                  $resulttext .= '<li>'.&mt("$title{'run'} set to $offon[$env{'form.autoenroll_run'}]").'</li>';
             }              }
             if ($changes{'sender'}) {              if ($changes{'sender'}) {
                 $resulttext .= '<li>'.&mt("$title{'sender'} set to [_1]",$env{'form.sender_uname'}.':'.$env{'form.sender_domain'}).'</li>';                  if ($sender_uname eq '' || $sender_domain eq '') {
                       $resulttext .= '<li>'.&mt("$title{'sender'} set to default (course owner).").'</li>';
                   } else {
                       $resulttext .= '<li>'.&mt("$title{'sender'} set to [_1]",$sender_uname.':'.$sender_domain).'</li>';
                   }
             }              }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
         } else {          } else {
             $resulttext = &mt('No changes made to auto-enrollment settings');              $resulttext = &mt('No changes made to auto-enrollment settings');
         }          }
     } else {      } else {
         $resulttext = &mt('An error occurred: [_1]',$putresult);          $resulttext = '<span class="LC_error">'.
       &mt('An error occurred: [_1]',$putresult).'</span>';
     }      }
     return $resulttext;      return $resulttext;
 }  }
Line 1588  sub modify_autoupdate { Line 2437  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',
                         email => 'E-mail address',                          permanentemail => 'E-mail address',
                         lastname => 'Last Name',                          lastname => 'Last Name',
                         firstname => 'First Name',                          firstname => 'First Name',
                         middlename => 'Middle Name',                          middlename => 'Middle Name',
Line 1599  sub modify_autoupdate { Line 2448  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 1621  sub modify_autoupdate { Line 2470  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 1636  sub modify_autoupdate { Line 2485  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 1669  sub modify_autoupdate { Line 2520  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 1689  sub modify_autoupdate { Line 2540  sub modify_autoupdate {
             $resulttext = &mt('No changes made to autoupdates');              $resulttext = &mt('No changes made to autoupdates');
         }          }
     } else {      } else {
         $resulttext = &mt('An error occurred: [_1]',$putresult);          $resulttext = '<span class="LC_error">'.
       &mt('An error occurred: [_1]',$putresult).'</span>';
     }      }
     return $resulttext;      return $resulttext;
 }  }
   
 1;  sub modify_directorysrch {
       my ($dom,%domconfig) = @_;
       my ($resulttext,%changes);
       my %currdirsrch;
       if (ref($domconfig{'directorysrch'}) eq 'HASH') {
           foreach my $key (keys(%{$domconfig{'directorysrch'}})) {
               $currdirsrch{$key} = $domconfig{'directorysrch'}{$key};
           }
       }
       my %title = ( available => 'Directory search available',
                     localonly => 'Other domains can search',
                     searchby => 'Search types',
                     searchtypes => 'Search latitude');
       my @offon = ('off','on');
       my @otherdoms = ('Yes','No');
   
       my @searchtypes = &Apache::loncommon::get_env_multiple('form.searchtypes');  
       my @cansearch = &Apache::loncommon::get_env_multiple('form.cansearch');
       my @searchby = &Apache::loncommon::get_env_multiple('form.searchby');
   
       my ($othertitle,$usertypes,$types) = &sorted_inst_types($dom);
       if (keys(%{$usertypes}) == 0) {
           @cansearch = ('default');
       } 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) {
                   if (!grep(/^\Q$type\E$/,@{$currdirsrch{'cansearch'}})) {
                       push(@{$changes{'cansearch'}},$type);
                   }
               }
           } else {
               push(@{$changes{'cansearch'}},@cansearch);
           }
       }
   
       if (ref($currdirsrch{'searchby'}) eq 'ARRAY') {
           foreach my $by (@{$currdirsrch{'searchby'}}) {
               if (!grep(/^\Q$by\E$/,@searchby)) {
                   push(@{$changes{'searchby'}},$by);
               }
           }
           foreach my $by (@searchby) {
               if (!grep(/^\Q$by\E$/,@{$currdirsrch{'searchby'}})) {
                   push(@{$changes{'searchby'}},$by);
               }
           }
       } else {
           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 =  (
               directorysrch => { available => $env{'form.dirsrch_available'},
                                  cansearch => \@cansearch,
                                  localonly => $env{'form.dirsrch_localonly'},
                                  searchby => \@searchby,
                                  searchtypes => \@searchtypes,
                                }
               );
       my $putresult = &Apache::lonnet::put_dom('configuration',\%dirsrch_hash,
                                                $dom);
       if ($putresult eq 'ok') {
           if (exists($currdirsrch{'available'})) {
                if ($currdirsrch{'available'} ne $env{'form.dirsrch_available'}) {
                    $changes{'available'} = 1;
                }
           } else {
               if ($env{'form.dirsrch_available'} eq '1') {
                   $changes{'available'} = 1;
               }
           }
           if (exists($currdirsrch{'localonly'})) {
                if ($currdirsrch{'localonly'} ne $env{'form.dirsrch_localonly'}) {
                    $changes{'localonly'} = 1;
                }
           } else {
               if ($env{'form.dirsrch_localonly'} eq '1') {
                   $changes{'localonly'} = 1;
               }
           }
           if (keys(%changes) > 0) {
               $resulttext = &mt('Changes made:').'<ul>';
               if ($changes{'available'}) {
                   $resulttext .= '<li>'.&mt("$title{'available'} set to: $offon[$env{'form.dirsrch_available'}]").'</li>';
               }
               if ($changes{'localonly'}) {
                   $resulttext .= '<li>'.&mt("$title{'localonly'} set to: $otherdoms[$env{'form.dirsrch_localonly'}]").'</li>';
               }
   
               if (ref($changes{'cansearch'}) eq 'ARRAY') {
                   my $chgtext;
                   if (ref($usertypes) eq 'HASH') {
                       if (keys(%{$usertypes}) > 0) {
                           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 (ref($changes{'searchby'}) eq 'ARRAY') {
                   my ($searchtitles,$titleorder) = &sorted_searchtitles();
                   my $chgtext;
                   foreach my $type (@{$titleorder}) {
                       if (grep(/^\Q$type\E$/,@searchby)) {
                           if (defined($searchtitles->{$type})) {
                               $chgtext .= $searchtitles->{$type}.'; ';
                           }
                       }
                   }
                   $chgtext =~ s/\; $//;
                   $resulttext .= '<li>'.&mt("$title{'searchby'} set to: [_1]",$chgtext).'</li>';
               }
               if (ref($changes{'searchtypes'}) eq 'ARRAY') {
                   my ($srchtypes_desc,$srchtypeorder) = &sorted_searchtypes(); 
                   my $chgtext;
                   foreach my $type (@{$srchtypeorder}) {
                       if (grep(/^\Q$type\E$/,@searchtypes)) {
                           if (defined($srchtypes_desc->{$type})) {
                               $chgtext .= $srchtypes_desc->{$type}.'; ';
                           }
                       }
                   }
                   $chgtext =~ s/\; $//;
                   $resulttext .= '<li>'.&mt("$title{'searchtypes'} set to: \"[_1]\"",$chgtext).'</li>';
               }
               $resulttext .= '</ul>';
           } else {
               $resulttext = &mt('No changes made to institution directory search settings');
           }
       } else {
           $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 @id_rule = &Apache::loncommon::get_env_multiple('form.id_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);
       }
   
       if (ref($curr_usercreation{'id_rule'}) eq 'ARRAY') {
           foreach my $type (@{$curr_usercreation{'id_rule'}}) {
               if (!grep(/^\Q$type\E$/,@id_rule)) {
                   push(@{$changes{'id_rule'}},$type);
               }
           }
           foreach my $type (@id_rule) {
               if (!grep(/^\Q$type\E$/,@{$curr_usercreation{'id_rule'}})) {
                   push(@{$changes{'id_rule'}},$type);
               }
           }
       } else {
           push(@{$changes{'id_rule'}},@id_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,
                                 id_rule       => \@id_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,'username');
                   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>'; 
                   }
               }
               if (ref($changes{'id_rule'}) eq 'ARRAY') {
                   my ($idrules,$idruleorder) = 
                       &Apache::lonnet::inst_userrules($dom,'id');
                   my $chgtext = '<ul>';
                   foreach my $type (@id_rule) {
                       if (ref($idrules->{$type}) eq 'HASH') {
                           $chgtext .= '<li>'.$idrules->{$type}{'name'}.'</li>';
                       }
                   }
                   $chgtext .= '</ul>';
                   if (@id_rule > 0) {
                       $resulttext .= '<li>'.&mt('IDs with the following formats are restricted to verified users in the institutional directory: ').$chgtext.'</li>';
                   } else {
                       $resulttext .= '<li>'.&mt('There are now no ID 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 $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>';
       }
       return $resulttext;
   }
   
   sub modify_usermodification {
       my ($dom,%domconfig) = @_;
       my ($resulttext,%curr_usermodification,%changes);
       if (ref($domconfig{'usermodification'}) eq 'HASH') {
           foreach my $key (keys(%{$domconfig{'usermodification'}})) {
               $curr_usermodification{$key} = $domconfig{'usermodification'}{$key};
           }
       }
       my @contexts = ('author','course');
       my %context_title = (
                              author => 'In author context',
                              course => 'In course context',
                           );
       my @fields = ('lastname','firstname','middlename','generation',
                     'permanentemail','id');
       my %roles = (
                     author => ['ca','aa'],
                     course => ['st','ep','ta','in','cr'],
                   );
       my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
       my %modifyhash;
       foreach my $context (@contexts) {
           foreach my $role (@{$roles{$context}}) {
               my @modifiable =  &Apache::loncommon::get_env_multiple('form.canmodify_'.$role);
               foreach my $item (@fields) {
                   if (grep(/^\Q$item\E$/,@modifiable)) {
                       $modifyhash{$context}{$role}{$item} = 1;
                   } else {
                       $modifyhash{$context}{$role}{$item} = 0;
                   }
               }
           }
           if (ref($curr_usermodification{$context}) eq 'HASH') {
               foreach my $role (@{$roles{$context}}) {
                   if (ref($curr_usermodification{$context}{$role}) eq 'HASH') {
                       foreach my $field (@fields) {
                           if ($modifyhash{$context}{$role}{$field} ne 
                                   $curr_usermodification{$context}{$role}{$field}) {
                               push(@{$changes{$context}},$role);
                               last;
                           }
                       }
                   }
               }
           } else {
               foreach my $context (@contexts) {
                   foreach my $role (@{$roles{$context}}) {
                       push(@{$changes{$context}},$role);
                   }
               }
           }
       }
       my %usermodification_hash =  (
                                      usermodification => \%modifyhash,
                                    );
       my $putresult = &Apache::lonnet::put_dom('configuration',
                                                \%usermodification_hash,$dom);
       if ($putresult eq 'ok') {
           if (keys(%changes) > 0) {
               $resulttext = &mt('Changes made: ').'<ul>';
               foreach my $context (@contexts) {
                   if (ref($changes{$context}) eq 'ARRAY') {
                       $resulttext .= '<li>'.$context_title{$context}.':<ul>';
                       if (ref($changes{$context}) eq 'ARRAY') {
                           foreach my $role (@{$changes{$context}}) {
                               my $rolename;
                               if ($role eq 'cr') {
                                   $rolename = &mt('Custom');
                               } else {
                                   $rolename = &Apache::lonnet::plaintext($role);
                               }
                               my @modifiable;
                               $resulttext .= '<li><span class="LC_cusr_emph">'.&mt('Target user with [_1] role',$rolename).'</span> - '.&mt('modifiable fields: ');
                               foreach my $field (@fields) {
                                   if ($modifyhash{$context}{$role}{$field}) {
                                       push(@modifiable,$fieldtitles{$field});
                                   }
                               }
                               if (@modifiable > 0) {
                                   $resulttext .= join(', ',@modifiable);
                               } else {
                                   $resulttext .= &mt('none'); 
                               }
                               $resulttext .= '</li>';
                           }
                           $resulttext .= '</ul></li>';
                       }
                   }
               }
               $resulttext .= '</ul>';
           } else {
               $resulttext = &mt('No changes made to user modification settings');
           }
       } else {
           $resulttext = '<span class="LC_error">'.
               &mt('An error occurred: [_1]',$putresult).'</span>';
       }
       return $resulttext;
   }
   
   1;

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


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.