Diff for /loncom/interface/domainprefs.pm between versions 1.209 and 1.218

version 1.209, 2013/09/29 00:49:28 version 1.218, 2013/12/25 20:43:46
Line 86  $dom,$settings,$rowtotal,$action. Line 86  $dom,$settings,$rowtotal,$action.
   
 $dom is the domain, $settings is a reference to a hash of current settings for  $dom is the domain, $settings is a reference to a hash of current settings for
 the current context, $rowtotal is a reference to the scalar used to record the   the current context, $rowtotal is a reference to the scalar used to record the 
 number of rows displayed on the page, and $action is the context (quotas,    number of rows displayed on the page, and $action is the context (quotas, 
 requestcourses or requestauthor).  requestcourses or requestauthor).
   
 The print_quotas routine was orginally created to display/store information  The print_quotas routine was orginally created to display/store information
Line 103  $datatable  - HTML containing form eleme Line 103  $datatable  - HTML containing form eleme
   
 In the case of course requests, radio buttons are displayed for each institutional  In the case of course requests, radio buttons are displayed for each institutional
 affiliate type (and also default, and _LC_adv) for each of the course types   affiliate type (and also default, and _LC_adv) for each of the course types 
 (official, unofficial and community).  In each case the radio buttons allow the   (official, unofficial, community, and textbook).  In each case the radio buttons 
 selection of one of four values:  allow the selection of one of four values:
   
 0, approval, validate, autolimit=N (where N is blank, or a positive integer).  0, approval, validate, autolimit=N (where N is blank, or a positive integer).
 which have the following effects:  which have the following effects:
