Diff for /loncom/interface/domainprefs.pm between versions 1.160.6.54 and 1.236

version 1.160.6.54, 2014/10/04 02:44:18 version 1.236, 2014/04/23 10:11:26
Line 213  sub handler { Line 213  sub handler {
                 'quotas','autoenroll','autoupdate','autocreate',                  'quotas','autoenroll','autoupdate','autocreate',
                 'directorysrch','usercreation','usermodification',                  'directorysrch','usercreation','usermodification',
                 'contacts','defaults','scantron','coursecategories',                  'contacts','defaults','scantron','coursecategories',
                 'serverstatuses','requestcourses','coursedefaults',                  'serverstatuses','requestcourses','helpsettings',
                 'usersessions','loadbalancing','requestauthor',                  'coursedefaults','usersessions','loadbalancing',
                 'selfenrollment','inststatus'],$dom);                  'requestauthor','selfenrollment','inststatus'],$dom);
     my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll',      my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll',
                        'autoupdate','autocreate','directorysrch','contacts',                         'autoupdate','autocreate','directorysrch','contacts',
                        'usercreation','selfcreation','usermodification','scantron',                         'usercreation','selfcreation','usermodification','scantron',
                        'requestcourses','requestauthor','coursecategories',                         'requestcourses','requestauthor','coursecategories',
                        'serverstatuses','coursedefaults','selfenrollment',                         'serverstatuses','helpsettings',
                        'usersessions');                         'coursedefaults','selfenrollment','usersessions');
     my %existing;      my %existing;
     if (ref($domconfig{'loadbalancing'}) eq 'HASH') {      if (ref($domconfig{'loadbalancing'}) eq 'HASH') {
         %existing = %{$domconfig{'loadbalancing'}};          %existing = %{$domconfig{'loadbalancing'}};
Line 369  sub handler { Line 369  sub handler {
                               col2 => 'Value'},                                col2 => 'Value'},
                              {col1 => 'Available textbooks',                               {col1 => 'Available textbooks',
                               col2 => ''},                                col2 => ''},
                              {col1 => 'Available templates',  
                               col2 => ''},  
                              {col1 => 'Validation (not official courses)',                               {col1 => 'Validation (not official courses)',
                               col2 => 'Value'},],                                col2 => 'Value'},],
                   print => \&print_quotas,                    print => \&print_quotas,
