Diff for /loncom/interface/courseprefs.pm between versions 1.71 and 1.92

version 1.71, 2015/05/21 23:26:35 version 1.92, 2021/06/07 02:19:51
Line 137  whether Domain coordinators who are curr Line 137  whether Domain coordinators who are curr
 advanced course user .db file for a course are to be hidden (e.g.,  advanced course user .db file for a course are to be hidden (e.g.,
 in syllabus, or from course user lists).  in syllabus, or from course user lists).
   
 Inputs: $cdom,$item,$settings,$crstype  Inputs: $cdom,$item,$settings,$crstype,$noedit
 where $cdom is course domain, item is nothideprivileged, $settings is  where $cdom is course domain, item is nothideprivileged, $settings is
 HASH ref of the current values for nothideprivileged, $crstype is   HASH ref of the current values for nothideprivileged, $crstype is 
 course type (Course or Community).   course type (Course or Community). 
Line 235  sub handler { Line 235  sub handler {
     my $cid = $env{'request.course.id'};      my $cid = $env{'request.course.id'};
     my ($cnum,$cdom,$chome) = &get_course($cid);      my ($cnum,$cdom,$chome) = &get_course($cid);
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     my $parm_permission = &Apache::lonnet::allowed('opa',$cid);      my ($parm_permission,$allowed) = &get_permission($cid);
     my $navmap = Apache::lonnavmaps::navmap->new();      my $navmap = Apache::lonnavmaps::navmap->new();
     if ($parm_permission && $navmap) {      if ($allowed && $navmap) {
         &Apache::loncommon::content_type($r,'text/html');          &Apache::loncommon::content_type($r,'text/html');
         $r->send_http_header;          $r->send_http_header;
     } else {      } else {
Line 344  sub handler { Line 344  sub handler {
         $phase = $env{'form.phase'};          $phase = $env{'form.phase'};
     }      }
   
     if ($phase eq 'categorizecourse') {      if (($phase eq 'categorizecourse') && ($parm_permission->{'categorizecourse'})) {
         &assign_course_categories($r,$crstype);          &assign_course_categories($r,$crstype);
         return OK;          return OK;
     }      }
   
     if ($phase eq 'releaseinfo') {      if (($phase eq 'releaseinfo') && ($parm_permission->{'releaseinfo'})) {
         my $loncaparev = $env{'course.'.$cid.'.internal.releaserequired'};          my $loncaparev = $env{'course.'.$cid.'.internal.releaserequired'};
         if ($loncaparev) {           if ($loncaparev) { 
             if (&display_loncaparev_constraints($r,$navmap,$loncaparev,$crstype)) {              if (&display_loncaparev_constraints($r,$navmap,$loncaparev,$crstype)) {
Line 367  sub handler { Line 367  sub handler {
     my %values=&Apache::lonnet::dump('environment',$cdom,$cnum);      my %values=&Apache::lonnet::dump('environment',$cdom,$cnum);
     my @prefs_order = ('courseinfo','localization','feedback','discussion',      my @prefs_order = ('courseinfo','localization','feedback','discussion',
                        'classlists','appearance','grading','printouts',                         'classlists','appearance','grading','printouts',
                        'spreadsheet','bridgetasks','other');                         'menuitems','spreadsheet','bridgetasks','lti','other');
   
     my %prefs = (      my %prefs = (
         'courseinfo' =>          'courseinfo' =>
Line 375  sub handler { Line 375  sub handler {
                      help => 'Course_Prefs_General',                       help => 'Course_Prefs_General',
                      ordered => ['owner','co-owners','loncaparev','description',                       ordered => ['owner','co-owners','loncaparev','description',
                                  'clonedfrom','courseid','uniquecode','categories',                                   'clonedfrom','courseid','uniquecode','categories',
                                  'hidefromcat','externalsyllabus','cloners','url',                                   'hidefromcat','syllabus','cloners','url',
                                  'rolenames'],                                   'rolenames'],
                      itemtext => {                       itemtext => {
                                    'owner'            => $lt{'ownr'},                                     'owner'            => $lt{'ownr'},
Line 386  sub handler { Line 386  sub handler {
                                    'categories'       => $lt{'catg'},                                     'categories'       => $lt{'catg'},
                                    'hidefromcat'      => $lt{'excc'},                                     'hidefromcat'      => $lt{'excc'},
                                    'cloners'          => $lt{'clon'},                                      'cloners'          => $lt{'clon'}, 
                                    'externalsyllabus' => 'Syllabus status',                                     'syllabus'         => 'Syllabus status',
                                    'url'              => 'Top Level Map',                                     'url'              => 'Top Level Map',
                                    'rolenames'        => $lt{'rept'},                                     'rolenames'        => $lt{'rept'},
                                    'loncaparev'       => $lt{'lcrv'},                                     'loncaparev'       => $lt{'lcrv'},
Line 419  sub handler { Line 419  sub handler {
                     { text => 'Discussion and Chat',                      { text => 'Discussion and Chat',
                       help => 'Course_Prefs_Discussions',                        help => 'Course_Prefs_Discussions',
                       ordered => ['pch.roles.denied','pch.users.denied',                        ordered => ['pch.roles.denied','pch.users.denied',
                                     'pac.roles.denied','pac.users.denied',
                                   'plc.roles.denied','plc.users.denied',                                    'plc.roles.denied','plc.users.denied',
                                   'allow_limited_html_in_feedback',                                    'allow_limited_html_in_feedback',
                                   'allow_discussion_post_editing',                                    'allow_discussion_post_editing',
Line 428  sub handler { Line 429  sub handler {
                          'pch.users.denied'             => 'No Resource Discussion',                           'pch.users.denied'             => 'No Resource Discussion',
                          'plc.roles.denied'             => 'No Chat room use',                           'plc.roles.denied'             => 'No Chat room use',
                          'plc.users.denied'             => 'No Chat room use',                           'plc.users.denied'             => 'No Chat room use',
                            'pac.roles.denied'             => 'No Anonymous Resource Discussion',
                            'pac.users.denied'             => 'No Anonymous Resource Discussion',  
                          allow_limited_html_in_feedback => 'Allow limited HTML in discussion',                           allow_limited_html_in_feedback => 'Allow limited HTML in discussion',
                          allow_discussion_post_editing  => 'Users can edit/delete own discussion posts',                           allow_discussion_post_editing  => 'Users can edit/delete own discussion posts',
                          discussion_post_fonts       => 'Discussion post fonts based on likes/unlikes',                           discussion_post_fonts          => 'Discussion post fonts based on likes/unlikes',
                                   },                                    },
                     },                      },
         'classlists' =>          'classlists' =>
Line 527  sub handler { Line 530  sub handler {
                         suppress_embed_prompt => 'Hide upload references prompt if uploading file to portfolio',                          suppress_embed_prompt => 'Hide upload references prompt if uploading file to portfolio',
                                 },                                  },
                   },                    },
           'lti' =>
                     {
                       text => 'LTI provider settings',
                       help => 'Course_Prefs_LTIProvider',
                       ordered => ['lti.override','lti.topmenu','lti.inlinemenu','lti.lcmenu'],
                       itemtext => {
                            'lti.override'   => 'Override domain defaults',
                            'lti.topmenu'    => 'Display LON-CAPA page header',
                            'lti.inlinemenu' => 'Display LON-CAPA inline menu',
                            'lti.lcmenu'     => 'Menu items',
                                   },
                     },
           'menuitems' =>
                      {
                        text => 'Menu display',
                        help => 'Course_Prefs_Menus',
                        header => [{col1 => 'Default Menu',
                                    col2 => 'Value',},
                                   {col1 => 'Menu collections',
                                    col2 => 'Settings',
                                   }],
                        ordered => ['menudefault','menucollections'],
                        itemtext => {
                            menudefault     => 'Choose default collection of menu items for course',
                            menucollections => 'Menu collections',
                                    },
                      },
         'other' =>          'other' =>
                   { text => 'Other settings',                    { text => 'Other settings',
                     help => 'Course_Prefs_Other',                      help => 'Course_Prefs_Other',
Line 535  sub handler { Line 565  sub handler {
                               }],                                }],
                   },                    },
     );      );
     if ($phase eq 'process') {      if (($phase eq 'process') && ($parm_permission->{'process'})) {
         my @allitems = &get_allitems(%prefs);          my @allitems = &get_allitems(%prefs);
         &Apache::lonconfigsettings::make_changes($r,$cdom,$phase,$context,          &Apache::lonconfigsettings::make_changes($r,$cdom,$phase,$context,
                                                  \@prefs_order,\%prefs,\%values,                                                   \@prefs_order,\%prefs,\%values,
                                                   $cnum,undef,\@allitems,'coursepref');                                                    $cnum,undef,\@allitems,
     } elsif ($phase eq 'display') {                                                    'coursepref',$parm_permission);
         my $jscript = &get_jscript($cid,$cdom,$phase,$crstype,\%values);      } elsif (($phase eq 'display') && ($parm_permission->{'display'})) {
           my $noedit;
           if (ref($parm_permission) eq 'HASH') {
               unless ($parm_permission->{'process'}) {
                   $noedit = 1;
               }
           }
           my $jscript = &get_jscript($cid,$cdom,$phase,$crstype,\%values,$noedit);
         my @allitems = &get_allitems(%prefs);          my @allitems = &get_allitems(%prefs);
         &Apache::lonconfigsettings::display_settings($r,$cdom,$phase,$context,          &Apache::lonconfigsettings::display_settings($r,$cdom,$phase,$context,
             \@prefs_order,\%prefs,\%values,undef,$jscript,\@allitems,$crstype,'coursepref');              \@prefs_order,\%prefs,\%values,undef,$jscript,\@allitems,$crstype,
               'coursepref',$parm_permission);
     } else {      } else {
         &Apache::lonconfigsettings::display_choices($r,$phase,$context,          &Apache::lonconfigsettings::display_choices($r,$phase,$context,
                                                     \@prefs_order,\%prefs,'coursepref');                                                      \@prefs_order,\%prefs,
                                                       'coursepref',$parm_permission);
     }      }
     return OK;      return OK;
 }  }
   
   sub get_permission {
       my ($cid) = @_;
       my %permission;
       my $allowed = 0;
       return (\%permission,$allowed) unless ($cid);
       if (&Apache::lonnet::allowed('opa',$cid)) {
           %permission= (
                          'pickactions'      => 1,
                          'categorizecourse' => 1,
                          'releaseinfo'      => 1,
                          'process'          => 1,
                          'display'          => 1,
            );
       } elsif (&Apache::lonnet::allowed('vpa',$env{'request.course.id'})) {
           %permission = (
                          'pickactions'      => 1,
                          'releaseinfo'      => 1,
                          'display'          => 1,
                         );
       }
       foreach my $perm (values(%permission)) {
           if ($perm) { $allowed=1; last; }
       }
       return (\%permission,$allowed);
   }
   
 sub get_allitems {  sub get_allitems {
     my (%prefs) = @_;      my (%prefs) = @_;
     my @allitems;      my @allitems;
Line 569  sub get_allitems { Line 634  sub get_allitems {
 }  }
   
 sub print_config_box {  sub print_config_box {
     my ($r,$cdom,$phase,$action,$item,$settings,$allitems,$crstype) = @_;      my ($r,$cdom,$phase,$action,$item,$settings,$allitems,$crstype,$parm_permission) = @_;
     my $ordered = $item->{'ordered'};      my $ordered = $item->{'ordered'};
     my $itemtext = $item->{'itemtext'};      my $itemtext = $item->{'itemtext'};
       my $noedit;
       if (ref($parm_permission) eq 'HASH') {
           unless ($parm_permission->{'process'}) {
               $noedit = 1;
           }
       }
     my $rowtotal = 0;      my $rowtotal = 0;
     my $output =      my $output =
          '<table class="LC_nested_outer">           '<table class="LC_nested_outer">
Line 584  sub print_config_box { Line 655  sub print_config_box {
     }      }
     $output .= '</span></th>'."\n".      $output .= '</span></th>'."\n".
                '</tr>';                 '</tr>';
     if (($action eq 'feedback') || ($action eq 'classlists')) {      if (($action eq 'feedback') || ($action eq 'classlists') || ($action eq 'menuitems')) {
         $output .= '          $output .= '
           <tr>            <tr>
            <td>             <td>
Line 606  sub print_config_box { Line 677  sub print_config_box {
         }          }
         $rowtotal ++;          $rowtotal ++;
         if ($action eq 'feedback') {          if ($action eq 'feedback') {
             $output .= &print_feedback('top',$cdom,$settings,$ordered,$itemtext,\$rowtotal);              $output .= &print_feedback('top',$cdom,$settings,$ordered,$itemtext,\$rowtotal,$noedit);
         } elsif ($action eq 'classlists') {          } elsif ($action eq 'classlists') {
             $output .= &print_classlists('top',$cdom,$settings,$itemtext,\$rowtotal,$crstype);              $output .= &print_classlists('top',$cdom,$settings,$itemtext,\$rowtotal,$crstype,$noedit);
           } elsif ($action eq 'menuitems') {
               $output .= &print_menuitems('top',$cdom,$settings,$itemtext,\$rowtotal,$crstype,$noedit);
         }          }
         $output .= '          $output .= '
            </table>             </table>
Line 629  sub print_config_box { Line 702  sub print_config_box {
         $output .= &mt($item->{'header'}->[1]->{'col2'}).'</td>          $output .= &mt($item->{'header'}->[1]->{'col2'}).'</td>
              </tr>';               </tr>';
         if ($action eq 'classlists') {          if ($action eq 'classlists') {
             $output .= &print_classlists('middle',$cdom,$settings,$itemtext,\$rowtotal,$crstype).              $output .= &print_classlists('middle',$cdom,$settings,$itemtext,\$rowtotal,$crstype,$noedit).
                        '                         '
             </table>              </table>
            </td>             </td>
Line 668  sub print_config_box { Line 741  sub print_config_box {
     }      }
     $rowtotal ++;      $rowtotal ++;
     if ($action eq 'courseinfo') {      if ($action eq 'courseinfo') {
         $output .= &print_courseinfo($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype);          $output .= &print_courseinfo($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit);
     } elsif ($action eq 'localization') {      } elsif ($action eq 'localization') {
         $output .= &print_localization($cdom,$settings,$ordered,$itemtext,\$rowtotal);          $output .= &print_localization($cdom,$settings,$ordered,$itemtext,\$rowtotal,$noedit);
     } elsif ($action eq 'feedback') {      } elsif ($action eq 'feedback') {
         $output .= &print_feedback('bottom',$cdom,$settings,$ordered,$itemtext,\$rowtotal);          $output .= &print_feedback('bottom',$cdom,$settings,$ordered,$itemtext,\$rowtotal,$noedit);
     } elsif ($action eq 'discussion') {      } elsif ($action eq 'discussion') {
         $output .= &print_discussion($cdom,$settings,$ordered,$itemtext,\$rowtotal);          $output .= &print_discussion($cdom,$settings,$ordered,$itemtext,\$rowtotal,$noedit);
     } elsif (($action eq 'classlists') || ($action eq 'viewableroster')) {      } elsif (($action eq 'classlists') || ($action eq 'viewableroster')) {
         $output .= &print_classlists('bottom',$cdom,$settings,$itemtext,\$rowtotal,$crstype);          $output .= &print_classlists('bottom',$cdom,$settings,$itemtext,\$rowtotal,$crstype,$noedit);
     } elsif ($action eq 'appearance') {      } elsif ($action eq 'appearance') {
         $output .= &print_appearance($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype);          $output .= &print_appearance($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit);
     } elsif ($action eq 'grading') {      } elsif ($action eq 'grading') {
         $output .= &print_grading($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype);          $output .= &print_grading($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit);
     } elsif ($action eq 'printouts') {      } elsif ($action eq 'printouts') {
         $output .= &print_printouts($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype);          $output .= &print_printouts($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit);
     } elsif ($action eq 'spreadsheet') {      } elsif ($action eq 'spreadsheet') {
         $output .= &print_spreadsheet($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype);          $output .= &print_spreadsheet($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit);
     } elsif ($action eq 'bridgetasks') {      } elsif ($action eq 'bridgetasks') {
         $output .= &print_bridgetasks($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype);          $output .= &print_bridgetasks($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit);
       } elsif ($action eq 'lti') {
           $output .= &print_lti($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit);
       } elsif ($action eq 'menuitems') {
           $output .= &print_menuitems('bottom',$cdom,$settings,$itemtext,\$rowtotal,$crstype,$noedit);
     } elsif ($action eq 'other') {      } elsif ($action eq 'other') {
         $output .= &print_other($cdom,$settings,$allitems,\$rowtotal,$crstype);          $output .= &print_other($cdom,$settings,$allitems,\$rowtotal,$crstype,$noedit);
     }      }
     $output .= '      $output .= '
    </table>     </table>
Line 728  sub process_changes { Line 805  sub process_changes {
                                  (!$can_categorize));                                   (!$can_categorize));
                         next if (($entry eq 'loncaparev') ||                           next if (($entry eq 'loncaparev') || 
                                 ($entry eq 'owner') ||                                  ($entry eq 'owner') ||
                                 ($entry eq 'clonedfrom'));                                  ($entry eq 'clonedfrom') ||
                                   ($entry eq 'syllabus'));
                         push(@ordered,$entry);                          push(@ordered,$entry);
                     }                      }
                 } elsif ($action eq 'classlists') {                  } elsif ($action eq 'classlists') {
Line 778  sub process_changes { Line 856  sub process_changes {
                             $changes->{$ext_entry} = $newvalues{$ext_entry};                              $changes->{$ext_entry} = $newvalues{$ext_entry};
                         }                          }
                     }                      }
                   } elsif ($action eq 'menuitems') {
                       my (%current,@colls);
                       my $next = 1;
                       if ($values->{'menucollections'}) {
                           foreach my $item (split(/;/,$values->{'menucollections'})) {
                               my ($num,$value) = split(/\%/,$item);
                               if ($num =~ /^\d+$/) {
                                   unless (grep(/^$num$/,@colls)) {
                                       push(@colls,$num);
                                   }
                                   my @entries = split(/\&/,$value);
                                   foreach my $entry (@entries) {
                                       my ($name,$fields) = split(/=/,$entry);
                                       $current{$num}{$name} = $fields;
                                   }
                               }
                           }
                       }
                       if (@colls) {
                           @colls = sort { $a <=> $b } @colls;
                           $next += $colls[-1];
                       }
                       if ($env{'form.menucollections_add'} eq $next) {
                           push(@colls,$next);
                       }
                       my $currdef = $values->{'menudefault'};
                       my $possdef = $env{'form.menudefault'};
                       if (($possdef =~ /^\d+$/) && (grep(/^$possdef$/,@colls))) {
                           if ($currdef ne $possdef) {
                               $changes->{'menudefault'} = $possdef;
                           }
                       } elsif ($currdef) {
                           $changes->{'menudefault'} = '';
                       }
                       my $menucoll;
                       if (@colls) {
                           my ($ordered,$cats) = &menuitems_categories();
                           my %shortcats = &menuitems_abbreviations();
                           foreach my $num (@colls) {
                               my ($entry,%include);
                               map { $include{$_}= 1; } &Apache::loncommon::get_env_multiple('form.menucollections_'.$num);
                               foreach my $item (@{$ordered}) {
                                   if ($item eq 'shown') {
                                       foreach my $type (@{$cats->{$item}}) {
                                           $entry .= $type.'=';
                                           if ($include{$type}) {
                                               $entry .= 'y';
                                           } else {
                                               $entry .= 'n';
                                           }
                                           $entry .= '&';
                                       }
                                   } else {
                                       $entry .= $shortcats{$item}.'=';
                                       foreach my $type (@{$cats->{$item}}) {
                                           if ($include{$type}) {
                                               $entry .= $type.',';
                                           }
                                       }
                                       $entry =~ s/,$//;
                                       $entry .= '&';
                                   }
                               }
                               $entry =~ s/\&$//;
                               if ($menucoll) {
                                   $menucoll .= ';';
                               }
                               $menucoll .= $num.'%'.$entry;
                           }
                           if ($menucoll ne $values->{'menucollections'}) {
                               $changes->{'menucollections'} = $menucoll;
                           }
                       } elsif ($values->{'menucollections'}) {
                           $changes->{'menucollections'} = '';
                       }
                 } else {                  } else {
                     foreach my $entry (@ordered) {                      foreach my $entry (@ordered) {
                         if ($entry eq 'cloners') {                          if ($entry eq 'cloners') {
Line 931  sub process_changes { Line 1084  sub process_changes {
                                 my $udom = $env{'user.domain'};                                  my $udom = $env{'user.domain'};
                                 my $pendingcoowners = $values->{'internal.pendingco-owners'};                                  my $pendingcoowners = $values->{'internal.pendingco-owners'};
                                 my @pendingcoown = split(',',$pendingcoowners);                                  my @pendingcoown = split(',',$pendingcoowners);
                                 if ($env{'form.pending_coowoner'}) {                                  if ($env{'form.pending_coowner'}) {
                                     foreach my $item (@pendingcoown) {                                      foreach my $item (@pendingcoown) {
                                         unless ($item eq $uname.':'.$udom) {                                          unless ($item eq $uname.':'.$udom) {
                                             push(@newpending,$item);                                              push(@newpending,$item);
                                         }                                          }
                                     }                                      }
                                     @newcoown = @currcoown;                                      @newcoown = @currcoown;
                                     if ($env{'form.pending_coowoner'} eq 'accept') {                                      if ($env{'form.pending_coowner'} eq 'accept') {
                                         unless (grep(/^\Q$uname\E:\Q$udom\E$/,@currcoown)) {                                          unless (grep(/^\Q$uname\E:\Q$udom\E$/,@currcoown)) {
                                             push(@newcoown,$uname.':'.$udom);                                              push(@newcoown,$uname.':'.$udom);
                                         }                                          }
                                     }                                      }
                                 } elsif ($env{'form.remove_coowoner'}) {                                  } elsif ($env{'form.remove_coowner'}) {
                                     foreach my $item (@currcoown) {                                      foreach my $item (@currcoown) {
                                         unless ($item eq $uname.':'.$udom) {                                          unless ($item eq $uname.':'.$udom) {
                                             push(@newcoown,$item);                                              push(@newcoown,$item);
Line 1021  sub process_changes { Line 1174  sub process_changes {
                                     }                                      }
                                 }                                  }
                             }                              }
                         } elsif (($entry eq 'plc.roles.denied') || ($entry eq 'pch.roles.denied')) {                          } elsif (($entry eq 'plc.roles.denied') || ($entry eq 'pch.roles.denied') ||
                                    ($entry eq 'pac.roles.denied')) {
                             my @denied = &Apache::loncommon::get_env_multiple('form.'.$entry);                              my @denied = &Apache::loncommon::get_env_multiple('form.'.$entry);
                             @denied = sort(@denied);                              @denied = sort(@denied);
                             my $deniedstr = '';                              my $deniedstr = '';
Line 1029  sub process_changes { Line 1183  sub process_changes {
                                 $deniedstr = join(',',@denied);                                    $deniedstr = join(',',@denied);  
                             }                              }
                             $newvalues{$entry} = $deniedstr;                              $newvalues{$entry} = $deniedstr;
                         } elsif (($entry eq 'plc.users.denied') || ($entry eq 'pch.users.denied')) {                          } elsif (($entry eq 'plc.users.denied') || ($entry eq 'pch.users.denied') ||
                                    ($entry eq 'pac.users.denied')) {
                             my $total = $env{'form.'.$entry.'_total'};                              my $total = $env{'form.'.$entry.'_total'};
                             my $userstr = '';                              my $userstr = '';
                             my @denied;                                my @denied;  
Line 1217  sub process_changes { Line 1372  sub process_changes {
                                 $settings =~ s/,$//;                                  $settings =~ s/,$//;
                             }                              }
                             $newvalues{$entry} = $settings;                              $newvalues{$entry} = $settings;
                           } elsif ($action eq 'lti') {
                               if ($entry eq 'lti.override') {
                                   $newvalues{$entry} = $env{'form.'.$entry};
                               } elsif (($entry eq 'lti.topmenu') || ($entry eq 'lti.inlinemenu')) {
                                   if ($env{'form.lti.override'}) {
                                       $newvalues{$entry} = $env{'form.'.$entry};
                                   } else {
                                       $newvalues{$entry} = '';
                                   }
                               } elsif ($entry eq 'lti.lcmenu') {
                                   if (($env{'form.lti.override'}) &&
                                       (($env{'form.lti.topmenu'}) || ($env{'form.lti.inlinemenu'}))) {
                                       my @lcmenu = &Apache::loncommon::get_env_multiple('form.lti.lcmenu');
                                       my @newlcmenu;
                                       if (@lcmenu) {
                                           my @menuitems = ('fullname','coursetitle','role','logout','grades');
                                           foreach my $item (@menuitems) {
                                               next if (($item eq 'grades') && (!$newvalues{'lti.inlinemenu'}));
                                               if (grep(/^\Q$item\E$/,@lcmenu)) {
                                                   push(@newlcmenu,$item);
                                               }
                                           }
                                       }
                                       if (@newlcmenu) {
                                           $newvalues{$entry} = join(',',@newlcmenu);
                                       } else {
                                           $newvalues{$entry} = 'none';
                                       }
                                   } else {
                                       $newvalues{$entry} = '';
                                   }
                               }
                         } else {                          } else {
                             $newvalues{$entry} = $env{'form.'.$entry};                              $newvalues{$entry} = $env{'form.'.$entry};
                         }                          }
Line 1427  sub store_changes { Line 1614  sub store_changes {
                                             }                                              }
                                         }                                          }
                                         $displayname = &mt($text);                                          $displayname = &mt($text);
                                       } elsif ($item eq 'lti') {
                                           if ($key eq 'lti.lcmenu') {
                                               if ($changes->{$item}{$key} eq 'none') {
                                                   $displayval = &mt('None of the configurable menu items displayed');
                                               } else {
                                                   my %ltititles = &ltimenu_titles();
                                                   $displayval = join(', ', map { $ltititles{$_}; } split(/,/,$changes->{$item}{$key}));
                                               }
                                           } else {
                                               if ($changes->{$item}{$key} eq '1') {
                                                   $displayval = &mt('Yes');
                                               } elsif ($changes->{$item}{$key} eq '') {
                                                   $displayval = &mt('No');
                                               }
                                           }
                                           $displayname = &mt($text);
                                       } elsif ($item eq 'menuitems') {
                                           unless ($changes->{$item}{$key} eq '') {
                                               if ($key eq 'menudefault') {
                                                   $displayname = &mt('Default collection of menu items');
                                                   $displayval = &mt('Collection: [_1]',
                                                                     $changes->{$item}{$key});
                                               } elsif ($key eq 'menucollections') {
                                                   $displayval = &menucollections_display($changes->{$item}{$key});
                                               }
                                           }
                                     } else {                                      } else {
                                         $displayname = &mt($text);                                          $displayname = &mt($text);
                                     }                                      }
Line 1471  sub store_changes { Line 1684  sub store_changes {
                                                 }                                                  }
                                             }                                              }
                                             unless (&Apache::lonnet::is_course_owner($cdom,$cnum)) {                                              unless (&Apache::lonnet::is_course_owner($cdom,$cnum)) {
                                                 if ($env{'form.pending_coowoner'} eq 'accept') {                                                  if ($env{'form.pending_coowner'} eq 'accept') {
                                                         $displayval = &mt('on');                                                          $displayval = &mt('on');
                                                 } elsif ($env{'form.pending_coowoner'} eq 'decline') {                                                  } elsif ($env{'form.pending_coowner'} eq 'decline') {
                                                         $displayval = '';                                                          $displayval = '';
                                                         $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('Invitation to be co-owner declined')).'</li>';                                                          $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('Invitation to be co-owner declined')).'</li>';
                                                 } elsif ($env{'form.remove_coowoner'}) {                                                  } elsif ($env{'form.remove_coowner'}) {
                                                     $displayval = &mt('off');                                                      $displayval = &mt('off');
                                                 }                                                  }
                                                 if ($displayval) {                                                  if ($displayval) {
Line 1489  sub store_changes { Line 1702  sub store_changes {
                                         }                                          }
                                     } elsif ($changes->{$item}{$key} eq '') {                                      } elsif ($changes->{$item}{$key} eq '') {
                                         push(@delkeys,$key);                                          push(@delkeys,$key);
                                         $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('Deleted setting for [_1]',                                          if ($item eq 'lti') {
                                                    '<i>'.$displayname.'</i>')).'</li>';                                              if (($key eq 'lti.override') || (($key ne 'lti.override') && ($env{'form.lti.override'} ne ''))) {
                                                   if (($key eq 'lti.lcmenu') &&
                                                       ((!$env{'form.lti.topmenu'}) && (!$env{'form.lti.inlinemenu'}))) {
                                                       $output .= '<li>'.&mt('LTI settings for menu items only saved if page header and/or inline menu is set to be displayed').'</li>';
                                                   } else {
                                                       $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]',
                                                                  '<i>'.$displayname.'</i>',
                                                                  "'<b>$displayval</b>'")).'</li>';
                                                   }
                                               } elsif (!exists($changes->{$item}{'lti.override'})) {
                                                   $output .= '<li>'.&mt('LTI settings only saved if Override is set to "Yes"').'</li>';
                                               }
                                           } elsif ($item eq 'menuitems') {
                                               if ($key eq 'menudefault') {
                                                   $output .= '<li>'.&mt("Default collection of menu items set to: 'Standard' (all menus shown)").'</li>';
                                               } elsif ($key eq 'menucollections') {
                                                   $output .= '<li>'.&mt('Specific collections of menus no longer available').'</li>';
                                               }
                                           } else {
                                               $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('Deleted setting for [_1]',
                                                          '<i>'.$displayname.'</i>')).'</li>';
                                           }
                                       } elsif ($key eq 'menucollections') {
                                           $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('Numbered menu collections:')).'<br />'.
                                                      $displayval.'</li>';
                                     } else {                                      } else {
                                         $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]',                                          $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]',
                                                    '<i>'.$displayname.'</i>',                                                     '<i>'.$displayname.'</i>',
Line 1529  sub store_changes { Line 1766  sub store_changes {
                                 }                                  }
                                 if (($key eq 'description') || ($key eq 'cloners') ||                                  if (($key eq 'description') || ($key eq 'cloners') ||
                                     ($key eq 'hidefromcat') || ($key eq 'categories') ||                                      ($key eq 'hidefromcat') || ($key eq 'categories') ||
                                     ($key eq 'co-owners')) {                                      ($key eq 'co-owners') || ($key eq 'lti.override') ||
                                       ($key eq 'lti.topmenu') || ($key eq 'lti.inlinemenu') ||
                                       ($key eq 'lti.lcmenu')) {
                                     push(@need_env_update,$key);                                      push(@need_env_update,$key);
                                 }                                  }
                             }                              }
Line 1613  sub update_env { Line 1852  sub update_env {
                     my @coowners = split(',',$storehash->{'internal.'.$key});                      my @coowners = split(',',$storehash->{'internal.'.$key});
                     $crsinfo{$env{'request.course.id'}}{'co-owners'} = \@coowners;                      $crsinfo{$env{'request.course.id'}}{'co-owners'} = \@coowners;
                     $count ++;                      $count ++;
                   } elsif ($key =~ /^lti\./) {
                       &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.'.$key => $storehash->{$key}});
                 }                  }
             }              }
             if ($count) {              if ($count) {
Line 1716  sub get_course { Line 1957  sub get_course {
 }  }
   
 sub get_jscript {  sub get_jscript {
     my ($cid,$cdom,$phase,$crstype,$settings) = @_;      my ($cid,$cdom,$phase,$crstype,$settings,$noedit) = @_;
     my ($can_toggle_cat,$can_categorize) = &can_modify_catsettings($cdom,$crstype);      my ($can_toggle_cat,$can_categorize) = &can_modify_catsettings($cdom,$crstype);
     my ($jscript,$categorize_js,$loncaparev_js,$instcode_js);      my ($jscript,$categorize_js,$loncaparev_js,$instcode_js);
     my $stubrowse_js = &Apache::loncommon::studentbrowser_javascript();      my $stubrowse_js = &Apache::loncommon::studentbrowser_javascript();
Line 1842  function syllabusinfo() { Line 2083  function syllabusinfo() {
     }      }
 }  }
 ENDSCRIPT  ENDSCRIPT
       my $menuitems_js;
       unless ($noedit) {
           my $collections;
           my $next = 1;
           if (ref($settings) eq 'HASH') {
               if ($settings->{'menucollections'} ne '') {
                   my @current;
                   foreach my $item (split(/;/,$settings->{'menucollections'})) {
                       my ($num) = split(/\%/,$item);
                       if ($num =~ /^\d+$/) {
                           push(@current,$num);
                       }
                   }
                   $collections = join("','",sort { $a <=> $b } @current);
                   if ($collections) {
                       $collections = "'$collections'";
                   }
                   $next += $current[-1];
               }
           }
           my $deftext = &mt('Standard (all menus shown)');
           $menuitems_js = <<ENDSCRIPT;
   function toggleAddmenucoll() {
       if (document.getElementById('menucollections_add')) {
           var state = 'none';
           var add = document.getElementById('menucollections_add').checked;
           if (add) {
               state = 'inline-block';
           }
           var fieldsets = new Array('shown','text','links','list','inline');
           for (var i=0; i<fieldsets.length; i++) {
               if (document.getElementById('addmenucoll_'+fieldsets[i])) {
                   document.getElementById('addmenucoll_'+fieldsets[i]).style.display = state;
               }
           }
           var box = document.getElementsByClassName('LC_menucoll_add');
           if (box.length) {
               for (var i=0; i<box.length; i++) {
                   if (add) {
                       box[i].checked = true;
                   } else {
                       box[i].checked = false;
                   }
               }
           }
           if (document.getElementById('menudefault')) {
               var menudef = document.getElementById('menudefault');
               var currsel = menudef.selectedIndex;
               var colls = new Array($collections);
               menudef.options.length = 0;
               if (!add) {
                   if (currsel == 1 + colls.length) {
                       currsel = 0;
                   }
               }
               if (currsel == 0) {
                   menudef.options[0] = new Option('$deftext','',true,true);
               } else {
                   menudef.options[0] = new Option('$deftext','',false,false);
               }
               if (colls.length) {
                   for (var i=0; i<colls.length; i++) {
                       var idx = i+1;
                       if (currsel == colls[i]) {
                           menudef.options[idx] = new Option(colls[i],colls[i],true,true);
                       } else {
                           menudef.options[idx] = new Option(colls[i],colls[i],false,false);
                       }
                   }
               }
               if (add) {
                   var addidx = 1 + colls.length;
                   if (currsel == addidx) {
                        menudef.options[addidx] = new Option('$next','$next',true,true);
                   } else {
                       menudef.options[addidx] = new Option('$next','$next',false,false);
                   }
               }
           }
       }
   }
   ENDSCRIPT
       }
     $jscript = '<script type="text/javascript" language="Javascript">'."\n".      $jscript = '<script type="text/javascript" language="Javascript">'."\n".
                '// <![CDATA['."\n".                   '// <![CDATA['."\n".  
                $browse_js."\n".$categorize_js."\n".$loncaparev_js."\n".                 $browse_js."\n".$categorize_js."\n".$loncaparev_js."\n".
                $cloners_js."\n".$instcode_js.                 $cloners_js."\n".$instcode_js.
                $syllabus_js."\n".'//]]>'."\n".                 $syllabus_js."\n".$menuitems_js."\n".'//]]>'."\n".
                '</script>'."\n".$stubrowse_js."\n";                 '</script>'."\n".$stubrowse_js."\n";
     return $jscript;      return $jscript;
 }  }
Line 1934  ENDSCRIPT Line 2258  ENDSCRIPT
   
   
 sub print_courseinfo {  sub print_courseinfo {
     my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_;      my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype,$noedit) = @_;
     unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {      unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
         return;          return;
     }      }
     my ($cathash,$categoriesform,$autocoowner,$clonedefaults);      my ($cathash,$categoriesform,$autocoowner,$clonedefaults,$disabled);
       if ($noedit) {
           $disabled = ' disabled="disabled"';
       }
     my %domconf =       my %domconf = 
         &Apache::lonnet::get_dom('configuration',          &Apache::lonnet::get_dom('configuration',
                                  ['coursecategories','autoenroll','coursedefaults'],$cdom);                                   ['coursecategories','autoenroll','coursedefaults'],$cdom);
Line 1947  sub print_courseinfo { Line 2274  sub print_courseinfo {
         if (ref($cathash) eq 'HASH') {          if (ref($cathash) eq 'HASH') {
             $categoriesform =               $categoriesform = 
                 &Apache::loncommon::assign_categories_table($cathash,                  &Apache::loncommon::assign_categories_table($cathash,
                                                 $settings->{'categories'},$crstype)."\n";                                                  $settings->{'categories'},$crstype,$disabled)."\n";
         }          }
     }      }
     if (ref($domconf{'autoenroll'}) eq 'HASH') {      if (ref($domconf{'autoenroll'}) eq 'HASH') {
Line 2014  sub print_courseinfo { Line 2341  sub print_courseinfo {
     } else {      } else {
         $replace = &mt('To replace the standard title for a course role, enter a title, otherwise leave blank');          $replace = &mt('To replace the standard title for a course role, enter a title, otherwise leave blank');
     }      }
       my ($editmap,$editsyllabus);
       unless ($noedit) {
           $editmap = ('&nbsp;'x2).
                      '<a href="javascript:openbrowser'.
                      "('display','url','sequence')\">".
                      &mt('Select Map').'</a><br /><span class="LC_warning"> '.
                      &mt('Modification may make assessment data inaccessible!').
                      '</span>';
           $editsyllabus = &mt('[_1]Edit[_2]','<a href="/public/'.$cdom.'/'.$cnum.'/syllabus?forceedit=1">',
                               '</a>');  
       }
     my %items = (      my %items = (
         'url' => {          'url' => {
                    text => '<b>'.&mt($itemtext->{'url'}).'</b>'.('&nbsp;'x2).                     text => '<b>'.&mt($itemtext->{'url'}).'</b>'.$editmap,
                            '<a href="javascript:openbrowser'.  
                            "('display','url','sequence')\">".  
                            &mt('Select Map').'</a><br /><span class="LC_warning"> '.  
                            &mt('Modification may make assessment data inaccessible!').  
                            '</span>',  
                    input => 'textbox',                     input => 'textbox',
                    size  => '55',                     size  => '55',
                    advanced => 1                     advanced => 1
Line 2063  sub print_courseinfo { Line 2396  sub print_courseinfo {
                    size  => '20',                     size  => '20',
                    advanced => 1                     advanced => 1
                         },                          },
         'externalsyllabus' => {          'syllabus' => {
                    text => '<b>'.&mt($itemtext->{'externalsyllabus'}).'</b><br />'.                     text => '<b>'.&mt($itemtext->{'syllabus'}).'</b><br />'.
                            &mt('(Syllabus type in use)').('&nbsp;' x2).                             &mt('(Syllabus type in use)').('&nbsp;' x2).
                            &mt('[_1]Edit[_2]','<a href="/public/'.$cdom.'/'.$cnum.'/syllabus?forceedit=1">',                             $editsyllabus,
                                '</a>'),  
                         },                          },
         'hidefromcat' => {          'hidefromcat' => {
                    text => '<b>'.&mt($itemtext->{'hidefromcat'}).'</b><br />'.                     text => '<b>'.&mt($itemtext->{'hidefromcat'}).'</b><br />'.
Line 2108  sub print_courseinfo { Line 2440  sub print_courseinfo {
         $datatable .= &item_table_row_start($items{$item}{text},$count,undef,$colspan);          $datatable .= &item_table_row_start($items{$item}{text},$count,undef,$colspan);
         }          }
         if ($items{$item}{input} eq 'radio') {          if ($items{$item}{input} eq 'radio') {
             $datatable .= &yesno_radio($item,$settings);              $datatable .= &yesno_radio($item,$settings,undef,undef,undef,$noedit);
         } elsif ($item eq 'cloners') {          } elsif ($item eq 'cloners') {
             my $includeempty = 1;              my $includeempty = 1;
             my $num = 0;              my $num = 0;
Line 2122  sub print_courseinfo { Line 2454  sub print_courseinfo {
                 $datatable .= ' checked="checked" ';                  $datatable .= ' checked="checked" ';
             }              }
             $datatable .= 'onchange="javascript:update_cloners('.              $datatable .= 'onchange="javascript:update_cloners('.
                           "'cloners_all'".');" />'.&mt('Yes').'</label>'.                            "'cloners_all'".');"'.$disabled.' />'.&mt('Yes').'</label>'.
                           ('&nbsp;'x2).'<label>'.                            ('&nbsp;'x2).'<label>'.
                           '<input type="radio" name="cloners_all" value="0" ';                            '<input type="radio" name="cloners_all" value="0" ';
             if ($settings->{$item} ne '*') {              if ($settings->{$item} ne '*') {
                 $datatable .= ' checked="checked" ';                  $datatable .= ' checked="checked" ';
             }              }
             $datatable .= ' onchange="javascript:update_cloners('.              $datatable .= ' onchange="javascript:update_cloners('.
                           "'cloners_all'".');" />'.&mt('No').'</label></td>'.                            "'cloners_all'".');"'.$disabled.' />'.&mt('No').'</label></td>'.
                           &Apache::loncommon::end_data_table_row().                            &Apache::loncommon::end_data_table_row().
                           &Apache::loncommon::end_data_table().                            &Apache::loncommon::end_data_table().
                           '<table><tr><td align="left"><b>'.&mt('Or').                            '<table><tr><td align="left"><b>'.&mt('Or').
Line 2137  sub print_courseinfo { Line 2469  sub print_courseinfo {
                           &Apache::loncommon::start_data_table();                            &Apache::loncommon::start_data_table();
             my @cloners;              my @cloners;
             if ($settings->{$item} eq '') {              if ($settings->{$item} eq '') {
                 my $default;                  unless ($noedit) {
                 if ($currcanclone eq 'domain') {                      my $default;
                     $default = '0';                      if ($currcanclone eq 'domain') {
                           $default = '0';
                       }
                       $datatable .= &new_cloners_dom_row($cdom,'0',$default);
                 }                  }
                 $datatable .= &new_cloners_dom_row($cdom,'0',$default);  
             } elsif ($settings->{$item} ne '*') {              } elsif ($settings->{$item} ne '*') {
                 my @entries = split(/,/,$settings->{$item});                  my @entries = split(/,/,$settings->{$item});
                 if (@entries > 0) {                  if (@entries > 0) {
Line 2162  sub print_courseinfo { Line 2496  sub print_courseinfo {
                                 '</b><input type="hidden" name="cloners_dom_'.$num.                                  '</b><input type="hidden" name="cloners_dom_'.$num.
                                 '" value="'.$udom.'" /></span><br />'.                                  '" value="'.$udom.'" /></span><br />'.
                                 '<span class="LC_nobreak"><label><input type="checkbox" '.                                  '<span class="LC_nobreak"><label><input type="checkbox" '.
                                 'name="cloners_delete" value="'.$num.'" onchange="javascript:update_cloners('."'cloners_delete','$num'".');" />'.                                  'name="cloners_delete" value="'.$num.'" onchange="javascript:update_cloners('."'cloners_delete','$num'".');"'.$disabled.' />'.
                                 &mt('Delete').'</label></span></td>'.                                  &mt('Delete').'</label></span></td>'.
                                 &Apache::loncommon::end_data_table_row();                                  &Apache::loncommon::end_data_table_row();
                             $num ++;                              $num ++;
Line 2185  sub print_courseinfo { Line 2519  sub print_courseinfo {
                           '<td align="left"><span class="LC_nobreak">'.                            '<td align="left"><span class="LC_nobreak">'.
                           $add_domtitle.'</span><br />'.                            $add_domtitle.'</span><br />'.
                           &Apache::loncommon::select_dom_form('','cloners_newdom',                            &Apache::loncommon::select_dom_form('','cloners_newdom',
                                                               $includeempty).                                                                $includeempty,undef,undef,
                                                                 undef,undef,$noedit).
                           '<input type="hidden" name="cloners_total" value="'.$num.'" />'.                            '<input type="hidden" name="cloners_total" value="'.$num.'" />'.
                           '</td>'.&Apache::loncommon::end_data_table_row().                            '</td>'.&Apache::loncommon::end_data_table_row().
                           &Apache::loncommon::end_data_table().                            &Apache::loncommon::end_data_table().
Line 2197  sub print_courseinfo { Line 2532  sub print_courseinfo {
                           &mt('Specific users').'&nbsp;(<tt>'.                            &mt('Specific users').'&nbsp;(<tt>'.
                           &mt('user:domain,user:domain').'</tt>)<br />'.                            &mt('user:domain,user:domain').'</tt>)<br />'.
                           &Apache::lonhtmlcommon::textbox($item,$cloners_str,                            &Apache::lonhtmlcommon::textbox($item,$cloners_str,
                                                           $items{$item}{'size'}).                                                            $items{$item}{'size'},$disabled).
                           '</td>'.&Apache::loncommon::end_data_table_row().                            '</td>'.&Apache::loncommon::end_data_table_row().
                           &Apache::loncommon::end_data_table();                            &Apache::loncommon::end_data_table();
             if (@code_order > 0) {              if (@code_order > 0) {
Line 2221  sub print_courseinfo { Line 2556  sub print_courseinfo {
                               '<td align="left"><span class="LC_nobreak">'.                                '<td align="left"><span class="LC_nobreak">'.
                               &mt('Cloning by official course(s) based on course category').('&nbsp;'x2).                                &mt('Cloning by official course(s) based on course category').('&nbsp;'x2).
                               '<label>'.                                '<label>'.
                               '<input type="radio" name="cloners_instcode" value="1" onclick="toggleCloners(this);"'.$checkedon.' />'.&mt('Yes').'</label>'.                                '<input type="radio" name="cloners_instcode" value="1" onclick="toggleCloners(this);"'.$checkedon.$disabled.' />'.&mt('Yes').'</label>'.
                               ('&nbsp;').                                ('&nbsp;').
                               '<label>'.                                '<label>'.
                               '<input type="radio" name="cloners_instcode" value="0" onclick="toggleCloners(this);"'.$checkedoff.' />'.&mt('No').'</label>'.                                '<input type="radio" name="cloners_instcode" value="0" onclick="toggleCloners(this);"'.$checkedoff.$disabled.' />'.&mt('No').'</label>'.
                               &Apache::courseclassifier::build_instcode_selectors($numtitles,                                &Apache::courseclassifier::build_instcode_selectors($numtitles,
                                   $lasttitle,\%cat_items,\@codetitles,\%cat_titles,\%cat_order,                                    $lasttitle,\%cat_items,\@codetitles,\%cat_titles,\%cat_order,
                                   $showncodes,'LC_cloners_instcodes','LC_cloners_instcode').                                    $showncodes,'LC_cloners_instcodes','LC_cloners_instcode',$noedit).
                               '</td>'.&Apache::loncommon::end_data_table_row().                                '</td>'.&Apache::loncommon::end_data_table_row().
                               &Apache::loncommon::end_data_table();                                &Apache::loncommon::end_data_table();
             }              }
Line 2248  sub print_courseinfo { Line 2583  sub print_courseinfo {
                               '</span></td><td align="left">'.                                '</span></td><td align="left">'.
                               &Apache::lonhtmlcommon::textbox('rolenames_'.$role,                                &Apache::lonhtmlcommon::textbox('rolenames_'.$role,
                                                  $settings->{$role.'.plaintext'},                                                   $settings->{$role.'.plaintext'},
                                                  $items{$item}{size}).'</td>'.                                                   $items{$item}{size},$disabled).'</td>'.
                               &Apache::loncommon::end_data_table_row();                                &Apache::loncommon::end_data_table_row();
             }              }
             $datatable .= &Apache::loncommon::end_data_table().'</td>';              $datatable .= &Apache::loncommon::end_data_table().'</td>';
         } elsif ($item eq 'categories') {          } elsif ($item eq 'categories') {
             my $launcher = 'onfocus="this.blur();javascript:catsbrowser();"';              my $launcher;
               if ($noedit) {
                   $launcher = $disabled;
               } else {
                   $launcher = 'onfocus="this.blur();javascript:catsbrowser();"';
               }
             $datatable .= '<input type="hidden" name="categories" value="'.$settings->{$item}.'" />'.              $datatable .= '<input type="hidden" name="categories" value="'.$settings->{$item}.'" />'.
                           &Apache::lonhtmlcommon::textbox($item.'_display',$settings->{$item},                            &Apache::lonhtmlcommon::textbox($item.'_display',$settings->{$item},
                                                           $items{$item}{size},$launcher);                                                            $items{$item}{size},$launcher);
Line 2293  sub print_courseinfo { Line 2633  sub print_courseinfo {
                 if (($crstype eq 'Course') && ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) && ($autocoowner)) {                  if (($crstype eq 'Course') && ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) && ($autocoowner)) {
                     $datatable .= &show_autocoowners(@currcoown);                      $datatable .= &show_autocoowners(@currcoown);
                 } else {                  } else {
                     $datatable .= &coowner_invitations($cnum,$cdom,@currcoown);                      $datatable .= &coowner_invitations($cnum,$cdom,\@currcoown,$noedit);
                 }                  }
             } else {              } else {
                 if (($crstype eq 'Course') && ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) && ($autocoowner)) {                  if (($crstype eq 'Course') && ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) && ($autocoowner)) {
                     $datatable .= &show_autocoowners(@currcoown);                      $datatable .= &show_autocoowners(@currcoown);
                 } else {                  } else {
                     $datatable .= &manage_coownership($cnum,$cdom,@currcoown);                      $datatable .= &manage_coownership($cnum,$cdom,\@currcoown,$noedit);
                 }                  }
             }              }
         } elsif ($item eq 'externalsyllabus') {          } elsif ($item eq 'syllabus') {
             my $external = $env{'course.'.$env{'request.course.id'}.'.externalsyllabus'};              my $external = $env{'course.'.$env{'request.course.id'}.'.externalsyllabus'};
             my $uploaded = $env{'course.'.$env{'request.course.id'}.'.uploadedsyllabus'};              my $uploaded = $env{'course.'.$env{'request.course.id'}.'.uploadedsyllabus'};
             my $minimal =  $env{'course.'.$env{'request.course.id'}.'.minimalsyllabus'};              my $minimal =  $env{'course.'.$env{'request.course.id'}.'.minimalsyllabus'};
Line 2343  sub print_courseinfo { Line 2683  sub print_courseinfo {
             }              }
             $datatable .= $showreqd;              $datatable .= $showreqd;
         } else {          } else {
             $datatable .= &Apache::lonhtmlcommon::textbox($item,$settings->{$item},$items{$item}{size});              $datatable .= &Apache::lonhtmlcommon::textbox($item,$settings->{$item},$items{$item}{size},$disabled);
         }          }
         $datatable .= &item_table_row_end();          $datatable .= &item_table_row_end();
     }      }
Line 2430  sub assign_course_categories { Line 2770  sub assign_course_categories {
         } else {          } else {
             $alert = &mt("Use 'Save' in the main window to save course categories");              $alert = &mt("Use 'Save' in the main window to save course categories");
         }          }
           &js_escape(\$alert);
         $catwin_js = <<ENDSCRIPT;          $catwin_js = <<ENDSCRIPT;
 <script type="text/javascript">  <script type="text/javascript">
   
Line 2523  sub display_loncaparev_constraints { Line 2864  sub display_loncaparev_constraints {
                               $Apache::lonrelrequtils::checkcrstypes{$crstype}).'</h4>';                                $Apache::lonrelrequtils::checkcrstypes{$crstype}).'</h4>';
     }      }
     my (%fromparam,%rowspan,%bymap,%byresource,@scopeorder,%toshow,%allmaps,      my (%fromparam,%rowspan,%bymap,%byresource,@scopeorder,%toshow,%allmaps,
         %byresponsetype,%bysubmission,%fromblocks);          %byresponsetype,%bysubmission,%fromblocks,%bycrsrestype);
     @scopeorder = ('all','section/group','user');      @scopeorder = ('all','section/group','user');
     my $now = time;      my $now = time;
     my $resourcedata = &Apache::lonparmset::readdata($cnum,$cdom);      my $resourcedata = &Apache::lonparmset::readdata($cnum,$cdom);
Line 2556  sub display_loncaparev_constraints { Line 2897  sub display_loncaparev_constraints {
                         if (grep(/^\Q$value\E$/,@{$Apache::lonrelrequtils::checkparms{$item}})) {                          if (grep(/^\Q$value\E$/,@{$Apache::lonrelrequtils::checkparms{$item}})) {
                             my $stdtype = &Apache::lonparmset::standard_parameter_types($item);                              my $stdtype = &Apache::lonparmset::standard_parameter_types($item);
                             $found{$item}{'valname'} = &get_param_description($stdtype,$value);                              $found{$item}{'valname'} = &get_param_description($stdtype,$value);
                             $found{$item}{'rev'} = $Apache::lonnet::needsrelease{'parameter:'.$item.':'.$value.':'};                              $found{$item}{'rev'} = $Apache::lonnet::needsrelease{'parameter:'.$item.':'.$value.'::'};
                         }                          }
                     }                      }
                 }                  }
             }              }
             foreach my $item (keys(%Apache::lonrelrequtils::checkparmsmatch)) {              foreach my $item (keys(%Apache::lonrelrequtils::checkparmvalsmatch)) {
                 if (ref($Apache::lonrelrequtils::checkparmsmatch{$item}) eq 'ARRAY') {                  if (ref($Apache::lonrelrequtils::checkparmvalsmatch{$item}) eq 'ARRAY') {
                     my $value = $resourcedata->{$key};                      my $value = $resourcedata->{$key};
                     foreach my $valuematch (@{$Apache::lonrelrequtils::checkparmsmatch{$item}}) {                      foreach my $valuematch (@{$Apache::lonrelrequtils::checkparmvalsmatch{$item}}) {
                         if ($value =~ /$valuematch/) {                          if ($value =~ /$valuematch/) {
                             my $stdtype = &Apache::lonparmset::standard_parameter_types($item);                              my $stdtype = &Apache::lonparmset::standard_parameter_types($item);
                             $found{$item}{'valname'} = &get_param_description($stdtype,$value,1);                               $found{$item}{'valname'} = &get_param_description($stdtype,$value,1);
                             $found{$item}{'rev'} =                               $found{$item}{'rev'} = 
                                 $Apache::lonnet::needsrelease{'parameter:'.$item.'::'.$valuematch};                                  $Apache::lonnet::needsrelease{'parameter:'.$item.'::'.$valuematch.':'};
                             last;                              last;
                         }                          }
                     }                      }
                 }                  }
             }              }
               foreach my $item (keys(%Apache::lonrelrequtils::checkparmnamesmatch)) {
                   my $regexp;
                   if ($item eq 'maplevelrecurse') {
                       $regexp = '\.(?:sequence|page)___\(rec\)\.';
                   }
                   if ($regexp ne '') {
                       if ($key =~ /$regexp.*\.(\w+)$/) {
                           my $name = $1;
                           my $value = $resourcedata->{$key};
                           if ($name eq 'type') { 
                               last unless (($value eq 'problem') || ($value eq 'practice') || ($value eq 'exam') ||
                                            ($value eq 'survey') || ($value eq 'surveycred') || ($value eq 'anonsurvey') || 
                                            ($value eq 'anonsurveycred') || ($value eq 'randomizetry') || ($value eq 'library'));
                           }
                           my $stdtype = &Apache::lonparmset::standard_parameter_types($name);
                           $found{$name}{'valname'} = &get_param_description($stdtype,$value);
                           $found{$name}{'extra'} = &mt('Recursive into sub-folders');
                           $found{$name}{'rev'} =
                               $Apache::lonnet::needsrelease{'parameter::::'.$item};
                       }
                   }
               }
             foreach my $item (keys(%found)) {              foreach my $item (keys(%found)) {
                 my $stdname = &Apache::lonparmset::standard_parameter_names($item);                  my $stdname = &Apache::lonparmset::standard_parameter_names($item);
                 my $rev = $found{$item}{'rev'};                  my $rev = $found{$item}{'rev'};
                 my $valname = $found{$item}{'valname'};                  my $valname = $found{$item}{'valname'};
                   my $extra = $found{$item}{'extra'};
                 my ($middle,$scope,$which,$level,$map,$resource);                    my ($middle,$scope,$which,$level,$map,$resource);  
                 my $start = $cid.'.';                  my $start = $cid.'.';
                 if ($key =~ /^\Q$start\E(\[useropt\:($match_username\:$match_domain)\]\.)/) {                  if ($key =~ /^\Q$start\E(\[useropt\:($match_username\:$match_domain)\]\.)/) {
Line 2593  sub display_loncaparev_constraints { Line 2957  sub display_loncaparev_constraints {
                     $scope = 'all';                      $scope = 'all';
                 }                  }
                 my $what="$stdname=$valname";                  my $what="$stdname=$valname";
                   if ($extra) {
                       $what .= "<br/>$extra<br />";
                   }
                 if ($key =~ /^\Q$start$middle\E\w+\.\Q$item\E$/) {                  if ($key =~ /^\Q$start$middle\E\w+\.\Q$item\E$/) {
                     $level = 'general';                      $level = 'general';
                     if ($scope eq 'all') {                      if ($scope eq 'all') {
Line 2613  sub display_loncaparev_constraints { Line 2980  sub display_loncaparev_constraints {
                         }                          }
                     }                      }
                     $rowspan{$rev} ++;                      $rowspan{$rev} ++;
                 } elsif ($key =~ /^\Q$start$middle\E(.+)___\(all\).\w+\.\Q$item\E$/) {                  } elsif ($key =~ /^\Q$start$middle\E(.+)___\((all|rec)\).\w+\.\Q$item\E$/) {
                     $level = 'folder';                      $level = 'folder';
                     $map = $1;                      $map = $1;
                     if ($scope eq 'all') {                      if ($scope eq 'all') {
Line 2768  sub display_loncaparev_constraints { Line 3135  sub display_loncaparev_constraints {
   
     if (defined($navmap)) {      if (defined($navmap)) {
         my %anonsubms=&Apache::lonnet::dump('nohist_anonsurveys',$cdom,$cnum);          my %anonsubms=&Apache::lonnet::dump('nohist_anonsurveys',$cdom,$cnum);
         my $rev_anonsurv=$Apache::lonnet::needsrelease{'parameter:type:anonsurvey'};          my $rev_anonsurv=$Apache::lonnet::needsrelease{'parameter:type:anonsurvey::'};
         my %randtrysubms=&Apache::lonnet::dump('nohist_randomizetry',$cdom,$cnum);          my %randtrysubms=&Apache::lonnet::dump('nohist_randomizetry',$cdom,$cnum);
         my $rev_randtry=$Apache::lonnet::needsrelease{'parameter:type:randomizetry'};          my $rev_randtry=$Apache::lonnet::needsrelease{'parameter:type:randomizetry::'};
           my $rev_exttool=$Apache::lonnet::needsrelease{'course:courserestype:exttool'};
         my $stdtype=&Apache::lonparmset::standard_parameter_types('type');          my $stdtype=&Apache::lonparmset::standard_parameter_types('type');
         my $stdname=&Apache::lonparmset::standard_parameter_names('type');          my $stdname=&Apache::lonparmset::standard_parameter_names('type');
         my $valanon=&get_param_description($stdtype,'anonsurvey');          my $valanon=&get_param_description($stdtype,'anonsurvey');
         my $valrandtry=&get_param_description($stdtype,'randomizetry');          my $valrandtry=&get_param_description($stdtype,'randomizetry');
         my %checkedrev;          my %checkedrev;
         foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_problem() },1,0)) {          foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_problem() || $_[0]->is_tool() },1,0)) {
             my @parts = @{$res->parts()};              my @parts = @{$res->parts()};
             my $symb = $res->symb();              my $symb = $res->symb();
             my $enclosing_map = &Apache::lonnet::declutter($res->enclosing_map_src());              my $enclosing_map = &Apache::lonnet::declutter($res->enclosing_map_src());
               if ($res->is_tool()) {
                   my $rev = $rev_exttool;
                   $bycrsrestype{$symb}{$rev} = &mt('External Tool');
                   $allmaps{$enclosing_map} = 1;
                   next;
               }
             foreach my $part (@parts) {              foreach my $part (@parts) {
                 if (exists($anonsubms{$symb."\0".$part})) {                  if (exists($anonsubms{$symb."\0".$part})) {
                     my $rev = $rev_anonsurv;                      my $rev = $rev_anonsurv;
Line 2867  sub display_loncaparev_constraints { Line 3241  sub display_loncaparev_constraints {
             }              }
         }          }
     }      }
       my $suppmap = 'supplemental.sequence';
       my ($suppcount,$supptools,$errors) = (0,0,0);
       ($suppcount,$supptools,$errors) = &Apache::loncommon::recurse_supplemental($cnum,$cdom,
                                                         $suppmap,$suppcount,$supptools,$errors);
     my $mapres_header = '<h4>'.      my $mapres_header = '<h4>'.
                         &mt('Requirements for specific folders or resources').                          &mt('Requirements for specific folders or resources').
                         '</h4>';                          '</h4>';
Line 2881  sub display_loncaparev_constraints { Line 3259  sub display_loncaparev_constraints {
     $r->print($start_page.$top_header);      $r->print($start_page.$top_header);
     if ($output) {      if ($output) {
         $r->print($output);          $r->print($output);
         if (defined($navmap)) {          if (defined($navmap) || $supptools) {
             &show_contents_view($r,$navmap,$cid,\%toshow,\%bymap,\%byresource,\%bysubmission,              &show_contents_view($r,$navmap,$cid,\%toshow,\%bymap,\%byresource,\%bysubmission,
                                 \%byresponsetype,\@scopeorder,\%lt);                                  \%byresponsetype,\%bycrsrestype,\@scopeorder,\%lt,$supptools);
         }          }
         $r->print('<br /><br />');           $r->print('<br /><br />'); 
     } else {      } else {
Line 2901  sub display_loncaparev_constraints { Line 3279  sub display_loncaparev_constraints {
   
 sub show_contents_view {  sub show_contents_view {
     my ($r,$navmap,$cid,$toshow,$bymap,$byresource,$bysubmission,$byresponsetype,      my ($r,$navmap,$cid,$toshow,$bymap,$byresource,$bysubmission,$byresponsetype,
         $scopeorder,$lt) = @_;          $bycrsrestype,$scopeorder,$lt,$supptools) = @_;
     if ((keys(%{$toshow}) > 0) || (keys(%{$byresource}) > 0) ||       my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons");
         (keys(%{$bysubmission}) > 0) || (keys(%{$byresponsetype}) > 0)) {      my $whitespace = '<img src="'.$location.'/whitespace_21.gif" alt="" />';
         my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons");      my $showmaincontent;
         my $whitespace = '<img src="'.$location.'/whitespace_21.gif" alt="" />';      if ((ref($navmap)) &&
         my $icon =  '<img src="'.$location.'/navmap.folder.open.gif" alt="" />';          ((keys(%{$toshow}) > 0) || (keys(%{$byresource}) > 0) ||
            (keys(%{$bysubmission}) > 0) || (keys(%{$byresponsetype}) > 0) ||
            (keys(%{$bycrsrestype}) > 0))) {
           $showmaincontent = 1;
       }
       if ($showmaincontent || $supptools) {
           $r->print(&Apache::loncommon::start_data_table());
       }
       if ($showmaincontent) {
           my $icon = '<img src="'.$location.'/navmap.folder.open.gif" alt="" />';
         my $topmap = $env{'course.'.$cid.'.url'};          my $topmap = $env{'course.'.$cid.'.url'};
         $r->print(&Apache::loncommon::start_data_table().          $r->print(&Apache::loncommon::start_data_table_header_row().
                   &Apache::loncommon::start_data_table_header_row().  
                   '<th>'.&mt('Location').'</th><th>'.&mt('Release').'</th>'.                    '<th>'.&mt('Location').'</th><th>'.&mt('Release').'</th>'.
                   '<th>'.&mt('Attribute/Setting').'</th>'.                    '<th>'.&mt('Attribute/Setting').'</th>'.
                   &Apache::loncommon::end_data_table_header_row().                    &Apache::loncommon::end_data_table_header_row().
                   &Apache::loncommon::start_data_table_row().                    &Apache::loncommon::start_data_table_row().
                   '<td>&nbsp;'.$icon.'&nbsp;'.&mt('Main Content').'</td>');                    '<td>&nbsp;'.$icon.'&nbsp;'.&mt('Main Content').'</td>');
                   &releases_by_map($r,$bymap,$topmap,$scopeorder,$lt);          &releases_by_map($r,$bymap,$topmap,$scopeorder,$lt);
                   $r->print(&Apache::loncommon::end_data_table_row());          $r->print(&Apache::loncommon::end_data_table_row());
         my $it=$navmap->getIterator(undef,undef,undef,1,1,undef);          my $it=$navmap->getIterator(undef,undef,undef,1,1,undef);
         my $curRes;          my $curRes;
         my $depth = 0;          my $depth = 0;
Line 2967  sub show_contents_view { Line 3353  sub show_contents_view {
                     if (ref($byresponsetype->{$symb}) eq 'HASH') {                      if (ref($byresponsetype->{$symb}) eq 'HASH') {
                         $rowspan += scalar(keys(%{$byresponsetype->{$symb}}));                          $rowspan += scalar(keys(%{$byresponsetype->{$symb}}));
                     }                      }
                       if (ref($bycrsrestype->{$symb}) eq 'HASH') {
                           $rowspan += scalar(keys(%{$bycrsrestype->{$symb}}));
                       }
                     next if (!$rowspan);                      next if (!$rowspan);
                     $icon = '<img class="LC_contentImage" src="'.$location.'/problem.gif" alt="'.                      $icon = '<img class="LC_contentImage" src="'.$location.'/problem.gif" alt="'.
                             &mt('Problem').'" />';                              &mt('Problem').'" />';
Line 3031  sub show_contents_view { Line 3420  sub show_contents_view {
                             $r->print('</td>');                              $r->print('</td>');
                         }                          }
                         $r->print(&Apache::loncommon::end_data_table_row());                          $r->print(&Apache::loncommon::end_data_table_row());
                           $newrow = 1;
                       }
                       if (ref($bycrsrestype->{$symb}) eq 'HASH') {
                           foreach my $rev (sort(keys(%{$bycrsrestype->{$symb}}))) {
                               if ($newrow) {
                                   $r->print(&Apache::loncommon::continue_data_table_row());
                               }
                               $r->print('<td>'.$rev.'</td><td>'.$bycrsrestype->{$symb}{$rev}.'</td>');
                           }
                           $r->print(&Apache::loncommon::end_data_table_row());
                     }                      }
                 }                  }
             }              }
         }          }
       }
       if ($supptools) {
           my $icon = '<img src="'.$location.'/navmap.folder.open.gif" alt="" />';
           $r->print(&Apache::loncommon::start_data_table_header_row().
                     '<th>'.&mt('Location').'</th><th>'.&mt('Release').'</th>'.
                     '<th>'.&mt('Resource Type').'</th>'.
                     &Apache::loncommon::end_data_table_header_row().
                     &Apache::loncommon::start_data_table_row().
                     '<td>&nbsp;'.$icon.'&nbsp;'.&mt('Supplemental Content').'</td>'.
                     '<td valign="middle">'.
                     $Apache::lonrelrequtils::exttool{'major'}.'.'.
                     $Apache::lonrelrequtils::exttool{'minor'}.
                     '</td><td>'.&mt('[quant,_1,External Tool,External Tools]',
                                     $supptools).'</td>'.
                     &Apache::loncommon::end_data_table_row());
       }
       if ($showmaincontent || $supptools) {
         $r->print(&Apache::loncommon::end_data_table());          $r->print(&Apache::loncommon::end_data_table());
     }      }
     return;      return;
Line 3043  sub show_contents_view { Line 3459  sub show_contents_view {
 sub releases_by_map {  sub releases_by_map {
     my ($r,$bymap,$url,$scopeorder,$lt) = @_;      my ($r,$bymap,$url,$scopeorder,$lt) = @_;
     return unless ((ref($bymap) eq 'HASH') && (ref($scopeorder) eq 'ARRAY'));      return unless ((ref($bymap) eq 'HASH') && (ref($scopeorder) eq 'ARRAY'));
       my $newrow = 0; 
     if (ref($bymap->{$url}) eq 'HASH') {      if (ref($bymap->{$url}) eq 'HASH') {
         foreach my $rev (sort(keys(%{$bymap->{$url}}))) {          foreach my $rev (sort(keys(%{$bymap->{$url}}))) {
               if ($newrow) {
                   $r->print(&Apache::loncommon::end_data_table_row().
                             &Apache::loncommon::continue_data_table_row());
               }
             $r->print('<td valign="middle">'.$rev.'</td><td>');              $r->print('<td valign="middle">'.$rev.'</td><td>');
             if (ref($bymap->{$url}{$rev}) eq 'HASH') {              if (ref($bymap->{$url}{$rev}) eq 'HASH') {
                 $r->print('<table border="0">');                  $r->print('<table border="0">');
Line 3066  sub releases_by_map { Line 3487  sub releases_by_map {
                 $r->print('</table>');                  $r->print('</table>');
             }              }
             $r->print('</td>');              $r->print('</td>');
               $newrow = 1;
         }          }
     } else {      } else {
         $r->print('<td colspan="2">&nbsp;</td>');          $r->print('<td colspan="2">&nbsp;</td>');
Line 3076  sub releases_by_map { Line 3498  sub releases_by_map {
 sub get_param_description {  sub get_param_description {
     my ($stdtype,$value,$regexp) = @_;      my ($stdtype,$value,$regexp) = @_;
     my ($name,$parammatches,$paramstrings,@possibles);      my ($name,$parammatches,$paramstrings,@possibles);
     $paramstrings = &Apache::lonparmset::standard_string_options($stdtype);      if ($stdtype =~ /^string/) {
           $paramstrings = &Apache::lonparmset::standard_string_options($stdtype);
       } elsif ($stdtype eq 'date_interval') {
           $paramstrings = &Apache::lonparmset::standard_interval_options($stdtype);
       }
     if ($regexp) {      if ($regexp) {
         $parammatches = &Apache::lonparmset::standard_string_matches($stdtype);          if ($stdtype =~ /^string/) {
               $parammatches = &Apache::lonparmset::standard_string_matches($stdtype);
           } elsif ($stdtype eq 'date_interval') {
               $parammatches = &Apache::lonparmset::standard_interval_matches($stdtype);
           }
         if (ref($parammatches) eq 'ARRAY') {          if (ref($parammatches) eq 'ARRAY') {
             @possibles = @{$parammatches};              @possibles = @{$parammatches};
         } else {          } else {
Line 3091  sub get_param_description { Line 3521  sub get_param_description {
         if (ref($paramstrings) eq 'ARRAY') {          if (ref($paramstrings) eq 'ARRAY') {
             @possibles = @{$paramstrings};              @possibles = @{$paramstrings};
         } else {          } else {
               if (($stdtype eq 'date_start') || ($stdtype eq 'date_end')) {
                   if ($name == 0) {
                       $name = &mt('Never');
                   } elsif (($name ne '') && ($name !~ /\D/)) {
                       $name = &Apache::lonlocal::locallocaltime($name);
                   }
               }
             return $name;              return $name;
         }          }
     }      }
Line 3156  sub show_autocoowners { Line 3593  sub show_autocoowners {
 }  }
   
 sub coowner_invitations {  sub coowner_invitations {
     my ($cnum,$cdom,@currcoown) = @_;      my ($cnum,$cdom,$currcoownref,$noedit) = @_;
     my ($output,@pendingcoown,@othercoords);      my ($output,@pendingcoown,@othercoords,@currcoown);
     my $pendingcoowners =      my $pendingcoowners =
         $env{'course.'.$env{'request.course.id'}.'.internal.pendingco-owners'};          $env{'course.'.$env{'request.course.id'}.'.internal.pendingco-owners'};
     if ($pendingcoowners) {      if ($pendingcoowners) {
         @pendingcoown = split(',',$pendingcoowners);          @pendingcoown = split(',',$pendingcoowners);
     }      }
       if (ref($currcoownref) eq 'ARRAY') {
           @currcoown == @{$currcoownref};
       }
       my $disabled;
       if ($noedit) {
           $disabled = ' disabled="disabled"';
       }
     my $ccrole = 'cc';      my $ccrole = 'cc';
     my %ccroles = &Apache::lonnet::get_my_roles($cnum,$cdom,undef,undef,[$ccrole]);      my %ccroles = &Apache::lonnet::get_my_roles($cnum,$cdom,undef,undef,[$ccrole]);
     foreach my $key (sort(keys(%ccroles))) {      foreach my $key (sort(keys(%ccroles))) {
Line 3180  sub coowner_invitations { Line 3624  sub coowner_invitations {
                           '<td><i>'.&mt('Current co-owners').'</i></td><td>';                            '<td><i>'.&mt('Current co-owners').'</i></td><td>';
             foreach my $person (@currcoown) {              foreach my $person (@currcoown) {
                 my ($co_uname,$co_dom) = split(':',$person);                  my ($co_uname,$co_dom) = split(':',$person);
                 $output .= '<span class="LC_nobreak"><label><input type="checkbox" name="coowners" checked="checked" value="'.$person.'" />'.&Apache::loncommon::plainname($co_uname,$co_dom).'</label></span>'.('&nbsp;'x2).' ';                  $output .= '<span class="LC_nobreak"><label><input type="checkbox" name="coowners" checked="checked" value="'.$person.'"'.$disabled.' />'.&Apache::loncommon::plainname($co_uname,$co_dom).'</label></span>'.('&nbsp;'x2).' ';
             }              }
             $output .= '</td>'.              $output .= '</td>'.
                           &Apache::loncommon::end_data_table_row();                            &Apache::loncommon::end_data_table_row();
Line 3190  sub coowner_invitations { Line 3634  sub coowner_invitations {
                           '<td><i>'.&mt('Invited as co-owners [_1](agreement pending)','<br />').'</i></td><td>';                            '<td><i>'.&mt('Invited as co-owners [_1](agreement pending)','<br />').'</i></td><td>';
             foreach my $person (@pendingcoown) {              foreach my $person (@pendingcoown) {
                 my ($co_uname,$co_dom) = split(':',$person);                  my ($co_uname,$co_dom) = split(':',$person);
                 $output .= '<span class="LC_nobreak"><label><input type="checkbox" name="pendingcoowners" checked="checked" value="'.$person.'" />'.&Apache::loncommon::plainname($co_uname,$co_dom).'</label></span>'.('&nbsp;'x2).' ';                  $output .= '<span class="LC_nobreak"><label><input type="checkbox" name="pendingcoowners" checked="checked" value="'.$person.'"'.$disabled.' />'.&Apache::loncommon::plainname($co_uname,$co_dom).'</label></span>'.('&nbsp;'x2).' ';
             }              }
             $output .= '</td>'.              $output .= '</td>'.
                        &Apache::loncommon::end_data_table_row();                         &Apache::loncommon::end_data_table_row();
Line 3200  sub coowner_invitations { Line 3644  sub coowner_invitations {
                           '<td><i>'.&mt('Invite other Coordinators [_1]to become co-owners','<br />').'</i></td><td>';                            '<td><i>'.&mt('Invite other Coordinators [_1]to become co-owners','<br />').'</i></td><td>';
             foreach my $person (@othercoords) {              foreach my $person (@othercoords) {
                 my ($co_uname,$co_dom) = split(':',$person);                  my ($co_uname,$co_dom) = split(':',$person);
                 $output .= '<span class="LC_nobreak"><label><input type="checkbox" name="invitecoowners" value="'.$person.'" />'.&Apache::loncommon::plainname($co_uname,$co_dom).'</label></span>'.('&nbsp;'x2).' ';                  $output .= '<span class="LC_nobreak"><label><input type="checkbox" name="invitecoowners" value="'.$person.'"'.$disabled.' />'.&Apache::loncommon::plainname($co_uname,$co_dom).'</label></span>'.('&nbsp;'x2).' ';
             }              }
             $output .= '</td>'.              $output .= '</td>'.
                           &Apache::loncommon::end_data_table_row();                            &Apache::loncommon::end_data_table_row();
Line 3213  sub coowner_invitations { Line 3657  sub coowner_invitations {
 }  }
   
 sub manage_coownership  {  sub manage_coownership  {
     my ($cnum,$cdom,@currcoown) = @_;      my ($cnum,$cdom,$currcoownref,$noedit) = @_;
     my (@pendingcoown);      my (@pendingcoown,@currcoown);
     my $pendingcoowners =      my $pendingcoowners =
         $env{'course.'.$env{'request.course.id'}.'.internal.pendingco-owners'};          $env{'course.'.$env{'request.course.id'}.'.internal.pendingco-owners'};
     if ($pendingcoowners) {      if ($pendingcoowners) {
         @pendingcoown = split(',',$pendingcoowners);          @pendingcoown = split(',',$pendingcoowners);
     }      }
       if (ref($currcoownref) eq 'ARRAY') {
           @currcoown == @{$currcoownref};
       }
       my $disabled;
       if ($noedit) {
           $disabled = ' disabled="disabled"';
       }
     my ($is_coowner,$is_pending,$output);      my ($is_coowner,$is_pending,$output);
     my $uname = $env{'user.name'};      my $uname = $env{'user.name'};
     my $udom = $env{'user.domain'};      my $udom = $env{'user.domain'};
Line 3249  sub manage_coownership  { Line 3700  sub manage_coownership  {
         }          }
         $output .= '<span class="LC_nobreak">';          $output .= '<span class="LC_nobreak">';
         if ($is_coowner) {          if ($is_coowner) {
             $output .= &mt('You are currently a co-owner:').'&nbsp;<label><input type="checkbox" name="remove_coowoner" value="'.$uname.':'.$udom.'" />'.&mt('Discontinue?').'</label>';              $output .= &mt('You are currently a co-owner:').'&nbsp;<label><input type="checkbox" name="remove_coowner" value="'.$uname.':'.$udom.'" />'.&mt('Discontinue?').'</label>';
         } else {          } else {
             $output .= &mt('The course owner has invited you to become a co-owner:').'&nbsp;<label><input type="radio" name="pending_coowoner" value="accept" />'.&mt('Accept?').'</label>'.('&nbsp;'x2).              $output .= &mt('The course owner has invited you to become a co-owner:').'&nbsp;<label><input type="radio" name="pending_coowner" value="accept"'.$disabled.' />'.&mt('Accept?').'</label>'.('&nbsp;'x2).
                        '<label><input type="radio" name=pending_coowoner" value="decline" />'.&mt('Decline?').'</label>';                         '<label><input type="radio" name=pending_coowner" value="decline"'.$disabled.' />'.&mt('Decline?').'</label>';
         }          }
         $output .= '</span>';          $output .= '</span>';
         if (@currcoown) {          if (@currcoown) {
Line 3266  sub manage_coownership  { Line 3717  sub manage_coownership  {
 }  }
   
 sub print_localization {  sub print_localization {
     my ($cdom,$settings,$ordered,$itemtext,$rowtotal) = @_;      my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$noedit) = @_;
     unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {      unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
         return;          return;
     }      }
Line 3285  sub print_localization { Line 3736  sub print_localization {
                          input => 'selectbox',                           input => 'selectbox',
                        },                         },
     );      );
     my $datatable;      my ($datatable,$disabled);
     my $count = 0;      my $count = 0;
       if ($noedit) {
           $disabled = ' disabled="disabled"';
       }
     foreach my $item (@{$ordered}) {      foreach my $item (@{$ordered}) {
         $count ++;          $count ++;
         my $colspan;          my $colspan;
         unless ($item eq 'languages') {          unless ($item eq 'languages') {
             $colspan = 2;               $colspan = 2;
         }          }
         $datatable .= &item_table_row_start($items{$item}{text},$count,undef,$colspan);          $datatable .= &item_table_row_start($items{$item}{text},$count,undef,$colspan);
         if ($item eq 'timezone') {          if ($item eq 'timezone') {
Line 3299  sub print_localization { Line 3753  sub print_localization {
             my $timezone = &Apache::lonlocal::gettimezone();              my $timezone = &Apache::lonlocal::gettimezone();
             $datatable .=               $datatable .= 
                 &Apache::loncommon::select_timezone($item,$timezone,undef,                  &Apache::loncommon::select_timezone($item,$timezone,undef,
                                                     $includeempty);                                                      $includeempty,$disabled);
         } elsif ($item eq 'datelocale') {          } elsif ($item eq 'datelocale') {
             my $includeempty = 1;              my $includeempty = 1;
             my $locale_obj = &Apache::lonlocal::getdatelocale();              my $locale_obj = &Apache::lonlocal::getdatelocale();
Line 3309  sub print_localization { Line 3763  sub print_localization {
             }              }
             $datatable .=               $datatable .= 
                 &Apache::loncommon::select_datelocale($item,$currdatelocale,                  &Apache::loncommon::select_datelocale($item,$currdatelocale,
                                                       undef,$includeempty);                                                        undef,$includeempty,$disabled);
         } else {          } else {
             if ($settings->{$item} eq '') {              if ($settings->{$item} eq '') {
                 $datatable .= '</td><td align="right">'.                  unless ($noedit) { 
                     &Apache::loncommon::select_language('languages_0','',1);                      $datatable .= '</td><td align="right">'.
                           &Apache::loncommon::select_language('languages_0','',1);
                   }
             } else {              } else {
                 my $num = 0;                  my $num = 0;
                 my @languages = split(/\s*[,;:]\s*/,$settings->{$item});                  my @languages = split(/\s*[,;:]\s*/,$settings->{$item});
Line 3333  sub print_localization { Line 3789  sub print_localization {
                             '</b><input type="hidden" name="languages_'.$num.                              '</b><input type="hidden" name="languages_'.$num.
                             '" value="'.$lang.'" /></span><br />'.                              '" value="'.$lang.'" /></span><br />'.
                             '<span class="LC_nobreak"><label><input type="checkbox" '.                              '<span class="LC_nobreak"><label><input type="checkbox" '.
                             'name="languages_delete" value="'.$num.'" />'.                              'name="languages_delete" value="'.$num.'"'.$disabled.' />'.
                             &mt('Delete').'</label></span></td>'.                              &mt('Delete').'</label></span></td>'.
                             &Apache::loncommon::end_data_table_row();                              &Apache::loncommon::end_data_table_row();
                             $num ++;                              $num ++;
                     }                      }
                 }                  }
                 $datatable .= &Apache::loncommon::start_data_table_row().                  unless ($noedit) {
                       $datatable .=
                                 &Apache::loncommon::start_data_table_row().
                               '<td align="left"><span class="LC_nobreak">'.                                '<td align="left"><span class="LC_nobreak">'.
                               &mt('Additional language:'). '</span><br />'.                                &mt('Additional language:'). '</span><br />'.
                               &Apache::loncommon::select_language('languages_'.$num,'',1).                                &Apache::loncommon::select_language('languages_'.$num,'',1).
                               '<input type="hidden" name="languages_total" value="'.$num.'" />'.                                '<input type="hidden" name="languages_total" value="'.$num.'" />'.
                               '</td>'.&Apache::loncommon::end_data_table_row().                                '</td>'.&Apache::loncommon::end_data_table_row();
                               &Apache::loncommon::end_data_table().'<br />';                   }
                    $datatable .= &Apache::loncommon::end_data_table().'<br />';
             }              }
         }          }
         $datatable .= &item_table_row_end();          $datatable .= &item_table_row_end();
Line 3366  sub get_lang_choices { Line 3825  sub get_lang_choices {
 }  }
   
 sub print_feedback {  sub print_feedback {
     my ($position,$cdom,$settings,$ordered,$itemtext,$rowtotal) = @_;      my ($position,$cdom,$settings,$ordered,$itemtext,$rowtotal,$noedit) = @_;
     unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {      unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
         return;          return;
     }      }
Line 3401  sub print_feedback { Line 3860  sub print_feedback {
                                            del      => 'Delete?',                                             del      => 'Delete?',
                                            sec      => 'Sections:',                                             sec      => 'Sections:',
                                          );                                           );
       my $disabled;
       if ($noedit) {
           $disabled = ' disabled="disabled"';
       }
     foreach my $item (@{$ordered}) {      foreach my $item (@{$ordered}) {
         $count ++;          $count ++;
         if ($position eq 'top') {          if ($position eq 'top') {
Line 3413  sub print_feedback { Line 3875  sub print_feedback {
             my $includeempty = 0;              my $includeempty = 0;
             $datatable .=  '</td><td align="right">'.              $datatable .=  '</td><td align="right">'.
                            &user_table($cdom,$item,\@sections,                             &user_table($cdom,$item,\@sections,
                                       $settings->{$item},\%lt);                                        $settings->{$item},\%lt,$noedit);
         } else {          } else {
             $datatable .= &Apache::lonhtmlcommon::textbox($item.'.text',              $datatable .= &Apache::lonhtmlcommon::textbox($item.'.text',
                               $settings->{$item.'.text'},$items{$item}{size});                                  $settings->{$item.'.text'},$items{$item}{size},$disabled);  
         }          }
         $datatable .= &item_table_row_end();          $datatable .= &item_table_row_end();
     }      }
Line 3425  sub print_feedback { Line 3887  sub print_feedback {
 }  }
   
 sub user_table {  sub user_table {
     my ($cdom,$item,$sections,$currvalue,$lt) = @_;      my ($cdom,$item,$sections,$currvalue,$lt,$noedit) = @_;
     my $output;      my $output;
     if ($currvalue eq '') {      if ($currvalue eq '') {
         $output .= &select_recipient($item,'0',$cdom,$sections);          unless ($noedit) {
               $output .= &select_recipient($item,'0',$cdom,$sections);
           }
     } else {      } else {
         my $num = 0;          my $num = 0;
         my @curr = split(/,/,$currvalue);          my @curr = split(/,/,$currvalue);
         $output .= '<table class="LC_data_table">';          $output .= '<table class="LC_data_table">';
         my ($currusers);          my ($currusers);
           my $disabled;
           if ($noedit) {
               $disabled = ' disabled="disabled"';
           }
         foreach my $val (@curr) {          foreach my $val (@curr) {
             next if ($val eq '');              next if ($val eq '');
             my ($uname,$udom,$seclist) = ($val =~ /^($match_username):($match_domain)(\(?[^\)]*\)?)$/);              my ($uname,$udom,$seclist) = ($val =~ /^($match_username):($match_domain)(\(?[^\)]*\)?)$/);
Line 3445  sub user_table { Line 3913  sub user_table {
             $currusers .= '<tr>'.              $currusers .= '<tr>'.
                         '<td valign="top"><span class="LC_nobreak">'.                          '<td valign="top"><span class="LC_nobreak">'.
                         '<label><input type="checkbox" '.                          '<label><input type="checkbox" '.
                         'name="'.$item.'_delete" value="'.$num.'" />'.                          'name="'.$item.'_delete" value="'.$num.'"'.$disabled.' />'.
                         $lt->{'del'}.'</label>'.                          $lt->{'del'}.'</label>'.
                         '<input type="hidden" name="'.$item.'_user_'.                          '<input type="hidden" name="'.$item.'_user_'.
                         $num.'" value="'.$uname.':'.$udom.'" />'.('&nbsp;'x2).                          $num.'" value="'.$uname.':'.$udom.'" />'.('&nbsp;'x2).
Line 3456  sub user_table { Line 3924  sub user_table {
                 if (@{$sections}) {                  if (@{$sections}) {
                     $currusers.= ('&nbsp;'x3).$lt->{'sec'}.'&nbsp;'.                      $currusers.= ('&nbsp;'x3).$lt->{'sec'}.'&nbsp;'.
                                   &select_sections($item,$num,$sections,                                    &select_sections($item,$num,$sections,
                                   \@selsec);                                    \@selsec,$noedit);
                 }                  }
             }              }
             $currusers .= '</span></td></tr>';              $currusers .= '</span></td></tr>';
Line 3474  sub user_table { Line 3942  sub user_table {
                           '<table>'.$currusers.'</table></td>'.                            '<table>'.$currusers.'</table></td>'.
                           '</tr>';                            '</tr>';
         }          }
         $output .= '<tr>'.          unless ($noedit) {
               $output .= 
                     '<tr>'.
                   '<td align="left"><span class="LC_nobreak"><i>'.                    '<td align="left"><span class="LC_nobreak"><i>'.
                   $lt->{'add'}.'</i></span><br />'.                    $lt->{'add'}.'</i></span><br />'.
                   &select_recipient($item,$num,$cdom,$sections).                    &select_recipient($item,$num,$cdom,$sections).
                   '<input type="hidden" name="'.$item.'_total" value="'.$num.'" />'.                    '<input type="hidden" name="'.$item.'_total" value="'.$num.'" />'.
                   '</td></tr></table>';                    '</td></tr>';
           }
           $output .= '</table>';
     }      }
     return $output;      return $output;
 }  }
Line 3489  sub select_recipient { Line 3961  sub select_recipient {
     my $domform = &Apache::loncommon::select_dom_form($cdom,$item.'_udom_'.$num,$includeempty);      my $domform = &Apache::loncommon::select_dom_form($cdom,$item.'_udom_'.$num,$includeempty);
     my $selectlink =      my $selectlink =
         &Apache::loncommon::selectstudent_link('display',$item.'_uname_'.$num,          &Apache::loncommon::selectstudent_link('display',$item.'_uname_'.$num,
                                                $item.'_udom_'.$num,1);                                                 $item.'_udom_'.$num,'only');
     my $output =       my $output = 
         '<table><tr><td align="center">'.&mt('Username').'<br />'.          '<table><tr><td align="center">'.&mt('Username').'<br />'.
         '<input type="text" name="'.$item.'_uname_'.$num.'" value="" /></td>'.          '<input type="text" name="'.$item.'_uname_'.$num.'" value="" /></td>'.
Line 3506  sub select_recipient { Line 3978  sub select_recipient {
 }  }
   
 sub select_sections {  sub select_sections {
     my ($item,$num,$sections,$selected) = @_;      my ($item,$num,$sections,$selected,$noedit) = @_;
     my ($output,@currsecs,$allsec);      my ($output,@currsecs,$allsec,$disabled);
     if (ref($selected) eq 'ARRAY') {      if (ref($selected) eq 'ARRAY') {
         @currsecs = @{$selected};          @currsecs = @{$selected};
     }      }
     if (!@currsecs) {      if (!@currsecs) {
         $allsec = ' selected="selected"';          $allsec = ' selected="selected"';
     }      }
       if ($noedit) {
           $disabled = ' disabled="disabled"';
       }
     if (ref($sections) eq 'ARRAY') {      if (ref($sections) eq 'ARRAY') {
         if (@{$sections}) {          if (@{$sections}) {
             my $mult;              my $mult;
Line 3523  sub select_sections { Line 3998  sub select_sections {
                     $mult .= ' size="4"';                      $mult .= ' size="4"';
                 }                  }
             }              }
             $output = '<select name="'.$item.'_sections_'.$num.'"'.$mult.'>'.              $output = '<select name="'.$item.'_sections_'.$num.'"'.$mult.$disabled.'>'.
                       ' <option value=""'.$allsec.'>'.&mt('All').'</option>';                        ' <option value=""'.$allsec.'>'.&mt('All').'</option>';
             foreach my $sec (@{$sections}) {              foreach my $sec (@{$sections}) {
                 my $is_sel;                  my $is_sel;
Line 3539  sub select_sections { Line 4014  sub select_sections {
 }  }
   
 sub print_discussion {  sub print_discussion {
     my ($cdom,$settings,$ordered,$itemtext,$rowtotal) = @_;      my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$noedit) = @_;
     unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {      unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
         return;          return;
     }      }
Line 3569  sub print_discussion { Line 4044  sub print_discussion {
                            &mt('(specific user(s))'),                             &mt('(specific user(s))'),
                    input => 'checkbox',                     input => 'checkbox',
                  },                   },
   
           'pac.roles.denied' => {
                      text => '<span class="LC_nobreak"><b>'.&mt($itemtext->{'pac.roles.denied'}).'</b>'.
                              &Apache::loncommon::help_open_topic("Course_Disable_Anonymous_Discussion").'</span><br />'.
                              &mt('(role-based)'),
                      input => 'checkbox',
                    },
   
           'pac.users.denied'   => {
                      text => '<span class="LC_nobreak"><b>'.&mt($itemtext->{'pac.users.denied'}).'</b><br />'.
                              &mt('(specific user(s))'),
                      input => 'checkbox',
                    },
   
         'allow_limited_html_in_feedback' => {          'allow_limited_html_in_feedback' => {
                    text => '<b>'.&mt($itemtext->{'allow_limited_html_in_feedback'}).'</b>',                     text => '<b>'.&mt($itemtext->{'allow_limited_html_in_feedback'}).'</b>',
                    input => 'radio',                     input => 'radio',
Line 3605  sub print_discussion { Line 4094  sub print_discussion {
         $datatable .= &item_table_row_start($items{$item}{text},$count,undef,$colspan);          $datatable .= &item_table_row_start($items{$item}{text},$count,undef,$colspan);
         if ($item eq 'plc.roles.denied') {          if ($item eq 'plc.roles.denied') {
             $datatable .= '</td><td align="right">'.              $datatable .= '</td><td align="right">'.
                           '<table>'.&role_checkboxes($cdom,$cnum,$item,$settings).                            '<table>'.&role_checkboxes($cdom,$cnum,$item,$settings,undef,undef,$noedit).
                           '</table>';                            '</table>';
         } elsif ($item eq 'plc.users.denied') {          } elsif ($item eq 'plc.users.denied') {
             $datatable .=  '</td><td align="right">'.              $datatable .=  '</td><td align="right">'.
                            &user_table($cdom,$item,undef,                             &user_table($cdom,$item,undef,
                                       $settings->{$item},\%lt);                                        $settings->{$item},\%lt,$noedit);
         } elsif ($item eq 'pch.roles.denied') {          } elsif ($item eq 'pch.roles.denied') {
             $datatable .= '</td><td align="right">'.              $datatable .= '</td><td align="right">'.
                           '<table>'.&role_checkboxes($cdom,$cnum,$item,$settings).                            '<table>'.&role_checkboxes($cdom,$cnum,$item,$settings,undef,undef,$noedit).
                           '</table>';                            '</table>';
         } elsif ($item eq 'pch.users.denied') {          } elsif ($item eq 'pch.users.denied') {
             $datatable .= '</td><td align="right">'.              $datatable .= '</td><td align="right">'.
                           &user_table($cdom,$item,undef,                            &user_table($cdom,$item,undef,
                                       $settings->{$item},\%lt);                                        $settings->{$item},\%lt,$noedit);
           } elsif ($item eq 'pac.roles.denied') {
               $datatable .= '</td><td align="right">'.
                             '<table>'.&role_checkboxes($cdom,$cnum,$item,$settings,undef,undef,$noedit).
                             '</table>';
           } elsif ($item eq 'pac.users.denied') {
               $datatable .=  '</td><td align="right">'.
                              &user_table($cdom,$item,undef,
                                         $settings->{$item},\%lt,$noedit);
         } elsif ($item eq 'allow_limited_html_in_feedback') {          } elsif ($item eq 'allow_limited_html_in_feedback') {
             $datatable .= &yesno_radio($item,$settings);              $datatable .= &yesno_radio($item,$settings,undef,undef,undef,$noedit);
         } elsif ($item eq 'allow_discussion_post_editing') {          } elsif ($item eq 'allow_discussion_post_editing') {
             $datatable .= '</td><td align="right"><br />'.              $datatable .= '</td><td align="right"><br />'.
                           &Apache::loncommon::start_data_table().                            &Apache::loncommon::start_data_table().
Line 3628  sub print_discussion { Line 4125  sub print_discussion {
                           '<th align="left">'.&mt('Role').'</th><th>'.                            '<th align="left">'.&mt('Role').'</th><th>'.
                           &mt('Sections').'</th>'.                            &mt('Sections').'</th>'.
                           &Apache::loncommon::end_data_table_row().                            &Apache::loncommon::end_data_table_row().
                           &role_checkboxes($cdom,$cnum,$item,$settings,1).                            &role_checkboxes($cdom,$cnum,$item,$settings,1,undef,$noedit).
                           &Apache::loncommon::end_data_table().'<br />';                            &Apache::loncommon::end_data_table().'<br />';
         } elsif ($item eq 'discussion_post_fonts') {          } elsif ($item eq 'discussion_post_fonts') {
             $datatable .= '</td><td align="right"><br />'.              $datatable .= '</td><td align="right"><br />'.
Line 3640  sub print_discussion { Line 4137  sub print_discussion {
                           '<th align="center">'.&mt('font-style').'</th>'.                            '<th align="center">'.&mt('font-style').'</th>'.
                           '<th align="center">'.&mt('Other css').'</th>'.                             '<th align="center">'.&mt('Other css').'</th>'. 
                           &Apache::loncommon::end_data_table_row().                            &Apache::loncommon::end_data_table_row().
                           &set_discussion_fonts($cdom,$cnum,$item,$settings).                            &set_discussion_fonts($cdom,$cnum,$item,$settings,$noedit).
                           &Apache::loncommon::end_data_table().'<br />';                            &Apache::loncommon::end_data_table().'<br />';
         }          }
         $datatable .= &item_table_row_end();          $datatable .= &item_table_row_end();
Line 3650  sub print_discussion { Line 4147  sub print_discussion {
 }  }
   
 sub role_checkboxes {  sub role_checkboxes {
     my ($cdom,$cnum,$item,$settings,$showsections,$crstype) = @_;      my ($cdom,$cnum,$item,$settings,$showsections,$crstype,$noedit) = @_;
     my @roles = ('st','ad','ta','ep','in');      my @roles = ('st','ad','ta','ep','in');
     if ($crstype eq 'Community') {      if ($crstype eq 'Community') {
         push(@roles,'co');          push(@roles,'co');
Line 3688  sub role_checkboxes { Line 4185  sub role_checkboxes {
     }      }
     my $numinrow = 3;      my $numinrow = 3;
     my $count = 0;      my $count = 0;
       my $disabled;
       if ($noedit) {
           $disabled = ' disabled="disabled"';  
       }
     foreach my $role (@roles) {      foreach my $role (@roles) {
         my $checked = '';          my $checked = '';
         if (grep(/^\Q$role\E$/,@current)) {          if (grep(/^\Q$role\E$/,@current)) {
Line 3706  sub role_checkboxes { Line 4207  sub role_checkboxes {
             }              }
         }          }
         $output .= '<td align="left"><span class="LC_nobreak"><label><input type="checkbox" name="'.          $output .= '<td align="left"><span class="LC_nobreak"><label><input type="checkbox" name="'.
                    $item.'" value="'.$role.'"'.$checked.'/>&nbsp;'.                     $item.'" value="'.$role.'"'.$checked.$disabled.'/>&nbsp;'.
                    $plrole.'</label></span></td>';                     $plrole.'</label></span></td>';
         if ($showsections) {          if ($showsections) {
             $output .= '<td align="left">'.              $output .= '<td align="left">'.
                        &select_sections($item,$role,\@sections,$currsec{$role}).                         &select_sections($item,$role,\@sections,$currsec{$role},$noedit).
                        '</td></tr>';                         '</td></tr>';
         }          }
         $count ++;          $count ++;
Line 3738  sub role_checkboxes { Line 4239  sub role_checkboxes {
                 }                  }
             }              }
             $output .= '<td><span class="LC_nobreak"><label><input type="checkbox" name="'.              $output .= '<td><span class="LC_nobreak"><label><input type="checkbox" name="'.
                        $item.'" value="'.$value.'"'.$checked.' />&nbsp;'.$rolename.                         $item.'" value="'.$value.'"'.$checked.$disabled.' />&nbsp;'.$rolename.
                        '</label></span></td>';                         '</label></span></td>';
             if ($showsections) {              if ($showsections) {
                 $output .= '<td>'.                  $output .= '<td>'.
                            &select_sections($item,$role,\@sections,$currsec{$role}).                             &select_sections($item,$role,\@sections,$currsec{$role},$noedit).
                            '</td>'.&Apache::loncommon::end_data_table_row();                             '</td>'.&Apache::loncommon::end_data_table_row();
             }              }
             $total ++;              $total ++;
Line 3764  sub role_checkboxes { Line 4265  sub role_checkboxes {
 }  }
   
 sub set_discussion_fonts {  sub set_discussion_fonts {
     my ($cdom,$cnum,$item,$settings) = @_;      my ($cdom,$cnum,$item,$settings,$noedit) = @_;
     my ($classorder,$classtitles) = &discussion_vote_classes();      my ($classorder,$classtitles) = &discussion_vote_classes();
     my ($styleorder,$styleitems) = &discussion_vote_styles();      my ($styleorder,$styleitems) = &discussion_vote_styles();
     my $output;      my $output;
     if (ref($classorder) eq 'ARRAY') {      if (ref($classorder) eq 'ARRAY') {
           my $disabled;
           if ($noedit) {
               $disabled = ' disabled="disabled"';
           }
         foreach my $cat (@{$classorder}) {          foreach my $cat (@{$classorder}) {
             my %curr = ();              my %curr = ();
             ($curr{'size'},$curr{'weight'},$curr{'style'},$curr{'other'}) =              ($curr{'size'},$curr{'weight'},$curr{'style'},$curr{'other'}) =
Line 3785  sub set_discussion_fonts { Line 4290  sub set_discussion_fonts {
                             ($currsize,$currunit) = ($1,$2);                              ($currsize,$currunit) = ($1,$2);
                             $curr{'size'} = $currunit;                              $curr{'size'} = $currunit;
                         }                          }
                         $output .= '<input type="textbox" name="discussion_post_fonts_'.$cat.'_'.$item.'" value="'.$currsize.'" size="5">'.                          $output .= '<input type="textbox" name="discussion_post_fonts_'.$cat.'_'.$item.'" value="'.$currsize.'" size="5"'.$disabled.' />'.
                                    '&nbsp;';                                     '&nbsp;';
                         $selitem = 'unit';                          $selitem = 'unit';
                     }                      }
                     if ((ref($styleitems) eq 'HASH') && (ref($styleitems->{$item}) eq 'ARRAY')) {                      if ((ref($styleitems) eq 'HASH') && (ref($styleitems->{$item}) eq 'ARRAY')) {
                         $output .= '<select name="discussion_post_fonts_'.$cat.'_'.$selitem.'">';                          $output .= '<select name="discussion_post_fonts_'.$cat.'_'.$selitem.'"'.$disabled.'>';
                         foreach my $val (@{$styleitems->{$item}}) {                          foreach my $val (@{$styleitems->{$item}}) {
                             my $sel;                              my $sel;
                             if ($val eq $curr{$item}) {                              if ($val eq $curr{$item}) {
Line 3801  sub set_discussion_fonts { Line 4306  sub set_discussion_fonts {
                     }                      }
                 }                  }
             }              }
             $output .= '</span></td><td><input type="textbox" size="10" name="discussion_post_fonts_'.$cat.'_other" value="'.$curr{'other'}.'" /></td>';              $output .= '</span></td><td><input type="textbox" size="10" name="discussion_post_fonts_'.$cat.'_other" value="'.$curr{'other'}.'"'.$disabled.' /></td>';
        }         }
        $output .= &Apache::loncommon::end_data_table_row();         $output .= &Apache::loncommon::end_data_table_row();
     }      }
Line 3833  sub discussion_vote_styles { Line 4338  sub discussion_vote_styles {
 }  }
   
 sub print_classlists {  sub print_classlists {
     my ($position,$cdom,$settings,$itemtext,$rowtotal,$crstype) = @_;      my ($position,$cdom,$settings,$itemtext,$rowtotal,$crstype,$noedit) = @_;
     my @ordered;      my @ordered;
     if ($position eq 'top') {      if ($position eq 'top') {
         @ordered = ('default_enrollment_start_date',          @ordered = ('default_enrollment_start_date',
Line 3907  sub print_classlists { Line 4412  sub print_classlists {
             ($settings->{'student_classlist_view'} eq 'section')) {               ($settings->{'student_classlist_view'} eq 'section')) { 
         $settings->{'student_classlist_view'} = 'disabled';          $settings->{'student_classlist_view'} = 'disabled';
     }      }
     return &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal,$crstype,'classlists');      return &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal,$crstype,'classlists',$noedit);
 }  }
   
 sub print_appearance {  sub print_appearance {
     my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_;      my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype,$noedit) = @_;
     unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {      unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
         return;          return;
     }      }
Line 3944  sub print_appearance { Line 4449  sub print_appearance {
                    input => 'selectbox',                     input => 'selectbox',
                    options => {                     options => {
                                 MathJax  => 'MathJax',                                  MathJax  => 'MathJax',
                                 jsMath   => 'jsMath',  
                                 mimetex => &mt('Convert to Images'),                                  mimetex => &mt('Convert to Images'),
                                 tth      => &mt('TeX to HTML'),                                  tth      => &mt('TeX to HTML'),
                               },                                },
                    order  => ['MathJax','jsMath','mimetex','tth'],                     order  => ['MathJax','mimetex','tth'],
                    nullval => $mathdef,                     nullval => $mathdef,
                  },                   },
         'tthoptions' => {          'tthoptions' => {
Line 3965  sub print_appearance { Line 4469  sub print_appearance {
                    input => 'radio',                     input => 'radio',
                  },                   },
     );      );
     return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'appearance');      return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'appearance',$noedit);
 }  }
   
 sub print_grading {  sub print_grading {
     my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_;      my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype,$noedit) = @_;
     unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {      unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
         return;          return;
     }      }
Line 4021  sub print_grading { Line 4525  sub print_grading {
                    input => 'radio',                     input => 'radio',
                  },                   },
     );      );
     return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'grading');      return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'grading',$noedit);
 }  }
   
 sub print_printouts {  sub print_printouts {
     my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_;      my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype,$noedit) = @_;
     unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {      unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
         return;          return;
     }      }
Line 4074  sub print_printouts { Line 4578  sub print_printouts {
             nullval => &mt('None specified - use domain default'),              nullval => &mt('None specified - use domain default'),
                     }                      }
     );      );
     return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'printouts');      return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'printouts',$noedit);
 }  }
   
 sub print_spreadsheet {  sub print_spreadsheet {
     my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_;      my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype,$noedit) = @_;
     unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {      unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
         return;          return;
     }      }
Line 4110  sub print_spreadsheet { Line 4614  sub print_spreadsheet {
             input => 'radio',              input => 'radio',
                          },                           },
                 );                  );
     return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'spreadsheet');      return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'spreadsheet',$noedit);
 }  }
   
 sub print_bridgetasks {  sub print_bridgetasks {
     my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_;      my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype,$noedit) = @_;
     unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {      unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
         return;          return;
     }      }
Line 4152  sub print_bridgetasks { Line 4656  sub print_bridgetasks {
              input => 'radio',               input => 'radio',
                                   },                                    },
                 );                  );
     return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'bridgetasks');      return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'bridgetasks',$noedit);
   }
   
   sub print_lti {
       my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype,$noedit) = @_;
       unless ((ref($settings) eq 'HASH') && (ref($ordered) eq 'ARRAY') && (ref($itemtext) eq 'HASH')) {
           return;
       }
       my @menuitems = ('fullname','coursetitle','role','logout','grades');
       my %menutitles = &ltimenu_titles();
       my ($domdefs,$displaydefs);
       if ($env{'request.lti.login'}) {
           my %lti = &Apache::lonnet::get_domain_lti($cdom,'provider');
           my @domdefsmenu;
           if (ref($lti{$env{'request.lti.login'}}) eq 'HASH') {
               if ($lti{$env{'request.lti.login'}}{'topmenu'}) {
                   $domdefs = &mt('Header shown').', ';
               }
               if ($lti{$env{'request.lti.login'}}{'inlinemenu'}) {
                   $domdefs .= &mt('Inline menu shown');
               }
               $domdefs =~ s/,\s$//;
               if (!$domdefs) {
                   $domdefs = &mt('No header or inline menu shown');
               }
               $domdefs = ' ('.&mt('Domain default').': '.$domdefs.')';
               if (ref($lti{$env{'request.lti.login'}}{'lcmenu'}) eq 'ARRAY') {
                   @domdefsmenu = @{$lti{$env{'request.lti.login'}}{'lcmenu'}};
               }
           }
           $displaydefs = &mt('Domain defaults');
           if (@domdefsmenu) {
               my @diffs = &Apache::loncommon::compare_arrays(\@menuitems,\@domdefsmenu);
               if (@diffs) {
                   my $missing;
                   foreach my $item (@menuitems) {
                       unless (grep(/^\Q$item\E$/,@domdefsmenu)) {
                           $missing .= ' '.$menutitles{$item}.',';
                       }
                   }
                   $missing =~ s/,$//;
                   $displaydefs .= ': '.&mt('Not shown').' --'.$missing;
               } else {
                   $displaydefs .= ': '.&mt('All shown');
               }
           } else {
               $displaydefs .= ': '.&mt('Not shown').' -- '.join(', ', map { $menutitles{$_}; } @menuitems);
           }
       } else {
           $displaydefs = &mt('Domain defaults only available in LTI context');
       }
       my %items = (
           'lti.override' => {
               text => '<b>'.&mt($itemtext->{'lti.override'}).'</b>'.$domdefs,
               input => 'radio',
                      },
           'lti.topmenu' => {
               text => '<b>'.&mt($itemtext->{'lti.topmenu'}).'</b>',
               input => 'radio',
                      },
           'lti.inlinemenu' => {
               text => '<b>'.&mt($itemtext->{'lti.inlinemenu'}).'</b>',
               input => 'radio',
                         },
           'lti.lcmenu' => {
               text => '<b>'.&mt($itemtext->{'lti.lcmenu'}).'</b><br />'.$displaydefs,
               input => 'custom',
                     },
                   );
       return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'lti',$noedit);
   }
   
   sub lcmenu_checkboxes {
       my ($cdom,$caller,$settings,$crstype,$noedit) = @_;
       my @menuitems = ('fullname','coursetitle','role','logout','grades');
       my %menutitles = &ltimenu_titles();
       my (@current,@domdefs);
       if ($env{'request.lti.login'}) {
           my %lti = &Apache::lonnet::get_domain_lti($cdom,'provider');
           if (ref($lti{$env{'request.lti.login'}}) eq 'HASH') {
               if (ref($lti{$env{'request.lti.login'}}{'lcmenu'}) eq 'ARRAY') {
                   @domdefs = @{$lti{$env{'request.lti.login'}}{'lcmenu'}};
               }
           }
       }
       if (ref($settings) eq 'HASH') {
           if ($settings->{'lti.lcmenu'}) {
               unless ($settings->{'lti.lcmenu'} eq 'none') {
                   @current = split(',',$settings->{'lti.lcmenu'});
               }
           } else {
               @current = @domdefs;
           }
       } else {
           @current = @domdefs;
       }
       my $numinrow = 3;
       my $count = 0;
       my $disabled;
       if ($noedit) {
           $disabled = ' disabled="disabled"';
       }
       my $output = '<table>';
       foreach my $item (@menuitems) {
           my $checked = '';
           if (grep(/^\Q$item\E$/,@current)) {
               $checked = ' checked="checked" ';
           }
           my $rem = $count%($numinrow);
           if ($rem == 0) {
               if ($count > 0) {
                   $output .= '</tr>';
               }
               $output .= '<tr>';
           }
           $output .= '<td align="left"><span class="LC_nobreak"><label><input type="checkbox" '.
                      'name="lti.lcmenu" value="'.$item.'"'.$checked.$disabled.'/>&nbsp;'.
                      $menutitles{$item}.'</label></span></td>';
           $count ++;
       }
       my $rem = $count%($numinrow);
       my $colsleft = $numinrow - $rem;
       if ($colsleft > 1 ) {
           $output .= '<td colspan="'.$colsleft.'" class="LC_left_item">'.
                      '&nbsp;</td>';
       } elsif ($colsleft == 1) {
           $output .= '<td class="LC_left_item">&nbsp;</td>';
       }
       $output .= '</tr></table>';
   }
   
   sub ltimenu_titles {
       return &Apache::lonlocal::texthash(
                                           fullname    => 'Full name',
                                           coursetitle => 'Course title',
                                           role        => 'Role',
                                           logout      => 'Logout',
                                           grades      => 'Grades',
       );
   }
   
   sub print_menuitems {
       my ($position,$cdom,$settings,$itemtext,$rowtotal,$crstype,$noedit) = @_;
       unless ((ref($settings) eq 'HASH') && (ref($itemtext) eq 'HASH')) {
           return;
       }
       if ($position eq 'top') {
           my (%defaultmenu_options,@defaultmenu_order,$addcollection);
           if ($settings->{'menucollections'} ne '') {
               foreach my $item (split(/;/,$settings->{'menucollections'})) {
                   my ($num,$value) = split(/\%/,$item);
                   if ($num =~ /^\d+$/) {
                       $defaultmenu_options{$num} = $num;
                   }
               }
               @defaultmenu_order = sort { $a <=> $b } keys(%defaultmenu_options);
               $addcollection = $defaultmenu_order[-1] + 1;
           } else {
               $addcollection = 1;
           }
           $defaultmenu_options{$addcollection} = $addcollection;
           my %items = (
               'menudefault' => {
                      text => '<b>'.&mt($itemtext->{'menudefault'}).'</b><br />'.
                              &mt("(can be overriden in deep-link context)"),
                      input => 'selectbox',
                      options => \%defaultmenu_options,
                      order  => \@defaultmenu_order,
                      nullval => &mt('Standard (all menus shown)'),
                               },
           );
           return &make_item_rows($cdom,\%items,['menudefault'],$settings,$rowtotal,$crstype,'menuitems',$noedit);
       } else {
           my %menu;
           my $count = 0;
           my $next = 1;
           my ($datatable,$disabled);
           if ($noedit) {
               $disabled = ' disabled="disabled"';
           }
   
           my ($ordered,$cats) = &menuitems_categories();
           my @order = @{$ordered};
           my %categories = %{$cats};
           my %menutitles = &menuitems_titles();
           my %menufields = &menuitems_fields();
   
           if ($settings->{'menucollections'} ne '') {
               foreach my $item (split(/;/,$settings->{'menucollections'})) {
                   my ($num,$value) = split(/\%/,$item);
                   if ($num =~ /^\d+$/) {
                       my @entries = split(/\&/,$value);
                       foreach my $entry (@entries) {
                           my ($name,$fields) = split(/=/,$entry);
                           $menu{$num}{$name} = $fields;
                       }
                   }
               }
               if (keys(%menu)) {
                   my @current = sort { $a <=> $b } keys(%menu);
                   $next += $current[-1];
                   foreach my $num (@current) {
                       my %checked;
                       my $on = ' checked="checked"';
                       foreach my $key (keys(%{$menu{$num}})) {
                           if (($key eq 'top') || ($key eq 'inline') || ($key eq 'main')) {
                               if ($menu{$num}{$key} eq 'y') {
                                   $checked{$key} = $on;
                               }
                           } else {
                               foreach my $field (split(/,/,$menu{$num}{$key})) {
                                   if (exists($menufields{$field})) {
                                       $checked{$field} = $on;
                                   }
                               }
                           }
                       }
                       if (ref($menu{$num}) eq 'HASH') {
                           $datatable .= &item_table_row_start('<em class="LC_nav_bar">'.$num.'</em>',$count,'','','','LC_left_item');
                           foreach my $category (@order) {
                               if ((ref($categories{$category}) eq 'ARRAY') && (@{$categories{$category}} > 0)) {
                                   $datatable .= '<fieldset style="vertical-align:top; display:inline-block"><legend>'.$menutitles{$category}.'</legend>'."\n";
                                   foreach my $field (@{$categories{$category}}) {
                                       $datatable .= '<label><input type="checkbox" name="menucollections_'.$num.'" value="'.$field.'"'.$checked{$field}.$disabled.' />'.
                                                     $menufields{$field}.'</label><br />';
                                   }
                                   $datatable .= '</fieldset>';
                               }
                           }
                           $datatable .= &item_table_row_end();
                           $count ++;
                       }
                   }
               }
           } elsif ($noedit) {
               my $text = &mt('No menu collections defined for this course.');
               $datatable .= &item_table_row_start($text,$count);
           }
           unless ($noedit) {
               my $add = '<label><input type="checkbox" name="menucollections_add" id="menucollections_add" value="'.$next.'" '.
                         'onclick="javascript:toggleAddmenucoll();" />'.&mt('Add').'</label>';
               $datatable .= &item_table_row_start($add,$count,'','','','LC_left_item');
               foreach my $category (@order) {
                   if ((ref($categories{$category}) eq 'ARRAY') && (@{$categories{$category}} > 0)) {
                       $datatable .= '<fieldset id="addmenucoll_'.$category.'" style="display:none; vertical-align:top;"><legend>'.$menutitles{$category}.'</legend>'."\n";
                       foreach my $field (@{$categories{$category}}) {
                           $datatable .= '<label><input type="checkbox" class="LC_menucoll_add" name="menucollections_'.$next.'" value="'.$field.'"'.$disabled.' />'.
                                         $menufields{$field}.'</label><br />';
                       }
                       $datatable .= '</fieldset>';
                   }
               }
               $datatable .= &item_table_row_end();
               $count ++;
           }
           return $datatable;
       }
   }
   
   sub menuitems_abbreviations {
       my %briefcats = (
                        text => 'pt',
                        links => 'p',
                        list => 'ps',
                        inline => 's',
                       );
       return %briefcats;
   }
   
   sub menuitems_categories {
       my @order = ('shown','text','links','list','inline');
       my %categories = (
                          shown => ['top','inline','main'],
                          text  => ['name','role','crs'],
                          links => ['pers','logo','menu','comm','roles','help','logout'],
                          list => ['about','prefs','port','wish','anno','rss'],
                          inline => ['cont','grades','chat','people','groups','resv','syll','feeds'],
                        );
       return (\@order,\%categories);
   }
   
   sub menuitems_titles {
       return &Apache::lonlocal::texthash (
           shown => 'Hierarchy',
           text  => 'Header text',
           links => 'Header links',
           list => 'Drop-down list',
           inline => 'Inline links',
       );
   }
   
   sub menuitems_fields {
       return &Apache::lonlocal::texthash (
                  top => 'Display header',
                  inline => 'Display inline menu',
                  main => 'Access to main menu',
                  pers => 'Personal',
                  logo => 'LON-CAPA',
                  menu => 'Home',
                  comm => 'Messages',
                  roles => 'Roles/Courses',
                  help => 'Help',
                  logout => 'Logout',
                  name => 'Fullname',
                  crs => 'Course Title',
                  role => 'Current Role',
                  about => 'Information',
                  prefs => 'Preferences',
                  port => 'Portfolio',
                  wish => 'Stored Links',
                  anno => 'Calendar',
                  rss => 'RSS Feeds',
                  cont => 'Contents',
                  grades => 'Grades',
                  chat => 'Chat',
                  people => 'People',
                  groups => 'Groups',
                  resv => 'Reservations',
                  syll => 'Syllabus',
                  feeds => 'Feeds',
       );
   }
   
   sub menucollections_display {
       my ($collections) = @_;
       my %menu;
       my ($ordered,$cats) = &menuitems_categories();
       my @order = @{$ordered};
       my %categories = %{$cats};
       my %menutitles = &menuitems_titles();
       my %menufields = &menuitems_fields();
       foreach my $item (split(/;/,$collections)) {
           my ($num,$value) = split(/\%/,$item);
           if ($num =~ /^\d+$/) {
               my @entries = split(/\&/,$value);
               foreach my $entry (@entries) {
                   my ($name,$fields) = split(/=/,$entry);
                   $menu{$num}{$name} = $fields;
               }
           }
       }
       my $output = '';
       if (keys(%menu)) {
           my @current = sort { $a <=> $b } keys(%menu);
           foreach my $num (@current) {
               my %checked;
               foreach my $key (keys(%{$menu{$num}})) {
                   if (($key eq 'top') || ($key eq 'inline') || ($key eq 'main')) {
                       if ($menu{$num}{$key} eq 'y') {
                           $checked{$key} = 1;
                       }
                   } else {
                       foreach my $field (split(/,/,$menu{$num}{$key})) {
                           if (exists($menufields{$field})) {
                               $checked{$field} = 1;
                           }
                       }
                   }
               }
               if (ref($menu{$num}) eq 'HASH') {
                   $output .= '<fieldset><legend>'.&mt('Collection [_1]',$num).'</legend>';
                   foreach my $category (@order) {
                       if ((ref($categories{$category}) eq 'ARRAY') && (@{$categories{$category}} > 0)) {
                           $output .= '<fieldset style="vertical-align:top; display:inline-block">'.
                                      '<legend>'.$menutitles{$category}.'</legend>'."\n";
                           foreach my $field (@{$categories{$category}}) {
                               if ($checked{$field}) {
                                   $output .= &Apache::lonhtmlcommon::confirm_success($menufields{$field});
                               } else {
                                   $output .= &Apache::lonhtmlcommon::confirm_success($menufields{$field},1);
                               }
                               $output .= '<br />';
                           }
                           $output .= '</fieldset>';
                       }
                   }
                   $output .= '</fieldset>';
               }
           }
       }
       return $output;
 }  }
   
 sub print_other {  sub print_other {
     my ($cdom,$settings,$allitems,$rowtotal,$crstype) = @_;      my ($cdom,$settings,$allitems,$rowtotal,$crstype,$noedit) = @_;
     unless ((ref($settings) eq 'HASH') && (ref($allitems) eq 'ARRAY')) {      unless ((ref($settings) eq 'HASH') && (ref($allitems) eq 'ARRAY')) {
         return;          return;
     }      }
Line 4177  sub print_other { Line 5061  sub print_other {
                             input => 'textbox',                              input => 'textbox',
                             size  => '30',                              size  => '30',
                            };                             };
     my $output = &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal,$crstype,'other');      my $output = &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal,$crstype,'other',$noedit);
 }  }
   
 sub get_other_items {  sub get_other_items {
Line 4206  sub get_other_items { Line 5090  sub get_other_items {
 }  }
   
 sub item_table_row_start {  sub item_table_row_start {
     my ($text,$count,$add_class,$colspan) = @_;      my ($text,$count,$add_class,$colspan,$leftclass,$rightclass) = @_;
     my $output;      my $output;
     my $css_class = ($count % 2) ? 'LC_odd_row' : 'LC_even_row';      my $css_class = ($count % 2) ? 'LC_odd_row' : 'LC_even_row';
     $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq '');      $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq '');
       if ($leftclass eq '') {
           $leftclass = 'LC_left_item';
       }
       if ($rightclass eq '') {
           $rightclass = 'LC_right_item';
       }
     $output .= '<tr class="'.$css_class.'">'."\n".      $output .= '<tr class="'.$css_class.'">'."\n".
                '<td class="LC_left_item">'.$text.                 '<td class="'.$leftclass.'">'.$text.
                '</td>';                 '</td>';
     if ($colspan) {      if ($colspan > 1) {
         $output .= '<td class="LC_right_item" colspan="'.$colspan.'">';          $output .= '<td class="'.$rightclass.'" colspan="'.$colspan.'">';
     } else {      } else {
         $output .= '<td class="LC_right_item">';          $output .= '<td class="'.$rightclass.'">';
     }      }
     return $output;      return $output;
 }  }
Line 4226  sub item_table_row_end { Line 5116  sub item_table_row_end {
 }  }
   
 sub yesno_radio {  sub yesno_radio {
     my ($item,$settings,$unsetdefault,$valueyes,$valueno) = @_;      my ($item,$settings,$unsetdefault,$valueyes,$valueno,$noedit) = @_;
     my $itemon = ' ';      my $itemon = ' ';
     my $itemoff = ' checked="checked" ';      my $itemoff = ' checked="checked" ';
     if (($valueyes eq '') && ($valueno eq '')) {      if (($valueyes eq '') && ($valueno eq '')) {
Line 4245  sub yesno_radio { Line 5135  sub yesno_radio {
             }              }
         }          }
     }      }
       my $disabled;
       if ($noedit) {
           $disabled = ' disabled="disabled"';
       }
     return '<span class="LC_nobreak"><label>'.      return '<span class="LC_nobreak"><label>'.
            '<input type="radio" name="'.$item.'"'.             '<input type="radio" name="'.$item.'"'.
            $itemon.' value="'.$valueyes.'" />'.&mt('Yes').'</label>&nbsp;'.             $itemon.' value="'.$valueyes.'"'.$disabled.' />'.&mt('Yes').'</label>&nbsp;'.
            '<label><input type="radio" name="'.$item.'"'.             '<label><input type="radio" name="'.$item.'"'.
            $itemoff.' value="'.$valueno.'" />'.&mt('No').'</label></span>';             $itemoff.' value="'.$valueno.'"'.$disabled.' />'.&mt('No').'</label></span>';
 }  }
   
 sub select_from_options {  sub select_from_options {
     my ($item,$order,$options,$curr,$nullval,$multiple,$maxsize,$onchange) = @_;      my ($item,$order,$options,$curr,$nullval,$multiple,$maxsize,$onchange,$noedit,$id) = @_;
     my $output;      my $output;
       my $disabled;
       if ($noedit) {
           $disabled = ' disabled=disabled"';
       }
     if ((ref($order) eq 'ARRAY') && (ref($options) eq 'HASH')) {      if ((ref($order) eq 'ARRAY') && (ref($options) eq 'HASH')) {
         $output='<select name="'.$item.'" '.$onchange;          $output='<select name="'.$item.'" '.$onchange;
         if ($multiple) {          if ($multiple) {
Line 4265  sub select_from_options { Line 5163  sub select_from_options {
                 $output .= ' size="'.$maxsize.'"';                  $output .= ' size="'.$maxsize.'"';
             }              }
         }          }
         $output .= '>'."\n";          if ($id ne '') {
               $output .= ' id="'.$id.'"';
           }
           $output .= $disabled.'>'."\n";
         if ($nullval ne '') {          if ($nullval ne '') {
             $output .= '<option value=""';              $output .= '<option value=""';
             if (ref($curr) eq 'ARRAY') {              if (ref($curr) eq 'ARRAY') {
Line 4298  sub select_from_options { Line 5199  sub select_from_options {
 }  }
   
 sub make_item_rows {  sub make_item_rows {
     my ($cdom,$items,$ordered,$settings,$rowtotal,$crstype,$caller) = @_;      my ($cdom,$items,$ordered,$settings,$rowtotal,$crstype,$caller,$noedit) = @_;
     my $datatable;      my $datatable;
     if ((ref($items) eq 'HASH') && (ref($ordered) eq 'ARRAY')) {      if ((ref($items) eq 'HASH') && (ref($ordered) eq 'ARRAY')) {
         my $count = 0;          my $count = 0;
Line 4324  sub make_item_rows { Line 5225  sub make_item_rows {
                 }                  }
                 $datatable .= $showcredits;                  $datatable .= $showcredits;
             } elsif ($item eq 'nothideprivileged') {              } elsif ($item eq 'nothideprivileged') {
                 $datatable .= &nothidepriv_row($cdom,$item,$settings,$crstype);                  $datatable .= &nothidepriv_row($cdom,$item,$settings,$crstype,$noedit);
             } elsif ($item eq 'checkforpriv') {              } elsif ($item eq 'checkforpriv') {
                 $datatable .= &checkforpriv_row($cdom,$item,$settings,$crstype);                  $datatable .= &checkforpriv_row($cdom,$item,$settings,$crstype,$noedit);
             } elsif ($item eq 'print_header_format') {              } elsif ($item eq 'print_header_format') {
                 $datatable .= &print_hdrfmt_row($item,$settings);                  $datatable .= &print_hdrfmt_row($item,$settings,$noedit);
               } elsif ($item eq 'lti.lcmenu') {
                   $datatable .= &lcmenu_checkboxes($cdom,$item,$settings,$crstype,$noedit);
             } elsif ($items->{$item}{input} eq 'dates') {              } elsif ($items->{$item}{input} eq 'dates') {
                  my $disabled;
                  if ($noedit) {
                     $disabled = ' disabled="disabled"';
                  }
                $datatable .=                 $datatable .=
                    &Apache::lonhtmlcommon::date_setter('display',$item,                     &Apache::lonhtmlcommon::date_setter('display',$item,
                                                        $settings->{$item});                                                         $settings->{$item},$disabled);
             } elsif ($items->{$item}{input} eq 'radio') {              } elsif ($items->{$item}{input} eq 'radio') {
                 my ($unsetdefault,$valueyes,$valueno);                  my ($unsetdefault,$valueyes,$valueno);
                 if (($item eq 'usejsme') || ($item eq 'uselcmath')) {                  if (($item eq 'usejsme') || ($item eq 'uselcmath')) {
Line 4342  sub make_item_rows { Line 5249  sub make_item_rows {
                      }                       }
                      $valueyes = "1";                       $valueyes = "1";
                      $valueno = "0";                       $valueno = "0";
                   } elsif (($item eq 'lti.topmenu') || ($item eq 'lti.inlinemenu')) {
                       $valueyes = '1';
                 }                  }
                 $datatable .= &yesno_radio($item,$settings,$unsetdefault,$valueyes,$valueno);                  $datatable .= &yesno_radio($item,$settings,$unsetdefault,$valueyes,$valueno,$noedit);
             } elsif ($items->{$item}{input} eq 'selectbox') {              } elsif ($items->{$item}{input} eq 'selectbox') {
                   my $id;
                   if ($caller eq 'menuitems') {
                       $id = $item;
                   }
                 my $curr = $settings->{$item};                  my $curr = $settings->{$item};
                 $datatable .=                  $datatable .=
                     &select_from_options($item,$items->{$item}{'order'},                      &select_from_options($item,$items->{$item}{'order'},
                                          $items->{$item}{'options'},$curr,                                           $items->{$item}{'options'},$curr,
                                          $items->{$item}{'nullval'});                                           $items->{$item}{'nullval'},
                                            undef,undef,undef,$noedit,$id);
             } elsif ($items->{$item}{input} eq 'textbox') {              } elsif ($items->{$item}{input} eq 'textbox') {
                   my $disabled;
                   if ($noedit) {
                       $disabled = ' disabled=disabled"';
                   }
                 $datatable .=                   $datatable .= 
                     &Apache::lonhtmlcommon::textbox($item,$settings->{$item},                      &Apache::lonhtmlcommon::textbox($item,$settings->{$item},
                                                     $items->{$item}{size});                                                      $items->{$item}{size},
                                                       $disabled);
             }              }
             $datatable .= &item_table_row_end();              $datatable .= &item_table_row_end();
         }          }
Line 4365  sub make_item_rows { Line 5284  sub make_item_rows {
 }  }
   
 sub nothidepriv_row {  sub nothidepriv_row {
     my ($cdom,$item,$settings,$crstype) = @_;      my ($cdom,$item,$settings,$crstype,$noedit) = @_;
     my ($cnum) = &get_course();      my ($cnum) = &get_course();
     my ($datatable,%nothide,@checkdoms);      my ($datatable,%nothide,@checkdoms);
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
Line 4402  sub nothidepriv_row { Line 5321  sub nothidepriv_row {
         }          }
     }      }
     if (@privusers > 0) {      if (@privusers > 0) {
           my $disabled;
           if ($noedit) {
              $disabled = ' disabled="disabled"';
           }
         $datatable .= '<table align="right">';          $datatable .= '<table align="right">';
         foreach my $user (sort(@privusers)) {          foreach my $user (sort(@privusers)) {
             my $hideon = ' checked="checked" ';              my $hideon = ' checked="checked" ';
Line 4418  sub nothidepriv_row { Line 5341  sub nothidepriv_row {
                           '</td><td align="left">'.                            '</td><td align="left">'.
                           '<span class="LC_nobreak"><label>'.                            '<span class="LC_nobreak"><label>'.
                           '<input type="radio" name="'.$item.'_'.$user.'"'.                            '<input type="radio" name="'.$item.'_'.$user.'"'.
                           $hideon.' value="" />'.&mt('Hidden').'</label>&nbsp;'.                            $hideon.' value=""'.$disabled.' />'.&mt('Hidden').'</label>&nbsp;'.
                           '<label><input type="radio" name="'.$item.'_'.$user.'"'.                            '<label><input type="radio" name="'.$item.'_'.$user.'"'.
                           $hideoff.' value="yes" />'.&mt('Shown').'</label></span></td>'.                            $hideoff.' value="yes"'.$disabled.' />'.&mt('Shown').'</label></span></td>'.
                           '</tr>';                            '</tr>';
         }          }
         $datatable .= '</table>';          $datatable .= '</table>';
Line 4435  sub nothidepriv_row { Line 5358  sub nothidepriv_row {
 }  }
   
 sub checkforpriv_row {  sub checkforpriv_row {
     my ($cdom,$item,$settings,$crstype) = @_;      my ($cdom,$item,$settings,$crstype,$noedit) = @_;
     my $datatable;      my $datatable;
     my %domains=map { $_ => 1; } &Apache::lonnet::all_domains();      my %domains=map { $_ => 1; } &Apache::lonnet::all_domains();
     if (keys(%domains) == 1) {      if (keys(%domains) == 1) {
Line 4448  sub checkforpriv_row { Line 5371  sub checkforpriv_row {
     if ($settings->{$item} eq '') {      if ($settings->{$item} eq '') {
         $datatable = '</td><td align="right">'.          $datatable = '</td><td align="right">'.
                      &Apache::loncommon::select_dom_form('','checkforpriv_'.$num,                       &Apache::loncommon::select_dom_form('','checkforpriv_'.$num,
                                                          1,1,undef,undef,\@excdoms);                                                           1,1,undef,undef,\@excdoms,
                                                            $noedit);
     } else {      } else {
         my @privdoms = split(/,/,$settings->{$item});          my @privdoms = split(/,/,$settings->{$item});
         my %domains=map { $_ => 1; } &Apache::lonnet::all_domains();          my %domains=map { $_ => 1; } &Apache::lonnet::all_domains();
         $datatable = '</td><td align="right"><br />'.          $datatable = '</td><td align="right"><br />'.
                      &Apache::loncommon::start_data_table();                       &Apache::loncommon::start_data_table();
           my $disabled;
           if ($noedit) {
               $disabled = ' disabled="disabled"';
           }
         if (@privdoms > 0) {          if (@privdoms > 0) {
             foreach my $currdom (@privdoms) {              foreach my $currdom (@privdoms) {
                 next unless ($domains{$currdom});                  next unless ($domains{$currdom});
Line 4468  sub checkforpriv_row { Line 5396  sub checkforpriv_row {
                     '</b><input type="hidden" name="checkforpriv_'.$num.                      '</b><input type="hidden" name="checkforpriv_'.$num.
                     '" value="'.$currdom.'" /></span><br />'.                      '" value="'.$currdom.'" /></span><br />'.
                     '<span class="LC_nobreak"><label><input type="checkbox" '.                      '<span class="LC_nobreak"><label><input type="checkbox" '.
                     'name="checkforpriv_delete" value="'.$num.'" />'.                      'name="checkforpriv_delete" value="'.$num.'"'.$disabled.' />'.
                     &mt('Delete').'</label></span></td>'.                      &mt('Delete').'</label></span></td>'.
                     &Apache::loncommon::end_data_table_row();                      &Apache::loncommon::end_data_table_row();
                 $num ++;                  $num ++;
Line 4483  sub checkforpriv_row { Line 5411  sub checkforpriv_row {
                 '<td align="left"><span class="LC_nobreak">'.                  '<td align="left"><span class="LC_nobreak">'.
                 &mt('Additional domain:'). '</span><br />'.                  &mt('Additional domain:'). '</span><br />'.
                 &Apache::loncommon::select_dom_form('','checkforpriv_'.$num,1,                  &Apache::loncommon::select_dom_form('','checkforpriv_'.$num,1,
                                                     1,undef,undef,\@excdoms).                                                      1,undef,undef,\@excdoms,$noedit).
                 '</td>'.&Apache::loncommon::end_data_table_row();                  '</td>'.&Apache::loncommon::end_data_table_row();
         }          }
         $datatable .= &Apache::loncommon::end_data_table().          $datatable .= &Apache::loncommon::end_data_table().
Line 4494  sub checkforpriv_row { Line 5422  sub checkforpriv_row {
 }  }
   
 sub print_hdrfmt_row {  sub print_hdrfmt_row {
     my ($item,$settings) = @_;      my ($item,$settings,$noedit) = @_;
     my @curr;      my @curr;
     my $currnum = 0;      my $currnum = 0;
     my $maxnum = 2;      my $maxnum = 2;
Line 4567  function getIndexByName(item) { Line 5495  function getIndexByName(item) {
 ENDJS  ENDJS
     $output .= '</td><td align="right"><br />'.      $output .= '</td><td align="right"><br />'.
                $currstr.'<table class="LC_data_table">';                 $currstr.'<table class="LC_data_table">';
       my $disabled;
       if ($noedit) {
           $disabled = ' disabled="disabled"';
       }
     if (@curr > 0) {      if (@curr > 0) {
         for (my $i=0; $i<@curr; $i++) {          for (my $i=0; $i<@curr; $i++) {
             my $pos = $i+1;              my $pos = $i+1;
             $output .= '<tr>'.              $output .= '<tr>'.
                        '<td align="left"><span class="LC_nobreak">'.                         '<td align="left"><span class="LC_nobreak">'.
                        &position_selector($pos,$i,$maxnum).&mt('Delete:').                         &position_selector($pos,$i,$maxnum,$disabled).&mt('Delete:').
                        '<input type="checkbox" name="printfmthdr_del_'.$i.                         '<input type="checkbox" name="printfmthdr_del_'.$i.
                        '" /></span></td>';                         '"'.$disabled.' /></span></td>';
             if ($curr[$i] =~ /^%\d*[nca]$/) {              if ($curr[$i] =~ /^%\d*[nca]$/) {
                 my ($limit,$subst) = ($curr[$i] =~ /^%(\d*)([nca])$/);                  my ($limit,$subst) = ($curr[$i] =~ /^%(\d*)([nca])$/);
                 $output .= '<td align="left">'.                  $output .= '<td align="left">'.
                            &substitution_selector($i,$subst,$limit).'</td>';                             &substitution_selector($i,$subst,$limit,$disabled).'</td>';
             } else {              } else {
                 $output .= '<td colspan="2" align="left">'.&mt('Text').'<br />'.                  $output .= '<td colspan="2" align="left">'.&mt('Text').'<br />'.
                            '<input type="textbox" name="printfmthdr_text_'.$i.'"'.                             '<input type="textbox" name="printfmthdr_text_'.$i.'"'.
                            ' value="'.$curr[$i].'" size="25" /></td>';                             ' value="'.$curr[$i].'" size="25"'.$disabled.' /></td>';
             }              }
             $output .= '</tr>';              $output .= '</tr>';
         }          }
     }      }
     my $pos = $currnum+1;       my $pos = $currnum+1;
     $output .= '<tr>'.      unless ($noedit) { 
           $output .= 
                  '<tr>'.
                '<td align="left"><span class="LC_nobreak">'.                 '<td align="left"><span class="LC_nobreak">'.
                &position_selector($pos,$currnum,$maxnum).                 &position_selector($pos,$currnum,$maxnum).
                '<b>'.&mt('New').'</b></span></td><td align="left">'.                 '<b>'.&mt('New').'</b></span></td><td align="left">'.
                &substitution_selector($currnum).'</td>'.                 &substitution_selector($currnum).'</td>'.
                '</tr>';                  '</tr>'; 
     $pos ++;          $pos ++;
     $currnum ++;          $currnum ++;
     $output .= '<tr>'.          $output .= 
                  '<tr>'.
                '<td align="left"><span class="LC_nobreak">'.                 '<td align="left"><span class="LC_nobreak">'.
                &position_selector($pos,$currnum,$maxnum).                 &position_selector($pos,$currnum,$maxnum).
                '<b>'.&mt('New').'</b></span></td>'.                 '<b>'.&mt('New').'</b></span></td>'.
Line 4605  ENDJS Line 5540  ENDJS
                '" value="" size ="25" />'.                 '" value="" size ="25" />'.
                '<input type="hidden" name="printfmthdr_maxnum" value="'.                 '<input type="hidden" name="printfmthdr_maxnum" value="'.
                 $maxnum.'" /></td>'.                  $maxnum.'" /></td>'.
                '</tr>'.                 '</tr>';
                '</table><br />';      }
       $output .= '</table><br />';
     return $output;      return $output;
 }  }
   
 sub position_selector {  sub position_selector {
     my ($pos,$num,$maxnum) = @_;      my ($pos,$num,$maxnum,$disabled) = @_;
     my $output = '<select name="printfmthdr_pos_'.$num.'" onchange="reOrder('."'$num'".');">';      my $output = '<select name="printfmthdr_pos_'.$num.'" onchange="reOrder('."'$num'".');"'.$disabled.'>';
     for (my $j=1; $j<=$maxnum; $j++) {      for (my $j=1; $j<=$maxnum; $j++) {
         my $sel = '';          my $sel = '';
         if ($pos == $j) {          if ($pos == $j) {
Line 4626  sub position_selector { Line 5562  sub position_selector {
 }  }
   
 sub substitution_selector {  sub substitution_selector {
     my ($num,$subst,$limit,$crstype) = @_;      my ($num,$subst,$limit,$crstype,$disabled) = @_;
     my ($stunametxt,$crsidtxt);      my ($stunametxt,$crsidtxt);
     if ($crstype eq 'Community') {      if ($crstype eq 'Community') {
         $stunametxt = 'member name';          $stunametxt = 'member name';
Line 4641  sub substitution_selector { Line 5577  sub substitution_selector {
                     a => 'assignment note',                      a => 'assignment note',
              );               );
     my $output .= &mt('Substitution').'<br />'.      my $output .= &mt('Substitution').'<br />'.
                   '<select name="printfmthdr_sub_'.$num.'">';                    '<select name="printfmthdr_sub_'.$num.'"'.$disabled.'>';
     if ($subst eq '') {      if ($subst eq '') {
         $output .= '<option value="" selected="selected"> </option>';          $output .= '<option value="" selected="selected"> </option>';
     }      }
Line 4655  sub substitution_selector { Line 5591  sub substitution_selector {
     }      }
     $output .= '</select></td><td align="left">'.&mt('Size limit').'<br />'.      $output .= '</select></td><td align="left">'.&mt('Size limit').'<br />'.
                '<input type="textbox" name="printfmthdr_limit_'.$num.                 '<input type="textbox" name="printfmthdr_limit_'.$num.
                '" value="'.$limit.'" size="5" /></span>';                 '" value="'.$limit.'" size="5"'.$disabled.' /></span>';
     return $output;      return $output;
 }  }
   

Removed from v.1.71  
changed lines
  Added in v.1.92


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

Internal Server Error

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

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

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