Line 259  sub handler { Line 259  sub handler {
                       help => 'Domain_Configuration_Quotas',                        help => 'Domain_Configuration_Quotas',
                       header => [{col1 => 'User affiliation',                        header => [{col1 => 'User affiliation',
                                   col2 => 'Available tools',                                    col2 => 'Available tools',
                                   col3 => 'Quotas, Mb; (Authoring requires role)',}],                                    col3 => 'Quotas, MB; (Authoring requires role)',}],
                     },                      },
         'autoenroll' =>          'autoenroll' =>
                    { text => 'Auto-enrollment settings',                     { text => 'Auto-enrollment settings',
Line 329  sub handler { Line 329  sub handler {
                   header => [{col1 => 'User affiliation',                    header => [{col1 => 'User affiliation',
                               col2 => 'Availability/Processing of requests',},                                col2 => 'Availability/Processing of requests',},
                              {col1 => 'Setting',                               {col1 => 'Setting',
                               col2 => 'Value'}],                                col2 => 'Value'},
                                {col1 => 'Available textbooks',
                                 col2 => ''}],
                  },                   },
         'requestauthor' =>          'requestauthor' =>
                  {text => 'Request authoring space',                   {text => 'Request authoring space',
Line 416  sub handler { Line 418  sub handler {
     my $confname = $dom.'-domainconfig';      my $confname = $dom.'-domainconfig';
   
     if ($phase eq 'process') {      if ($phase eq 'process') {
         if (&Apache::lonconfigsettings::make_changes($r,$dom,$phase,$context,\@prefs_order,          my $result = &Apache::lonconfigsettings::make_changes($r,$dom,$phase,$context,\@prefs_order,
                                                      \%prefs,\%domconfig,$confname,\@roles) eq 'update') {                                                                \%prefs,\%domconfig,$confname,\@roles);
           if (ref($result) eq 'HASH') {
             $r->rflush();              $r->rflush();
             &devalidate_remote_domconfs($dom);              &devalidate_remote_domconfs($dom,$result);
         }          }
     } elsif ($phase eq 'display') {      } elsif ($phase eq 'display') {
         my $js = &recaptcha_js().          my $js = &recaptcha_js().
Line 433  sub handler { Line 436  sub handler {
                    &common_domprefs_js().                     &common_domprefs_js().
                    &Apache::loncommon::javascript_array_indexof();                     &Apache::loncommon::javascript_array_indexof();
         }          }
           if (grep(/^requestcourses$/,@actions)) {
               my $javascript_validations;
               my $coursebrowserjs=&Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'}); 
               $js .= <<END;
   <script type="text/javascript">
   $javascript_validations
   </script>
   $coursebrowserjs
   END
           }
         &Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,$js);          &Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,$js);
     } else {      } else {
 # check if domconfig user exists for the domain.  # check if domconfig user exists for the domain.
Line 442  sub handler { Line 455  sub handler {
         unless ($configuserok eq 'ok') {          unless ($configuserok eq 'ok') {
             &Apache::lonconfigsettings::print_header($r,$phase,$context);              &Apache::lonconfigsettings::print_header($r,$phase,$context);
             $r->print(&mt('The domain configuration user "[_1]" has yet to be created.',              $r->print(&mt('The domain configuration user "[_1]" has yet to be created.',
                            $confname).                            $confname).
                       '<br />'                        '<br />'
             );              );
             if ($switchserver) {              if ($switchserver) {
Line 514  sub process_changes { Line 527  sub process_changes {
         $output = &modify_rolecolors($r,$dom,$confname,$roles,          $output = &modify_rolecolors($r,$dom,$confname,$roles,
                                      $lastactref,%domconfig);                                       $lastactref,%domconfig);
     } elsif ($action eq 'quotas') {      } elsif ($action eq 'quotas') {
         $output = &modify_quotas($dom,$action,%domconfig);          $output = &modify_quotas($r,$dom,$action,$lastactref,%domconfig);
     } elsif ($action eq 'autoenroll') {      } elsif ($action eq 'autoenroll') {
         $output = &modify_autoenroll($dom,$lastactref,%domconfig);          $output = &modify_autoenroll($dom,$lastactref,%domconfig);
     } elsif ($action eq 'autoupdate') {      } elsif ($action eq 'autoupdate') {
Line 530  sub process_changes { Line 543  sub process_changes {
     } elsif ($action eq 'contacts') {      } elsif ($action eq 'contacts') {
         $output = &modify_contacts($dom,$lastactref,%domconfig);          $output = &modify_contacts($dom,$lastactref,%domconfig);
     } elsif ($action eq 'defaults') {      } elsif ($action eq 'defaults') {
         $output = &modify_defaults($dom,$r,%domconfig);          $output = &modify_defaults($dom,$lastactref,%domconfig);
     } 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') {
Line 538  sub process_changes { Line 551  sub process_changes {
     } 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($dom,$action,%domconfig);          $output = &modify_quotas($r,$dom,$action,$lastactref,%domconfig);
     } elsif ($action eq 'requestauthor') {      } elsif ($action eq 'requestauthor') {
         $output = &modify_quotas($dom,$action,%domconfig);          $output = &modify_quotas($r,$dom,$action,$lastactref,%domconfig);
     } elsif ($action eq 'helpsettings') {      } elsif ($action eq 'helpsettings') {
         $output = &modify_helpsettings($r,$dom,$confname,%domconfig);          $output = &modify_helpsettings($r,$dom,$confname,%domconfig);
     } elsif ($action eq 'coursedefaults') {      } elsif ($action eq 'coursedefaults') {
         $output = &modify_coursedefaults($dom,%domconfig);          $output = &modify_coursedefaults($dom,$lastactref,%domconfig);
     } elsif ($action eq 'usersessions') {      } elsif ($action eq 'usersessions') {
         $output = &modify_usersessions($dom,%domconfig);          $output = &modify_usersessions($dom,$lastactref,%domconfig);
     } elsif ($action eq 'loadbalancing') {      } elsif ($action eq 'loadbalancing') {
         $output = &modify_loadbalancing($dom,%domconfig);          $output = &modify_loadbalancing($dom,%domconfig);
     }      }
Line 575  sub print_config_box { Line 588  sub print_config_box {
     if ($numheaders > 1) {      if ($numheaders > 1) {
         my $colspan = '';          my $colspan = '';
         my $rightcolspan = '';          my $rightcolspan = '';
         if (($action eq 'rolecolors') || ($action eq 'coursecategories') ||           if (($action eq 'rolecolors') || ($action eq 'coursecategories') ||
             (($action eq 'login') && ($numheaders < 3))) {              (($action eq 'login') && ($numheaders < 3))) {
             $colspan = ' colspan="2"';              $colspan = ' colspan="2"';
         }          }
Line 666  sub print_config_box { Line 679  sub print_config_box {
             <table class="LC_nested">              <table class="LC_nested">
              <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>'.
                        &print_usermodification('bottom',$dom,$settings,\$rowtotal);                         &print_usermodification('bottom',$dom,$settings,\$rowtotal);
             $rowtotal ++;              $rowtotal ++;
         } elsif ($action eq 'coursecategories') {          } elsif ($action eq 'coursecategories') {
Line 682  sub print_config_box { Line 695  sub print_config_box {
             <table class="LC_nested">              <table class="LC_nested">
              <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"'.$colspan.'>'.&mt($item->{'header'}->[2]->{'col2'}).'</td>      </tr>'.                <td class="LC_right_item"'.$colspan.'>'.&mt($item->{'header'}->[2]->{'col2'}).'</td></tr>'.
                        &print_login('help',$dom,$confname,$phase,$settings,\$rowtotal);                         &print_login('help',$dom,$confname,$phase,$settings,\$rowtotal);
                 $rowtotal ++;                  $rowtotal ++;
             } else {              } else {
                 $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).
                          &print_studentcode($settings,\$rowtotal).'
              </table>
             </td>
            </tr>
            <tr>
              <td>
               <table class="LC_nested">
                <tr class="LC_info_row">
                 <td class="LC_left_item"'.$colspan.'>'.&mt($item->{'header'}->[2]->{'col1'}).'</td>
                 <td class="LC_right_item">'.&mt($item->{'header'}->[2]->{'col2'}).'</td> </tr>'.
                          &print_textbookcourses($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);
         } elsif ($action eq 'usersessions') {          } elsif ($action eq 'usersessions') {
Line 794  sub print_config_box { Line 818  sub print_config_box {
         } elsif ($action eq 'contacts') {          } elsif ($action eq 'contacts') {
             $output .= &print_contacts($dom,$settings,\$rowtotal);              $output .= &print_contacts($dom,$settings,\$rowtotal);
         } elsif ($action eq 'defaults') {          } elsif ($action eq 'defaults') {
             $output .= &print_defaults($dom,\$rowtotal);              $output .= &print_defaults($dom,$settings,\$rowtotal);
         } elsif ($action eq 'scantron') {          } elsif ($action eq 'scantron') {
             $output .= &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal);              $output .= &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal);
         } elsif ($action eq 'serverstatuses') {          } elsif ($action eq 'serverstatuses') {
Line 1549  sub print_quotas { Line 1573  sub print_quotas {
     my $typecount = 0;      my $typecount = 0;
     my ($css_class,%titles);      my ($css_class,%titles);
     if ($context eq 'requestcourses') {      if ($context eq 'requestcourses') {
         @usertools = ('official','unofficial','community');          @usertools = ('official','unofficial','community','textbook');
         @options =('norequest','approval','validate','autolimit');          @options =('norequest','approval','validate','autolimit');
         %validations = &Apache::lonnet::auto_courserequest_checks($dom);          %validations = &Apache::lonnet::auto_courserequest_checks($dom);
         %titles = &courserequest_titles();          %titles = &courserequest_titles();
     } elsif ($context eq 'requestauthor') {      } elsif ($context eq 'requestauthor') {
         @usertools = ('author');          @usertools = ('author');
         @options = ('norequest','approval','automatic');          @options = ('norequest','approval','automatic');
         %titles = &authorrequest_titles();           %titles = &authorrequest_titles();
     } else {      } else {
         @usertools = ('aboutme','blog','webdav','portfolio');          @usertools = ('aboutme','blog','webdav','portfolio');
         %titles = &tool_titles();          %titles = &tool_titles();
Line 1995  sub print_requestmail { Line 2019  sub print_requestmail {
     return $datatable;      return $datatable;
 }  }
   
   sub print_studentcode {
       my ($settings,$rowtotal) = @_;
       my $rownum = 0; 
       my ($output,%current);
       my @crstypes = ('official','unofficial','community','textbook');
       if (ref($settings->{'uniquecode'}) eq 'HASH') {
           foreach my $type (@crstypes) {
               $current{$type} = $settings->{'uniquecode'}{$type};
           }
       }
       $output .= '<tr>'.
                  '<td class="LC_left_item">'.&mt('Generate unique six character code as course identifier?').'</td>'.
                  '<td class="LC_left_item">';
       foreach my $type (@crstypes) {
           my $check = ' ';
           if ($current{$type}) {
               $check = ' checked="checked" ';
           }
           $output .= '<span class="LC_nobreak"><label>'.
                      '<input type="checkbox" name="uniquecode" value="'.$type.'"'.$check.'/>'.
                      &mt($type).'</label></span>'.('&nbsp;'x2).' ';
       }
       $output .= '</td></tr>';
       $$rowtotal ++;
       return $output;
   }
   
   sub print_textbookcourses {
       my ($dom,$settings,$rowtotal) = @_;
       my $rownum = 0;
       my $css_class;
       my $itemcount = 1;
       my $maxnum = 0;
       my $bookshash;
       if (ref($settings) eq 'HASH') {
           $bookshash = $settings->{'textbooks'};
       }
       my %ordered;
       if (ref($bookshash) eq 'HASH') {
           foreach my $item (keys(%{$bookshash})) {
               if (ref($bookshash->{$item}) eq 'HASH') {
                   my $num = $bookshash->{$item}{'order'};
                   $ordered{$num} = $item;
               }
           }
       }
       my $confname = $dom.'-domainconfig';
       my $switchserver = &check_switchserver($dom,$confname);
       my $maxnum = scalar(keys(%ordered));
       my $datatable = &textbookcourses_javascript(\%ordered);
       if (keys(%ordered)) {
           my @items = sort { $a <=> $b } keys(%ordered);
           for (my $i=0; $i<@items; $i++) {
               $css_class = $itemcount%2?' class="LC_odd_row"':'';
               my $key = $ordered{$items[$i]};
               my %coursehash=&Apache::lonnet::coursedescription($key);
               my $coursetitle = $coursehash{'description'};
               my ($subject,$title,$author,$image,$imgsrc,$cdom,$cnum);
               if (ref($bookshash->{$key}) eq 'HASH') {
                   $subject = $bookshash->{$key}->{'subject'};
                   $title = $bookshash->{$key}->{'title'};
                   $author = $bookshash->{$key}->{'author'};
                   $image = $bookshash->{$key}->{'image'};
                   if ($image ne '') {
                       my ($path,$imagefile) = ($image =~ m{^(.+)/([^/]+)$});
                       my $imagethumb = "$path/tn-".$imagefile;
                       $imgsrc = '<img src="'.$imagethumb.'" alt="'.&mt('Textbook image').'" />';
                   }
               }
               my $chgstr = ' onchange="javascript:reorderBooks(this.form,'."'$key'".');"';
               $datatable .= '<tr '.$css_class.'><td><span class="LC_nobreak">'
                            .'<select name="'.$key.'"'.$chgstr.'>';
               for (my $k=0; $k<=$maxnum; $k++) {
                   my $vpos = $k+1;
                   my $selstr;
                   if ($k == $i) {
                       $selstr = ' selected="selected" ';
                   }
                   $datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>';
               }
               $datatable .= '</select>'.('&nbsp;'x2).
                   '<label><input type="checkbox" name="book_del" value="'.$key.'" />'.
                   &mt('Delete?').'</label></span></td>'.
                   '<td colspan="2">'.
                   '<span class="LC_nobreak">'.&mt('Subject:').'<input type="text" size="15" name="book_subject_'.$i.'" value="'.$subject.'" /></span> '.
                   ('&nbsp;'x2).
                   '<span class="LC_nobreak">'.&mt('Title:').'<input type="text" size="30" name="book_title_'.$i.'" value="'.$title.'" /></span> '.
                   ('&nbsp;'x2).
                   '<span class="LC_nobreak">'.&mt('Author(s):').'<input type="text" size="25" name="book_author_'.$i.'" value="'.$author.'" /></span> '.
                   ('&nbsp;'x2).
                   '<span class="LC_nobreak">'.&mt('Thumbnail:');
               if ($image) {
                   $datatable .= '<span class="LC_nobreak">'.
                                 $imgsrc.
                                 '<label><input type="checkbox" name="book_image_del"'.
                                 ' value="'.$key.'" />'.&mt('Delete?').'</label></span> '.
                                 '<span class="LC_nobreak">&nbsp;'.&mt('Replace:').'&nbsp;';
               }
               if ($switchserver) {
                   $datatable .= &mt('Upload to library server: [_1]',$switchserver);
               } else {
                   $datatable .= '<input type="file" name="book_image_'.$i.'" value="" />';
               }
               $datatable .= '<input type="hidden" name="book_id_'.$i.'" value="'.$key.'" /></span> '.
                             '<span class="LC_nobreak">'.&mt('LON-CAPA course:').'&nbsp;'.
                             $coursetitle.'</span></td></tr>'."\n";
               $itemcount ++;
           }
       }
       $css_class = $itemcount%2?' class="LC_odd_row"':'';
       my $chgstr = ' onchange="javascript:reorderBooks(this.form,'."'addbook_pos'".');"';
       $datatable .= '<tr '.$css_class.'><td><span class="LC_nobreak">'."\n".
                     '<input type="hidden" name="book_maxnum" value="'.$maxnum.'" />'."\n".
                     '<select name="addbook_pos"'.$chgstr.'>';
       for (my $k=0; $k<$maxnum+1; $k++) {
           my $vpos = $k+1;
           my $selstr;
           if ($k == $maxnum) {
               $selstr = ' selected="selected" ';
           }
           $datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>';
       }
       $datatable .= '</select>&nbsp;'."\n".
                     '<input type="checkbox" name="addbook" value="1" />'.&mt('Add').'</td>'."\n".
                     '<td colspan="2">'.
                     '<span class="LC_nobreak">'.&mt('Subject:').'<input type="text" size="15" name="addbook_subject" value="" /></span> '."\n".
                     ('&nbsp;'x2).
                     '<span class="LC_nobreak">'.&mt('Title:').'<input type="text" size="30" name="addbook_title" value="" /></span> '."\n".
                     ('&nbsp;'x2).
                     '<span class="LC_nobreak">'.&mt('Author(s):').'<input type="text" size="25" name="addbook_author" value="" /></span> '."\n".
                     ('&nbsp;'x2).
                     '<span class="LC_nobreak">'.&mt('Image:').'&nbsp;';
       if ($switchserver) {
           $datatable .= &mt('Upload to library server: [_1]',$switchserver);
       } else {
           $datatable .= '<input type="file" name="addbook_image" value="" />';
       }
       $datatable .= '</span>'."\n".
                     '<span class="LC_nobreak">'.&mt('LON-CAPA course:').'&nbsp;'.
                     &Apache::loncommon::select_dom_form($env{'request.role.domain'},'addbook_cdom').
                     '<input type="text" size="25" name="addbook_cnum" value="" />'.
                     &Apache::loncommon::selectcourse_link
                         ('display','addbook_cnum','addbook_cdom',undef,undef,undef,'Course');
                     '</span></td>'."\n".
                     '</tr>'."\n";
       $itemcount ++;
       return $datatable;
   }
   
   sub textbookcourses_javascript {
       my ($textbooks) = @_;
       return unless(ref($textbooks) eq 'HASH');
       my $num = scalar(keys(%{$textbooks}));
       my @jsarray;
       foreach my $item (sort {$a <=> $b } (keys(%{$textbooks}))) {
           push(@jsarray,$textbooks->{$item});
       }
       my $jstext = '    var textbooks = Array('."'".join("','",@jsarray)."'".');'."\n";
       return <<"ENDSCRIPT";
   <script type="text/javascript">
   // <![CDATA[
   function reorderBooks(form,item) {
       var changedVal;
   $jstext 
       var newpos = 'addbook_pos';
       var current = new Array;
       var maxh = 1 + $num;
       var current = new Array;
       var newitemVal = form.elements[newpos].options[form.elements[newpos].selectedIndex].value;
       if (item == newpos) {
           changedVal = newitemVal;
       } else {
           changedVal = form.elements[item].options[form.elements[item].selectedIndex].value;
           current[newitemVal] = newpos;
       }
       for (var i=0; i<textbooks.length; i++) {
           var elementName = textbooks[i];
           if (elementName != item) {
               if (form.elements[elementName]) {
                   var currVal = form.elements[elementName].options[form.elements[elementName].selectedIndex].value;
                   current[currVal] = elementName;
               }
           }
       }
       var oldVal;
       for (var j=0; j<maxh; j++) {
           if (current[j] == undefined) {
               oldVal = j;
           }
       }
       if (oldVal < changedVal) {
           for (var k=oldVal+1; k<=changedVal ; k++) {
              var elementName = current[k];
              form.elements[elementName].selectedIndex = form.elements[elementName].selectedIndex - 1;
           }
       } else {
           for (var k=changedVal; k<oldVal; k++) {
               var elementName = current[k];
               form.elements[elementName].selectedIndex = form.elements[elementName].selectedIndex + 1;
           }
       }
       return;
   }
   
   // ]]>
   </script>
   
   ENDSCRIPT
   }
   
 sub print_autoenroll {  sub print_autoenroll {
     my ($dom,$settings,$rowtotal) = @_;      my ($dom,$settings,$rowtotal) = @_;
     my $autorun = &Apache::lonnet::auto_run(undef,$dom),      my $autorun = &Apache::lonnet::auto_run(undef,$dom),
Line 2156  sub print_autocreate { Line 2390  sub print_autocreate {
                 }                  }
             }              }
         }          }
         if ($settings->{'xmldc'} ne '') {           if ($settings->{'xmldc'} ne '') {
             $currhash{$settings->{'xmldc'}} = 1;              $currhash{$settings->{'xmldc'}} = 1;
         }          }
     } else {      } else {
Line 2493  sub print_coursedefaults { Line 2727  sub print_coursedefaults {
                                                  \%choices,$itemcount);                                                   \%choices,$itemcount);
     } else {      } else {
         $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';          $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';
         my ($currdefresponder,$def_official_credits,$def_unofficial_credits,%curruploadquota);          my ($currdefresponder,$def_official_credits,$def_unofficial_credits,$def_textbook_credits,
               %curruploadquota);
         my $currusecredits = 0;          my $currusecredits = 0;
         my @types = ('official','unofficial','community');          my @types = ('official','unofficial','community','textbook');
         if (ref($settings) eq 'HASH') {          if (ref($settings) eq 'HASH') {
             $currdefresponder = $settings->{'anonsurvey_threshold'};              $currdefresponder = $settings->{'anonsurvey_threshold'};
             if (ref($settings->{'uploadquota'}) eq 'HASH') {              if (ref($settings->{'uploadquota'}) eq 'HASH') {
Line 2506  sub print_coursedefaults { Line 2741  sub print_coursedefaults {
             if (ref($settings->{'coursecredits'}) eq 'HASH') {              if (ref($settings->{'coursecredits'}) eq 'HASH') {
                 $def_official_credits = $settings->{'coursecredits'}->{'official'};                  $def_official_credits = $settings->{'coursecredits'}->{'official'};
                 $def_unofficial_credits = $settings->{'coursecredits'}->{'unofficial'};                  $def_unofficial_credits = $settings->{'coursecredits'}->{'unofficial'};
                 if (($def_official_credits ne '') || ($def_unofficial_credits ne '')) {                  $def_textbook_credits = $settings->{'coursecredits'}->{'textbook'};
                   if (($def_official_credits ne '') || ($def_unofficial_credits ne '') ||
                       ($def_textbook_credits ne '')) {
                     $currusecredits = 1;                      $currusecredits = 1;
                 }                  }
             }              }
Line 2542  sub print_coursedefaults { Line 2779  sub print_coursedefaults {
         $datatable .= '</tr></table></td></tr>'."\n";          $datatable .= '</tr></table></td></tr>'."\n";
         $itemcount += 2;          $itemcount += 2;
         my $onclick = 'toggleCredits(this.form);';          my $onclick = 'toggleCredits(this.form);';
         my $display = 'none';            my $display = 'none';
         if ($currusecredits) {          if ($currusecredits) {
             $display = 'block';              $display = 'block';
         }          }
Line 2556  sub print_coursedefaults { Line 2793  sub print_coursedefaults {
                          &mt('Default credits for unofficial courses [_1]',                           &mt('Default credits for unofficial courses [_1]',
                          '<input type="text" name="unofficial_credits" value="'.                           '<input type="text" name="unofficial_credits" value="'.
                          $def_unofficial_credits.'" size="3" />').                           $def_unofficial_credits.'" size="3" />').
                            '</span><br />'.
                            '<span class="LC_nobreak">'.
                            &mt('Default credits for textbook courses [_1]',
                            '<input type="text" name="textbook_credits" value="'.
                            $def_textbook_credits.'" size="3" />').
                          '</span></div>'."\n";                           '</span></div>'."\n";
         %defaultchecked = ('coursecredits' => 'off');          %defaultchecked = ('coursecredits' => 'off');
         @toggles = ('coursecredits');          @toggles = ('coursecredits');
Line 3028  sub print_loadbalancing { Line 3270  sub print_loadbalancing {
                       '<td rowspan="'.$rownum.'" valign="top">'.                        '<td rowspan="'.$rownum.'" valign="top">'.
                       '<p>';                        '<p>';
         if ($lonhost eq '') {          if ($lonhost eq '') {
             $datatable .= '<span class="LC_nobreak">';               $datatable .= '<span class="LC_nobreak">';
             if (keys(%currbalancer) > 0) {              if (keys(%currbalancer) > 0) {
                 $datatable .= &mt('Add balancer:');                  $datatable .= &mt('Add balancer:');
             } else {              } else {
Line 3044  sub print_loadbalancing { Line 3286  sub print_loadbalancing {
                 next if ($currbalancer{$server});                  next if ($currbalancer{$server});
                 $datatable .= '<option value="'.$server.'">'.$server.'</option>'."\n";                  $datatable .= '<option value="'.$server.'">'.$server.'</option>'."\n";
             }              }
             $datatable .=               $datatable .=
                 '</select>'."\n".                  '</select>'."\n".
                 '<input type="hidden" name="loadbalancing_prevlonhost_'.$balnum.'" id="loadbalancing_prevlonhost_'.$balnum.'" value="" />&nbsp;</span>'."\n";                  '<input type="hidden" name="loadbalancing_prevlonhost_'.$balnum.'" id="loadbalancing_prevlonhost_'.$balnum.'" value="" />&nbsp;</span>'."\n";
         } else {          } else {
Line 3083  sub print_loadbalancing { Line 3325  sub print_loadbalancing {
                 if (exists($currbalancer{$spares[$i]})) {                  if (exists($currbalancer{$spares[$i]})) {
                     $disabled = ' disabled="disabled"';                      $disabled = ' disabled="disabled"';
                 }                  }
                 $targettable .=                   $targettable .=
                     '<td><label><input type="checkbox" name="loadbalancing_target_'.$balnum.'_'.$sparetype.'"'.                      '<td><label><input type="checkbox" name="loadbalancing_target_'.$balnum.'_'.$sparetype.'"'.
                     $checked.$disabled.' value="'.$chkboxval.'" id="loadbalancing_target_'.$balnum.'_'.$sparetype.'_'.$i.'" onclick="checkOffloads('."this,'$balnum','$sparetype'".');" /><span id="loadbalancing_targettxt_'.$balnum.'_'.$sparetype.'_'.$i.'">&nbsp;'.$chkboxval.                      $checked.$disabled.' value="'.$chkboxval.'" id="loadbalancing_target_'.$balnum.'_'.$sparetype.'_'.$i.'" onclick="checkOffloads('."this,'$balnum','$sparetype'".');" /><span id="loadbalancing_targettxt_'.$balnum.'_'.$sparetype.'_'.$i.'">&nbsp;'.$chkboxval.
                     '</span></label></td>';                      '</span></label></td>';
Line 3167  sub loadbalancing_rules { Line 3409  sub loadbalancing_rules {
         $css_class,$balnum,$islast) = @_;          $css_class,$balnum,$islast) = @_;
     my $output;      my $output;
     my $num = 0;      my $num = 0;
     my ($alltypes,$othertypes,$titles) =       my ($alltypes,$othertypes,$titles) =
         &loadbalancing_titles($dom,$intdom,$usertypes,$types);          &loadbalancing_titles($dom,$intdom,$usertypes,$types);
     if ((ref($alltypes) eq 'ARRAY') && (ref($titles) eq 'HASH'))  {      if ((ref($alltypes) eq 'ARRAY') && (ref($titles) eq 'HASH'))  {
         foreach my $type (@{$alltypes}) {          foreach my $type (@{$alltypes}) {
Line 3246  sub loadbalance_rule_row { Line 3488  sub loadbalance_rule_row {
     if ($islast && $num == 1) {      if ($islast && $num == 1) {
         $space = '<div display="inline-block">&nbsp;</div>';          $space = '<div display="inline-block">&nbsp;</div>';
     }      }
     my $output =       my $output =
         '<tr class="'.$css_class.'" id="balanceruletr_'.$balnum.'_'.$num.'"><td valign="top">'.$space.          '<tr class="'.$css_class.'" id="balanceruletr_'.$balnum.'_'.$num.'"><td valign="top">'.$space.
         '<div id="balanceruletitle_'.$balnum.'_'.$type.'" style="'.$style.'">'.$title.'</div></td>'."\n".          '<div id="balanceruletitle_'.$balnum.'_'.$type.'" style="'.$style.'">'.$title.'</div></td>'."\n".
         '<td valaign="top">'.$space.          '<td valaign="top">'.$space.
Line 3266  sub loadbalance_rule_row { Line 3508  sub loadbalance_rule_row {
                 unless ($checked) {                  unless ($checked) {
                     $default = ' selected="selected"';                      $default = ' selected="selected"';
                 }                  }
                 $extra =                   $extra =
                     ':&nbsp;<select name="loadbalancing_singleserver_'.$balnum.'_'.$type.                      ':&nbsp;<select name="loadbalancing_singleserver_'.$balnum.'_'.$type.
                     '" id="loadbalancing_singleserver_'.$balnum.'_'.$type.                      '" id="loadbalancing_singleserver_'.$balnum.'_'.$type.
                     '" onchange="singleServerToggle('."'$balnum','$type'".')">'."\n".                      '" onchange="singleServerToggle('."'$balnum','$type'".')">'."\n".
Line 3346  sub tool_titles { Line 3588  sub tool_titles {
                      official   => 'Official courses (with institutional codes)',                       official   => 'Official courses (with institutional codes)',
                      unofficial => 'Unofficial courses',                       unofficial => 'Unofficial courses',
                      community  => 'Communities',                       community  => 'Communities',
                        textbook   => 'Textbook courses',
                  );                   );
     return %titles;      return %titles;
 }  }
Line 3355  sub courserequest_titles { Line 3598  sub courserequest_titles {
                                    official   => 'Official',                                     official   => 'Official',
                                    unofficial => 'Unofficial',                                     unofficial => 'Unofficial',
                                    community  => 'Communities',                                     community  => 'Communities',
                                      textbook   => 'Textbook',
                                    norequest  => 'Not allowed',                                     norequest  => 'Not allowed',
                                    approval   => 'Approval by Dom. Coord.',                                     approval   => 'Approval by Dom. Coord.',
                                    validate   => 'With validation',                                     validate   => 'With validation',
Line 3371  sub authorrequest_titles { Line 3615  sub authorrequest_titles {
                                    automatic  => 'Automatic approval',                                     automatic  => 'Automatic approval',
                  );                   );
     return %titles;      return %titles;
 }   }
   
 sub courserequest_conditions {  sub courserequest_conditions {
     my %conditions = &Apache::lonlocal::texthash (      my %conditions = &Apache::lonlocal::texthash (
Line 3610  sub captcha_choice { Line 3854  sub captcha_choice {
 #  #
 # Note: If reCAPTCHA is to be used for LON-CAPA servers in a domain, a domain coordinator should visit:  # Note: If reCAPTCHA is to be used for LON-CAPA servers in a domain, a domain coordinator should visit:
 # https://www.google.com/recaptcha and generate a Public and Private key. For domains with multiple  # https://www.google.com/recaptcha and generate a Public and Private key. For domains with multiple
 # servers a single key pair will be used for all servers, so the internet domain (e.g., yourcollege.edu)   # servers a single key pair will be used for all servers, so the internet domain (e.g., yourcollege.edu)
 # specified for use with the key should be broad enough to accommodate all servers in the LON-CAPA domain.  # specified for use with the key should be broad enough to accommodate all servers in the LON-CAPA domain.
 #    #
     $output .= '</td></tr>'."\n".      $output .= '</td></tr>'."\n".
                '<tr><td>'."\n".                 '<tr><td>'."\n".
                '<span class="LC_nobreak"><span id="'.$context.'_recaptchapubtxt">'.$pubtext.'</span>&nbsp;'."\n".                 '<span class="LC_nobreak"><span id="'.$context.'_recaptchapubtxt">'.$pubtext.'</span>&nbsp;'."\n".
Line 3759  sub print_usermodification { Line 4003  sub print_usermodification {
 }  }
   
 sub print_defaults {  sub print_defaults {
     my ($dom,$rowtotal) = @_;      my ($dom,$settings,$rowtotal) = @_;
     my @items = ('auth_def','auth_arg_def','lang_def','timezone_def',      my @items = ('auth_def','auth_arg_def','lang_def','timezone_def',
                  'datelocale_def','portal_def');                   'datelocale_def','portal_def');
     my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);      my %defaults;
       if (ref($settings) eq 'HASH') {
           %defaults = %{$settings};
       } else {
           my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
           foreach my $item (@items) {
               $defaults{$item} = $domdefaults{$item};
           }
       }
     my $titles = &defaults_titles($dom);      my $titles = &defaults_titles($dom);
     my $rownum = 0;      my $rownum = 0;
     my ($datatable,$css_class);      my ($datatable,$css_class);
Line 3786  sub print_defaults { Line 4038  sub print_defaults {
             my %authnames = &authtype_names();              my %authnames = &authtype_names();
             foreach my $auth (@authtypes) {              foreach my $auth (@authtypes) {
                 my $checked = ' ';                  my $checked = ' ';
                 if ($domdefaults{$item} eq $auth) {                  if ($defaults{$item} eq $auth) {
                     $checked = ' checked="checked" ';                      $checked = ' checked="checked" ';
                 }                  }
                 $datatable .= '<label><input type="radio" name="'.$item.                  $datatable .= '<label><input type="radio" name="'.$item.
Line 3795  sub print_defaults { Line 4047  sub print_defaults {
             }              }
         } elsif ($item eq 'timezone_def') {          } elsif ($item eq 'timezone_def') {
             my $includeempty = 1;              my $includeempty = 1;
             $datatable .= &Apache::loncommon::select_timezone($item,$domdefaults{$item},undef,$includeempty);              $datatable .= &Apache::loncommon::select_timezone($item,$defaults{$item},undef,$includeempty);
         } elsif ($item eq 'datelocale_def') {          } elsif ($item eq 'datelocale_def') {
             my $includeempty = 1;              my $includeempty = 1;
             $datatable .= &Apache::loncommon::select_datelocale($item,$domdefaults{$item},undef,$includeempty);              $datatable .= &Apache::loncommon::select_datelocale($item,$defaults{$item},undef,$includeempty);
         } elsif ($item eq 'lang_def') {          } elsif ($item eq 'lang_def') {
             my %langchoices = &get_languages_hash();              my %langchoices = &get_languages_hash();
             $langchoices{''} = 'No language preference';              $langchoices{''} = 'No language preference';
             %langchoices = &Apache::lonlocal::texthash(%langchoices);              %langchoices = &Apache::lonlocal::texthash(%langchoices);
             $datatable .= &Apache::loncommon::select_form($domdefaults{$item},$item,              $datatable .= &Apache::loncommon::select_form($defaults{$item},$item,
                                                           \%langchoices);                                                            \%langchoices);
         } else {          } else {
             my $size;              my $size;
Line 3811  sub print_defaults { Line 4063  sub print_defaults {
                 $size = ' size="25"';                  $size = ' size="25"';
             }              }
             $datatable .= '<input type="text" name="'.$item.'" value="'.              $datatable .= '<input type="text" name="'.$item.'" value="'.
                           $domdefaults{$item}.'"'.$size.' />';                            $defaults{$item}.'"'.$size.' />';
         }          }
         $datatable .= '</td></tr>';          $datatable .= '</td></tr>';
         $rownum ++;          $rownum ++;
Line 4148  sub print_coursecategories { Line 4400  sub print_coursecategories {
                             }                              }
                             $datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>';                              $datatable .= '<option value="'.$k.'"'.$selstr.'>'.$vpos.'</option>';
                         }                          }
                         $datatable .= '</select></td><td>';                          $datatable .= '</select></span></td><td>';
                         if ($parent eq 'instcode' || $parent eq 'communities') {                          if ($parent eq 'instcode' || $parent eq 'communities') {
                             $datatable .=  '<span class="LC_nobreak">'                              $datatable .=  '<span class="LC_nobreak">'
                                            .$default_names{$parent}.'</span>';                                             .$default_names{$parent}.'</span>';
Line 4178  sub print_coursecategories { Line 4430  sub print_coursecategories {
                             $datatable .= '</td>';                              $datatable .= '</td>';
                         } else {                          } else {
                             $datatable .= $parent                              $datatable .= $parent
                                           .'&nbsp;<label><input type="checkbox" name="deletecategory" '                                            .'&nbsp;<span class="LC_nobreak"><label>'
                                             .'<input type="checkbox" name="deletecategory" '
                                           .'value="'.$item.'" />'.&mt('Delete').'</label></span></td>';                                            .'value="'.$item.'" />'.&mt('Delete').'</label></span></td>';
                         }                          }
                         my $depth = 1;                          my $depth = 1;
Line 4922  sub modify_login { Line 5175  sub modify_login {
                     } else {                      } else {
                         my $puberror = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$newfile{$lang},$result);                          my $puberror = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$newfile{$lang},$result);
                         $errors .= '<li><span class="LC_error">'.$puberror.'</span></li>';                          $errors .= '<li><span class="LC_error">'.$puberror.'</span></li>';
                         if ((grep(/^\Q$lang\E$/,@currlangs)) &&                           if ((grep(/^\Q$lang\E$/,@currlangs)) &&
                             (!grep(/^\Q$lang\E$/,@delurls))) {                              (!grep(/^\Q$lang\E$/,@delurls))) {
   
                             $loginhash{'login'}{'helpurl'}{$lang} = $domconfig{'login'}{'helpurl'}{$lang};                              $loginhash{'login'}{'helpurl'}{$lang} = $domconfig{'login'}{'helpurl'}{$lang};
Line 4980  sub modify_login { Line 5233  sub modify_login {
         }          }
         if (keys(%changes) > 0 || $colchgtext) {          if (keys(%changes) > 0 || $colchgtext) {
             &Apache::loncommon::devalidate_domconfig_cache($dom);              &Apache::loncommon::devalidate_domconfig_cache($dom);
             $$lastactref = 'update';              if (ref($lastactref) eq 'HASH') {
                   $lastactref->{'domainconfig'} = 1;
               }
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             foreach my $item (sort(keys(%changes))) {              foreach my $item (sort(keys(%changes))) {
                 if ($item eq 'loginvia') {                  if ($item eq 'loginvia') {
Line 5040  sub modify_login { Line 5295  sub modify_login {
                     }                      }
                 } elsif ($item eq 'captcha') {                  } elsif ($item eq 'captcha') {
                     if (ref($loginhash{'login'}) eq 'HASH') {                      if (ref($loginhash{'login'}) eq 'HASH') {
                         my $chgtxt;                           my $chgtxt;
                         if ($loginhash{'login'}{$item} eq 'notused') {                          if ($loginhash{'login'}{$item} eq 'notused') {
                             $chgtxt .= &mt('No CAPTCHA validation in use for helpdesk form.');                              $chgtxt .= &mt('No CAPTCHA validation in use for helpdesk form.');
                         } else {                          } else {
Line 5128  sub modify_rolecolors { Line 5383  sub modify_rolecolors {
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             &Apache::loncommon::devalidate_domconfig_cache($dom);              &Apache::loncommon::devalidate_domconfig_cache($dom);
             $$lastactref = 'update';              if (ref($lastactref) eq 'HASH') {
                   $lastactref->{'domainconfig'} = 1;
               }
             $resulttext = &display_colorchgs($dom,\%changes,$roles,              $resulttext = &display_colorchgs($dom,\%changes,$roles,
                                              $rolehash{'rolecolors'});                                               $rolehash{'rolecolors'});
         } else {          } else {
Line 5540  sub publishlogo { Line 5797  sub publishlogo {
 # See if there is anything left  # See if there is anything left
     unless ($fname) { return ('error: no uploaded file'); }      unless ($fname) { return ('error: no uploaded file'); }
     $fname="$subdir/$fname";      $fname="$subdir/$fname";
     my $docroot=$r->dir_config('lonDocRoot');       my $docroot=$r->dir_config('lonDocRoot');
     my $filepath="$docroot/priv";      my $filepath="$docroot/priv";
     my $relpath = "$dom/$confname";      my $relpath = "$dom/$confname";
     my ($fnamepath,$file,$fetchthumb);      my ($fnamepath,$file,$fetchthumb);
Line 5809  sub check_switchserver { Line 6066  sub check_switchserver {
 }  }
   
 sub modify_quotas {  sub modify_quotas {
     my ($dom,$action,%domconfig) = @_;      my ($r,$dom,$action,$lastactref,%domconfig) = @_;
     my ($context,@usertools,@options,%validations,%titles,%confhash,%toolshash,      my ($context,@usertools,@options,%validations,%titles,%confhash,%toolshash,
         %limithash,$toolregexp,%conditions,$resulttext,%changes);          %limithash,$toolregexp,%conditions,$resulttext,%changes,$confname,$configuserok,
           $author_ok,$switchserver,$errors);
     if ($action eq 'quotas') {      if ($action eq 'quotas') {
         $context = 'tools';           $context = 'tools'; 
     } else {      } else {
         $context = $action;          $context = $action;
     }      }
     if ($context eq 'requestcourses') {      if ($context eq 'requestcourses') {
         @usertools = ('official','unofficial','community');          @usertools = ('official','unofficial','community','textbook');
         @options =('norequest','approval','validate','autolimit');          @options =('norequest','approval','validate','autolimit');
         %validations = &Apache::lonnet::auto_courserequest_checks($dom);          %validations = &Apache::lonnet::auto_courserequest_checks($dom);
         %titles = &courserequest_titles();          %titles = &courserequest_titles();
         $toolregexp = join('|',@usertools);          $toolregexp = join('|',@usertools);
         %conditions = &courserequest_conditions();          %conditions = &courserequest_conditions();
           $confname = $dom.'-domainconfig';
           my $servadm = $r->dir_config('lonAdmEMail');
           ($configuserok,$author_ok,$switchserver) = &config_check($dom,$confname,$servadm);
     } elsif ($context eq 'requestauthor') {      } elsif ($context eq 'requestauthor') {
         @usertools = ('author');          @usertools = ('author');
         %titles = &authorrequest_titles();          %titles = &authorrequest_titles();
Line 5831  sub modify_quotas { Line 6092  sub modify_quotas {
         @usertools = ('aboutme','blog','webdav','portfolio');          @usertools = ('aboutme','blog','webdav','portfolio');
         %titles = &tool_titles();          %titles = &tool_titles();
     }      }
     my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);      my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
     my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);      my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
     foreach my $key (keys(%env)) {      foreach my $key (keys(%env)) {
         if ($context eq 'requestcourses') {          if ($context eq 'requestcourses') {
Line 5862  sub modify_quotas { Line 6123  sub modify_quotas {
         my @approvalnotify = &Apache::loncommon::get_env_multiple('form.reqapprovalnotify');          my @approvalnotify = &Apache::loncommon::get_env_multiple('form.reqapprovalnotify');
         @approvalnotify = sort(@approvalnotify);          @approvalnotify = sort(@approvalnotify);
         $confhash{'notify'}{'approval'} = join(',',@approvalnotify);          $confhash{'notify'}{'approval'} = join(',',@approvalnotify);
           my @crstypes = ('official','unofficial','community','textbook');
           my @hasuniquecode = &Apache::loncommon::get_env_multiple('form.uniquecode');
           foreach my $type (@hasuniquecode) {
               if (grep(/^\Q$type\E$/,@crstypes)) {
                   $confhash{'uniquecode'}{$type} = 1;
               }
           }
           my ($newbook,@allpos);
           if ($context eq 'requestcourses') {
               if ($env{'form.addbook'}) {
                   if (($env{'form.addbook_cnum'} =~ /^$match_courseid$/) &&
                       ($env{'form.addbook_cdom'} =~ /^$match_domain$/)) {
                       if (&Apache::lonnet::homeserver($env{'form.addbook_cnum'},
                                                       $env{'form.addbook_cdom'}) eq 'no_host') {
                           $errors .= '<li><span class="LC_error">'.&mt('Invalid LON-CAPA course for textbook').
                                      '</span></li>';
                       } else {
                           $newbook = $env{'form.addbook_cdom'}.'_'.$env{'form.addbook_cnum'};
                           my $position = $env{'form.addbook_pos'};
                           $position =~ s/\D+//g;
                           if ($position ne '') {
                               $allpos[$position] = $newbook;
                           }
                       }
                   } 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') {
                 if ($domconfig{$action}{'notify'}{'approval'} ne $confhash{'notify'}{'approval'}) {                  if ($domconfig{$action}{'notify'}{'approval'} ne $confhash{'notify'}{'approval'}) {
Line 5872  sub modify_quotas { Line 6163  sub modify_quotas {
                     $changes{'notify'}{'approval'} = 1;                      $changes{'notify'}{'approval'} = 1;
                 }                  }
             }              }
               if (ref($domconfig{$action}{'uniquecode'}) eq 'HASH') {
                   if (ref($confhash{'uniquecode'}) eq 'HASH') {
                       foreach my $crstype (keys(%{$domconfig{$action}{'uniquecode'}})) {
                           unless ($confhash{'uniquecode'}{$crstype}) {
                               $changes{'uniquecode'} = 1;
                           }
                       }
                       unless ($changes{'uniquecode'}) {
                           foreach my $crstype (keys(%{$confhash{'uniquecode'}})) {
                               unless ($domconfig{$action}{'uniquecode'}{$crstype}) {
                                   $changes{'uniquecode'} = 1;
                               }
                           }
                       }
                  } else {
                      $changes{'uniquecode'} = 1;
                  }
               } elsif (ref($confhash{'uniquecode'}) eq 'HASH') {
                   $changes{'uniquecode'} = 1;
               }
               if ($context eq 'requestcourses') {
                   if (ref($domconfig{$action}{'textbooks'}) eq 'HASH') {
                       my %deletions;
                       my @todelete = &Apache::loncommon::get_env_multiple('form.book_del');
                       if (@todelete) {
                           map { $deletions{$_} = 1; } @todelete;
                       }
                       my %imgdeletions;
                       my @todeleteimages = &Apache::loncommon::get_env_multiple('form.book_image_del');
                       if (@todeleteimages) {
                           map { $imgdeletions{$_} = 1; } @todeleteimages;
                       }
                       my $maxnum = $env{'form.book_maxnum'};
                       for (my $i=0; $i<=$maxnum; $i++) {
                           my $key = $env{'form.book_id_'.$i};
                           if (ref($domconfig{$action}{'textbooks'}{$key}) eq 'HASH') {
                               if ($deletions{$key}) {
                                   if ($domconfig{$action}{'textbooks'}{$key}{'image'}) {
                                       #FIXME need to obsolete item in RES space
                                   }
                                   next;
                               } else {
                                   my $newpos = $env{'form.'.$key};
                                   $newpos =~ s/\D+//g;
                                   foreach my $item ('subject','title','author') {
                                       $confhash{'textbooks'}{$key}{$item} = $env{'form.book_'.$item.'_'.$i};
                                       if ($domconfig{$action}{'textbooks'}{$key}{$item} ne $confhash{'textbooks'}{$key}{$item}) {
                                           $changes{'textbooks'}{$key} = 1;
                                       }
                                   }
                                   $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'};
                               }
                           }
                       }
                   }
               }
         } else {          } else {
             if ($confhash{'notify'}{'approval'}) {              if ($confhash{'notify'}{'approval'}) {
                 $changes{'notify'}{'approval'} = 1;                  $changes{'notify'}{'approval'} = 1;
             }              }
               if (ref($confhash{'uniquecode'} eq 'HASH')) {
                   $changes{'uniquecode'} = 1;
               }
           }
           if ($context eq 'requestcourses') {
               if ($newbook) {
                   $changes{'textbooks'}{$newbook} = 1;
                   foreach my $item ('subject','title','author') {
                       $env{'form.addbook_'.$item} =~ s/(`)/'/g;
                       if ($env{'form.addbook_'.$item}) {
                           $confhash{'textbooks'}{$newbook}{$item} = $env{'form.addbook_'.$item};
                       }
                   }
                   if ($env{'form.addbook_image.filename'} ne '') {
                       my ($cdom,$cnum) = split(/_/,$newbook);
                       my ($imageurl,$error) = 
                           &process_textbook_image($r,$dom,$confname,'addbook_image',$cdom,$cnum,$configuserok,
                                                   $switchserver,$author_ok);
                       if ($imageurl) {
                           $confhash{'textbooks'}{$newbook}{'image'} = $imageurl;
                       }
                       if ($error) {
                           &Apache::lonnet::logthis($error);
                           $errors .= '<li><span class="LC_error">'.$error.'</span></li>';
                       }
                   }
               }
               if (@allpos > 0) {
                   my $idx = 0;
                   foreach my $item (@allpos) {
                       if ($item ne '') {
                           $confhash{'textbooks'}{$item}{'order'} = $idx;
                           if (ref($domconfig{$action}) eq 'HASH') {
                               if (ref($domconfig{$action}{'textbooks'}) eq 'HASH') {
                                   if (ref($domconfig{$action}{'textbooks'}{$item}) eq 'HASH') {
                                       if ($domconfig{$action}{'textbooks'}{$item}{'order'} ne $idx) {
                                           $changes{'textbooks'}{$item} = 1;
                                       }
                                   }
                               }
                           }
                           $idx ++;
                       }
                   }
               }
         }          }
     } else {      } else {
         $confhash{'defaultquota'}{'default'} = $env{'form.defaultquota'};          $confhash{'defaultquota'}{'default'} = $env{'form.defaultquota'};
Line 6017  sub modify_quotas { Line 6429  sub modify_quotas {
         $domdefaults{'requestauthor'} = \%confhash;          $domdefaults{'requestauthor'} = \%confhash;
     } else {      } else {
         foreach my $key (keys(%confhash)) {          foreach my $key (keys(%confhash)) {
             $domdefaults{$key} = $confhash{$key};              unless (($context eq 'requestcourses') && ($key eq 'textbooks')) {
                   $domdefaults{$key} = $confhash{$key};
               }
         }          }
     }      }
   
Line 6030  sub modify_quotas { Line 6444  sub modify_quotas {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             my $cachetime = 24*60*60;              my $cachetime = 24*60*60;
             &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);              &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
               if (ref($lastactref) eq 'HASH') {
                   $lastactref->{'domdefaults'} = 1;
               }
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             unless (($context eq 'requestcourses') ||               unless (($context eq 'requestcourses') ||
                     ($context eq 'requestauthor')) {                      ($context eq 'requestauthor')) {
                 if (ref($changes{'defaultquota'}) eq 'HASH') {                  if (ref($changes{'defaultquota'}) eq 'HASH') {
                     $resulttext .= '<li>'.&mt('Portfolio default quotas').'<ul>';                      $resulttext .= '<li>'.&mt('Portfolio default quotas').'<ul>';
Line 6042  sub modify_quotas { Line 6458  sub modify_quotas {
                             if ($type eq 'default') {                              if ($type eq 'default') {
                                 $typetitle = $othertitle;                                  $typetitle = $othertitle;
                             }                              }
                             $resulttext .= '<li>'.&mt('[_1] set to [_2] Mb',$typetitle,$confhash{'defaultquota'}{$type}).'</li>';                              $resulttext .= '<li>'.&mt('[_1] set to [_2] MB',$typetitle,$confhash{'defaultquota'}{$type}).'</li>';
                         }                          }
                     }                      }
                     $resulttext .= '</ul></li>';                      $resulttext .= '</ul></li>';
Line 6055  sub modify_quotas { Line 6471  sub modify_quotas {
                             if ($type eq 'default') {                              if ($type eq 'default') {
                                 $typetitle = $othertitle;                                  $typetitle = $othertitle;
                             }                              }
                             $resulttext .= '<li>'.&mt('[_1] set to [_2] Mb',$typetitle,$confhash{'authorquota'}{$type}).'</li>';                              $resulttext .= '<li>'.&mt('[_1] set to [_2] MB',$typetitle,$confhash{'authorquota'}{$type}).'</li>';
                         }                          }
                     }                      }
                     $resulttext .= '</ul></li>';                      $resulttext .= '</ul></li>';
Line 6066  sub modify_quotas { Line 6482  sub modify_quotas {
                 my (%haschgs,%inconf);                  my (%haschgs,%inconf);
                 if ($context eq 'requestauthor') {                  if ($context eq 'requestauthor') {
                     %haschgs = %changes;                      %haschgs = %changes;
                     %inconf = %confhash;                       %inconf = %confhash;
                 } else {                  } else {
                     if (ref($changes{$item}) eq 'HASH') {                      if (ref($changes{$item}) eq 'HASH') {
                         %haschgs = %{$changes{$item}};                          %haschgs = %{$changes{$item}};
Line 6080  sub modify_quotas { Line 6496  sub modify_quotas {
                         &Apache::lonnet::usertools_access($env{'user.name'},                          &Apache::lonnet::usertools_access($env{'user.name'},
                                                           $env{'user.domain'},                                                            $env{'user.domain'},
                                                           $item,'reload',$context);                                                            $item,'reload',$context);
                     if (($context eq 'requestcourses') ||                       if (($context eq 'requestcourses') ||
                         ($context eq 'requestauthor')) {                          ($context eq 'requestauthor')) {
                         if ($env{'environment.canrequest.'.$item} ne $newacc) {                          if ($env{'environment.canrequest.'.$item} ne $newacc) {
                             $newenv{'environment.canrequest.'.$item} = $newacc;                              $newenv{'environment.canrequest.'.$item} = $newacc;
Line 6152  sub modify_quotas { Line 6568  sub modify_quotas {
                     }                      }
                 }                  }
             }              }
               if ($action eq 'requestcourses') {
                   my @offon = ('off','on');
                   if ($changes{'uniquecode'}) {
                       if (ref($confhash{'uniquecode'}) eq 'HASH') {
                           my $codestr = join(' ',map{ &mt($_); } sort(keys(%{$confhash{'uniquecode'}})));
                           $resulttext .= '<li>'.
                                          &mt('Generation of six character code as course identifier for distribution to students set to on for: [_1].','<b>'.$codestr.'</b>').
                                          '</li>';
                       } else {
                           $resulttext .= '<li>'.&mt('Generation of six character code as course identifier for distribution to students set to off.').
                                          '</li>';
                       }
                   }
                   if (ref($changes{'textbooks'}) eq 'HASH') {
                       $resulttext .= '<li>'.&mt('Available textbooks updated').'<ul>';
                       foreach my $key (sort(keys(%{$changes{'textbooks'}}))) {
                           my %coursehash = &Apache::lonnet::coursedescription($key);
                           my $coursetitle = $coursehash{'description'};
                           my $position = $confhash{'textbooks'}{$key}{'order'} + 1;
                           $resulttext .= '<li>';
                           foreach my $item ('subject','title','author') {
                               my $name = $item.':';
                               $name =~ s/^(\w)/\U$1/;
                               $resulttext .= &mt($name).' '.$confhash{'textbooks'}{$key}{$item}.'<br />';
                           }
                           $resulttext .= ' '.&mt('Order: [_1]',$position).'<br />';
                           if ($confhash{'textbooks'}{$key}{'image'}) {
                               $resulttext .= ' '.&mt('Image: [_1]',
                                                  '<img src="'.$confhash{'textbooks'}{$key}{'image'}.'"'.
                                                  ' alt="Textbook cover" />').'<br />';
                           }
                           $resulttext .= ' '.&mt('LON-CAPA Course: [_1]',$coursetitle).'</li>';
                       }
                       $resulttext .= '</ul></li>';
                   }
               }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
             if (keys(%newenv)) {              if (keys(%newenv)) {
                 &Apache::lonnet::appenv(\%newenv);                  &Apache::lonnet::appenv(\%newenv);
Line 6169  sub modify_quotas { Line 6621  sub modify_quotas {
         $resulttext = '<span class="LC_error">'.          $resulttext = '<span class="LC_error">'.
     &mt('An error occurred: [_1]',$putresult).'</span>';      &mt('An error occurred: [_1]',$putresult).'</span>';
     }      }
       if ($errors) {
           $resulttext .= '<p>'.&mt('The following errors occurred when modifying Textbook settings.').
                          '<ul>'.$errors.'</ul></p>';
       }
     return $resulttext;      return $resulttext;
 }  }
   
   sub process_textbook_image {
       my ($r,$dom,$confname,$caller,$cdom,$cnum,$configuserok,$switchserver,$author_ok) = @_;
       my $filename = $env{'form.'.$caller.'.filename'};
       my ($error,$url);
       my ($width,$height) = (50,50);
       if ($configuserok eq 'ok') {
           if ($switchserver) {
               $error = &mt('Upload of textbook image is not permitted to this server: [_1]',
                            $switchserver);
           } elsif ($author_ok eq 'ok') {
               my ($result,$imageurl) =
                   &publishlogo($r,'upload',$caller,$dom,$confname,
                                "textbooks/$dom/$cnum/cover",$width,$height);
               if ($result eq 'ok') {
                   $url = $imageurl;
               } else {
                   $error = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$filename,$result);
               }
           } else {
               $error = &mt("Upload of [_1] failed because an author role could not be assigned to a Domain Configuration user ([_2]) in domain: [_3].  Error was: [_4].",$filename,$confname,$dom,$author_ok);
           }
       } else {
           $error = &mt("Upload of [_1] failed because a Domain Configuration user ([_2]) could not be created in domain: [_3].  Error was: [_4].",$filename,$confname,$dom,$configuserok);
       }
       return ($url,$error);
   }
   
 sub modify_autoenroll {  sub modify_autoenroll {
     my ($dom,$lastactref,%domconfig) = @_;      my ($dom,$lastactref,%domconfig) = @_;
     my ($resulttext,%changes);      my ($resulttext,%changes);
Line 6241  sub modify_autoenroll { Line 6724  sub modify_autoenroll {
             if ($changes{'coowners'}) {              if ($changes{'coowners'}) {
                 $resulttext .= '<li>'.&mt("$title{'coowners'} set to $offon[$env{'form.autoassign_coowners'}]").'</li>';                  $resulttext .= '<li>'.&mt("$title{'coowners'} set to $offon[$env{'form.autoassign_coowners'}]").'</li>';
                 &Apache::loncommon::devalidate_domconfig_cache($dom);                  &Apache::loncommon::devalidate_domconfig_cache($dom);
                 $$lastactref = 'update';                  if (ref($lastactref) eq 'HASH') {
                       $lastactref->{'domainconfig'} = 1;
                   }
             }              }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
         } else {          } else {
Line 6647  sub modify_directorysrch { Line 7132  sub modify_directorysrch {
                         } else {                          } else {
                             $chgtext =~ s/\; $//;                              $chgtext =~ s/\; $//;
                         }                          }
                         $resulttext .=                           $resulttext .=
                             '<li>'.                              '<li>'.
                             &mt("Users from domain '[_1]' permitted to search the institutional directory set to: [_2]",                              &mt("Users from domain '[_1]' permitted to search the institutional directory set to: [_2]",
                                 '<span class="LC_cusr_emph">'.$dom.'</span>',$chgtext).                                  '<span class="LC_cusr_emph">'.$dom.'</span>',$chgtext).
Line 6799  sub modify_contacts { Line 7284  sub modify_contacts {
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             &Apache::loncommon::devalidate_domconfig_cache($dom);              &Apache::loncommon::devalidate_domconfig_cache($dom);
             $$lastactref = 'update';              if (ref($lastactref) eq 'HASH') {
                   $lastactref->{'domainconfig'} = 1;
               }
             my ($titles,$short_titles)  = &contact_titles();              my ($titles,$short_titles)  = &contact_titles();
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             foreach my $item (@contacts) {              foreach my $item (@contacts) {
Line 6874  sub modify_usercreation { Line 7361  sub modify_usercreation {
     foreach my $item(@contexts) {      foreach my $item(@contexts) {
         if ($item eq 'selfcreate') {          if ($item eq 'selfcreate') {
             @{$cancreate{$item}} = &Apache::loncommon::get_env_multiple('form.can_createuser_'.$item);              @{$cancreate{$item}} = &Apache::loncommon::get_env_multiple('form.can_createuser_'.$item);
             my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);              my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
             if (!((($domdefaults{'auth_def'} =~/^krb/) && ($domdefaults{'auth_arg_def'} ne '')) || ($domdefaults{'auth_def'} eq 'localauth'))) {              if (!((($domdefaults{'auth_def'} =~/^krb/) && ($domdefaults{'auth_arg_def'} ne '')) || ($domdefaults{'auth_def'} eq 'localauth'))) {
                 if (ref($cancreate{$item}) eq 'ARRAY') {                   if (ref($cancreate{$item}) eq 'ARRAY') { 
                     if (grep(/^login$/,@{$cancreate{$item}})) {                      if (grep(/^login$/,@{$cancreate{$item}})) {
Line 7147  sub modify_usercreation { Line 7634  sub modify_usercreation {
                             if ($captchas{$cancreate{$type}}) {                              if ($captchas{$cancreate{$type}}) {
                                 $chgtext .= &mt("Validation for self-creation screen set to $captchas{$cancreate{$type}}.");                                  $chgtext .= &mt("Validation for self-creation screen set to $captchas{$cancreate{$type}}.");
                             } else {                              } else {
                                 $chgtext .= &mt('Validation for self-creation screen set to unknown type.');                                   $chgtext .= &mt('Validation for self-creation screen set to unknown type.');
                             }                              }
                         }                          }
                     } elsif ($type eq 'recaptchakeys') {                      } elsif ($type eq 'recaptchakeys') {
Line 7275  sub process_captcha { Line 7762  sub process_captcha {
         $newsettings->{'captcha'} = 'original';          $newsettings->{'captcha'} = 'original';
     }      }
     if ($current->{'captcha'} ne $newsettings->{'captcha'}) {      if ($current->{'captcha'} ne $newsettings->{'captcha'}) {
         if ($container eq 'cancreate') {           if ($container eq 'cancreate') {
             if (ref($changes->{'cancreate'}) eq 'ARRAY') {              if (ref($changes->{'cancreate'}) eq 'ARRAY') {
                 push(@{$changes->{'cancreate'}},'captcha');                  push(@{$changes->{'cancreate'}},'captcha');
             } elsif (!defined($changes->{'cancreate'})) {              } elsif (!defined($changes->{'cancreate'})) {
Line 7314  sub process_captcha { Line 7801  sub process_captcha {
                 $changes->{'cancreate'} = ['recaptchakeys'];                  $changes->{'cancreate'} = ['recaptchakeys'];
             }              }
         } else {          } else {
             $changes->{'recaptchakeys'} = 1;               $changes->{'recaptchakeys'} = 1;
         }          }
     }      }
     return;      return;
Line 7441  sub modify_usermodification { Line 7928  sub modify_usermodification {
 }  }
   
 sub modify_defaults {  sub modify_defaults {
     my ($dom,$r,%domconfig) = @_;      my ($dom,$lastactref,%domconfig) = @_;
     my ($resulttext,$mailmsgtxt,%newvalues,%changes,@errors);      my ($resulttext,$mailmsgtxt,%newvalues,%changes,@errors);
     my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);      my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
     my @items = ('auth_def','auth_arg_def','lang_def','timezone_def','datelocale_def','portal_def');      my @items = ('auth_def','auth_arg_def','lang_def','timezone_def','datelocale_def','portal_def');
     my @authtypes = ('internal','krb4','krb5','localauth');      my @authtypes = ('internal','krb4','krb5','localauth');
     foreach my $item (@items) {      foreach my $item (@items) {
Line 7503  sub modify_defaults { Line 7990  sub modify_defaults {
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             my $version = $r->dir_config('lonVersion');              my $version = &Apache::lonnet::get_server_loncaparev($dom);
             my $mailmsgtext = "Changes made to domain settings in a LON-CAPA installation - domain: $dom (running version: $version) - dns_domain.tab needs to be updated with the following changes, to support legacy 2.4, 2.5 and 2.6 versions of LON-CAPA.\n\n";              my $mailmsgtext = "Changes made to domain settings in a LON-CAPA installation - domain: $dom (running version: $version) - dns_domain.tab needs to be updated with the following changes, to support legacy 2.4, 2.5 and 2.6 versions of LON-CAPA.\n\n";
             foreach my $item (sort(keys(%changes))) {              foreach my $item (sort(keys(%changes))) {
                 my $value = $env{'form.'.$item};                  my $value = $env{'form.'.$item};
Line 7526  sub modify_defaults { Line 8013  sub modify_defaults {
             $mailmsgtext .= "\n";              $mailmsgtext .= "\n";
             my $cachetime = 24*60*60;              my $cachetime = 24*60*60;
             &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);              &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
               if (ref($lastactref) eq 'HASH') {
                   $lastactref->{'domdefaults'} = 1;
               }
             if ($changes{'auth_def'} || $changes{'auth_arg_def'} || $changes{'lang_def'} || $changes{'datelocale_def'}) {              if ($changes{'auth_def'} || $changes{'auth_arg_def'} || $changes{'lang_def'} || $changes{'datelocale_def'}) {
                 my $notify = 1;                  my $notify = 1;
                 if (ref($domconfig{'contacts'}) eq 'HASH') {                  if (ref($domconfig{'contacts'}) eq 'HASH') {
Line 7618  sub modify_scantron { Line 8108  sub modify_scantron {
                 }                  }
                 $resulttext .= '</ul>';                  $resulttext .= '</ul>';
                 &Apache::loncommon::devalidate_domconfig_cache($dom);                  &Apache::loncommon::devalidate_domconfig_cache($dom);
                 $$lastactref = 'update';                  if (ref($lastactref) eq 'HASH') {
                       $lastactref->{'domainconfig'} = 1;
                   }
             } else {              } else {
                 $resulttext = &mt('No changes made to bubblesheet format file');                  $resulttext = &mt('No changes made to bubblesheet format file');
             }              }
Line 8009  sub modify_helpsettings { Line 8501  sub modify_helpsettings {
                     $changes{$item} = 1;                      $changes{$item} = 1;
                 }                  }
             }              }
             if (($env{'form.'.$item} eq '0') || ($env{'form.'.$item} eq '1')) {               if (($env{'form.'.$item} eq '0') || ($env{'form.'.$item} eq '1')) {
                 $helphash{'helpsettings'}{$item} = $env{'form.'.$item};                  $helphash{'helpsettings'}{$item} = $env{'form.'.$item};
             }              }
         }          }
Line 8042  sub modify_helpsettings { Line 8534  sub modify_helpsettings {
 }  }
   
 sub modify_coursedefaults {  sub modify_coursedefaults {
     my ($dom,%domconfig) = @_;      my ($dom,$lastactref,%domconfig) = @_;
     my ($resulttext,$errors,%changes,%defaultshash);      my ($resulttext,$errors,%changes,%defaultshash);
     my %defaultchecked = ('canuse_pdfforms' => 'off');      my %defaultchecked = ('canuse_pdfforms' => 'off');
     my @toggles = ('canuse_pdfforms');      my @toggles = ('canuse_pdfforms');
     my @numbers = ('anonsurvey_threshold','uploadquota_official','uploadquota_unofficial',      my @numbers = ('anonsurvey_threshold','uploadquota_official','uploadquota_unofficial',
                    'uploadquota_community');                     'uploadquota_community','uploadquota_textbook');
     my @types = ('official','unofficial','community');      my @types = ('official','unofficial','community','textbook');
     my %staticdefaults = (      my %staticdefaults = (
                            anonsurvey_threshold => 10,                             anonsurvey_threshold => 10,
                            uploadquota          => 500,                             uploadquota          => 500,
Line 8113  sub modify_coursedefaults { Line 8605  sub modify_coursedefaults {
             }              }
         }          }
         my $officialcreds = $env{'form.official_credits'};          my $officialcreds = $env{'form.official_credits'};
         $officialcreds =~ s/^[^\d\.]//g;          $officialcreds =~ s/[^\d.]+//g;
         my $unofficialcreds = $env{'form.unofficial_credits'};          my $unofficialcreds = $env{'form.unofficial_credits'};
         $unofficialcreds =~ s/^[^\d\.]//g;          $unofficialcreds =~ s/[^\d.]+//g;
           my $textbookcreds = $env{'form.textbook_credits'};
           $textbookcreds =~ s/[^\d.]+//g;
         if (ref($domconfig{'coursedefaults'}{'coursecredits'} ne 'HASH') &&          if (ref($domconfig{'coursedefaults'}{'coursecredits'} ne 'HASH') &&
                 ($env{'form.coursecredits'} eq '1')) {                  ($env{'form.coursecredits'} eq '1')) {
                 $changes{'coursecredits'} = 1;                  $changes{'coursecredits'} = 1;
         } else {          } else {
             if (($domconfig{'coursedefaults'}{'coursecredits'}{'official'} ne $officialcreds)  ||              if (($domconfig{'coursedefaults'}{'coursecredits'}{'official'} ne $officialcreds)  ||
                 ($domconfig{'coursedefaults'}{'coursecredits'}{'unofficial'} ne $unofficialcreds)) {                  ($domconfig{'coursedefaults'}{'coursecredits'}{'unofficial'} ne $unofficialcreds) ||
                   ($domconfig{'coursedefaults'}{'coursecredits'}{'textbook'} ne $textbookcreds)) {
                 $changes{'coursecredits'} = 1;                  $changes{'coursecredits'} = 1;
             }              }
         }          }
         $defaultshash{'coursedefaults'}{'coursecredits'} = {          $defaultshash{'coursedefaults'}{'coursecredits'} = {
             official   => $officialcreds,              official   => $officialcreds,
             unofficial => $unofficialcreds,              unofficial => $unofficialcreds,
               textbook   => $textbookcreds,
         }          }
     }      }
     my $putresult = &Apache::lonnet::put_dom('configuration',\%defaultshash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%defaultshash,
                                              $dom);                                               $dom);
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         my %domdefaults;  
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
               my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
             if (($changes{'canuse_pdfforms'}) || ($changes{'coursecredits'}) || ($changes{'uploadquota'})) {              if (($changes{'canuse_pdfforms'}) || ($changes{'coursecredits'}) || ($changes{'uploadquota'})) {
                 %domdefaults = &Apache::lonnet::get_domain_defaults($dom);  
                 if ($changes{'canuse_pdfforms'}) {                  if ($changes{'canuse_pdfforms'}) {
                     $domdefaults{'canuse_pdfforms'}=$defaultshash{'coursedefaults'}{'canuse_pdfforms'};                      $domdefaults{'canuse_pdfforms'}=$defaultshash{'coursedefaults'}{'canuse_pdfforms'};
                 }                  }
Line 8146  sub modify_coursedefaults { Line 8641  sub modify_coursedefaults {
                             $defaultshash{'coursedefaults'}{'coursecredits'}{'official'};                              $defaultshash{'coursedefaults'}{'coursecredits'}{'official'};
                         $domdefaults{'unofficialcredits'} =                          $domdefaults{'unofficialcredits'} =
                             $defaultshash{'coursedefaults'}{'coursecredits'}{'unofficial'};                              $defaultshash{'coursedefaults'}{'coursecredits'}{'unofficial'};
                           $domdefaults{'textbookcredits'} =
                               $domdefaults{'coursedefaults'}{'coursecredits'}{'textbook'};
                     }                      }
                 }                  }
                 if ($changes{'uploadquota'}) {                  if ($changes{'uploadquota'}) {
Line 8157  sub modify_coursedefaults { Line 8654  sub modify_coursedefaults {
                 }                  }
                 my $cachetime = 24*60*60;                  my $cachetime = 24*60*60;
                 &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);                  &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
                   if (ref($lastactref) eq 'HASH') {
                       $lastactref->{'domdefaults'} = 1;
                   }
             }              }
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             foreach my $item (sort(keys(%changes))) {              foreach my $item (sort(keys(%changes))) {
Line 8173  sub modify_coursedefaults { Line 8673  sub modify_coursedefaults {
                         $resulttext .= '<li>'.&mt('Default quota for content uploaded to a course/community via Course Editor set as follows:').'<ul>'.                          $resulttext .= '<li>'.&mt('Default quota for content uploaded to a course/community via Course Editor set as follows:').'<ul>'.
                                        '<li>'.&mt('Official courses: [_1] MB','<b>'.$defaultshash{'coursedefaults'}{'uploadquota'}{'official'}.'</b>').'</li>'.                                         '<li>'.&mt('Official courses: [_1] MB','<b>'.$defaultshash{'coursedefaults'}{'uploadquota'}{'official'}.'</b>').'</li>'.
                                        '<li>'.&mt('Unofficial courses: [_1] MB','<b>'.$defaultshash{'coursedefaults'}{'uploadquota'}{'unofficial'}.'</b>').'</li>'.                                         '<li>'.&mt('Unofficial courses: [_1] MB','<b>'.$defaultshash{'coursedefaults'}{'uploadquota'}{'unofficial'}.'</b>').'</li>'.
                                          '<li>'.&mt('Textbook courses: [_1] MB','<b>'.$defaultshash{'coursedefaults'}{'uploadquota'}{'textbook'}.'</b>').'</li>'.
   
                                        '<li>'.&mt('Communities: [_1] MB','<b>'.$defaultshash{'coursedefaults'}{'uploadquota'}{'community'}.'</b>').'</li>'.                                         '<li>'.&mt('Communities: [_1] MB','<b>'.$defaultshash{'coursedefaults'}{'uploadquota'}{'community'}.'</b>').'</li>'.
                                        '</ul>'.                                         '</ul>'.
                                        '</li>';                                         '</li>';
Line 8182  sub modify_coursedefaults { Line 8684  sub modify_coursedefaults {
                 } elsif ($item eq 'coursecredits') {                  } elsif ($item eq 'coursecredits') {
                     if (ref($defaultshash{'coursedefaults'}{'coursecredits'}) eq 'HASH') {                      if (ref($defaultshash{'coursedefaults'}{'coursecredits'}) eq 'HASH') {
                         if (($domdefaults{'officialcredits'} eq '') &&                          if (($domdefaults{'officialcredits'} eq '') &&
                             ($domdefaults{'unofficialcredits'} eq '')) {                              ($domdefaults{'unofficialcredits'} eq '') &&
                               ($domdefaults{'textbookcredits'} eq '')) {
                             $resulttext .= '<li>'.&mt('Student credits not in use for courses in this domain').'</li>';                              $resulttext .= '<li>'.&mt('Student credits not in use for courses in this domain').'</li>';
                         } else {                          } else {
                             $resulttext .= '<li>'.&mt('Student credits can be set per course by a Domain Coordinator, with the following defaults applying:').'<ul>'.                              $resulttext .= '<li>'.&mt('Student credits can be set per course by a Domain Coordinator, with the following defaults applying:').'<ul>'.
                                            '<li>'.&mt('Official courses: [_1]',$defaultshash{'coursedefaults'}{'coursecredits'}{'official'}).'</li>'.                                             '<li>'.&mt('Official courses: [_1]',$defaultshash{'coursedefaults'}{'coursecredits'}{'official'}).'</li>'.
                                            '<li>'.&mt('Unofficial courses: [_1]',$defaultshash{'coursedefaults'}{'coursecredits'}{'unofficial'}).'</li>'.                                             '<li>'.&mt('Unofficial courses: [_1]',$defaultshash{'coursedefaults'}{'coursecredits'}{'unofficial'}).'</li>'.
                                              '<li>'.&mt('Textbook courses: [_1]',$defaultshash{'coursedefaults'}{'coursecredits'}{'textbook'}).'</li>'.
                                            '</ul>'.                                             '</ul>'.
                                            '</li>';                                             '</li>';
                         }                          }
Line 8208  sub modify_coursedefaults { Line 8712  sub modify_coursedefaults {
 }  }
   
 sub modify_usersessions {  sub modify_usersessions {
     my ($dom,%domconfig) = @_;      my ($dom,$lastactref,%domconfig) = @_;
     my @hostingtypes = ('version','excludedomain','includedomain');      my @hostingtypes = ('version','excludedomain','includedomain');
     my @offloadtypes = ('primary','default');      my @offloadtypes = ('primary','default');
     my %types = (      my %types = (
Line 8225  sub modify_usersessions { Line 8729  sub modify_usersessions {
     foreach my $prefix (@prefixes) {      foreach my $prefix (@prefixes) {
         $defaultshash{'usersessions'}{$prefix} = {};          $defaultshash{'usersessions'}{$prefix} = {};
     }      }
     my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);      my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
     my $resulttext;      my $resulttext;
     my %iphost = &Apache::lonnet::get_iphost();      my %iphost = &Apache::lonnet::get_iphost();
     foreach my $prefix (@prefixes) {      foreach my $prefix (@prefixes) {
Line 8401  sub modify_usersessions { Line 8905  sub modify_usersessions {
             }              }
             my $cachetime = 24*60*60;              my $cachetime = 24*60*60;
             &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);              &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
               if (ref($lastactref) eq 'HASH') {
                   $lastactref->{'domdefaults'} = 1;
               }
             if (keys(%changes) > 0) {              if (keys(%changes) > 0) {
                 my %lt = &usersession_titles();                  my %lt = &usersession_titles();
                 $resulttext = &mt('Changes made:').'<ul>';                  $resulttext = &mt('Changes made:').'<ul>';
Line 8412  sub modify_usersessions { Line 8919  sub modify_usersessions {
                                 foreach my $lonhost (sort(keys(%{$changes{$prefix}}))) {                                  foreach my $lonhost (sort(keys(%{$changes{$prefix}}))) {
                                     $resulttext .= '<li><b>'.$lonhost.'</b> ';                                      $resulttext .= '<li><b>'.$lonhost.'</b> ';
                                     my $lonhostdom = &Apache::lonnet::host_domain($lonhost);                                      my $lonhostdom = &Apache::lonnet::host_domain($lonhost);
                                     &Apache::lonnet::remote_devalidate_cache($lonhost,'spares',$lonhostdom);                                      my $cachekey = &escape('spares').':'.&escape($lonhostdom);
                                       &Apache::lonnet::remote_devalidate_cache($lonhost,[$cachekey]);
                                     if (ref($changes{$prefix}{$lonhost}) eq 'HASH') {                                      if (ref($changes{$prefix}{$lonhost}) eq 'HASH') {
                                         foreach my $type (@{$types{$prefix}}) {                                          foreach my $type (@{$types{$prefix}}) {
                                             if ($changes{$prefix}{$lonhost}{$type}) {                                              if ($changes{$prefix}{$lonhost}{$type}) {
Line 8502  sub modify_loadbalancing { Line 9010  sub modify_loadbalancing {
         if ($balancer eq '') {          if ($balancer eq '') {
             next;              next;
         }          }
         if (!exists($servers{$balancer})) {           if (!exists($servers{$balancer})) {
             if (exists($currbalancer{$balancer})) {              if (exists($currbalancer{$balancer})) {
                 push(@{$changes{'delete'}},$balancer);                  push(@{$changes{'delete'}},$balancer);
             }              }
Line 8553  sub modify_loadbalancing { Line 9061  sub modify_loadbalancing {
             }              }
         } else {          } else {
             if (ref($defaultshash{'loadbalancing'}{$balancer}) eq 'HASH') {              if (ref($defaultshash{'loadbalancing'}{$balancer}) eq 'HASH') {
                 foreach my $sparetype (@sparestypes) {                   foreach my $sparetype (@sparestypes) {
                     if (ref($defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}) eq 'ARRAY') {                      if (ref($defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}) eq 'ARRAY') {
                         if (@{$defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}} > 0) {                          if (@{$defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}} > 0) {
                             $changes{'curr'}{$balancer}{'targets'} = 1;                              $changes{'curr'}{$balancer}{'targets'} = 1;
                         }                          }
                     }                      }
                 }                  }
             }                }
         }          }
         my $ishomedom;          my $ishomedom;
         if (&Apache::lonnet::host_domain($balancer) eq $dom) {          if (&Apache::lonnet::host_domain($balancer) eq $dom) {
Line 8569  sub modify_loadbalancing { Line 9077  sub modify_loadbalancing {
         if (ref($alltypes) eq 'ARRAY') {          if (ref($alltypes) eq 'ARRAY') {
             foreach my $type (@{$alltypes}) {              foreach my $type (@{$alltypes}) {
                 my $rule;                  my $rule;
                 unless ((($type eq '_LC_external') || ($type eq '_LC_internetdom')) &&                   unless ((($type eq '_LC_external') || ($type eq '_LC_internetdom')) &&
                          (!$ishomedom)) {                           (!$ishomedom)) {
                     $rule = $env{'form.loadbalancing_rules_'.$i.'_'.$type};                      $rule = $env{'form.loadbalancing_rules_'.$i.'_'.$type};
                 }                  }
Line 8594  sub modify_loadbalancing { Line 9102  sub modify_loadbalancing {
         }          }
         my $putresult = &Apache::lonnet::put_dom('configuration',          my $putresult = &Apache::lonnet::put_dom('configuration',
                                                  \%defaultshash,$dom);                                                   \%defaultshash,$dom);
    
         if ($putresult eq 'ok') {          if ($putresult eq 'ok') {
             if (keys(%changes) > 0) {              if (keys(%changes) > 0) {
                 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>';
                         &Apache::lonnet::remote_devalidate_cache($balancer,'loadbalancing',$dom);                          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);
                     }                      }
                 }                  }
Line 8651  sub modify_loadbalancing { Line 9159  sub modify_loadbalancing {
                                         } else {                                          } else {
                                             $balancetext = &mt('offload to [_1]',$defaultshash{'loadbalancing'}{$balancer}{'rules'}{$type});                                              $balancetext = &mt('offload to [_1]',$defaultshash{'loadbalancing'}{$balancer}{'rules'}{$type});
                                         }                                          }
                                         $resulttext .= '<li>'.&mt('Load Balancer: [_1] -- balancing for [_2] set to - "[_3]"',$balancer,$titles->{$type},$balancetext).'</li>';                                               $resulttext .= '<li>'.&mt('Load Balancer: [_1] -- balancing for [_2] set to - "[_3]"',$balancer,$titles->{$type},$balancetext).'</li>';
                                     }                                      }
                                 }                                  }
                             }                              }
                         }                          }
                         &Apache::lonnet::remote_devalidate_cache($balancer,'loadbalancing',$dom);                          my $cachekey = &escape('loadbalancing').':'.&escape($dom);
                           &Apache::lonnet::remote_devalidate_cache($balancer,[$cachekey]);
                     }                      }
                 }                  }
                 if ($resulttext ne '') {                  if ($resulttext ne '') {
Line 8744  sub active_dc_picker { Line 9253  sub active_dc_picker {
         }          }
     }      }
     @domcoord = sort(@domcoord);      @domcoord = sort(@domcoord);
     my $numdcs = scalar(@domcoord);       my $numdcs = scalar(@domcoord);
     my $rows = 0;      my $rows = 0;
     my $table;      my $table;
     if ($numdcs > 1) {      if ($numdcs > 1) {
Line 8878  sub lonbalance_targets_js { Line 9387  sub lonbalance_targets_js {
     }      }
     &get_loadbalancers_config($servers,\%existing,\%currbalancer,      &get_loadbalancers_config($servers,\%existing,\%currbalancer,
                               \%currtargets,\%currrules);                                \%currtargets,\%currrules);
     my $balancers = join("','",sort(keys(%currbalancer)));       my $balancers = join("','",sort(keys(%currbalancer)));
     return <<"END";      return <<"END";
   
 <script type="text/javascript">  <script type="text/javascript">
Line 8949  function showSpares(balancer,ishomedom,b Line 9458  function showSpares(balancer,ishomedom,b
             } else {              } else {
                 document.getElementById('balanceruletitle_'+balnum+'_'+insttypes[k]).style.display='none';                  document.getElementById('balanceruletitle_'+balnum+'_'+insttypes[k]).style.display='none';
                 document.getElementById('balancerule_'+balnum+'_'+insttypes[k]).style.display='none';                  document.getElementById('balancerule_'+balnum+'_'+insttypes[k]).style.display='none';
   
             }              }
         } else {          } else {
             document.getElementById('balanceruletitle_'+balnum+'_'+insttypes[k]).style.display='block';              document.getElementById('balanceruletitle_'+balnum+'_'+insttypes[k]).style.display='block';
Line 8961  function showSpares(balancer,ishomedom,b Line 9469  function showSpares(balancer,ishomedom,b
             var item = document.getElementById('loadbalancing_singleserver_'+balnum+'_'+insttypes[k]);              var item = document.getElementById('loadbalancing_singleserver_'+balnum+'_'+insttypes[k]);
             item.options.length = 0;              item.options.length = 0;
             item.options[0] = new Option("","",true,true);              item.options[0] = new Option("","",true,true);
             var idx = 0;                var idx = 0;
             for (var m=0; m<alltargets.length; m++) {              for (var m=0; m<alltargets.length; m++) {
                 if ((currBalancers.indexOf(alltargets[m]) == -1) && (alltargets[m] != balancer)) {                  if ((currBalancers.indexOf(alltargets[m]) == -1) && (alltargets[m] != balancer)) {
                     idx ++;                      idx ++;
                     item.options[idx] = new Option(alltargets[m],alltargets[m],false,false);                      item.options[idx] = new Option(alltargets[m],alltargets[m],false,false);
                       
                 }                  }
             }              }
         }          }
Line 9380  sub captcha_phrases { Line 9887  sub captcha_phrases {
 }  }
   
 sub devalidate_remote_domconfs {  sub devalidate_remote_domconfs {
     my ($dom) = @_;      my ($dom,$cachekeys) = @_;
     my $primary_id = &Apache::lonnet::domain($dom,'primary');      return unless (ref($cachekeys) eq 'HASH');
     my $intdom = &Apache::lonnet::internet_dom($primary_id);  
     my %servers = &Apache::lonnet::internet_dom_servers($dom);      my %servers = &Apache::lonnet::internet_dom_servers($dom);
     my %thismachine;      my %thismachine;
     map { $thismachine{$_} = 1; } &Apache::lonnet::current_machine_ids();      map { $thismachine{$_} = 1; } &Apache::lonnet::current_machine_ids();
       my @posscached = ('domainconfig','domdefaults');
     if (keys(%servers) > 1) {      if (keys(%servers) > 1) {
         foreach my $server (keys(%servers)) {          foreach my $server (keys(%servers)) {
             next if ($thismachine{$server});              next if ($thismachine{$server});
             &Apache::lonnet::remote_devalidate_cache($server,'domainconfig',$dom);              my @cached;
               foreach my $name (@posscached) {
                   if ($cachekeys->{$name}) {
                       push(@cached,&escape($name).':'.&escape($dom));
                   }
               }
               if (@cached) {
                   &Apache::lonnet::remote_devalidate_cache($server,\@cached);
               }
         }          }
     }      }
     return;      return;

Removed from v.1.209  
changed lines
  Added in v.1.218


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