Line 389  sub handler { Line 387  sub handler {
         'coursecategories' =>          'coursecategories' =>
                   { text => 'Cataloging of courses/communities',                    { text => 'Cataloging of courses/communities',
                     help => 'Domain_Configuration_Cataloging_Courses',                      help => 'Domain_Configuration_Cataloging_Courses',
                     header => [{col1 => 'Catalog type/availability',                      header => [{col1 => 'Category settings',
                                 col2 => '',},  
                                {col1 => 'Category settings for standard catalog',  
                                 col2 => '',},                                  col2 => '',},
                                {col1 => 'Categories',                                 {col1 => 'Categories',
                                 col2 => '',                                  col2 => '',
Line 409  sub handler { Line 405  sub handler {
                   print => \&print_serverstatuses,                    print => \&print_serverstatuses,
                   modify => \&modify_serverstatuses,                    modify => \&modify_serverstatuses,
                  },                   },
           'helpsettings' =>
                    {text   => 'Help page settings',
                     help   => 'Domain_Configuration_Help_Settings',
                     header => [{col1 => 'Help Settings (logged-in users)',
                                 col2 => 'Value'}],
                     print  => \&print_helpsettings,
                     modify => \&modify_helpsettings,
                    },
         'coursedefaults' =>           'coursedefaults' => 
                  {text => 'Course/Community defaults',                   {text => 'Course/Community defaults',
                   help => 'Domain_Configuration_Course_Defaults',                    help => 'Domain_Configuration_Course_Defaults',
                   header => [{col1 => 'Defaults which can be overridden for each course by a DC',                    header => [{col1 => 'Defaults which can be overridden in each course by a CC',
                                 col2 => 'Value',},
                                {col1 => 'Defaults which can be overridden for each course by a DC',
                               col2 => 'Value',},],                                col2 => 'Value',},],
                   print => \&print_coursedefaults,                    print => \&print_coursedefaults,
                   modify => \&modify_coursedefaults,                    modify => \&modify_coursedefaults,
Line 429  sub handler { Line 435  sub handler {
                   print => \&print_selfenrollment,                    print => \&print_selfenrollment,
                   modify => \&modify_selfenrollment,                    modify => \&modify_selfenrollment,
                  },                   },
           'privacy' => 
                    {text   => 'User Privacy',
                     help   => 'Domain_Configuration_User_Privacy',
                     header => [{col1 => 'Setting',
                                 col2 => 'Value',}],
                     print => \&print_privacy,
                     modify => \&modify_privacy,
                    },
         'usersessions' =>          'usersessions' =>
                  {text  => 'User session hosting/offloading',                   {text  => 'User session hosting/offloading',
                   help  => 'Domain_Configuration_User_Sessions',                    help  => 'Domain_Configuration_User_Sessions',
Line 606  sub process_changes { Line 620  sub process_changes {
     } elsif ($action eq 'scantron') {      } elsif ($action eq 'scantron') {
         $output = &modify_scantron($r,$dom,$confname,$lastactref,%domconfig);          $output = &modify_scantron($r,$dom,$confname,$lastactref,%domconfig);
     } elsif ($action eq 'coursecategories') {      } elsif ($action eq 'coursecategories') {
         $output = &modify_coursecategories($dom,$lastactref,%domconfig);          $output = &modify_coursecategories($dom,%domconfig);
     } elsif ($action eq 'serverstatuses') {      } elsif ($action eq 'serverstatuses') {
         $output = &modify_serverstatuses($dom,%domconfig);          $output = &modify_serverstatuses($dom,%domconfig);
     } elsif ($action eq 'requestcourses') {      } elsif ($action eq 'requestcourses') {
         $output = &modify_quotas($r,$dom,$action,$lastactref,%domconfig);          $output = &modify_quotas($r,$dom,$action,$lastactref,%domconfig);
     } elsif ($action eq 'requestauthor') {      } elsif ($action eq 'requestauthor') {
         $output = &modify_quotas($r,$dom,$action,$lastactref,%domconfig);          $output = &modify_quotas($r,$dom,$action,$lastactref,%domconfig);
       } elsif ($action eq 'helpsettings') {
           $output = &modify_helpsettings($r,$dom,$confname,%domconfig);
     } elsif ($action eq 'coursedefaults') {      } elsif ($action eq 'coursedefaults') {
         $output = &modify_coursedefaults($dom,$lastactref,%domconfig);          $output = &modify_coursedefaults($dom,$lastactref,%domconfig);
     } elsif ($action eq 'selfenrollment') {      } elsif ($action eq 'selfenrollment') {
Line 649  sub print_config_box { Line 665  sub print_config_box {
     if ($numheaders > 1) {      if ($numheaders > 1) {
         my $colspan = '';          my $colspan = '';
         my $rightcolspan = '';          my $rightcolspan = '';
         if (($action eq 'rolecolors') || ($action eq 'defaults') ||          if (($action eq 'rolecolors') || ($action eq 'coursecategories') || ($action eq 'defaults') ||
             (($action eq 'login') && ($numheaders < 3))) {              (($action eq 'login') && ($numheaders < 3))) {
             $colspan = ' colspan="2"';              $colspan = ' colspan="2"';
         }          }
Line 666  sub print_config_box { Line 682  sub print_config_box {
              </tr>';               </tr>';
         $rowtotal ++;          $rowtotal ++;
         if (($action eq 'autoupdate') || ($action eq 'usercreation') || ($action eq 'selfcreation') ||          if (($action eq 'autoupdate') || ($action eq 'usercreation') || ($action eq 'selfcreation') ||
             ($action eq 'usermodification') || ($action eq 'defaults') ||              ($action eq 'usermodification') || ($action eq 'defaults') || ($action eq 'coursedefaults') ||
             ($action eq 'selfenrollment') || ($action eq 'usersessions')) {              ($action eq 'selfenrollment') || ($action eq 'usersessions')) {
             $output .= $item->{'print'}->('top',$dom,$settings,\$rowtotal);              $output .= $item->{'print'}->('top',$dom,$settings,\$rowtotal);
         } elsif ($action eq 'coursecategories') {          } elsif ($action eq 'coursecategories') {
Line 697  sub print_config_box { Line 713  sub print_config_box {
             $rowtotal ++;              $rowtotal ++;
         if (($action eq 'autoupdate') || ($action eq 'usercreation') ||          if (($action eq 'autoupdate') || ($action eq 'usercreation') ||
             ($action eq 'selfcreation') || ($action eq 'selfenrollment') ||              ($action eq 'selfcreation') || ($action eq 'selfenrollment') ||
             ($action eq 'usersessions') || ($action eq 'coursecategories')) {              ($action eq 'usersessions')) {
             if ($action eq 'coursecategories') {              $output .= $item->{'print'}->('middle',$dom,$settings,\$rowtotal).'
                 $output .= &print_coursecategories('middle',$dom,$item,$settings,\$rowtotal);  
                 $colspan = ' colspan="2"';  
             } else {  
                 $output .= $item->{'print'}->('middle',$dom,$settings,\$rowtotal);  
             }  
             $output .= '  
            </table>             </table>
           </td>            </td>
          </tr>           </tr>
Line 714  sub print_config_box { Line 724  sub print_config_box {
              <tr class="LC_info_row">               <tr class="LC_info_row">
               <td class="LC_left_item"'.$colspan.'>'.&mt($item->{'header'}->[2]->{'col1'}).'</td>                <td class="LC_left_item"'.$colspan.'>'.&mt($item->{'header'}->[2]->{'col1'}).'</td>
               <td class="LC_right_item">'.&mt($item->{'header'}->[2]->{'col2'}).'</td>                <td class="LC_right_item">'.&mt($item->{'header'}->[2]->{'col2'}).'</td>
              </tr>'."\n";               </tr>'."\n".
             if ($action eq 'coursecategories') {              $item->{'print'}->('bottom',$dom,$settings,\$rowtotal);
                 $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal);  
             } else {  
                 $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal);  
             }  
             $rowtotal ++;              $rowtotal ++;
         } elsif (($action eq 'usermodification') || ($action eq 'defaults')) {          } elsif (($action eq 'usermodification') || ($action eq 'coursedefaults') ||
                     ($action eq 'defaults')) {
             $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal);              $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal);
           } elsif ($action eq 'coursecategories') {
               $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal);
         } elsif ($action eq 'login') {          } elsif ($action eq 'login') {
             if ($numheaders == 3) {              if ($numheaders == 3) {
                 $output .= &print_login('page',$dom,$confname,$phase,$settings,\$rowtotal).'                  $output .= &print_login('page',$dom,$confname,$phase,$settings,\$rowtotal).'
Line 741  sub print_config_box { Line 750  sub print_config_box {
                 $output .= &print_login('help',$dom,$confname,$phase,$settings,\$rowtotal);                  $output .= &print_login('help',$dom,$confname,$phase,$settings,\$rowtotal);
             }              }
         } elsif ($action eq 'requestcourses') {          } elsif ($action eq 'requestcourses') {
             $output .= &print_requestmail($dom,$action,$settings,\$rowtotal);              $output .= &print_requestmail($dom,$action,$settings,\$rowtotal).
             $rowtotal ++;                         &print_studentcode($settings,\$rowtotal).'
             $output .= &print_studentcode($settings,\$rowtotal).'  
            </table>             </table>
           </td>            </td>
          </tr>           </tr>
Line 753  sub print_config_box { Line 761  sub print_config_box {
              <tr class="LC_info_row">               <tr class="LC_info_row">
               <td class="LC_left_item"'.$colspan.'>'.&mt($item->{'header'}->[2]->{'col1'}).'</td>                <td class="LC_left_item"'.$colspan.'>'.&mt($item->{'header'}->[2]->{'col1'}).'</td>
               <td class="LC_right_item">'.&mt($item->{'header'}->[2]->{'col2'}).'</td> </tr>'.                <td class="LC_right_item">'.&mt($item->{'header'}->[2]->{'col2'}).'</td> </tr>'.
                        &textbookcourses_javascript($settings).                         &print_textbookcourses($dom,$settings,\$rowtotal).'
                        &print_textbookcourses($dom,'textbooks',$settings,\$rowtotal).'  
             </table>  
            </td>  
           </tr>  
          <tr>  
            <td>  
             <table class="LC_nested">  
              <tr class="LC_info_row">  
               <td class="LC_left_item"'.$colspan.'>'.&mt($item->{'header'}->[3]->{'col1'}).'</td>  
               <td class="LC_right_item">'.&mt($item->{'header'}->[3]->{'col2'}).'</td> </tr>'.  
                        &print_textbookcourses($dom,'templates',$settings,\$rowtotal).'  
             </table>              </table>
            </td>             </td>
           </tr>            </tr>
Line 772  sub print_config_box { Line 769  sub print_config_box {
            <td>             <td>
             <table class="LC_nested">              <table class="LC_nested">
              <tr class="LC_info_row">               <tr class="LC_info_row">
               <td class="LC_left_item"'.$colspan.' valign="top">'.&mt($item->{'header'}->[4]->{'col1'}).'</td>                <td class="LC_left_item"'.$colspan.' valign="top">'.&mt($item->{'header'}->[3]->{'col1'}).'</td>
               <td class="LC_right_item" valign="top">'.&mt($item->{'header'}->[4]->{'col2'}).'</td>                <td class="LC_right_item" valign="top">'.&mt($item->{'header'}->[3]->{'col2'}).'</td>
              </tr>'.               </tr>'.
             &print_validation_rows('requestcourses',$dom,$settings,\$rowtotal);              &print_validation_rows('requestcourses',$dom,$settings,\$rowtotal);
         } elsif ($action eq 'requestauthor') {          } elsif ($action eq 'requestauthor') {
             $output .= &print_requestmail($dom,$action,$settings,\$rowtotal);              $output .= &print_requestmail($dom,$action,$settings,\$rowtotal);
             $rowtotal ++;  
         } elsif ($action eq 'rolecolors') {          } elsif ($action eq 'rolecolors') {
             $output .= &print_rolecolors($phase,'coordinator',$dom,$confname,$settings,\$rowtotal).'              $output .= &print_rolecolors($phase,'coordinator',$dom,$confname,$settings,\$rowtotal).'
            </table>             </table>
Line 864  sub print_config_box { Line 860  sub print_config_box {
             $output .= &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal);              $output .= &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal);
         } elsif ($action eq 'helpsettings') {          } elsif ($action eq 'helpsettings') {
             $output .= &print_helpsettings($dom,$confname,$settings,\$rowtotal);              $output .= &print_helpsettings($dom,$confname,$settings,\$rowtotal);
         } elsif ($action eq 'coursedefaults') {  
             $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal);  
         }          }
     }      }
     $output .= '      $output .= '
Line 2057  sub print_requestmail { Line 2051  sub print_requestmail {
         $datatable .= &mt('There are no active Domain Coordinators');          $datatable .= &mt('There are no active Domain Coordinators');
     }      }
     $datatable .='</td></tr>';      $datatable .='</td></tr>';
       $$rowtotal += $rows;
     return $datatable;      return $datatable;
 }  }
   
Line 2065  sub print_studentcode { Line 2060  sub print_studentcode {
     my $rownum = 0;       my $rownum = 0; 
     my ($output,%current);      my ($output,%current);
     my @crstypes = ('official','unofficial','community','textbook');      my @crstypes = ('official','unofficial','community','textbook');
     if (ref($settings) eq 'HASH') {      if (ref($settings->{'uniquecode'}) eq 'HASH') {
         if (ref($settings->{'uniquecode'}) eq 'HASH') {          foreach my $type (@crstypes) {
             foreach my $type (@crstypes) {              $current{$type} = $settings->{'uniquecode'}{$type};
                 $current{$type} = $settings->{'uniquecode'}{$type};  
             }  
         }          }
     }      }
     $output .= '<tr>'.      $output .= '<tr>'.
Line 2090  sub print_studentcode { Line 2083  sub print_studentcode {
 }  }
   
 sub print_textbookcourses {  sub print_textbookcourses {
     my ($dom,$type,$settings,$rowtotal) = @_;      my ($dom,$settings,$rowtotal) = @_;
     my $rownum = 0;      my $rownum = 0;
     my $css_class;      my $css_class;
     my $itemcount = 1;      my $itemcount = 1;
     my $maxnum = 0;      my $maxnum = 0;
     my $bookshash;      my $bookshash;
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         $bookshash = $settings->{$type};          $bookshash = $settings->{'textbooks'};
     }      }
     my %ordered;      my %ordered;
     if (ref($bookshash) eq 'HASH') {      if (ref($bookshash) eq 'HASH') {
Line 2110  sub print_textbookcourses { Line 2103  sub print_textbookcourses {
     }      }
     my $confname = $dom.'-domainconfig';      my $confname = $dom.'-domainconfig';
     my $switchserver = &check_switchserver($dom,$confname);      my $switchserver = &check_switchserver($dom,$confname);
     my $maxnum = scalar(keys(%ordered));      $maxnum = scalar(keys(%ordered));
     my $datatable;      my $datatable = &textbookcourses_javascript(\%ordered);
     if (keys(%ordered)) {      if (keys(%ordered)) {
         my @items = sort { $a <=> $b } keys(%ordered);          my @items = sort { $a <=> $b } keys(%ordered);
         for (my $i=0; $i<@items; $i++) {          for (my $i=0; $i<@items; $i++) {
Line 2119  sub print_textbookcourses { Line 2112  sub print_textbookcourses {
             my $key = $ordered{$items[$i]};              my $key = $ordered{$items[$i]};
             my %coursehash=&Apache::lonnet::coursedescription($key);              my %coursehash=&Apache::lonnet::coursedescription($key);
             my $coursetitle = $coursehash{'description'};              my $coursetitle = $coursehash{'description'};
             my ($subject,$title,$author,$publisher,$image,$imgsrc,$cdom,$cnum);              my ($subject,$title,$author,$image,$imgsrc,$cdom,$cnum);
             if (ref($bookshash->{$key}) eq 'HASH') {              if (ref($bookshash->{$key}) eq 'HASH') {
                 $subject = $bookshash->{$key}->{'subject'};                  $subject = $bookshash->{$key}->{'subject'};
                 $title = $bookshash->{$key}->{'title'};                  $title = $bookshash->{$key}->{'title'};
                 if ($type eq 'textbooks') {                  $author = $bookshash->{$key}->{'author'};
                     $publisher = $bookshash->{$key}->{'publisher'};                  $image = $bookshash->{$key}->{'image'};
                     $author = $bookshash->{$key}->{'author'};                  if ($image ne '') {
                     $image = $bookshash->{$key}->{'image'};                      my ($path,$imagefile) = ($image =~ m{^(.+)/([^/]+)$});
                     if ($image ne '') {                      my $imagethumb = "$path/tn-".$imagefile;
                         my ($path,$imagefile) = ($image =~ m{^(.+)/([^/]+)$});                      $imgsrc = '<img src="'.$imagethumb.'" alt="'.&mt('Textbook image').'" />';
                         my $imagethumb = "$path/tn-".$imagefile;  
                         $imgsrc = '<img src="'.$imagethumb.'" alt="'.&mt('Textbook image').'" />';  
                     }  
                 }                  }
             }              }
             my $chgstr = ' onchange="javascript:reorderBooks(this.form,'."'$type".'_'."$key','$type'".');"';              my $chgstr = ' onchange="javascript:reorderBooks(this.form,'."'$key'".');"';
             $datatable .= '<tr '.$css_class.'><td><span class="LC_nobreak">'              $datatable .= '<tr '.$css_class.'><td><span class="LC_nobreak">'
                          .'<select name="'.$type.'_'.$key.'"'.$chgstr.'>';                           .'<select name="'.$key.'"'.$chgstr.'>';
             for (my $k=0; $k<=$maxnum; $k++) {              for (my $k=0; $k<=$maxnum; $k++) {
                 my $vpos = $k+1;                  my $vpos = $k+1;
                 my $selstr;                  my $selstr;
Line 2146  sub print_textbookcourses { Line 2136  sub print_textbookcourses {
                 $datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>';                  $datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>';
             }              }
             $datatable .= '</select>'.('&nbsp;'x2).              $datatable .= '</select>'.('&nbsp;'x2).
                 '<label><input type="checkbox" name="'.$type.'_del" value="'.$key.'" />'.                  '<label><input type="checkbox" name="book_del" value="'.$key.'" />'.
                 &mt('Delete?').'</label></span></td>'.                  &mt('Delete?').'</label></span></td>'.
                 '<td colspan="2">'.                  '<td colspan="2">'.
                 '<span class="LC_nobreak">'.&mt('Subject:').'<input type="text" size="15" name="'.$type.'_subject_'.$i.'" value="'.$subject.'" /></span> '.                  '<span class="LC_nobreak">'.&mt('Subject:').'<input type="text" size="15" name="book_subject_'.$i.'" value="'.$subject.'" /></span> '.
                 ('&nbsp;'x2).                  ('&nbsp;'x2).
                 '<span class="LC_nobreak">'.&mt('Title:').'<input type="text" size="30" name="'.$type.'_title_'.$i.'" value="'.$title.'" /></span> ';                  '<span class="LC_nobreak">'.&mt('Title:').'<input type="text" size="30" name="book_title_'.$i.'" value="'.$title.'" /></span> '.
             if ($type eq 'textbooks') {                  ('&nbsp;'x2).
                 $datatable .= ('&nbsp;'x2).                  '<span class="LC_nobreak">'.&mt('Author(s):').'<input type="text" size="25" name="book_author_'.$i.'" value="'.$author.'" /></span> '.
                               '<span class="LC_nobreak">'.&mt('Publisher:').'<input type="text" size="10" name="'.$type.'_publisher_'.$i.'" value="'.$publisher.'" /></span> '.                  ('&nbsp;'x2).
                               ('&nbsp;'x2).                  '<span class="LC_nobreak">'.&mt('Thumbnail:');
                               '<span class="LC_nobreak">'.&mt('Author(s):').'<input type="text" size="25" name="'.$type.'_author_'.$i.'" value="'.$author.'" /></span> '.              if ($image) {
                               ('&nbsp;'x2).                  $datatable .= '<span class="LC_nobreak">'.
                               '<span class="LC_nobreak">'.&mt('Thumbnail:');                                $imgsrc.
                 if ($image) {                                '<label><input type="checkbox" name="book_image_del"'.
                     $datatable .= '<span class="LC_nobreak">'.                                ' value="'.$key.'" />'.&mt('Delete?').'</label></span> '.
                                   $imgsrc.                                '<span class="LC_nobreak">&nbsp;'.&mt('Replace:').'&nbsp;';
                                   '<label><input type="checkbox" name="'.$type.'_image_del"'.              }
                                   ' value="'.$key.'" />'.&mt('Delete?').'</label></span> '.              if ($switchserver) {
                                   '<span class="LC_nobreak">&nbsp;'.&mt('Replace:').'&nbsp;';                  $datatable .= &mt('Upload to library server: [_1]',$switchserver);
                 }              } else {
                 if ($switchserver) {                  $datatable .= '<input type="file" name="book_image_'.$i.'" value="" />';
                     $datatable .= &mt('Upload to library server: [_1]',$switchserver);  
                 } else {  
                     $datatable .= '<input type="file" name="'.$type.'_image_'.$i.'" value="" />';  
                 }  
             }              }
             $datatable .= '<input type="hidden" name="'.$type.'_id_'.$i.'" value="'.$type.'_'.$key.'" /></span> '.              $datatable .= '<input type="hidden" name="book_id_'.$i.'" value="'.$key.'" /></span> '.
                           '<span class="LC_nobreak">'.&mt('LON-CAPA course:').'&nbsp;'.                            '<span class="LC_nobreak">'.&mt('LON-CAPA course:').'&nbsp;'.
                           $coursetitle.'</span></td></tr>'."\n";                            $coursetitle.'</span></td></tr>'."\n";
             $itemcount ++;              $itemcount ++;
         }          }
     }      }
     $css_class = $itemcount%2?' class="LC_odd_row"':'';      $css_class = $itemcount%2?' class="LC_odd_row"':'';
     my $chgstr = ' onchange="javascript:reorderBooks(this.form,'."'$type"."_addbook_pos','$type'".');"';      my $chgstr = ' onchange="javascript:reorderBooks(this.form,'."'addbook_pos'".');"';
     $datatable .= '<tr '.$css_class.'><td><span class="LC_nobreak">'."\n".      $datatable .= '<tr '.$css_class.'><td><span class="LC_nobreak">'."\n".
                   '<input type="hidden" name="'.$type.'_maxnum" value="'.$maxnum.'" />'."\n".                    '<input type="hidden" name="book_maxnum" value="'.$maxnum.'" />'."\n".
                   '<select name="'.$type.'_addbook_pos"'.$chgstr.'>';                    '<select name="addbook_pos"'.$chgstr.'>';
     for (my $k=0; $k<$maxnum+1; $k++) {      for (my $k=0; $k<$maxnum+1; $k++) {
         my $vpos = $k+1;          my $vpos = $k+1;
         my $selstr;          my $selstr;
Line 2192  sub print_textbookcourses { Line 2178  sub print_textbookcourses {
         $datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>';          $datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>';
     }      }
     $datatable .= '</select>&nbsp;'."\n".      $datatable .= '</select>&nbsp;'."\n".
                   '<input type="checkbox" name="'.$type.'_addbook" value="1" />'.&mt('Add').'</td>'."\n".                    '<input type="checkbox" name="addbook" value="1" />'.&mt('Add').'</td>'."\n".
                   '<td colspan="2">'.                    '<td colspan="2">'.
                   '<span class="LC_nobreak">'.&mt('Subject:').'<input type="text" size="15" name="'.$type.'_addbook_subject" value="" /></span> '."\n".                    '<span class="LC_nobreak">'.&mt('Subject:').'<input type="text" size="15" name="addbook_subject" value="" /></span> '."\n".
                   ('&nbsp;'x2).                    ('&nbsp;'x2).
                   '<span class="LC_nobreak">'.&mt('Title:').'<input type="text" size="30" name="'.$type.'_addbook_title" value="" /></span> '."\n".                    '<span class="LC_nobreak">'.&mt('Title:').'<input type="text" size="30" name="addbook_title" value="" /></span> '."\n".
                   ('&nbsp;'x2);                    ('&nbsp;'x2).
     if ($type eq 'textbooks') {                    '<span class="LC_nobreak">'.&mt('Author(s):').'<input type="text" size="25" name="addbook_author" value="" /></span> '."\n".
         $datatable .= '<span class="LC_nobreak">'.&mt('Publisher:').'<input type="text" size="10" name="'.$type.'_addbook_publisher" value="" /></span> '."\n".                    ('&nbsp;'x2).
                       ('&nbsp;'x2).                    '<span class="LC_nobreak">'.&mt('Image:').'&nbsp;';
                       '<span class="LC_nobreak">'.&mt('Author(s):').'<input type="text" size="25" name="'.$type.'_addbook_author" value="" /></span> '."\n".      if ($switchserver) {
                       ('&nbsp;'x2).          $datatable .= &mt('Upload to library server: [_1]',$switchserver);
                       '<span class="LC_nobreak">'.&mt('Image:').'&nbsp;';      } else {
         if ($switchserver) {          $datatable .= '<input type="file" name="addbook_image" value="" />';
             $datatable .= &mt('Upload to library server: [_1]',$switchserver);  
         } else {  
             $datatable .= '<input type="file" name="'.$type.'_addbook_image" value="" />';  
         }  
     }      }
     $datatable .= '</span>'."\n".      $datatable .= '</span>'."\n".
                   '<span class="LC_nobreak">'.&mt('LON-CAPA course:').'&nbsp;'.                    '<span class="LC_nobreak">'.&mt('LON-CAPA course:').'&nbsp;'.
                   &Apache::loncommon::select_dom_form($env{'request.role.domain'},$type.'_addbook_cdom').                    &Apache::loncommon::select_dom_form($env{'request.role.domain'},'addbook_cdom').
                   '<input type="text" size="25" name="'.$type.'_addbook_cnum" value="" />'.                    '<input type="text" size="25" name="addbook_cnum" value="" />'.
                   &Apache::loncommon::selectcourse_link                    &Apache::loncommon::selectcourse_link
                       ('display',$type.'_addbook_cnum',$type.'_addbook_cdom',undef,undef,undef,'Course');                        ('display','addbook_cnum','addbook_cdom',undef,undef,undef,'Course');
                   '</span></td>'."\n".                    '</span></td>'."\n".
                   '</tr>'."\n";                    '</tr>'."\n";
     $itemcount ++;      $itemcount ++;
Line 2223  sub print_textbookcourses { Line 2205  sub print_textbookcourses {
 }  }
   
 sub textbookcourses_javascript {  sub textbookcourses_javascript {
     my ($settings) = @_;      my ($textbooks) = @_;
     return unless(ref($settings) eq 'HASH');      return unless(ref($textbooks) eq 'HASH');
     my (%ordered,%total,%jstext);      my $num = scalar(keys(%{$textbooks}));
     foreach my $type ('textbooks','templates') {      my @jsarray;
         $total{$type} = 0;      foreach my $item (sort {$a <=> $b } (keys(%{$textbooks}))) {
         if (ref($settings->{$type}) eq 'HASH') {          push(@jsarray,$textbooks->{$item});
             foreach my $item (keys(%{$settings->{$type}})) {  
                 if (ref($settings->{$type}->{$item}) eq 'HASH') {  
                     my $num = $settings->{$type}->{$item}{'order'};  
                     $ordered{$type}{$num} = $item;  
                 }  
             }  
             $total{$type} = scalar(keys(%{$settings->{$type}}));  
         }  
         my @jsarray = ();  
         foreach my $item (sort {$a <=> $b } (keys(%{$ordered{$type}}))) {  
             push(@jsarray,$ordered{$type}{$item});  
         }  
         $jstext{$type} = '    var '.$type.' = Array('."'".join("','",@jsarray)."'".');'."\n";  
     }      }
       my $jstext = '    var textbooks = Array('."'".join("','",@jsarray)."'".');'."\n";
     return <<"ENDSCRIPT";      return <<"ENDSCRIPT";
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
 function reorderBooks(form,item,caller) {  function reorderBooks(form,item) {
     var changedVal;      var changedVal;
 $jstext{'textbooks'};  $jstext 
 $jstext{'templates'};      var newpos = 'addbook_pos';
     var newpos;  
     var maxh;  
     if (caller == 'textbooks') {    
         newpos = 'textbooks_addbook_pos';  
         maxh = 1 + $total{'textbooks'};  
     } else {  
         newpos = 'templates_addbook_pos';  
         maxh = 1 + $total{'templates'};  
     }  
     var current = new Array;      var current = new Array;
       var maxh = 1 + $num;
     var newitemVal = form.elements[newpos].options[form.elements[newpos].selectedIndex].value;      var newitemVal = form.elements[newpos].options[form.elements[newpos].selectedIndex].value;
     if (item == newpos) {      if (item == newpos) {
         changedVal = newitemVal;          changedVal = newitemVal;
Line 2267  $jstext{'templates'}; Line 2229  $jstext{'templates'};
         changedVal = form.elements[item].options[form.elements[item].selectedIndex].value;          changedVal = form.elements[item].options[form.elements[item].selectedIndex].value;
         current[newitemVal] = newpos;          current[newitemVal] = newpos;
     }      }
     if (caller == 'textbooks') {      for (var i=0; i<textbooks.length; i++) {
         for (var i=0; i<textbooks.length; i++) {          var elementName = textbooks[i];
             var elementName = 'textbooks_'+textbooks[i];          if (elementName != item) {
             if (elementName != item) {              if (form.elements[elementName]) {
                 if (form.elements[elementName]) {                  var currVal = form.elements[elementName].options[form.elements[elementName].selectedIndex].value;
                     var currVal = form.elements[elementName].options[form.elements[elementName].selectedIndex].value;                  current[currVal] = elementName;
                     current[currVal] = elementName;  
                 }  
             }  
         }  
     }  
     if (caller == 'templates') {  
         for (var i=0; i<templates.length; i++) {  
             var elementName = 'templates_'+templates[i];  
             if (elementName != item) {  
                 if (form.elements[elementName]) {  
                     var currVal = form.elements[elementName].options[form.elements[elementName].selectedIndex].value;  
                     current[currVal] = elementName;  
                 }  
             }              }
         }          }
     }      }
Line 2503  sub print_autocreate { Line 2452  sub print_autocreate {
                   $createoff{'req'}.' value="0" />'.&mt('No').'</label></span>';                    $createoff{'req'}.' value="0" />'.&mt('No').'</label></span>';
     my ($numdc,$dctable,$rows) = &active_dc_picker($dom,$numinrow,'radio',      my ($numdc,$dctable,$rows) = &active_dc_picker($dom,$numinrow,'radio',
                                                    'autocreate_xmldc',%currhash);                                                     'autocreate_xmldc',%currhash);
     $datatable .= '</td></tr><tr class="LC_odd_row"><td>';  
     if ($numdc > 1) {      if ($numdc > 1) {
         $datatable .= &mt('Course creation processed as: (choose Dom. Coord.)').          $datatable .= '</td></tr><tr class="LC_odd_row"><td>'.
                       '</td><td class="LC_left_item">';                        &mt('Course creation processed as: (choose Dom. Coord.)').
                         '</td><td class="LC_left_item">'.$dctable.'</td></tr>';
     } else {      } else {
         $datatable .= &mt('Course creation processed as:').          $datatable .= $dctable.'</td></tr>';
                       '</td><td class="LC_right_item">';  
     }      }
     $datatable .= $dctable.'</td></tr>';  
     $$rowtotal += $rows;      $$rowtotal += $rows;
     return $datatable;      return $datatable;
 }  }
Line 3103  sub print_validation_rows { Line 3050  sub print_validation_rows {
     }      }
     if ($caller eq 'requestcourses') {      if ($caller eq 'requestcourses') {
         my %currhash;          my %currhash;
         if (ref($settings) eq 'HASH') {          if (ref($settings->{'validation'}) eq 'HASH') {
             if (ref($settings->{'validation'}) eq 'HASH') {              if ($settings->{'validation'}{'dc'} ne '') {
                 if ($settings->{'validation'}{'dc'} ne '') {                  $currhash{$settings->{'validation'}{'dc'}} = 1;
                     $currhash{$settings->{'validation'}{'dc'}} = 1;  
                 }  
             }              }
         }          }
         my $numinrow = 2;          my $numinrow = 2;
         my ($numdc,$dctable,$rows) = &active_dc_picker($dom,$numinrow,'radio',          my ($numdc,$dctable,$rows) = &active_dc_picker($dom,$numinrow,'radio',
                                                        'validationdc',%currhash);                                                         'validationdc',%currhash);
         my $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';  
         $datatable .= '</td></tr><tr'.$css_class.'><td>';  
         if ($numdc > 1) {          if ($numdc > 1) {
             $datatable .= &mt('Course creation processed as: (choose Dom. Coord.)');              $datatable .= '</td></tr><tr class="LC_odd_row"><td>'.
                             &mt('Course creation processed as: (choose Dom. Coord.)').
                             '</td><td class="LC_left_item">'.$dctable.'</td></tr>';
         } else {          } else {
             $datatable .=  &mt('Course creation processed as: ');              $datatable .= $dctable.'</td></tr>';
         }          }
         $datatable .= '</td><td class="LC_left_item">'.$dctable.'</td></tr>';  
         $itemcount ++;          $itemcount ++;
     }      }
     if (ref($rowtotal)) {      if (ref($rowtotal)) {
Line 4127  sub print_selfcreation { Line 4071  sub print_selfcreation {
                 $$rowtotal ++;                  $$rowtotal ++;
             }              }
         }          }
         my @fields = ('lastname','firstname','middlename','permanentemail','id','inststatus');  
         my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();  
         $fieldtitles{'inststatus'} = &mt('Institutional status');  
         my $rem;  
         my $numperrow = 2;  
         my $css_class = $$rowtotal%2?' class="LC_odd_row"':'';  
         $datatable .= '<tr'.$css_class.'>'.  
                      '<td class="LC_left_item">'.&mt('Mapping of Shibboleth environment variable names to user data fields (SSO auth)').'</td>'.  
                      '<td class="LC_left_item">'."\n".  
                      '<table><tr><td>'."\n";  
         for (my $i=0; $i<@fields; $i++) {  
             $rem = $i%($numperrow);  
             if ($rem == 0) {  
                 if ($i > 0) {  
                     $datatable .= '</tr>';  
                 }  
                 $datatable .= '<tr>';  
             }  
             my $currval;  
             if (ref($createsettings) eq 'HASH') {  
                 if (ref($createsettings->{'shibenv'}) eq 'HASH') {  
                     $currval = $createsettings->{'shibenv'}{$fields[$i]};  
                 }  
             }  
             $datatable .= '<td class="LC_left_item">'.  
                           '<span class="LC_nobreak">'.  
                           '<input type="text" name="shibenv_'.$fields[$i].'" '.  
                           'value="'.$currval.'" size="10" />&nbsp;'.  
                           $fieldtitles{$fields[$i]}.'</span></td>';  
         }  
         my $colsleft = $numperrow - $rem;  
         if ($colsleft > 1 ) {  
             $datatable .= '<td colspan="'.$colsleft.'" class="LC_left_item">'.  
                          '&nbsp;</td>';  
         } elsif ($colsleft == 1) {  
             $datatable .= '<td class="LC_left_item">&nbsp;</td>';  
         }  
         $datatable .= '</tr></table></td></tr>';  
         $$rowtotal ++;  
     } elsif ($position eq 'middle') {      } elsif ($position eq 'middle') {
         my %domconf = &Apache::lonnet::get_dom('configuration',['usermodification'],$dom);          my %domconf = &Apache::lonnet::get_dom('configuration',['usermodification'],$dom);
         my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);          my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
Line 4176  sub print_selfcreation { Line 4081  sub print_selfcreation {
             foreach my $status (@{$types}) {              foreach my $status (@{$types}) {
                 $datatable .= &modifiable_userdata_row('selfcreate',$status,$domconf{'usermodification'},                  $datatable .= &modifiable_userdata_row('selfcreate',$status,$domconf{'usermodification'},
                                                        $numinrow,$$rowtotal,$usertypes);                                                         $numinrow,$$rowtotal,$usertypes);
                 $$rowtotal ++;              $$rowtotal ++;
             }              }
         }          }
     } else {      } else {
Line 4222  sub print_selfcreation { Line 4127  sub print_selfcreation {
         $additional .= '</div>'."\n";          $additional .= '</div>'."\n";
   
         ($datatable,$itemcount) = &radiobutton_prefs(\%radiohash,\@toggles,\%defaultchecked,          ($datatable,$itemcount) = &radiobutton_prefs(\%radiohash,\@toggles,\%defaultchecked,
                                                      \%choices,$$rowtotal,$onclick,$additional);                                                       \%choices,$itemcount,$onclick,$additional);
         $$rowtotal ++;          $$rowtotal += $itemcount;
         $datatable .= &print_requestmail($dom,'selfcreation',$createsettings,$rowtotal);          $datatable .= &print_requestmail($dom,'selfcreation',$createsettings,$rowtotal);
         $$rowtotal ++;          $$rowtotal ++;
         my ($infofields,$infotitles) = &Apache::loncommon::emailusername_info();          my ($infofields,$infotitles) = &Apache::loncommon::emailusername_info();
Line 4841  sub print_coursecategories { Line 4746  sub print_coursecategories {
     my ($position,$dom,$hdritem,$settings,$rowtotal) = @_;      my ($position,$dom,$hdritem,$settings,$rowtotal) = @_;
     my $datatable;      my $datatable;
     if ($position eq 'top') {      if ($position eq 'top') {
         my (%checked);  
         my @catitems = ('unauth','auth');  
         my @cattypes = ('std','domonly','codesrch','none');  
         $checked{'unauth'} = 'std';  
         $checked{'auth'} = 'std';  
         if (ref($settings) eq 'HASH') {  
             foreach my $type (@cattypes) {  
                 if ($type eq $settings->{'unauth'}) {  
                     $checked{'unauth'} = $type;  
                 }  
                 if ($type eq $settings->{'auth'}) {  
                     $checked{'auth'} = $type;  
                 }  
             }  
         }  
         my %lt = &Apache::lonlocal::texthash (  
                                                unauth   => 'Catalog type for unauthenticated users',  
                                                auth     => 'Catalog type for authenticated users',  
                                                none     => 'No catalog',  
                                                std      => 'Standard catalog',  
                                                domonly  => 'Domain-only catalog',  
                                                codesrch => "Code search form",  
                                              );  
        my $itemcount = 0;  
        foreach my $item (@catitems) {  
            my $css_class = $itemcount%2? ' class="LC_odd_row"':'';  
            $datatable .= '<tr '.$css_class.'>'.  
                          '<td>'.$lt{$item}.'</td>'.  
                          '<td class="LC_right_item"><span class="LC_nobreak">';  
            foreach my $type (@cattypes) {  
                my $ischecked;  
                if ($checked{$item} eq $type) {  
                    $ischecked=' checked="checked"';  
                }  
                $datatable .= '<label>'.  
                              '<input type="radio" name="coursecat_'.$item.'" value="'.$type.'"'.$ischecked.  
                              ' />'.$lt{$type}.'</label>&nbsp;';  
            }  
            $datatable .= '</td></tr>';  
            $itemcount ++;  
         }  
         $$rowtotal += $itemcount;  
     } elsif ($position eq 'middle') {  
         my $toggle_cats_crs = ' ';          my $toggle_cats_crs = ' ';
         my $toggle_cats_dom = ' checked="checked" ';          my $toggle_cats_dom = ' checked="checked" ';
         my $can_cat_crs = ' ';          my $can_cat_crs = ' ';
Line 5090  sub print_coursecategories { Line 4952  sub print_coursecategories {
                 $datatable .= &initialize_categories($itemcount);                  $datatable .= &initialize_categories($itemcount);
             }              }
         } else {          } else {
             $datatable .= '<td class="LC_right_item">'.$hdritem->{'header'}->[1]->{'col2'}.'</td>'              $datatable .= '<td class="LC_right_item">'.$hdritem->{'header'}->[0]->{'col2'}.'</td>'
                           .&initialize_categories($itemcount);                            .&initialize_categories($itemcount);
         }          }
         $$rowtotal += $itemcount;          $$rowtotal += $itemcount;
Line 5153  sub serverstatus_pages { Line 5015  sub serverstatus_pages {
   
 sub defaults_javascript {  sub defaults_javascript {
     my ($settings) = @_;      my ($settings) = @_;
     return unless (ref($settings) eq 'HASH');      my ($output,$jstext); 
     if ((ref($settings->{'inststatusorder'}) eq 'ARRAY') && (ref($settings->{'inststatustypes'}) eq 'HASH')) {      if ((ref($settings->{'inststatusorder'}) eq 'ARRAY') && (ref($settings->{'inststatustypes'}) eq 'HASH')) {
         my $maxnum = scalar(@{$settings->{'inststatusorder'}});          my $maxnum = scalar(@{$settings->{'inststatusorder'}});
         if ($maxnum eq '') {          if ($maxnum eq '') {
             $maxnum = 0;              $maxnum = 0;
         }          }
         $maxnum ++;          $maxnum ++;
         my $jstext = '    var inststatuses = Array('."'".join("','",@{$settings->{'inststatusorder'}})."'".');';            $jstext = '    var inststatuses = Array('."'".join("','",@{$settings->{'inststatusorder'}})."'".');';  
         return <<"ENDSCRIPT";          return <<"ENDSCRIPT";
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
Line 5236  sub coursecategories_javascript { Line 5098  sub coursecategories_javascript {
         $jstext  = '    var categories = Array(1);'."\n".          $jstext  = '    var categories = Array(1);'."\n".
                    '    categories[0] = Array("instcode_pos");'."\n";                      '    categories[0] = Array("instcode_pos");'."\n"; 
     }      }
     my $instcode_reserved = &mt('The name: [_1] is a reserved category.','"instcode"');      my $instcode_reserved = &mt('The name: "instcode" is a reserved category');
     my $communities_reserved = &mt('The name: [_1] is a reserved category.','"communities"');      my $communities_reserved = &mt('The name: "communities" is a reserved category');
     my $choose_again = '\\n'.&mt('Please use a different name for the new top level category.');       my $choose_again = '\\n'.&mt('Please use a different name for the new top level category'); 
     $output = <<"ENDSCRIPT";      $output = <<"ENDSCRIPT";
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
Line 6053  sub modify_login { Line 5915  sub modify_login {
                         if (!$privkey) {                          if (!$privkey) {
                             $chgtxt .= '<li>'.&mt('Private key deleted').'</li>';                              $chgtxt .= '<li>'.&mt('Private key deleted').'</li>';
                         } else {                          } else {
                             $chgtxt .= '<li>'.&mt('Private key set to [_1]',$privkey).'</li>';                              $chgtxt .= '<li>'.&mt('Private key set to [_1]',$pubkey).'</li>';
                         }                          }
                         $chgtxt .= '</ul>';                          $chgtxt .= '</ul>';
                         $resulttext .= '<li>'.$chgtxt.'</li>';                          $resulttext .= '<li>'.$chgtxt.'</li>';
Line 6878  sub modify_quotas { Line 6740  sub modify_quotas {
                 $confhash{'uniquecode'}{$type} = 1;                  $confhash{'uniquecode'}{$type} = 1;
             }              }
         }          }
         my (%newbook,%allpos);          my ($newbook,@allpos);
         if ($context eq 'requestcourses') {          if ($context eq 'requestcourses') {
             foreach my $type ('textbooks','templates') {              if ($env{'form.addbook'}) {
                 @{$allpos{$type}} = ();                   if (($env{'form.addbook_cnum'} =~ /^$match_courseid$/) &&
                 my $invalid;                      ($env{'form.addbook_cdom'} =~ /^$match_domain$/)) {
                 if ($type eq 'textbooks') {                      if (&Apache::lonnet::homeserver($env{'form.addbook_cnum'},
                     $invalid = &mt('Invalid LON-CAPA course for textbook');                                                      $env{'form.addbook_cdom'}) eq 'no_host') {
                 } else {                          $errors .= '<li><span class="LC_error">'.&mt('Invalid LON-CAPA course for textbook').
                     $invalid = &mt('Invalid LON-CAPA course for template');                                     '</span></li>';
                 }                      } else {
                 if ($env{'form.'.$type.'_addbook'}) {                          $newbook = $env{'form.addbook_cdom'}.'_'.$env{'form.addbook_cnum'};
                     if (($env{'form.'.$type.'_addbook_cnum'} =~ /^$match_courseid$/) &&                          my $position = $env{'form.addbook_pos'};
                         ($env{'form.'.$type.'_addbook_cdom'} =~ /^$match_domain$/)) {                          $position =~ s/\D+//g;
                         if (&Apache::lonnet::homeserver($env{'form.'.$type.'_addbook_cnum'},                          if ($position ne '') {
                                                         $env{'form.'.$type.'_addbook_cdom'}) eq 'no_host') {                              $allpos[$position] = $newbook;
                             $errors .= '<li><span class="LC_error">'.$invalid.'</span></li>';  
                         } else {  
                             $newbook{$type} = $env{'form.'.$type.'_addbook_cdom'}.'_'.$env{'form.'.$type.'_addbook_cnum'};  
                             my $position = $env{'form.'.$type.'_addbook_pos'};  
                             $position =~ s/\D+//g;  
                             if ($position ne '') {  
                                 $allpos{$type}[$position] = $newbook{$type};  
                             }  
                         }                          }
                     } else {  
                         $errors .= '<li><span class="LC_error">'.$invalid.'</span></li>';  
                     }                      }
                   } else {
                       $errors .= '<li><span class="LC_error">'.&mt('Invalid LON-CAPA course for textbook').
                                  '</span></li>';
                 }                  }
             }               }
   
         }          }
         if (ref($domconfig{$action}) eq 'HASH') {          if (ref($domconfig{$action}) eq 'HASH') {
             if (ref($domconfig{$action}{'notify'}) eq 'HASH') {              if (ref($domconfig{$action}{'notify'}) eq 'HASH') {
Line 6939  sub modify_quotas { Line 6795  sub modify_quotas {
                 $changes{'uniquecode'} = 1;                  $changes{'uniquecode'} = 1;
             }              }
             if ($context eq 'requestcourses') {              if ($context eq 'requestcourses') {
                 foreach my $type ('textbooks','templates') {                  if (ref($domconfig{$action}{'textbooks'}) eq 'HASH') {
                     if (ref($domconfig{$action}{$type}) eq 'HASH') {                      my %deletions;
                         my %deletions;                      my @todelete = &Apache::loncommon::get_env_multiple('form.book_del');
                         my @todelete = &Apache::loncommon::get_env_multiple('form.'.$type.'_del');                      if (@todelete) {
                         if (@todelete) {                          map { $deletions{$_} = 1; } @todelete;
                             map { $deletions{$_} = 1; } @todelete;                      }
                         }                      my %imgdeletions;
                         my %imgdeletions;                      my @todeleteimages = &Apache::loncommon::get_env_multiple('form.book_image_del');
                         my @todeleteimages = &Apache::loncommon::get_env_multiple('form.'.$type.'_image_del');                      if (@todeleteimages) {
                         if (@todeleteimages) {                          map { $imgdeletions{$_} = 1; } @todeleteimages;
                             map { $imgdeletions{$_} = 1; } @todeleteimages;                      }
                         }                      my $maxnum = $env{'form.book_maxnum'};
                         my $maxnum = $env{'form.'.$type.'_maxnum'};                      for (my $i=0; $i<=$maxnum; $i++) {
                         for (my $i=0; $i<=$maxnum; $i++) {                          my $key = $env{'form.book_id_'.$i};
                             my $itemid = $env{'form.'.$type.'_id_'.$i};                          if (ref($domconfig{$action}{'textbooks'}{$key}) eq 'HASH') {
                             my ($key) = ($itemid =~ /^\Q$type\E_(\w+)$/);                               if ($deletions{$key}) {
                             if (ref($domconfig{$action}{$type}{$key}) eq 'HASH') {                                  if ($domconfig{$action}{'textbooks'}{$key}{'image'}) {
                                 if ($deletions{$key}) {  
                                     if ($domconfig{$action}{$type}{$key}{'image'}) {  
                                         #FIXME need to obsolete item in RES space  
                                     }  
                                     next;  
                                 } else {  
                                     my $newpos = $env{'form.'.$itemid};  
                                     $newpos =~ s/\D+//g;  
                                     foreach my $item ('subject','title','publisher','author') {  
                                         next if ((($item eq 'author') || ($item eq 'publisher')) &&  
                                                  ($type eq 'templates'));  
                                         $confhash{$type}{$key}{$item} = $env{'form.'.$type.'_'.$item.'_'.$i};  
                                         if ($domconfig{$action}{$type}{$key}{$item} ne $confhash{$type}{$key}{$item}) {  
                                             $changes{$type}{$key} = 1;  
                                         }  
                                     }  
                                     $allpos{$type}[$newpos] = $key;  
                                 }  
                                 if ($imgdeletions{$key}) {  
                                     $changes{$type}{$key} = 1;  
                                     #FIXME need to obsolete item in RES space                                      #FIXME need to obsolete item in RES space
                                 } elsif ($env{'form.'.$type.'_image_'.$i.'.filename'}) {                                  }
                                     my ($cdom,$cnum) = split(/_/,$key);                                  next;
                                     my ($imgurl,$error) = &process_textbook_image($r,$dom,$confname,$type.'_image_'.$i,                              } else {
                                                                                   $cdom,$cnum,$type,$configuserok,                                  my $newpos = $env{'form.'.$key};
                                                                                   $switchserver,$author_ok);                                  $newpos =~ s/\D+//g;
                                     if ($imgurl) {                                  foreach my $item ('subject','title','author') {
                                         $confhash{$type}{$key}{'image'} = $imgurl;                                      $confhash{'textbooks'}{$key}{$item} = $env{'form.book_'.$item.'_'.$i};
                                         $changes{$type}{$key} = 1;                                       if ($domconfig{$action}{'textbooks'}{$key}{$item} ne $confhash{'textbooks'}{$key}{$item}) {
                                           $changes{'textbooks'}{$key} = 1;
                                     }                                      }
                                     if ($error) {  
                                         &Apache::lonnet::logthis($error);  
                                         $errors .= '<li><span class="LC_error">'.$error.'</span></li>';  
                                     }   
                                 } elsif ($domconfig{$action}{$type}{$key}{'image'}) {  
                                     $confhash{$type}{$key}{'image'} =   
                                         $domconfig{$action}{$type}{$key}{'image'};  
                                 }                                  }
                                   $allpos[$newpos] = $key;
                               }
                               if ($imgdeletions{$key}) {
                                   $changes{'textbooks'}{$key} = 1;
                                   #FIXME need to obsolete item in RES space
                               } elsif ($env{'form.book_image_'.$i.'.filename'}) {
                                   my ($cdom,$cnum) = split(/_/,$key);
                                   my ($imgurl,$error) = &process_textbook_image($r,$dom,$confname,'book_image_'.$i,
                                                                                 $cdom,$cnum,$configuserok,
                                                                                 $switchserver,$author_ok);
                                   if ($imgurl) {
                                       $confhash{'textbooks'}{$key}{'image'} = $imgurl;
                                       $changes{'textbooks'}{$key} = 1; 
                                   }
                                   if ($error) {
                                       &Apache::lonnet::logthis($error);
                                       $errors .= '<li><span class="LC_error">'.$error.'</span></li>';
                                   } 
                               } elsif ($domconfig{$action}{'textbooks'}{$key}{'image'}) {
                                   $confhash{'textbooks'}{$key}{'image'} = 
                                       $domconfig{$action}{'textbooks'}{$key}{'image'};
                             }                              }
                         }                          }
                     }                      }
Line 7008  sub modify_quotas { Line 6859  sub modify_quotas {
             }              }
         }          }
         if ($context eq 'requestcourses') {          if ($context eq 'requestcourses') {
             foreach my $type ('textbooks','templates') {              if ($newbook) {
                 if ($newbook{$type}) {                  $changes{'textbooks'}{$newbook} = 1;
                     $changes{$type}{$newbook{$type}} = 1;                  foreach my $item ('subject','title','author') {
                     foreach my $item ('subject','title','publisher','author') {                      $env{'form.addbook_'.$item} =~ s/(`)/'/g;
                         next if ((($item eq 'author') || ($item eq 'publisher')) &&                      if ($env{'form.addbook_'.$item}) {
                                  ($type eq 'template'));                          $confhash{'textbooks'}{$newbook}{$item} = $env{'form.addbook_'.$item};
                         $env{'form.'.$type.'_addbook_'.$item} =~ s/(`)/'/g;                      }
                         if ($env{'form.'.$type.'_addbook_'.$item}) {                  }
                             $confhash{$type}{$newbook{$type}}{$item} = $env{'form.'.$type.'_addbook_'.$item};                  if ($env{'form.addbook_image.filename'} ne '') {
                         }                      my ($cdom,$cnum) = split(/_/,$newbook);
                     }                      my ($imageurl,$error) =
                     if ($type eq 'textbooks') {                          &process_textbook_image($r,$dom,$confname,'addbook_image',$cdom,$cnum,$configuserok,
                         if ($env{'form.'.$type.'_addbook_image.filename'} ne '') {                                                  $switchserver,$author_ok);
                             my ($cdom,$cnum) = split(/_/,$newbook{$type});                      if ($imageurl) {
                             my ($imageurl,$error) =                          $confhash{'textbooks'}{$newbook}{'image'} = $imageurl;
                                 &process_textbook_image($r,$dom,$confname,$type.'_addbook_image',$cdom,$cnum,$type,                      }
                                                         $configuserok,$switchserver,$author_ok);                      if ($error) {
                             if ($imageurl) {                          &Apache::lonnet::logthis($error);
                                 $confhash{$type}{$newbook{$type}}{'image'} = $imageurl;                          $errors .= '<li><span class="LC_error">'.$error.'</span></li>';
                             }  
                             if ($error) {  
                                 &Apache::lonnet::logthis($error);  
                                 $errors .= '<li><span class="LC_error">'.$error.'</span></li>';  
                             }  
                         }  
                     }                      }
                 }                  }
                 if (@{$allpos{$type}} > 0) {              }
                     my $idx = 0;              if (@allpos > 0) {
                     foreach my $item (@{$allpos{$type}}) {                  my $idx = 0;
                         if ($item ne '') {                  foreach my $item (@allpos) {
                             $confhash{$type}{$item}{'order'} = $idx;                      if ($item ne '') {
                             if (ref($domconfig{$action}) eq 'HASH') {                          $confhash{'textbooks'}{$item}{'order'} = $idx;
                                 if (ref($domconfig{$action}{$type}) eq 'HASH') {                          if (ref($domconfig{$action}) eq 'HASH') {
                                     if (ref($domconfig{$action}{$type}{$item}) eq 'HASH') {                              if (ref($domconfig{$action}{'textbooks'}) eq 'HASH') {
                                         if ($domconfig{$action}{$type}{$item}{'order'} ne $idx) {                                  if (ref($domconfig{$action}{'textbooks'}{$item}) eq 'HASH') {
                                             $changes{$type}{$item} = 1;                                      if ($domconfig{$action}{'textbooks'}{$item}{'order'} ne $idx) {
                                         }                                          $changes{'textbooks'}{$item} = 1;
                                     }                                      }
                                 }                                  }
                             }                              }
                             $idx ++;  
                         }                          }
                           $idx ++;
                     }                      }
                 }                  }
             }              }
Line 7267  sub modify_quotas { Line 7112  sub modify_quotas {
         $domdefaults{'requestauthor'} = \%confhash;          $domdefaults{'requestauthor'} = \%confhash;
     } else {      } else {
         foreach my $key (keys(%confhash)) {          foreach my $key (keys(%confhash)) {
             unless (($context eq 'requestcourses') && (($key eq 'textbooks') || ($key eq 'templates'))) {              unless (($context eq 'requestcourses') && ($key eq 'textbooks')) {
                 $domdefaults{$key} = $confhash{$key};                  $domdefaults{$key} = $confhash{$key};
             }              }
         }          }
Line 7419  sub modify_quotas { Line 7264  sub modify_quotas {
                                        '</li>';                                         '</li>';
                     }                      }
                 }                  }
                 foreach my $type ('textbooks','templates') {                  if (ref($changes{'textbooks'}) eq 'HASH') {
                     if (ref($changes{$type}) eq 'HASH') {                      $resulttext .= '<li>'.&mt('Available textbooks updated').'<ul>';
                         $resulttext .= '<li>'.&mt("Available $type updated").'<ul>';                      foreach my $key (sort(keys(%{$changes{'textbooks'}}))) {
                         foreach my $key (sort(keys(%{$changes{$type}}))) {                          my %coursehash = &Apache::lonnet::coursedescription($key);
                             my %coursehash = &Apache::lonnet::coursedescription($key);                          my $coursetitle = $coursehash{'description'};
                             my $coursetitle = $coursehash{'description'};                          my $position = $confhash{'textbooks'}{$key}{'order'} + 1;
                             my $position = $confhash{$type}{$key}{'order'} + 1;                          $resulttext .= '<li>';
                             $resulttext .= '<li>';                          foreach my $item ('subject','title','author') {
                             foreach my $item ('subject','title','publisher','author') {                              my $name = $item.':';
                                 next if ((($item eq 'author') || ($item eq 'publisher')) &&                              $name =~ s/^(\w)/\U$1/;
                                          ($type eq 'templates'));                              $resulttext .= &mt($name).' '.$confhash{'textbooks'}{$key}{$item}.'<br />';
                                 my $name = $item.':';                          }
                                 $name =~ s/^(\w)/\U$1/;                          $resulttext .= ' '.&mt('Order: [_1]',$position).'<br />';
                                 $resulttext .= &mt($name).' '.$confhash{$type}{$key}{$item}.'<br />';                          if ($confhash{'textbooks'}{$key}{'image'}) {
                             }                              $resulttext .= ' '.&mt('Image: [_1]',
                             $resulttext .= ' '.&mt('Order: [_1]',$position).'<br />';                                                 '<img src="'.$confhash{'textbooks'}{$key}{'image'}.'"'.
                             if ($type eq 'textbooks') {                                                 ' alt="Textbook cover" />').'<br />';
                                 if ($confhash{$type}{$key}{'image'}) {  
                                     $resulttext .= ' '.&mt('Image: [_1]',  
                                                    '<img src="'.$confhash{$type}{$key}{'image'}.'"'.  
                                                    ' alt="Textbook cover" />').'<br />';  
                                 }  
                             }  
                             $resulttext .= ' '.&mt('LON-CAPA Course: [_1]',$coursetitle).'</li>';  
                         }                          }
                         $resulttext .= '</ul></li>';                          $resulttext .= ' '.&mt('LON-CAPA Course: [_1]',$coursetitle).'</li>';
                     }                      }
                       $resulttext .= '</ul></li>';
                 }                  }
                 if (ref($changes{'validation'}) eq 'HASH') {                  if (ref($changes{'validation'}) eq 'HASH') {
                     if ((ref($validationitemsref) eq 'ARRAY') && (ref($validationnamesref) eq 'HASH')) {                      if ((ref($validationitemsref) eq 'ARRAY') && (ref($validationnamesref) eq 'HASH')) {
Line 7493  sub modify_quotas { Line 7332  sub modify_quotas {
 }  }
   
 sub process_textbook_image {  sub process_textbook_image {
     my ($r,$dom,$confname,$caller,$cdom,$cnum,$type,$configuserok,$switchserver,$author_ok) = @_;      my ($r,$dom,$confname,$caller,$cdom,$cnum,$configuserok,$switchserver,$author_ok) = @_;
     my $filename = $env{'form.'.$caller.'.filename'};      my $filename = $env{'form.'.$caller.'.filename'};
     my ($error,$url);      my ($error,$url);
     my ($width,$height) = (50,50);      my ($width,$height) = (50,50);
Line 7504  sub process_textbook_image { Line 7343  sub process_textbook_image {
         } elsif ($author_ok eq 'ok') {          } elsif ($author_ok eq 'ok') {
             my ($result,$imageurl) =              my ($result,$imageurl) =
                 &publishlogo($r,'upload',$caller,$dom,$confname,                  &publishlogo($r,'upload',$caller,$dom,$confname,
                              "$type/$dom/$cnum/cover",$width,$height);                               "textbooks/$dom/$cnum/cover",$width,$height);
             if ($result eq 'ok') {              if ($result eq 'ok') {
                 $url = $imageurl;                  $url = $imageurl;
             } else {              } else {
Line 8444  sub modify_selfcreation { Line 8283  sub modify_selfcreation {
                         if (($item eq 'selfcreate') || ($item eq 'statustocreate') ||                          if (($item eq 'selfcreate') || ($item eq 'statustocreate') ||
                             ($item eq 'captcha') || ($item eq 'recaptchakeys') ||                               ($item eq 'captcha') || ($item eq 'recaptchakeys') || 
                             ($item eq 'emailusername') || ($item eq 'notify') ||                              ($item eq 'emailusername') || ($item eq 'notify') ||
                             ($item eq 'selfcreateprocessing') || ($item eq 'shibenv')) {                              ($item eq 'selfcreateprocessing')) {
                             $curr_usercreation{$key}{$item} = $domconfig{'usercreation'}{$key}{$item};                              $curr_usercreation{$key}{$item} = $domconfig{'usercreation'}{$key}{$item};
                         } else {                          } else {
                             $save_usercreate{$key}{$item} = $domconfig{'usercreation'}{$key}{$item};                              $save_usercreate{$key}{$item} = $domconfig{'usercreation'}{$key}{$item};
Line 8476  sub modify_selfcreation { Line 8315  sub modify_selfcreation {
     %{$cancreate{'emailusername'}} = ();      %{$cancreate{'emailusername'}} = ();
     @{$cancreate{'statustocreate'}} = ();      @{$cancreate{'statustocreate'}} = ();
     %{$cancreate{'selfcreateprocessing'}} = ();      %{$cancreate{'selfcreateprocessing'}} = ();
     %{$cancreate{'shibenv'}} = ();  
     my %selfcreatetypes = (      my %selfcreatetypes = (
                              sso   => 'users authenticated by institutional single sign on',                               sso   => 'users authenticated by institutional single sign on',
                              login => 'users authenticated by institutional log-in',                               login => 'users authenticated by institutional log-in',
Line 8521  sub modify_selfcreation { Line 8359  sub modify_selfcreation {
 # value set to one), if self-creation with e-mail address permitted, where $type is user type: faculty, staff, student etc.  # value set to one), if self-creation with e-mail address permitted, where $type is user type: faculty, staff, student etc.
 #  #
   
     if ($env{'form.cancreate_email'}) {      if ($env{'form.cancreate_email'} eq 'email') {
         push(@contexts,'emailusername');          push(@contexts,'emailusername');
         if (ref($types) eq 'ARRAY') {          if (ref($types) eq 'ARRAY') {
             foreach my $type (@{$types}) {              foreach my $type (@{$types}) {
Line 8594  sub modify_selfcreation { Line 8432  sub modify_selfcreation {
     }      }
     my @fields = ('lastname','firstname','middlename','generation',      my @fields = ('lastname','firstname','middlename','generation',
                   'permanentemail','id');                    'permanentemail','id');
     my @shibfields = (@fields,'inststatus');  
     my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();      my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles();
 #  #
 # Where usernames may created for institutional log-in and/or institutional single sign on:  # Where usernames may created for institutional log-in and/or institutional single sign on:
Line 8639  sub modify_selfcreation { Line 8476  sub modify_selfcreation {
                 }                  }
             }              }
         }          }
         foreach my $field (@shibfields) {  
             if ($env{'form.shibenv_'.$field} ne '') {  
                 $cancreate{'shibenv'}{$field} = $env{'form.shibenv_'.$field};  
             }  
         }  
         if (ref($curr_usercreation{'cancreate'}) eq 'HASH') {  
             if (ref($curr_usercreation{'cancreate'}{'shibenv'}) eq 'HASH') {  
                 foreach my $field (@shibfields) {  
                     if ($env{'form.shibenv_'.$field} ne $curr_usercreation{'cancreate'}{'shibenv'}{$field}) {  
                         push(@{$changes{'cancreate'}},'shibenv');  
                     }  
                 }  
             } else {  
                 foreach my $field (@shibfields) {  
                     if ($env{'form.shibenv_'.$field}) {  
                         push(@{$changes{'cancreate'}},'shibenv');  
                         last;  
                     }  
                 }  
             }  
         }  
     }      }
     foreach my $item (@contexts) {      foreach my $item (@contexts) {
         if (ref($curr_usercreation{'cancreate'}{$item}) eq 'ARRAY') {          if (ref($curr_usercreation{'cancreate'}{$item}) eq 'ARRAY') {
Line 8782  sub modify_selfcreation { Line 8598  sub modify_selfcreation {
     if (ref($cancreate{'statustocreate'}) eq 'ARRAY') {      if (ref($cancreate{'statustocreate'}) eq 'ARRAY') {
         $save_usercreate{'cancreate'}{'statustocreate'} = $cancreate{'statustocreate'};          $save_usercreate{'cancreate'}{'statustocreate'} = $cancreate{'statustocreate'};
     }      }
     if (ref($cancreate{'shibenv'}) eq 'HASH') {  
         $save_usercreate{'cancreate'}{'shibenv'} = $cancreate{'shibenv'};  
     }  
     $save_usercreate{'cancreate'}{'emailusername'} = $cancreate{'emailusername'};      $save_usercreate{'cancreate'}{'emailusername'} = $cancreate{'emailusername'};
     $save_usercreate{'emailrule'} = \@email_rule;      $save_usercreate{'emailrule'} = \@email_rule;
   
Line 8827  sub modify_selfcreation { Line 8640  sub modify_selfcreation {
                                 }                                  }
                             }                              }
                         }                          }
                     } elsif ($type eq 'shibenv') {  
                         if (keys(%{$cancreate{$type}}) == 0) {  
                             $chgtext .= &mt('Shibboleth-autheticated user does not use environment variables to set user information');   
                         } else {  
                             $chgtext .= &mt('Shibboleth-autheticated user information set from environment variables, as follows:').  
                                         '<ul>';  
                             foreach my $field (@shibfields) {  
                                 next if ($cancreate{$type}{$field} eq '');  
                                 if ($field eq 'inststatus') {  
                                     $chgtext .= '<li>'.&mt('Institutional status').' -- '.$cancreate{$type}{$field}.'</li>';  
                                 } else {  
                                     $chgtext .= '<li>'.$fieldtitles{$field}.' -- '.$cancreate{$type}{$field}.'</li>';  
                                 }  
                             }  
                             $chgtext .= '</ul>';  
                         }    
                     } elsif ($type eq 'statustocreate') {                      } elsif ($type eq 'statustocreate') {
                         if ((ref($cancreate{'selfcreate'}) eq 'ARRAY') &&                          if ((ref($cancreate{'selfcreate'}) eq 'ARRAY') &&
                             (ref($cancreate{'statustocreate'}) eq 'ARRAY')) {                              (ref($cancreate{'statustocreate'}) eq 'ARRAY')) {
Line 8939  sub modify_selfcreation { Line 8736  sub modify_selfcreation {
                                 foreach my $type (@{$types}) {                                  foreach my $type (@{$types}) {
                                     if (ref($cancreate{'emailusername'}{$type}) eq 'HASH') {                                      if (ref($cancreate{'emailusername'}{$type}) eq 'HASH') {
                                         if (keys(%{$cancreate{'emailusername'}{$type}}) > 0) {                                          if (keys(%{$cancreate{'emailusername'}{$type}}) > 0) {
                                             $chgtext .= &mt('When self-creating account with e-mail as username, the following information will be provided by [_1]:',"'$usertypes->{$type}'").                                              $chgtext .= &mt('When self-creating account with e-mail as username, the following information will be provided by [_1]:',$usertypes->{$type}).
                                                     '<ul>';                                                      '<ul>';
                                             foreach my $field (@{$infofields}) {                                              foreach my $field (@{$infofields}) {
                                                 if ($cancreate{'emailusername'}{$type}{$field}) {                                                  if ($cancreate{'emailusername'}{$type}{$field}) {
                                                     $chgtext .= '<li>'.$infotitles->{$field}.'</li>';                                                      $chgtext .= '<li>'.$infotitles->{$field}.'</li>';
                                                 }                                                  }
                                             }                                              }
                                             $chgtext .= '</ul>';  
                                         } else {  
                                             $chgtext .= &mt('When self creating account with e-mail as username, no information besides e-mail address will be provided by [_1].',"'$usertypes->{$type}'").'<br />';  
                                         }                                          }
                                           $chgtext .= '</ul>';
                                     } else {                                      } else {
                                         $chgtext .= &mt('When self creating account with e-mail as username, no information besides e-mail address will be provided by [_1].',"'$usertypes->{$type}'").'<br />';                                          $chgtext .= &mt('When self creating account with e-mail as username, no information besides e-mail address will be provided by [_1].',$usertypes->{$type}).'<br />';
                                     }                                      }
                                 }                                  }
                             }                              }
Line 9057  sub process_captcha { Line 8852  sub process_captcha {
     if ($newsettings->{'captcha'} eq 'recaptcha') {      if ($newsettings->{'captcha'} eq 'recaptcha') {
         $newpub = $env{'form.'.$container.'_recaptchapub'};          $newpub = $env{'form.'.$container.'_recaptchapub'};
         $newpriv = $env{'form.'.$container.'_recaptchapriv'};          $newpriv = $env{'form.'.$container.'_recaptchapriv'};
         $newpub =~ s/[^\w\-]//g;          $newpub =~ s/\W//g;
         $newpriv =~ s/[^\w\-]//g;          $newpriv =~ s/\W//g;
         $newsettings->{'recaptchakeys'} = {          $newsettings->{'recaptchakeys'} = {
                                              public  => $newpub,                                               public  => $newpub,
                                              private => $newpriv,                                               private => $newpriv,
Line 9516  sub modify_scantron { Line 9311  sub modify_scantron {
 }  }
   
 sub modify_coursecategories {  sub modify_coursecategories {
     my ($dom,$lastactref,%domconfig) = @_;      my ($dom,%domconfig) = @_;
     my ($resulttext,%deletions,%reorderings,%needreordering,%adds,%changes,$errors,      my ($resulttext,%deletions,%reorderings,%needreordering,%adds,%changes,$errors,
         $cathash);          $cathash);
     my @deletecategory = &Apache::loncommon::get_env_multiple('form.deletecategory');      my @deletecategory = &Apache::loncommon::get_env_multiple('form.deletecategory');
     my @catitems = ('unauth','auth');  
     my @cattypes = ('std','domonly','codesrch','none');  
     if (ref($domconfig{'coursecategories'}) eq 'HASH') {      if (ref($domconfig{'coursecategories'}) eq 'HASH') {
         $cathash = $domconfig{'coursecategories'}{'cats'};          $cathash = $domconfig{'coursecategories'}{'cats'};
         if ($domconfig{'coursecategories'}{'togglecats'} ne $env{'form.togglecats'}) {          if ($domconfig{'coursecategories'}{'togglecats'} ne $env{'form.togglecats'}) {
Line 9540  sub modify_coursecategories { Line 9333  sub modify_coursecategories {
             $changes{'categorizecomm'} = 1;              $changes{'categorizecomm'} = 1;
             $domconfig{'coursecategories'}{'categorizecomm'} = $env{'form.categorizecomm'};              $domconfig{'coursecategories'}{'categorizecomm'} = $env{'form.categorizecomm'};
         }          }
         foreach my $item (@catitems) {  
             if (grep(/^\Q$env{'form.coursecat_'.$item}\E$/,@cattypes)) {  
                 if ($domconfig{'coursecategories'}{$item} ne $env{'form.coursecat_'.$item}) {  
                     $changes{$item} = 1;  
                     $domconfig{'coursecategories'}{$item} = $env{'form.coursecat_'.$item};  
                 }  
             }  
         }  
     } else {      } else {
         $changes{'togglecats'} = 1;          $changes{'togglecats'} = 1;
         $changes{'categorize'} = 1;          $changes{'categorize'} = 1;
Line 9559  sub modify_coursecategories { Line 9344  sub modify_coursecategories {
                                              togglecatscomm => $env{'form.togglecatscomm'},                                               togglecatscomm => $env{'form.togglecatscomm'},
                                              categorizecomm => $env{'form.categorizecomm'},                                               categorizecomm => $env{'form.categorizecomm'},
                                          };                                           };
         foreach my $item (@catitems) {  
             if ($env{'form.coursecat_'.$item} ne 'std') {  
                 $changes{$item} = 1;  
             }  
             if (grep(/^\Q$env{'form.coursecat_'.$item}\E$/,@cattypes)) {  
                 $domconfig{'coursecategories'}{$item} = $env{'form.coursecat_'.$item};  
             }  
         }  
     }      }
     if (ref($cathash) eq 'HASH') {      if (ref($cathash) eq 'HASH') {
         if (($domconfig{'coursecategories'}{'cats'}{'instcode::0'} ne '')  && ($env{'form.instcode'} == 0)) {          if (($domconfig{'coursecategories'}{'cats'}{'instcode::0'} ne '')  && ($env{'form.instcode'} == 0)) {
Line 9689  sub modify_coursecategories { Line 9466  sub modify_coursecategories {
                          dom  => 'set in Domain ("Modify Course/Community")',                           dom  => 'set in Domain ("Modify Course/Community")',
                          crs  => 'set in Course ("Course Configuration")',                           crs  => 'set in Course ("Course Configuration")',
                          comm => 'set in Community ("Community Configuration")',                           comm => 'set in Community ("Community Configuration")',
                          none     => 'No catalog',  
                          std      => 'Standard catalog',  
                          domonly  => 'Domain-only catalog',  
                          codesrch => 'Code search form',  
                         );                          );
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             if ($changes{'togglecats'}) {              if ($changes{'togglecats'}) {
Line 9707  sub modify_coursecategories { Line 9480  sub modify_coursecategories {
             if ($changes{'categorizecomm'}) {              if ($changes{'categorizecomm'}) {
                 $resulttext .= '<li>'.&mt("$title{'categorizecomm'} $level{$env{'form.categorizecomm'}}").'</li>';                  $resulttext .= '<li>'.&mt("$title{'categorizecomm'} $level{$env{'form.categorizecomm'}}").'</li>';
             }              }
             if ($changes{'unauth'}) {  
                 $resulttext .= '<li>'.&mt('Catalog type for unauthenticated users set to "'.$level{$env{'form.coursecat_unauth'}}.'"').'</li>';  
             }  
             if ($changes{'auth'}) {  
                 $resulttext .= '<li>'.&mt('Catalog type for authenticated users set to "'.$level{$env{'form.coursecat_auth'}}.'"').'</li>';  
             }  
             if ((keys(%deletions) > 0) || (keys(%reorderings) > 0) || (keys(%adds) > 0)) {              if ((keys(%deletions) > 0) || (keys(%reorderings) > 0) || (keys(%adds) > 0)) {
                 my $cathash;                  my $cathash;
                 if (ref($domconfig{'coursecategories'}) eq 'HASH') {                  if (ref($domconfig{'coursecategories'}) eq 'HASH') {
Line 9757  sub modify_coursecategories { Line 9524  sub modify_coursecategories {
                 }                  }
             }              }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
             if ($changes{'unauth'} || $changes{'auth'}) {  
                 my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);  
                 if ($changes{'auth'}) {  
                     $domdefaults{'catauth'} = $domconfig{'coursecategories'}{'auth'};  
                 }  
                 if ($changes{'unauth'}) {  
                     $domdefaults{'catunauth'} = $domconfig{'coursecategories'}{'unauth'};  
                 }  
                 my $cachetime = 24*60*60;  
                 &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);  
                 if (ref($lastactref) eq 'HASH') {  
                     $lastactref->{'domdefaults'} = 1;  
                 }  
             }  
         } else {          } else {
             $resulttext = '<span class="LC_error">'.              $resulttext = '<span class="LC_error">'.
                           &mt('An error occurred: [_1]',$putresult).'</span>';                            &mt('An error occurred: [_1]',$putresult).'</span>';
Line 10774  sub modify_loadbalancing { Line 10527  sub modify_loadbalancing {
                                                  \%defaultshash,$dom);                                                   \%defaultshash,$dom);
         if ($putresult eq 'ok') {          if ($putresult eq 'ok') {
             if (keys(%changes) > 0) {              if (keys(%changes) > 0) {
                 my %toupdate;  
                 if (ref($changes{'delete'}) eq 'ARRAY') {                  if (ref($changes{'delete'}) eq 'ARRAY') {
                     foreach my $balancer (sort(@{$changes{'delete'}})) {                      foreach my $balancer (sort(@{$changes{'delete'}})) {
                         $resulttext .= '<li>'.&mt('Load Balancing discontinued for: [_1]',$balancer).'</li>';                          $resulttext .= '<li>'.&mt('Load Balancing discontinued for: [_1]',$balancer).'</li>';
                         $toupdate{$balancer} = 1;                          my $cachekey = &escape('loadbalancing').':'.&escape($dom);
                           &Apache::lonnet::remote_devalidate_cache($balancer,[$cachekey]);
                     }                      }
                 }                  }
                 if (ref($changes{'add'}) eq 'ARRAY') {                  if (ref($changes{'add'}) eq 'ARRAY') {
                     foreach my $balancer (sort(@{$changes{'add'}})) {                      foreach my $balancer (sort(@{$changes{'add'}})) {
                         $resulttext .= '<li>'.&mt('Load Balancing enabled for: [_1]',$balancer);                          $resulttext .= '<li>'.&mt('Load Balancing enabled for: [_1]',$balancer);
                         $toupdate{$balancer} = 1;  
                     }                      }
                 }                  }
                 if (ref($changes{'curr'}) eq 'HASH') {                  if (ref($changes{'curr'}) eq 'HASH') {
Line 10827  sub modify_loadbalancing { Line 10579  sub modify_loadbalancing {
                                         } elsif (($rule eq 'homeserver') || ($rule eq 'externalbalancer') ||                                          } elsif (($rule eq 'homeserver') || ($rule eq 'externalbalancer') ||
                                                  ($rule eq 'balancer') || ($rule eq 'offloadedto')) {                                                   ($rule eq 'balancer') || ($rule eq 'offloadedto')) {
                                             $balancetext =  $ruletitles{$rule};                                              $balancetext =  $ruletitles{$rule};
                                             if (($rule eq 'balancer') || ($rule eq 'offloadedto')) {  
                                                 foreach my $sparetype (@sparestypes) {  
                                                     if (ref($defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}) eq 'ARRAY') {  
                                                         map { $toupdate{$_} = 1; } (@{$defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}});  
                                                     }  
                                                 }  
                                             }  
                                         } else {                                          } else {
                                             $balancetext = &mt('offload to [_1]',$defaultshash{'loadbalancing'}{$balancer}{'rules'}{$type});                                              $balancetext = &mt('offload to [_1]',$defaultshash{'loadbalancing'}{$balancer}{'rules'}{$type});
                                         }                                          }
Line 10842  sub modify_loadbalancing { Line 10587  sub modify_loadbalancing {
                                 }                                  }
                             }                              }
                         }                          }
                         if (keys(%toupdate)) {                          my $cachekey = &escape('loadbalancing').':'.&escape($dom);
                             my %thismachine;                          &Apache::lonnet::remote_devalidate_cache($balancer,[$cachekey]);
                             my $updatedhere;  
                             my $cachetime = 60*60*24;  
                             map { $thismachine{$_} = 1; } &Apache::lonnet::current_machine_ids();  
                             foreach my $lonhost (keys(%toupdate)) {  
                                 if ($thismachine{$lonhost}) {  
                                     unless ($updatedhere) {  
                                         &Apache::lonnet::do_cache_new('loadbalancing',$dom,  
                                                                       $defaultshash{'loadbalancing'},  
                                                                       $cachetime);  
                                         $updatedhere = 1;  
                                     }  
                                 } else {  
                                     my $cachekey = &escape('loadbalancing').':'.&escape($dom);  
                                     &Apache::lonnet::remote_devalidate_cache($lonhost,[$cachekey]);  
                                 }  
                             }  
                         }  
                     }                      }
                 }                  }
                 if ($resulttext ne '') {                  if ($resulttext ne '') {
Line 11001  sub active_dc_picker { Line 10729  sub active_dc_picker {
         my ($dcname,$dcdom) = split(':',$domcoord[0]);          my ($dcname,$dcdom) = split(':',$domcoord[0]);
         my $user = &Apache::loncommon::plainname($dcname,$dcdom);          my $user = &Apache::loncommon::plainname($dcname,$dcdom);
         if ($inputtype eq 'radio') {          if ($inputtype eq 'radio') {
             $table = '<input type="hidden" name="'.$name.'" value="'.$domcoord[0].'" />'.$user;              $table .= '<input type="hidden" name="'.$name.'" value="'.$domcoord[0].'" />'.$user;
             if ($user ne $dcname.':'.$dcdom) {              if ($user ne $dcname.':'.$dcdom) {
                 $table .=  ' ('.$dcname.':'.$dcdom.')';                  $table .=  ' ('.$dcname.':'.$dcdom.')';
             }              }
Line 11010  sub active_dc_picker { Line 10738  sub active_dc_picker {
             if (exists($currhash{$domcoord[0]})) {              if (exists($currhash{$domcoord[0]})) {
                 $check = ' checked="checked"';                  $check = ' checked="checked"';
             }              }
             $table = '<span class="LC_nobreak"><label>'.              $table .= '<span class="LC_nobreak"><label>'.
                      '<input type="checkbox" name="'.$name.'" '.                        '<input type="checkbox" name="'.$name.'" '.
                      'value="'.$domcoord[0].'"'.$check.' />'.$user;                        'value="'.$domcoord[0].'"'.$check.' />'.$user;
             if ($user ne $dcname.':'.$dcdom) {              if ($user ne $dcname.':'.$dcdom) {
                 $table .=  ' ('.$dcname.':'.$dcdom.')';                  $table .=  ' ('.$dcname.':'.$dcdom.')';
             }              }

Removed from v.1.160.6.54  
changed lines
  Added in v.1.236


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