Diff for /loncom/interface/courseprefs.pm between versions 1.5 and 1.55

version 1.5, 2009/05/25 22:56:34 version 1.55, 2013/04/08 23:57:21
Line 28 Line 28
 ###############################################################  ###############################################################
 ##############################################################  ##############################################################
   
   =pod
   
   =head1 NAME
   
   courseprefs- Handler to set/modify course configuration
   
   =head1 SYNOPSIS
   
   courseprefs provides an interface for setting general course configuration
   
   =head1 DESCRIPTION
   
   This module is used for configuration of a course
   
   =head1 INTERNAL SUBROUTINES
   
   =over
   
   =item get_allitems()
   
   =item print_config_box()
   
   =item process_changes()
   
   =item get_sec_str()
   
   =item check_clone()
   
   =item store_changes()
   
   =item update_env()
   
   =item display_disallowed()
   
   =item get_course()
   
   =item get_jscript()
   
   =item cloners_javascript()
   
   =item print_courseinfo()
   
   =item new_cloners_dom_row()
   
   =item can_modify_catsettings()
   
   =item assign_course_categories()
   
   =item print_localization()
   
   =item get_lang_choices()
   
   =item print_feedback()
   
   =item user_table()
   
   =item select_recipient()
   
   =item select_sections()
   
   =item print_discussion()
   
   =item role_checkboxes()
   
   =item print_classlists()
   
   =item print_appearance()
   
   =item print_grading()
   
   =item print_printouts()
   
   =item print_spreadsheet()
   
   =item print_bridgetasks()
   
   =item print_other()
   
   =item get_other_items()
   
   =item item_table_row_start()
   
   =item item_table_row_end()
   
   =item yes_no_radio()
   
   =item select_from_options()
   
   =item make_item_rows()
   
   Creates table used to display and set course configuration items.
   
   Inputs: $cdom,$items,$ordered,$settings,$rowtotal,$crstype
   where $cdom is course's domain, $items is HASH ref for current config
   item, $ordered is ARRAY ref of items to include in row in 
   display order, $settings is HASH ref of current values forrow,
   $rowtotal is SCALAR ref used to accumulate row count, $crstype is    
   course type.
   
   Returns: $datatable
   HTML mark-up of data table which accumulates individual rows.  
   
   =item nothidepriv_row()
   
   Creates row containing form elements used to display and set
   whether Domain coordinators who are currently included in  
   advanced course user .db file for a course are to be hidden (e.g.,
   in syllabus, or from course user lists).
   
   Inputs: $cdom,$item,$settings,$crstype
   where $cdom is course domain, item is nothideprivileged, $settings is
   HASH ref of the current values for nothideprivileged, $crstype is 
   course type (Course or Community). 
   
   Return: $datatable
   HTML mark-up for Privileged users (Domain Coordinators) in staff listing.
   
   =item print_hdrfmt_row()
   
   Creates row containing form elements used to display and set
   substitution items and text to be used in the header included
   on printouts.
   
   Inputs: $item,$settings
   where $item is print_header_format, and $settings is a HASH ref
   of the current values stored for print_header_format.
   
   Returns: $output
   HTML mark-up containing Javascript functions: reOrder() and getIndexByName()
   used to dynamically update position selectboxes, and HTML table elements
   for the "Print header format" row.
   
   =item position_selector()
   
   Creates a select box which can be used to reorder substitutions
   and text included in a printout header. 
   
   Inputs: $pos,$num,$maxnum
   where $pos is current position, $num is the unique identifier,
   and $maxnum is the total number of items (both substitutions
   and text in the printout header.
   
   Returns: $output
   HTML mark-up for the selectbox and a hidden form element containing 
   the current position.   
   
   =item substitution_selector()
   
   Creates a combination of select box for choosing an item 
   (student name, course ID or assignment note) to substitute, 
   and a corresponding size limit in the header used for printouts.
   
   Inputs: $num,$subst,$limit,$crstype
   where $num is the unique identifier, $subst is the current 
   substitution (n,c or a, for name, course or note respectively,
   $limit is the current size limit (integer), and $crstype is
   course type - course or community.
   
   Returns: $output
   HTML mark-up for selectbox and textbox (separate table cells).  
   
   =item change_clone()
   
   Modifies the list of courses a user can clone (stored
   in the user's environment.db file), called when a
   change is made to the list of users allowed to clone
   a course.
   
   Inputs: $action,$cloner
   where $action is add or drop, and $cloner is identity of
   user for whom cloning ability is to be changed in course.
   
   Returns: nothing
   
   =back
   
   =cut
   
   
 package Apache::courseprefs;  package Apache::courseprefs;
   
 use strict;  use strict;
Line 36  use Apache::lonnet; Line 215  use Apache::lonnet;
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonhtmlcommon();  use Apache::lonhtmlcommon();
 use Apache::lonconfigsettings;  use Apache::lonconfigsettings;
   use Apache::lonparmset;
 use Apache::lonlocal;  use Apache::lonlocal;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   
Line 57  sub handler { Line 237  sub handler {
         $r->send_http_header;          $r->send_http_header;
     } else {      } else {
         if ($navmap) {          if ($navmap) {
             $env{'user.error.msg'}=              if ($crstype eq 'Community') {
                 "/adm/courseprefs:opa:0:0:Cannot modify course settings";                  $env{'user.error.msg'}=
                       "/adm/courseprefs:opa:0:0:Cannot modify community settings";
               } else {
                   $env{'user.error.msg'}=
                       "/adm/courseprefs:opa:0:0:Cannot modify course settings";
               }
         } else {          } else {
            $env{'user.error.msg'}=              if ($crstype eq 'Community') {
                 "/adm/courseprefs::0:1:Course environment gone, reinitialize the course";                  $env{'user.error.msg'}=
                       "/adm/courseprefs::0:1:Course environment gone, reinitialize the community";
               } else {
                   $env{'user.error.msg'}=
                       "/adm/courseprefs::0:1:Course environment gone, reinitialize the course";
   
               }
         }          }
         return HTTP_NOT_ACCEPTABLE;          return HTTP_NOT_ACCEPTABLE;
     }      }
Line 73  sub handler { Line 264  sub handler {
         &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset",          &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset",
                                                 text=>"Parameter Manager"});                                                  text=>"Parameter Manager"});
     }      }
       my ($brtext,$brtitle,$crsinfotext,$crsinfodesc,$crscateg,$crshide);
       my %lt;
       if ($crstype eq 'Community') {
           %lt = (
                   conf => 'Community Settings',
                   edit => 'Edit Community Settings',
                   gens => 'General community settings',
                   idnu => 'Community ID or number',
                   desc => 'Community Description',
                   ownr => 'Community Owner',
                   cown => 'Community Co-owners',
                   catg => 'Categorize community',
                   excc => 'Exclude from community catalog',
                   clon => 'Users allowed to clone community',
                   rept => 'Replacement titles for standard community roles',
                   time => 'Timezone where the community is located',
                   date => 'Locale used for community calendar',
                   coco => 'Community Content',
                   copo => 'Community Policy',
                   priv => 'Domain Coordinators in community',
                   defd => 'Default dates for member access',
                   stuv => 'Member-viewable membership list options',
                   stul => 'Member agreement needed to be listed',
                   clas => 'Membership and facilitator listing',
                   priv => 'Privileged users (Domain Coordinators) in facilitator listing',
                   defc => 'Default Community Spreadsheet',
                   defs => 'Default User Spreadsheet',
                   seme => 'Send message to member when clicking Done on Tasks'
                 );
       } else {
           %lt = (
                   conf => 'Course Settings',
                   edit => 'Edit Course Settings',
                   gens => 'General course settings',
                   idnu => 'Course ID or number',
                   desc => 'Course Description',
                   cred => 'Student credits', 
                   ownr => 'Course Owner',
                   cown => 'Course Co-owners',
                   catg => 'Categorize course',
                   excc => 'Exclude from course catalog',
                   clon => 'Users allowed to clone course',
                   rept => 'Replacement titles for standard course roles',
                   time => 'Timezone in which the course takes place',
                   date => 'Locale used for course calendar',
                   coco => 'Course Content',
                   copo => 'Course Policy',
                   priv => 'Domain Coordinators in course',
                   defd => 'Default dates for student access',
                   stuv => 'Student-viewable classlist options',
                   stul => 'Student agreement needed to be listed',
                   clas => 'Classlists and staff listing',
                   priv => 'Privileged users (Domain Coordinators) in staff listing',
                   defc => 'Default Course Spreadsheet',
                   defs => 'Default Student Spreadsheet',
                   seme => 'Send message to student when clicking Done on Tasks',
                 );
       }
       $lt{'lcrv'} = 'Required LON-CAPA version';
     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/courseprefs',      &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/courseprefs',
         text=>"Course Configuration"});          text=>$lt{'conf'}});
     my $breadcrumbs =      my $breadcrumbs =
         &Apache::lonhtmlcommon::breadcrumbs('Edit Course Configuration');          &Apache::lonhtmlcommon::breadcrumbs($lt{'edit'});
   
     my $phase = 'pickactions';      my $phase = 'pickactions';
     if ( exists($env{'form.phase'}) ) {      if ( exists($env{'form.phase'}) ) {
Line 84  sub handler { Line 334  sub handler {
     }      }
   
     if ($phase eq 'categorizecourse') {      if ($phase eq 'categorizecourse') {
         &assign_course_categories($r);          &assign_course_categories($r,$crstype);
         return OK;          return OK;
     }      }
   
       if ($phase eq 'releaseinfo') {
           my $loncaparev = $env{'course.'.$cid.'.internal.releaserequired'};
           if ($loncaparev) { 
               &display_loncaparev_constraints($r,$navmap,$loncaparev,$crstype);
               return OK;
           }
       }
   
     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',
Line 95  sub handler { Line 353  sub handler {
   
     my %prefs = (      my %prefs = (
         'courseinfo' =>          'courseinfo' =>
                    { text => 'General course settings',                     { text => $lt{'gens'},
                      help => 'Course_Environment',                       help => 'Course_Prefs_General',
                      header => [{col1 => 'Setting',                       ordered => ['owner','co-owners','loncaparev','description',
                                  col2 => 'Value'}],                                   'courseid','categories','hidefromcat',
                      ordered => ['description','courseid','categories',                                   'externalsyllabus','cloners','url','rolenames'],
                                  'hidefromcat','cloners','externalsyllabus',  
                                  'url','rolenames'],  
                      itemtext => {                       itemtext => {
                                    description      => 'Course Description',                                     'owner'            => $lt{'ownr'},
                                    courseid         => 'Course ID or number',                                     'co-owners'        => $lt{'cown'},
                                    categories       => 'Categorize course',                                     'description'      => $lt{'desc'},
                                    hidefromcat      => 'Exclude from course catalog',                                     'courseid'         => $lt{'idnu'},
                                    cloners          => 'Users allowed to clone course',                                      'categories'       => $lt{'catg'},
                                    externalsyllabus => 'URL of Syllabus',                                     'hidefromcat'      => $lt{'excc'},
                                    url              => 'Top Level Map',                                     'cloners'          => $lt{'clon'}, 
                                    rolenames        => 'Replacement titles for standard course roles',                                     'externalsyllabus' => 'URL of Syllabus',
                                      'url'              => 'Top Level Map',
                                      'rolenames'        => $lt{'rept'},
                                      'loncaparev'       => $lt{'lcrv'},
                                  },                                   },
                     },                      },
         'localization' =>          'localization' =>
                     { text => 'Language/TimeZone/Locale',                      { text => 'Language and time localization',
                       help => 'Course_Environment',                        help => 'Course_Prefs_Language',
                       header => [{col1 => 'Setting',  
                                   col2 => 'Value',}],  
                       ordered => ['languages','timezone','datelocale'],                        ordered => ['languages','timezone','datelocale'],
                       itemtext => {                        itemtext => {
                                     languages  => 'Languages used',                                      languages  => 'Languages used',
                                     timezone   => 'Timezone in which the course takes place',                                      timezone   => $lt{'time'}, 
                                     datelocale => 'Locale used for course calendar',                                      datelocale => $lt{'date'},
                                   },                                    },
                     },                      },
         'feedback' =>          'feedback' =>
                     { text => 'Feedback messages',                      { text => 'Feedback messages',
                       help => 'Course_Environment',                        help => 'Course_Prefs_Feedback',
                       header => [{col1 => 'Questions about:',                        header => [{col1 => 'Questions about:',
                                   col2 => 'Recipients'},                                    col2 => 'Recipients'}],
                                  {col1 => 'Questions about:',  
                                   col2 => 'Custom Text'}],  
                       ordered => ['question.email','comment.email','policy.email'],                        ordered => ['question.email','comment.email','policy.email'],
                       itemtext => {                        itemtext => {
                                      'question.email' => 'Resource Content',                                       'question.email' => 'Resource Content',
                                      'comment.email'  => 'Course Content',                                       'comment.email'  => $lt{'coco'},
                                      'policy.email'   => 'Course Policy',                                       'policy.email'   => $lt{'copo'},
                                   },                                    },
                     },                      },
         'discussion' =>          'discussion' =>
                     { text => 'Discussion and Chat',                      { text => 'Discussion and Chat',
                       help => 'Course_Environment',                        help => 'Course_Prefs_Discussions',
                       header => [{col1 => 'Setting',                        ordered => ['pch.roles.denied','pch.users.denied',
                                   col2 => 'Value',}],                                    'plc.roles.denied','plc.users.denied',
                       ordered => ['plc.roles.denied','plc.users.denied',  
                                   'pch.roles.denied','pch.users.denied',  
                                   'allow_limited_html_in_feedback',                                    'allow_limited_html_in_feedback',
                                   'allow_discussion_post_editing'],                                    'allow_discussion_post_editing',
                                     'discussion_post_fonts'],
                       itemtext => {                        itemtext => {
                          'plc.roles.denied'             => 'No Resource Discussion',                           'pch.roles.denied'             => 'No Resource Discussion',
                          'plc.users.denied'             => 'No Resource Discussion',                           'pch.users.denied'             => 'No Resource Discussion',
                          'pch.roles.denied'             => 'No Chat room use',                           'plc.roles.denied'             => 'No Chat room use',
                          'pch.users.denied'             => 'No Chat room use',                           'plc.users.denied'             => 'No Chat room use',
                          allow_limited_html_in_feedback => 'Allow limited HTML in discussion posts',                           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',
                                   },                                    },
                     },                      },
         'classlists' =>          'classlists' =>
                    { text => 'Classlists and Staff Listing',                     { text => $lt{'clas'},
                      help => 'Course_Environment',                       help => 'Course_Prefs_Classlists',
                      header => [{col1 => 'Type',                       header => [{col1 => 'Type',
                                  col2 => 'Default dates for student access'},                                   col2 => $lt{'defd'}},
                                 {col1 => 'Setting',                                  {col1 => 'Setting',
                                  col2 => 'Privileged users (Domain Coordinators) in staff listing'},                                   col2 => $lt{'priv'}},
                                 {col1 => 'Setting',                                  {col1 => 'Setting',
                                  col2 => 'Student-viewable classlist options'}],                                   col2 => $lt{'stuv'}}],
                      ordered => ['default_enrollment_start_date',                       ordered => ['default_enrollment_start_date',
                                  'default_enrollment_end_date',                                   'default_enrollment_end_date',
                                    'defaultcredits',
                                  'nothideprivileged','student_classlist_view',                                   'nothideprivileged','student_classlist_view',
                                  'student_opt_in','student_classlist_portfiles'],                                   'student_classlist_opt_in','student_classlist_portfiles'],
                      itemtext => {                       itemtext => {
                          default_enrollment_start_date => 'Start date',                           default_enrollment_start_date => 'Start date',
                          default_enrollment_end_date   => 'End date',                           default_enrollment_end_date   => 'End date',
                          nothideprivileged             => 'Domain Coodinators in course',                           nothideprivileged             => $lt{'priv'},
                          student_classlist_view        => 'Student-viewable classlist',                           student_classlist_view        => $lt{'stuv'},
                          student_opt_in                => 'Student agreement needed to be listed',                           student_classlist_opt_in      => $lt{'stul'},
                          student_classlist_portfiles   => 'Include link to accessible portfolio files',                           student_classlist_portfiles   => 'Include link to accessible portfolio files',
                            defaultcredits                => $lt{'cred'},
                                   },                                    },
                    },                     },
         'appearance' =>          'appearance' =>
                    { text => 'Display of resources ',                     { text => 'Display of resources ',
                      help => 'Course_Environment',                       help => 'Course_Prefs_Display',
                      header => [{col1 => 'Setting',  
                                  col2 => 'Value'}],  
                      ordered => ['default_xml_style','pageseparators',                       ordered => ['default_xml_style','pageseparators',
                                  'disable_receipt_display','texengine',                                   'disable_receipt_display','texengine',
                                  'tthoptions'],                                   'tthoptions'],
                       itemtext => {                        itemtext => {
                           default_xml_style       => 'Default XML Style File',                            default_xml_style       => 'Default XML style file',
                           pageseparators          => 'Visibly Separate Items on Pages',                            pageseparators          => 'Visibly Separate Items on Pages',
                           disable_receipt_display => 'Disable display of problem receipts',                            disable_receipt_display => 'Disable display of problem receipts',
                           texengine               => 'Force use of a specific math rendering engine',                            texengine               => 'Force use of a specific math rendering engine',
Line 197  sub handler { Line 452  sub handler {
                   },                    },
         'grading' =>          'grading' =>
                   { text => 'Grading',                    { text => 'Grading',
                     help => 'Course_Environment',                      help => 'Course_Prefs_Grading',
                     header => [{col1 => 'Setting',  
                                 col2 => 'Value',}],  
                     ordered => ['grading','rndseed',                      ordered => ['grading','rndseed',
                                 'receiptalg','disablesigfigs'],                                  'receiptalg','disablesigfigs'],
                     itemtext => {                      itemtext => {
Line 212  sub handler { Line 465  sub handler {
                   },                    },
         'printouts' =>          'printouts' =>
                   { text => 'Printout generation',                    { text => 'Printout generation',
                     help => 'Course_Environment',                      help => 'Course_Prefs_Printouts',
                     header => [{col1 => 'Setting',  
                                 col2 => 'Value',}],  
                     ordered => ['problem_stream_switch','suppress_tries',                      ordered => ['problem_stream_switch','suppress_tries',
                                 'default_paper_size','print_header_format',                                  'default_paper_size','print_header_format',
                                 'disableexampointprint'],                                  'disableexampointprint','canuse_pdfforms'],
                     itemtext => {                      itemtext => {
                         problem_stream_switch => 'Allow problems to be split over pages',                          problem_stream_switch => 'Allow problems to be split over pages',
                         suppress_tries        => 'Suppress number of tries in printing',                          suppress_tries        => 'Suppress number of tries in printing',
                         default_paper_size    => 'Default paper type',                          default_paper_size    => 'Default paper type',
                         print_header_format   => 'Print header format',                          print_header_format   => 'Print header format',
                         disableexampointprint => 'Disable automatically printing point values on exams',                          disableexampointprint => 'Disable automatically printing point values on bubblesheet exams',
                           canuse_pdfforms    => 'Users can print problems as PDF forms and upload later for grading',
                                 },                                  },
                   },                    },
         'spreadsheet' =>          'spreadsheet' =>
                   { text => 'Spreadsheets',                    { text => 'Spreadsheets',
                     help => 'Course_Environment',                      help => 'Course_Prefs_Spreadsheet',
                     header => [{col1 => 'Setting',  
                                 col2 => 'Value'}],  
                     ordered => ['spreadsheet_default_classcalc',                      ordered => ['spreadsheet_default_classcalc',
                                 'spreadsheet_default_studentcalc',                                  'spreadsheet_default_studentcalc',
                                 'spreadsheet_default_assesscalc','hideemptyrows'],                                  'spreadsheet_default_assesscalc','hideemptyrows'],
                     itemtext => {                      itemtext => {
                                   spreadsheet_default_classcalc   => 'Default Course Spreadsheet',                                    spreadsheet_default_classcalc   => $lt{'defc'},
                                   spreadsheet_default_studentcalc => 'Default Student Spreadsheet',                                    spreadsheet_default_studentcalc => $lt{'defs'},
                                   spreadsheet_default_assesscalc  => 'Default Assessment Spreadsheet',                                    spreadsheet_default_assesscalc  => 'Default Assessment Spreadsheet',
                                   hideemptyrows                   => 'Hide Empty Rows in Spreadsheets',                                    hideemptyrows                   => 'Hide Empty Rows in Spreadsheets',
                                 },                                  },
                   },                    },
         'bridgetasks' =>          'bridgetasks' =>
                   { text => 'Bridge tasks',                    { text => 'Bridge tasks',
                     help => 'Course_Environment',                      help => 'Course_Prefs_Bridgetasks',
                     header => [{col1 => 'Setting',  
                                 col2 => 'Value'}],  
                     ordered => ['task_messages','task_grading',                      ordered => ['task_messages','task_grading',
                                 'suppress_embed_prompt'],                                  'suppress_embed_prompt'],
                     itemtext => {                      itemtext => {
                         task_messages         => 'Send message to student when clicking Done on Tasks',                          task_messages         => $lt{'seme'},
                         task_grading          => 'Bridge Task grading by instructors and TAs in sections' ,                          task_grading          => 'Bridge Task grading by instructors and TAs in sections' ,
                         suppress_embed_prompt => 'Hide upload references prompt if uploading file to portfolio',                          suppress_embed_prompt => 'Hide upload references prompt if uploading file to portfolio',
                                 },                                  },
                   },                    },
         'other' =>          'other' =>
                   { text => 'Other settings',                    { text => 'Other settings',
                     help => 'Course_Environment',                      help => 'Course_Prefs_Other',
                     header => [ {col1 => 'Item',                      header => [ {col1 => 'Item',
                                  col2 => 'Value',                                   col2 => 'Value',
                               }],                                }],
Line 266  sub handler { Line 514  sub handler {
         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);                                                    $cnum,undef,\@allitems,'coursepref');
     } elsif ($phase eq 'display') {      } elsif ($phase eq 'display') {
         my $jscript = &get_jscript($cdom,$phase);          my $jscript = &get_jscript($cid,$cdom,$phase,$crstype);
         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);              \@prefs_order,\%prefs,\%values,undef,$jscript,\@allitems,$crstype,'coursepref');
     } else {      } else {
         &Apache::lonconfigsettings::display_choices($r,$phase,$context,          &Apache::lonconfigsettings::display_choices($r,$phase,$context,
                                                     \@prefs_order,\%prefs);                                                      \@prefs_order,\%prefs,'coursepref');
     }      }
     return OK;      return OK;
 }  }
Line 296  sub get_allitems { Line 544  sub get_allitems {
 }  }
   
 sub print_config_box {  sub print_config_box {
     my ($r,$cdom,$phase,$action,$item,$settings,$allitems) = @_;      my ($r,$cdom,$phase,$action,$item,$settings,$allitems,$crstype) = @_;
     my $ordered = $item->{'ordered'};      my $ordered = $item->{'ordered'};
     my $itemtext = $item->{'itemtext'};      my $itemtext = $item->{'itemtext'};
     my $rowtotal = 0;      my $rowtotal = 0;
     my $output =      my $output =
          '<table class="LC_nested_outer">           '<table class="LC_nested_outer">
           <tr>            <tr>
            <th align="left" valign="middle"><span class="LC_font_larger">'.             <th align="left" valign="middle"><span class="LC_nobreak" style="font-size: larger;" >'.
            &mt($item->{text}).'&nbsp;'.             &mt($item->{text});
            &Apache::loncommon::help_open_topic($item->{'help'}).'</span></th>'."\n".      if ($item->{'help'}) {
           '</tr>';          $output .= '&nbsp;'.
                      &Apache::loncommon::help_open_topic($item->{'help'});
       }
       $output .= '</span></th>'."\n".
                  '</tr>';
     if (($action eq 'feedback') || ($action eq 'classlists')) {      if (($action eq 'feedback') || ($action eq 'classlists')) {
         $output .= '          $output .= '
           <tr>            <tr>
            <td>             <td>
             <table class="LC_nested">              <table class="LC_nested">';   
              <tr class="LC_info_row">          if (exists $item->{'header'}->[0]->{'col1'} || 
               exists $item->{'header'}->[0]->{'col2'}) {
    $output .= '          
             <tr class="LC_info_row">
               <td class="LC_left_item">'.&mt($item->{'header'}->[0]->{'col1'}).'</td>                <td class="LC_left_item">'.&mt($item->{'header'}->[0]->{'col1'}).'</td>
               <td class="LC_right_item">'.&mt($item->{'header'}->[0]->{'col2'}).'</td>                <td class="LC_right_item">'.&mt($item->{'header'}->[0]->{'col2'}).'</td>
              </tr>';              </tr>';
           }
         $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);
         } elsif ($action eq 'classlists') {          } elsif ($action eq 'classlists') {
             $output .= &print_classlists('top',$cdom,$settings,$itemtext,\$rowtotal);              $output .= &print_classlists('top',$cdom,$settings,$itemtext,\$rowtotal,$crstype);
         }          }
         $output .= '          $output .= '
            </table>             </table>
           </td>            </td>
          </tr>           </tr>
          <tr>           <tr>
            <td>            <td>
             <table class="LC_nested">              <table class="LC_nested">
              <tr class="LC_info_row">               <tr class="LC_info_row">
               <td class="LC_left_item">'.&mt($item->{'header'}->[1]->{'col1'}).'</td>';                <td class="LC_left_item">'.&mt($item->{'header'}->[1]->{'col1'}).'</td>';
Line 335  sub print_config_box { Line 591  sub print_config_box {
               <td class="LC_right_item">'.&mt($item->{'header'}->[1]->{'col2'}).'</td>                <td class="LC_right_item">'.&mt($item->{'header'}->[1]->{'col2'}).'</td>
              </tr>';               </tr>';
         if ($action eq 'classlists') {          if ($action eq 'classlists') {
             $output .= &print_classlists('middle',$cdom,$settings,$itemtext,\$rowtotal).              $output .= &print_classlists('middle',$cdom,$settings,$itemtext,\$rowtotal,$crstype).
                        '                         '
             </table>              </table>
            </td>             </td>
           </tr>            </tr>
           <tr>            <tr>
            <td>             <td>
             <table class="LC_nested">              <table class="LC_nested">';
              <tr class="LC_info_row">              if (exists $item->{'header'}->[2]->{'col1'} || 
               <td class="LC_left_item" valign="top">'.&mt($item->{'header'}->[2]->{'col1'}).'</td>              exists $item->{'header'}->[2]->{'col2'}) {
               <td class="LC_right_item" valign="top">'.&mt($item->{'header'}->[2]->{'col2'}).'</td>   $output .= '          
              </tr>';   <tr class="LC_info_row">
     <td class="LC_left_item">'.&mt($item->{'header'}->[2]->{'col1'}).'</td>
     <td class="LC_right_item">'.&mt($item->{'header'}->[2]->{'col2'}).'</td>
    </tr>';
           }
         }          }
     } else {      } else {
         $output .= '          $output .= '
           <tr>            <tr>
            <td>             <td>
             <table class="LC_nested">              <table class="LC_nested">';
              <tr class="LC_info_row">          if (exists $item->{'header'}->[0]->{'col1'} || 
               exists $item->{'header'}->[0]->{'col2'}) {
    $output .= '          
             <tr class="LC_info_row">
               <td class="LC_left_item" valign="top">'.&mt($item->{'header'}->[0]->{'col1'}).'</td>                <td class="LC_left_item" valign="top">'.&mt($item->{'header'}->[0]->{'col1'}).'</td>
               <td class="LC_right_item" valign="top">'.&mt($item->{'header'}->[0]->{'col2'}).'</td>                <td class="LC_right_item" valign="top">'.&mt($item->{'header'}->[0]->{'col2'}).'</td>
              </tr>';              </tr>';
           }
     }      }
     $rowtotal ++;      $rowtotal ++;
     if ($action eq 'courseinfo') {      if ($action eq 'courseinfo') {
         $output .= &print_courseinfo($cdom,$settings,$ordered,$itemtext,\$rowtotal);          $output .= &print_courseinfo($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype);
     } elsif ($action eq 'localization') {      } elsif ($action eq 'localization') {
         $output .= &print_localization($cdom,$settings,$ordered,$itemtext,\$rowtotal);          $output .= &print_localization($cdom,$settings,$ordered,$itemtext,\$rowtotal);
     } 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);
     } elsif ($action eq 'discussion') {      } elsif ($action eq 'discussion') {
         $output .= &print_discussion($cdom,$settings,$ordered,$itemtext,\$rowtotal);          $output .= &print_discussion($cdom,$settings,$ordered,$itemtext,\$rowtotal);
     } elsif ($action eq 'classlists') {      } elsif (($action eq 'classlists') || ($action eq 'viewableroster')) {
         $output .= &print_classlists('bottom',$cdom,$settings,$itemtext,\$rowtotal);          $output .= &print_classlists('bottom',$cdom,$settings,$itemtext,\$rowtotal,$crstype);
     } elsif ($action eq 'appearance') {      } elsif ($action eq 'appearance') {
         $output .= &print_appearance($cdom,$settings,$ordered,$itemtext,\$rowtotal);          $output .= &print_appearance($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype);
     } elsif ($action eq 'grading') {      } elsif ($action eq 'grading') {
         $output .= &print_grading($cdom,$settings,$ordered,$itemtext,\$rowtotal);          $output .= &print_grading($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype);
     } elsif ($action eq 'printouts') {      } elsif ($action eq 'printouts') {
         $output .= &print_printouts($cdom,$settings,$ordered,$itemtext,\$rowtotal);          $output .= &print_printouts($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype);
     } elsif ($action eq 'spreadsheet') {      } elsif ($action eq 'spreadsheet') {
         $output .= &print_spreadsheet($cdom,$settings,$ordered,$itemtext,\$rowtotal);          $output .= &print_spreadsheet($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype);
     } elsif ($action eq 'bridgetasks') {      } elsif ($action eq 'bridgetasks') {
         $output .= &print_bridgetasks($cdom,$settings,$ordered,$itemtext,\$rowtotal);          $output .= &print_bridgetasks($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype);
     } elsif ($action eq 'other') {      } elsif ($action eq 'other') {
         $output .= &print_other($cdom,$settings,$allitems,\$rowtotal);          $output .= &print_other($cdom,$settings,$allitems,\$rowtotal,$crstype);
     }      }
     $output .= '      $output .= '
    </table>     </table>
Line 391  sub print_config_box { Line 655  sub print_config_box {
 }  }
   
 sub process_changes {  sub process_changes {
     my ($cdom,$action,$values,$item,$changes,$allitems,$disallowed) = @_;      my ($cdom,$action,$values,$item,$changes,$allitems,$disallowed,$crstype) = @_;
     my %newvalues;      my %newvalues;
     if (ref($item) eq 'HASH') {      if (ref($item) eq 'HASH') {
         if (ref($changes) eq 'HASH') {          if (ref($changes) eq 'HASH') {
Line 410  sub process_changes { Line 674  sub process_changes {
                     }                      }
                 }                  }
             } elsif (ref($item->{'ordered'}) eq 'ARRAY') {              } elsif (ref($item->{'ordered'}) eq 'ARRAY') {
                 @ordered = @{$item->{'ordered'}};                  if ($action eq 'courseinfo') {
                       my ($can_toggle_cat,$can_categorize) =
                           &can_modify_catsettings($cdom,$crstype);
                       foreach my $entry (@{$item->{'ordered'}}) {
                           next if (($entry eq 'hidefromcat') &&
                                    (!$can_toggle_cat));
                           next if (($entry eq 'categories') &&
                                    (!$can_categorize));
                           next if (($entry eq 'loncaparev') || 
                                   ($entry eq 'owner'));
                           push(@ordered,$entry);
                       }
                   } elsif ($action eq 'classlists') {
                       foreach my $entry (@{$item->{'ordered'}}) {
                           next if ($entry eq 'defaultcredits');
                           push(@ordered,$entry);
                       }
                   } else {
                       @ordered = @{$item->{'ordered'}};
                   }
             }              }
             if (@ordered > 0) {              if (@ordered > 0) {
                 if ($action eq 'feedback') {                  if ($action eq 'feedback') {
Line 460  sub process_changes { Line 743  sub process_changes {
                                 if (exists($env{'form.cloners_activate'})) {                                  if (exists($env{'form.cloners_activate'})) {
                                     my $actnum = $env{'form.cloners_activate'};                                      my $actnum = $env{'form.cloners_activate'};
                                     if ($actnum ne '') {                                      if ($actnum ne '') {
                                         if ($env{'form.clonersdom_'.$actnum} ne '') {                                          if ($env{'form.cloners_dom_'.$actnum} ne '') {
                                             my $clonedom = $env{'form.clonersdom_'.$actnum};                                              my $clonedom = $env{'form.cloners_dom_'.$actnum};
                                             if (&check_clone($clonedom,$disallowed) eq 'ok') {                                              if (&check_clone($clonedom,$disallowed) eq 'ok') {
                                                 $newvalues{$entry} = '*:'.$clonedom;                                                  $newvalues{$entry} = '*:'.$clonedom;
                                                 push(@clonedoms,$newvalues{$entry});                                                  push(@clonedoms,$newvalues{$entry});
Line 503  sub process_changes { Line 786  sub process_changes {
                                     my @cloners = split(',',$env{'form.'.$entry});                                      my @cloners = split(',',$env{'form.'.$entry});
                                     my @okcloners;                                      my @okcloners;
                                     foreach my $cloner (@cloners) {                                      foreach my $cloner (@cloners) {
                                         my ($uname,$udom) = split(':',$cloner);                                          $cloner =~ s/^\s+//;
                                         if (&check_clone($udom,$disallowed,$uname) eq 'ok') {                                          $cloner =~ s/\s+$//;
                                             if (!grep(/^\Q$cloner\E$/,@okcloners)) {                                          unless ($cloner eq '') {
                                                 push(@okcloners,$cloner);                                              my ($uname,$udom) = split(':',$cloner);
                                               if (&check_clone($udom,$disallowed,$uname) eq 'ok') {
                                                   if (!grep(/^\Q$cloner\E$/,@okcloners)) {
                                                       push(@okcloners,$cloner);
                                                   }
                                             }                                              }
                                         }                                          }
                                     }                                      }
Line 527  sub process_changes { Line 814  sub process_changes {
                                     }                                      }
                                 }                                  }
                             }                              }
                           } elsif ($entry eq 'co-owners') {
                               my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                               my $coowners = $values->{'internal.co-owners'};
                               my @currcoown;
                               if ($coowners) {
                                   @currcoown = split(',',$coowners);
                               }
                               if (&Apache::lonnet::is_course_owner($cdom,$cnum)) {
                                   my $autocoowner;
                                   if (($crstype eq 'Course') && 
                                       ($values->{'internal.coursecode'})) {
                                       my %domconf =
                                           &Apache::lonnet::get_dom('configuration',['autoenroll'],$cdom);
                                       if (ref($domconf{'autoenroll'}) eq 'HASH') {
                                           $autocoowner = $domconf{'autoenroll'}{'co-owners'};
                                       }
                                   }
                                   unless ($autocoowner) {
                                       my @keepcoowners = &Apache::loncommon::get_env_multiple('form.coowners');
                                       my @pendingcoowners = &Apache::loncommon::get_env_multiple('form.pendingcoowners');
                                       my @invitecoowners =  &Apache::loncommon::get_env_multiple('form.invitecoowners');
                                       if (@invitecoowners) {
                                           push(@pendingcoowners,@invitecoowners);
                                       }
                                       $newvalues{'pendingco-owners'} = join(',',sort(@pendingcoowners));
                                       $newvalues{'co-owners'} = join(',',sort(@keepcoowners));
                                       if ($newvalues{'co-owners'} ne $values->{'internal.co-owners'}) {
                                           $changes->{$entry}{'co-owners'} = $newvalues{'co-owners'};
                                           push(@{$changes->{$entry}{'changed'}},'co-owners');
                                       }
                                       if ($newvalues{'pendingco-owners'} ne $values->{'internal.pendingco-owners'}) {
                                           $changes->{$entry}{'pendingco-owners'} = $newvalues{'pendingco-owners'};
                                           push(@{$changes->{$entry}{'changed'}},'pendingco-owners');
                                       }
                                   }
                               } else {
                                   my (@newpending,@newcoown);
                                   my $uname = $env{'user.name'};
                                   my $udom = $env{'user.domain'};
                                   my $pendingcoowners = $values->{'internal.pendingco-owners'};
                                   my @pendingcoown = split(',',$pendingcoowners);
                                   if ($env{'form.pending_coowoner'}) {
                                       foreach my $item (@pendingcoown) {
                                           unless ($item eq $uname.':'.$udom) {
                                               push(@newpending,$item);
                                           }
                                       }
                                       @newcoown = @currcoown;
                                       if ($env{'form.pending_coowoner'} eq 'accept') {
                                           unless (grep(/^\Q$uname\E:\Q$udom\E$/,@currcoown)) {
                                               push(@newcoown,$uname.':'.$udom);
                                           }
                                       }
                                   } elsif ($env{'form.remove_coowoner'}) {
                                       foreach my $item (@currcoown) {
                                           unless ($item eq $uname.':'.$udom) {
                                               push(@newcoown,$item);
                                           }
                                       }
                                       if ($pendingcoowners ne '') {
                                           @newpending = @pendingcoown;
                                       }
                                   }
                                   $newvalues{'pendingco-owners'} = join(',',sort(@newpending));
                                   $newvalues{'co-owners'} = join(',',sort(@newcoown));
                                   if ($newvalues{'co-owners'} ne $values->{'internal.co-owners'}) {
                                       $changes->{$entry}{'co-owners'} = $newvalues{'co-owners'};
                                       push(@{$changes->{$entry}{'changed'}},'co-owners');
                                   }
                                   if ($newvalues{'pendingco-owners'} ne $values->{'internal.pendingco-owners'}) {
                                       $changes->{$entry}{'pendingco-owners'} = $newvalues{'pendingco-owners'};
                                       push(@{$changes->{$entry}{'changed'}},'pendingco-owners');
                                   }
                               }
                         } elsif ($entry =~ /^default_enrollment_(start|end)_date$/) {                          } elsif ($entry =~ /^default_enrollment_(start|end)_date$/) {
                             $newvalues{$entry}=&Apache::lonhtmlcommon::get_date_from_form($entry);                              $newvalues{$entry}=&Apache::lonhtmlcommon::get_date_from_form($entry);
                         } elsif ($entry eq 'rolenames') {                          } elsif ($entry eq 'rolenames') {
                             my $crstype = &Apache::loncommon::course_type();  
                             my %adv_roles =                              my %adv_roles =
                                 &Apache::lonnet::get_course_adv_roles($env{'request.course.id'},1);                                  &Apache::lonnet::get_course_adv_roles($env{'request.course.id'},1);
                             my @stds = ('cc','in','ta','ep','ad','st');                              my @stds;
                               if ($crstype eq 'Community') {
                                   @stds = ('co');
                               } else {
                                   @stds = ('cc');
                               }
                               push(@stds,('in','ta','ep','ad','st'));
                             my (@replacements,@regulars);                              my (@replacements,@regulars);
                             foreach my $role (@stds) {                              foreach my $role (@stds) {
                                 if ($values->{$role.'.plaintext'} ne '') {                                  if ($values->{$role.'.plaintext'} ne '') {
                                     push(@replacements,$role);                                        push(@replacements,$role);
                                 } else {                                  } else {
                                     push(@regulars,$role);                                      push(@regulars,$role);
                                 }                                  }
                             }                               }
                             foreach my $stdrole (@stds) {                              foreach my $stdrole (@stds) {
                                 my $ext_entry = $entry.'_'.$stdrole;                                  my $ext_entry = $entry.'_'.$stdrole;
                                 my $stdname = &Apache::lonnet::plaintext($stdrole,$crstype,                                  my $stdname = &Apache::lonnet::plaintext($stdrole,$crstype,
Line 554  sub process_changes { Line 920  sub process_changes {
                                 if ($newvalues{$ext_entry} ne $values->{$stdrole.'.plaintext'}) {                                  if ($newvalues{$ext_entry} ne $values->{$stdrole.'.plaintext'}) {
                                     my $dupname = 0;                                      my $dupname = 0;
                                     if ($newvalues{$ext_entry} ne '') {                                      if ($newvalues{$ext_entry} ne '') {
                                         my $dupname = 0;  
                                         if (grep(/^\Q$newvalues{$ext_entry}\E$/,@replacements)) {                                          if (grep(/^\Q$newvalues{$ext_entry}\E$/,@replacements)) {
                                             $dupname = 1;                                              $dupname = 1;
                                             push(@{$disallowed->{'rolenames'}{'replacements'}},$newvalues{$ext_entry});                                              push(@{$disallowed->{'rolenames'}{'replacements'}},$newvalues{$ext_entry});
Line 636  sub process_changes { Line 1001  sub process_changes {
                                 }                                  }
                             }                              }
                             $newvalues{$entry} =~ s/,$//;                              $newvalues{$entry} =~ s/,$//;
                           } elsif ($entry eq 'discussion_post_fonts') {
                               my ($classorder,$classtitles) = &discussion_vote_classes();
                               my $fontchange = 0;
                               foreach my $class (@{$classorder}) {
                                   my $ext_entry = $entry.'_'.$class; 
                                   my $size = $env{'form.'.$ext_entry.'_size'};
                                   my $unit = $env{'form.'.$ext_entry.'_unit'};
                                   my $weight = $env{'form.'.$ext_entry.'_weight'};
                                   my $style = $env{'form.'.$ext_entry.'_style'};
                                   my $other = $env{'form.'.$ext_entry.'_other'};
                                   $size =~ s/,//g;
                                   $unit =~ s/,//g; 
                                   $weight =~ s/,//g;
                                   $style =~ s/,//g;
                                   $other =~ s/[^\w;:\s\-\%.]//g;
                                   $other =~ s/(^\s+|\s+$)//g;
                                   $newvalues{$ext_entry} = join(',',($size.$unit,$weight,$style,$other));
                                   my $current = $values->{$ext_entry};
                                   if ($values->{$ext_entry} eq '') {
                                       $current = ',,,'; 
                                   }
                                   if ($newvalues{$ext_entry} ne $current) {
                                       $changes->{$ext_entry} = $newvalues{$ext_entry};
                                       $fontchange ++;
                                   }
                               }
                               if ($fontchange) {
                                   $changes->{$entry} = 1;
                               } 
                         } elsif ($entry eq 'nothideprivileged') {                          } elsif ($entry eq 'nothideprivileged') {
                             my @curr_nothide;                              my @curr_nothide;
                             my @new_nothide;                              my @new_nothide;
Line 655  sub process_changes { Line 1049  sub process_changes {
                             }                              }
                             foreach my $key (keys(%env)) {                              foreach my $key (keys(%env)) {
                                 if ($key =~ /^form\.\Q$entry\E_($match_username:$match_domain)$/) {                                  if ($key =~ /^form\.\Q$entry\E_($match_username:$match_domain)$/) {
                                     if ($env{'form.'.$key}) {                                      if ($env{$key}) {
                                        my $nothide = $1;                                         my $nothide = $1;
                                        if (!grep(/^\Q$nothide\E$/,@new_nothide)) {                                         if (!grep(/^\Q$nothide\E$/,@new_nothide)) {
                                            push(@new_nothide,$nothide);                                              push(@new_nothide,$nothide); 
Line 691  sub process_changes { Line 1085  sub process_changes {
                                                 $hdr .= $env{'form.printfmthdr_limit_'.$i};                                                  $hdr .= $env{'form.printfmthdr_limit_'.$i};
                                             }                                              }
                                             $hdr .= $env{'form.printfmthdr_sub_'.$i};                                              $hdr .= $env{'form.printfmthdr_sub_'.$i};
                                         } elsif ($env{'form.printfmthdr_sub_'.$i} ne '') {                                          } elsif ($env{'form.printfmthdr_text_'.$i} ne '') {
                                             $hdr = $env{'form.printfmthdr_sub_'.$i};                                              $hdr = $env{'form.printfmthdr_text_'.$i};
                                         }                                          }
                                         $newhdr[$env{'form.printfmthdr_pos_'.$i}] = $hdr;                                          $newhdr[$env{'form.printfmthdr_pos_'.$i}] = $hdr;
                                     }                                      }
Line 739  sub process_changes { Line 1133  sub process_changes {
                         } else {                          } else {
                             $newvalues{$entry} = $env{'form.'.$entry};                              $newvalues{$entry} = $env{'form.'.$entry};
                         }                          }
                         if ($newvalues{$entry} ne $values->{$entry}) {                          unless (($entry eq 'co-owners') || ($entry eq 'discussion_post_fonts')) {
                             $changes->{$entry} = $newvalues{$entry};                              if ($newvalues{$entry} ne $values->{$entry}) {
                                   $changes->{$entry} = $newvalues{$entry};
                               }
                         }                          }
                     }                      }
                 }                  }
Line 790  sub check_clone { Line 1186  sub check_clone {
 }  }
   
 sub store_changes {  sub store_changes {
     my ($cdom,$cnum,$prefs_order,$actions,$prefs,$values,$changes) = @_;      my ($cdom,$cnum,$prefs_order,$actions,$prefs,$values,$changes,$crstype) = @_;
     my ($chome,$output);      my ($chome,$output);
     my (%storehash,@delkeys,@need_env_update);      my (%storehash,@delkeys,@need_env_update,@oldcloner);
     if ((ref($values) eq 'HASH') && (ref($changes) eq 'HASH')) {      if ((ref($values) eq 'HASH') && (ref($changes) eq 'HASH')) {
         %storehash = %{$values};          %storehash = %{$values};
     } else {      } else {
         $output = &mt('No changes made to course settings.');          if ($crstype eq 'Community') {
         return;              $output = &mt('No changes made to community settings.');
           } else {
               $output = &mt('No changes made to course settings.');
           }
           return $output;
     }      }
     my %yesno = (      my %yesno = (
                  hidefromcat           => '1',                   hidefromcat           => '1',
Line 812  sub store_changes { Line 1212  sub store_changes {
             $output .= '<h3>'.&mt($prefs->{$item}{'text'}).'</h3>';              $output .= '<h3>'.&mt($prefs->{$item}{'text'}).'</h3>';
             if (ref($changes->{$item}) eq 'HASH') {              if (ref($changes->{$item}) eq 'HASH') {
                 if (keys(%{$changes->{$item}}) > 0) {                  if (keys(%{$changes->{$item}}) > 0) {
                     $output .= &mt('Changes made:').'<ul>';                      $output .= &mt('Changes made:').'<ul style="list-style:none;">';
                     if ($item eq 'other') {                      if ($item eq 'other') {
                         foreach my $key (sort(keys(%{$changes->{$item}}))) {                          foreach my $key (sort(keys(%{$changes->{$item}}))) {
                             $storehash{$key} = $changes->{$item}{$key};                              $storehash{$key} = $changes->{$item}{$key};
                             if ($changes->{$item}{$key} eq '') {                              if ($changes->{$item}{$key} eq '') {
                                 push(@delkeys,$key);                                  push(@delkeys,$key);
                                 $output .= '<li>'.&mt('Deleted setting for [_1]','<i>'.$key.'</i>').'</li>';                                  $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('Deleted setting for [_1]','<i>'.$key.'</i>')).'</li>';
                             } else {                              } else {
                                 $output .= '<li>'.&mt('[_1] set to [_2]','<i>'.$key.'</i>',                                  $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]','<i>'.$key.'</i>',
                                            "'$storehash{$key}'").'</li>';                                             "'$storehash{$key}'")).'</li>';
                             }                              }
                         }                          }
                     } else {                      } else {
Line 833  sub store_changes { Line 1233  sub store_changes {
                             foreach my $key (@settings) {                              foreach my $key (@settings) {
                                 if ($key eq 'rolenames') {                                  if ($key eq 'rolenames') {
                                     my $displayname = $prefs->{$item}->{'itemtext'}{$key};                                      my $displayname = $prefs->{$item}->{'itemtext'}{$key};
                                     my $crstype = &Apache::loncommon::course_type();  
                                     my $msg;                                      my $msg;
                                     foreach my $role ('cc','in','ta','ep','ad','st') {                                      my @roles;
                                       if ($crstype eq 'Community') {
                                           @roles = ('co');
                                       } else {
                                           @roles = ('cc');
                                       }
                                       push(@roles,('in','ta','ep','ad','st'));
                                       foreach my $role (@roles) {
                                         next if (!exists($changes->{$item}{$key.'_'.$role}));                                          next if (!exists($changes->{$item}{$key.'_'.$role}));
                                         my $stdname = &Apache::lonnet::plaintext($role,$crstype,undef,1);                                          my $stdname = &Apache::lonnet::plaintext($role,$crstype,undef,1);
                                         my $newname = $changes->{$item}{$key.'_'.$role};                                          my $newname = $changes->{$item}{$key.'_'.$role};
Line 847  sub store_changes { Line 1253  sub store_changes {
                                                 "'<b>".$newname."</b>'").'</li>';                                                  "'<b>".$newname."</b>'").'</li>';
                                     }                                      }
                                     if ($msg ne '') {                                      if ($msg ne '') {
                                         $output .= '<li>'.&mt($displayname).'<ul>'.$msg.'</ul></li>';                                          $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt($displayname)).'<ul class="LC_success">'.$msg.'</ul></li>';
                                     }                                      }
                                 } else {                                  } else {
                                     next if (!exists($changes->{$item}{$key}));                                      next if (!exists($changes->{$item}{$key}));
                                     my ($displayname,$text);                                      my ($displayname,$text);
                                     $text = $prefs->{$item}->{'itemtext'}{$key};                                      $text = $prefs->{$item}->{'itemtext'}{$key};
                                     my $displayval = $changes->{$item}{$key};                                      my $displayval;
                                       unless (($key eq 'co-owners') || ($key eq 'discussion_post_fonts')) {
                                           $displayval = $changes->{$item}{$key};
                                       }
                                     if ($item eq 'feedback') {                                      if ($item eq 'feedback') {
                                         if ($key =~ /^(question|policy|comment)(\.email)\.text$/) {                                          if ($key =~ /^(question|policy|comment)(\.email)\.text$/) {
                                             $text = $prefs->{$item}->{'itemtext'}{$1.$2};                                              $text = $prefs->{$item}->{'itemtext'}{$1.$2};
Line 887  sub store_changes { Line 1296  sub store_changes {
                                                     }                                                      }
                                                     $displayval = join(', ',@longroles);                                                      $displayval = join(', ',@longroles);
                                                 }                                                  }
                                               } elsif ($key eq 'discussion_post_fonts') {
                                                   my ($classorder,$classtitles)=&discussion_vote_classes();
                                                   my ($styleorder,$styleitems)=&discussion_vote_styles();
                                                   my $count = 1;
                                                   my $total = scalar(keys(%{$changes->{$item}}));
                                                   foreach my $class (@{$classorder}) {
                                                       $count ++;
                                                       next unless ($changes->{$item}{$key.'_'.$class});
                                                       my @vals = split(/,/,$changes->{$item}{$key.'_'.$class});
                                                       my $showval = '';
                                                       for (my $i=0; $i<@{$styleorder}; $i++) {
                                                           if ($vals[$i] ne '') {
                                                               $showval .= 'font-'.$styleorder->[$i].': '.$vals[$i].'; ';
                                                           }
                                                       }
                                                       if ($vals[3] ne '') {
                                                           $showval .= $vals[3];
                                                       }
                                                       if ($showval ne '') {
                                                           $displayval .= $classtitles->{$class}.':{ '.
                                                                          $showval.'}';
                                                           $storehash{$key.'_'.$class} = $changes->{$item}{$key.'_'.$class};
                                                       } else {
                                                           $displayval .= $classtitles->{$class}.': '.&mt('None');
                                                           push(@delkeys,$key.'_'.$class);
                                                       }
                                                       unless ($count == $total) {
                                                           $displayval .= ('&nbsp;'x2);
                                                       }
                                                   }
                                             }                                              }
                                             $displayname = &mt($text);                                              $displayname = &mt($text);
                                         }                                          }
Line 905  sub store_changes { Line 1344  sub store_changes {
                                         $displayname = &mt($text);                                          $displayname = &mt($text);
                                     }                                      }
                                     if (defined($yesno{$key})) {                                      if (defined($yesno{$key})) {
                                         $displayval = 'no';                                          $displayval = &mt('No');
                                         if ($changes->{$item}{$key} eq 'yes') {                                          if ($changes->{$item}{$key} eq 'yes') {
                                             $displayval = 'yes';                                                                        $displayval = &mt('Yes');                          
                                         }                                          }
                                     } elsif (($key =~ /^default_enrollment_(start|end)_date$/) && ($displayval)) {                                      } elsif (($key =~ /^default_enrollment_(start|end)_date$/) && ($displayval)) {
                                         $displayval = &Apache::lonlocal::locallocaltime($displayval);                                          $displayval = &Apache::lonlocal::locallocaltime($displayval);
                                     } elsif ($key eq 'categories') {                                      } elsif ($key eq 'categories') {
                                         $displayval = $env{'form.categories_display'};                                          $displayval = $env{'form.categories_display'};
                                     }                                        } elsif ($key eq 'canuse_pdfforms') {
                                     if ($changes->{$item}{$key} eq '') {                                          if ($changes->{$item}{$key} eq '1') {
                                               $displayval = &mt('Yes');
                                           } elsif ($changes->{$item}{$key} eq '0') {
                                               $displayval = &mt('No');
                                           }
                                       }
                                       if ($key eq 'co-owners') {
                                           if (ref($changes->{$item}{$key}) eq 'HASH') {
                                               if (ref($changes->{$item}{$key}{'changed'}) eq 'ARRAY') {
                                                   foreach my $type ('co-owners','pendingco-owners') {
                                                       next unless (grep(/^\Q$type\E$/,@{$changes->{$item}{$key}{'changed'}}));
                                                       if ($type eq 'pendingco-owners') {
                                                           if (&Apache::lonnet::is_course_owner($cdom,$cnum)) {
                                                               $displayname = &mt('Invited as co-owners, pending acceptance');
                                                           }
                                                       }
                                                       if ($changes->{$item}{$key}{$type} eq '') {
                                                           push(@delkeys,'internal.'.$type);
                                                           if (&Apache::lonnet::is_course_owner($cdom,$cnum)) {
                                                               $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('Deleted setting for [_1]',
                                                               '<i>'.$displayname.'</i>')).'</li>';
                                                           }
                                                       } elsif (&Apache::lonnet::is_course_owner($cdom,$cnum)) {
                                                           $displayval = join(', ',map { &Apache::loncommon::plainname(split(':',$_)); } split(',',$changes->{$item}{$key}{$type}));
                                                           $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]',
                                                                      '<i>'.$displayname.'</i>',
                                                                      "'<b>$displayval</b>'")).'</li>';
                                                       }
                                                   }
                                               }
                                               unless (&Apache::lonnet::is_course_owner($cdom,$cnum)) {
                                                   if ($env{'form.pending_coowoner'} eq 'accept') {
                                                           $displayval = &mt('on');
                                                   } elsif ($env{'form.pending_coowoner'} eq 'decline') {
                                                           $displayval = '';
                                                           $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('Invitation to be co-owner declined')).'</li>';
                                                   } elsif ($env{'form.remove_coowoner'}) {
                                                       $displayval = &mt('off');
                                                   }
                                                   if ($displayval) {
                                                       $displayname = &mt('Your co-ownership status');
                                                       $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]',
                                                      '<i>'.$displayname.'</i>',
                                                      "'<b>$displayval</b>'")).'</li>';
                                                   }
                                               }
                                           }
                                       } elsif ($changes->{$item}{$key} eq '') {
                                         push(@delkeys,$key);                                          push(@delkeys,$key);
                                         $output .= '<li>'.&mt('Deleted setting for [_1]',                                          $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('Deleted setting for [_1]',
                                                    '<i>'.$displayname.'</i>').'</li>';                                                     '<i>'.$displayname.'</i>')).'</li>';
                                     } else {                                      } else {
                                         $output .= '<li>'.&mt('[_1] set to [_2]',                                          $output .= '<li>'.&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]',
                                                    '<i>'.$displayname.'</i>',                                                     '<i>'.$displayname.'</i>',
                                                    "'<b>$displayval</b>'");                                                     "'<b>$displayval</b>'"));
                                         if ($key eq 'url') {                                          if ($key eq 'url') {
                                             my $bkuptime=time;                                              my $bkuptime=time;
                                             $output .= ('&nbsp;'x2).&mt('(Previous URL backed up)').': '.                                              $output .= ('&nbsp;'x2).&mt('(Previous URL backed up)').': '.
                                             $storehash{'top level map backup '.$bkuptime} => $values->{$key};                                              $storehash{'top level map backup '.$bkuptime} = $values->{$key};
                                         }                                          }
                                         $output .= '</li>';                                          $output .= '</li>';
                                     }                                      }
                                     $storehash{$key} = $changes->{$item}{$key};                                      if ($key eq 'co-owners') {
                                           if (ref($changes->{$item}{$key}) eq 'HASH') {
                                               if (ref($changes->{$item}{$key}{'changed'}) eq 'ARRAY') {
                                                   foreach my $type ('co-owners','pendingco-owners') {
                                                       next unless (grep(/^\Q$type\E$/,@{$changes->{$item}{$key}{'changed'}}));
                                                       $storehash{'internal.'.$type} = $changes->{$item}{$key}{$type};
                                                   }
                                               }
                                           }
                                       } else {
                                           unless ($key eq 'discussion_post_fonts') {
                                               $storehash{$key} = $changes->{$item}{$key};
                                           }
                                       }
                                   }
                                   if ($key eq 'cloners') {
                                       # Get existing cloners
                                       my %clonenames = 
                                           &Apache::lonnet::dump('environment',$cdom,$cnum,'cloners');
                                       if ($clonenames{'cloners'} =~ /,/) {
                                           @oldcloner = split(/\s*\,\s*/,$clonenames{'cloners'});
                                       } else {
                                           $oldcloner[0] = $clonenames{'cloners'};
                                       }
                                 }                                  }
                                 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')) {
                                     push(@need_env_update,$key);                                      push(@need_env_update,$key);
                                 }                                  }
                             }                              }
Line 940  sub store_changes { Line 1450  sub store_changes {
                     }                      }
                     $output .= '</ul>';                      $output .= '</ul>';
                 } else {                  } else {
                     $output = &mt('No changes made to course settings.');                      if ($crstype eq 'Community') {
                           $output .= &mt('No changes made to community settings.');
                       } else {
                           $output .= &mt('No changes made to course settings.');
                       }
                 }                  }
             }              }
         }          }
     }      }
     if (&Apache::lonnet::put('environment',\%storehash,$cdom,$cnum) eq 'ok') {      if (&Apache::lonnet::put('environment',\%storehash,$cdom,$cnum) eq 'ok') {
           if (ref($changes) eq 'HASH') {
               if (ref($changes->{'courseinfo'}) eq 'HASH') {
                   if (exists($changes->{'courseinfo'}{'cloners'})) {
                       &change_clone($cdom,$cnum,$changes->{'courseinfo'}{'cloners'},
                                     \@oldcloner);
                   }
               }
           }
         if (@delkeys) {          if (@delkeys) {
             if (&Apache::lonnet::del('environment',\@delkeys,$cdom,$cnum) ne 'ok') {              if (&Apache::lonnet::del('environment',\@delkeys,$cdom,$cnum) ne 'ok') {
                 $output .= '<br /><span class="LC_error">'.                  $output .= '<br /><span class="LC_error">';
                            &mt('An error occurred when removing course settings which are no longer in use.').'</span>';                  if ($crstype eq 'Community') {
                       $output .= &mt('An error occurred when removing community settings which are no longer in use.');
                   } else {
                       $output .= &mt('An error occurred when removing course settings which are no longer in use.');
                   }
                   $output .= '</span>';
               } else {
                   foreach my $key (@delkeys) {
                       &Apache::lonnet::delenv('course.'.$cdom.'_'.$cnum.'.'.$key);
                   }
             }              }
         }          }
         if (@need_env_update) {          if (@need_env_update) {
Line 959  sub store_changes { Line 1490  sub store_changes {
         &Apache::lonnet::coursedescription($env{'request.course.id'},          &Apache::lonnet::coursedescription($env{'request.course.id'},
                                            {'freshen_cache' => 1});                                             {'freshen_cache' => 1});
     } else {      } else {
         $output = '<span class="LC_error">'.          $output = '<span class="LC_error">';
                   &mt('An error occurred when saving changes to course settings, which remain unchanged.').'</span>';          if ($crstype eq 'Community') {
               $output .= &mt('An error occurred when saving changes to community settings, which remain unchanged.');
           } else {          
               $output .= &mt('An error occurred when saving changes to course settings, which remain unchanged.');
           }
           $output .= '</span>';
     }      }
     return $output;      return $output;
 }  }
Line 980  sub update_env { Line 1516  sub update_env {
                     &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.'.$key => $storehash->{$key}});                      &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.'.$key => $storehash->{$key}});
                     $crsinfo{$env{'request.course.id'}}{$key} = $storehash->{$key};                      $crsinfo{$env{'request.course.id'}}{$key} = $storehash->{$key};
                     $count ++;                      $count ++;
                   } elsif ($key eq 'co-owners') {
                       if ($storehash->{'internal.co-owners'} ne '') {
                           &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.internal.co-owners' => $storehash->{'internal.co-owners'}});
                       }
                       if ($storehash->{'internal.pendingco-owners'} ne '') {
                           &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.internal.pendingco-owners' => $storehash->{'internal.pendingco-owners'}});
                       }
                       my @coowners = split(',',$storehash->{'internal.'.$key});
                       $crsinfo{$env{'request.course.id'}}{'co-owners'} = \@coowners;
                       $count ++;
                 }                  }
             }              }
             if ($count) {              if ($count) {
Line 991  sub update_env { Line 1537  sub update_env {
 }  }
   
 sub display_disallowed {  sub display_disallowed {
     my ($item,$disallowed,$prefs) = @_;      my ($item,$disallowed,$prefs,$crstype) = @_;
     my $output;      my $output;
     if ((ref($disallowed) eq 'HASH') && (ref($prefs) eq 'HASH')) {      if ((ref($disallowed) eq 'HASH') && (ref($prefs) eq 'HASH')) {
         if (keys(%{$disallowed})) {          if (keys(%{$disallowed})) {
Line 1007  sub display_disallowed { Line 1553  sub display_disallowed {
                         my $msg = '<b>'.$disallowed->{$error}.'</b>, '.&mt('reason').' - '.                          my $msg = '<b>'.$disallowed->{$error}.'</b>, '.&mt('reason').' - '.
                                   $lt{$error};                                     $lt{$error}; 
                         if ($error eq 'newuser') {                          if ($error eq 'newuser') {
                             $msg .= '<br />'.&mt('Please [_1]add the user(s)[_2] before returning to the [_3]Course Configuration[_2] to add as potential cloners.','<a href="/adm/createuser">','</a>','<a href="/adm/courseprefs">');                              $msg .= '<br />'.&mt("Please [_1]add the user(s)[_2] before returning to the [_3]$crstype Configuration[_2] to add as potential cloners.",'<a href="/adm/createuser">','</a>','<a href="/adm/courseprefs">');
                         }                          }
                         push(@fails,$msg);                          push(@fails,$msg);
                     }                      }
Line 1038  sub display_disallowed { Line 1584  sub display_disallowed {
             } elsif (($item eq 'feedback') || ($item eq 'discussion') || ($item eq 'localization')) {              } elsif (($item eq 'feedback') || ($item eq 'discussion') || ($item eq 'localization')) {
                 $output .= '<span class="LC_warning">';                  $output .= '<span class="LC_warning">';
                 if ($item eq 'feedback') {                  if ($item eq 'feedback') {
                     $output .= &mt('Unable to include as a recipient of course feedback for:');                      if ($crstype eq 'Community') {
                           $output .= &mt('Unable to include as a recipient of community feedback for:');
                       } else {
                           $output .= &mt('Unable to include as a recipient of course feedback for:');
                       }
                 } elsif ($item eq 'discussion') {                  } elsif ($item eq 'discussion') {
                     $output .= &mt('Unable to include in user-based access control for:');                      $output .= &mt('Unable to include in user-based access control for:');
                 } elsif ($item eq 'localization') {                  } elsif ($item eq 'localization') {
                     $output .= &mt('Unable to include in course localization:');                      if ($crstype eq 'Community') {
                           $output .= &mt('Unable to include in community localization:');
                       } else {
                           $output .= &mt('Unable to include in course localization:');
                       }
                 }                  }
                 $output .= '</span><ul>';                  $output .= '</span><ul>';
                 foreach my $key (sort(keys(%{$disallowed}))) {                  foreach my $key (sort(keys(%{$disallowed}))) {
Line 1074  sub get_course { Line 1628  sub get_course {
 }  }
   
 sub get_jscript {  sub get_jscript {
     my ($cdom,$phase) = @_;      my ($cid,$cdom,$phase,$crstype) = @_;
     my ($can_toggle_cat,$can_categorize) = &can_modify_catsettings($cdom);      my ($can_toggle_cat,$can_categorize) = &can_modify_catsettings($cdom,$crstype);
     my ($jscript,$categorize_js);      my ($jscript,$categorize_js,$loncaparev_js);
     my $stubrowse_js = &Apache::loncommon::studentbrowser_javascript();      my $stubrowse_js = &Apache::loncommon::studentbrowser_javascript();
     my $browse_js = &Apache::loncommon::browser_and_searcher_javascript('parmset');      my $browse_js = &Apache::loncommon::browser_and_searcher_javascript('parmset');
     my $cloners_js = &cloners_javascript($phase);      my $cloners_js = &cloners_javascript($phase);
Line 1093  function catsbrowser() { Line 1647  function catsbrowser() {
 }  }
 ENDSCRIPT  ENDSCRIPT
     }      }
       my $loncaparev = $env{'course.'.$cid.'.internal.releaserequired'};
       if ($loncaparev) {
           $loncaparev_js = <<ENDSCRIPT;
   function loncaparevinfo() {
       var lcrevwin = null;
       var url = '/adm/courseprefs?phase=releaseinfo';
       if (!lcrevwin || lcrevwin.closed) {
           lcrevwin=window.open(url,'releasewin','height=480,width=600,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no');
       } else {
           lcrevwin.focus();
       }
   }
   ENDSCRIPT
       }
     $jscript = '<script type="text/javascript" language="Javascript">'."\n".      $jscript = '<script type="text/javascript" language="Javascript">'."\n".
                $browse_js."\n".$categorize_js."\n".$cloners_js."\n".'</script>'.                 $browse_js."\n".$categorize_js."\n".$loncaparev_js."\n".
                "\n".$stubrowse_js."\n";                 $cloners_js."\n".'</script>'."\n".$stubrowse_js."\n";
     return $jscript;      return $jscript;
 }  }
   
Line 1182  ENDSCRIPT Line 1750  ENDSCRIPT
   
   
 sub print_courseinfo {  sub print_courseinfo {
     my ($cdom,$settings,$ordered,$itemtext,$rowtotal) = @_;      my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_;
     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);      my ($cathash,$categoriesform,$autocoowner);
     my $crstype = &Apache::loncommon::course_type();  
     my %domconf =       my %domconf = 
         &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom);          &Apache::lonnet::get_dom('configuration',['coursecategories','autoenroll'],$cdom);
     if (ref($domconf{'coursecategories'}) eq 'HASH') {      if (ref($domconf{'coursecategories'}) eq 'HASH') {
         $cathash = $domconf{'coursecategories'}{'cats'};          $cathash = $domconf{'coursecategories'}{'cats'};
         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'})."\n";                                                  $settings->{'categories'},$crstype)."\n";
         }          }
     }      }
       if (ref($domconf{'autoenroll'}) eq 'HASH') {
           $autocoowner = $domconf{'autoenroll'}{'co-owners'};
       }
     if (!defined($categoriesform)) {      if (!defined($categoriesform)) {
         $categoriesform = &mt('No categories defined for this domain');          $categoriesform = &mt('No categories defined in this domain.');
     }      }
   
     my ($can_toggle_cat,$can_categorize) = &can_modify_catsettings($cdom);      my ($can_toggle_cat,$can_categorize) = &can_modify_catsettings($cdom,$crstype);
   
       my $replace;
       if ($crstype eq 'Community') {
           $replace = &mt('To replace the standard title for a course role, enter a title, otherwise leave blank');
       } else {
           $replace = &mt('To replace the standard title for a course role, enter a title, otherwise leave blank');
       }
     my %items = (      my %items = (
         'url' => {          'url' => {
                    text => '<b>'.&mt($itemtext->{'url'}).'</b>'.('&nbsp;'x2).                     text => '<b>'.&mt($itemtext->{'url'}).'</b>'.('&nbsp;'x2).
Line 1213  sub print_courseinfo { Line 1789  sub print_courseinfo {
                            &mt('Modification may make assessment data inaccessible!').                             &mt('Modification may make assessment data inaccessible!').
                            '</span>',                             '</span>',
                    input => 'textbox',                     input => 'textbox',
                    size  => '40',                     size  => '55',
                      advanced => 1
                  },                   },
         'description'  => {           'description'  => { 
                    text => '<b>'.&mt($itemtext->{'description'}).'</b>',                     text => '<b>'.&mt($itemtext->{'description'}).'</b>',
                    input => 'textbox',                     input => 'textbox',
                    size  => '25',                     size  => '55',
                             },
           'owner'        => {
                      text => '<b>'.&mt($itemtext->{'owner'}).'</b>',
                             },
           'co-owners'    => {
                      text => '<b>'.&mt($itemtext->{'co-owners'}).'</b>',
                           },                            },
         'courseid'     => {           'courseid'     => { 
                    text => '<b>'.&mt($itemtext->{'courseid'}).'</b><br />'.'('.                     text => '<b>'.&mt($itemtext->{'courseid'}).'</b><br />'.'('.
Line 1228  sub print_courseinfo { Line 1811  sub print_courseinfo {
                           },                            },
         'cloners'      => {           'cloners'      => { 
                    text => '<b>'.&mt($itemtext->{'cloners'}).'</b><br />'.                     text => '<b>'.&mt($itemtext->{'cloners'}).'</b><br />'.
                            &mt('Course Coordinators included automatically'),                             &mt('Owner and Coordinators included automatically'),
                    input => 'textbox',                     input => 'textbox',
                    size  => '40',                     size  => '40'
                          },                           },
         'rolenames'  => {           'rolenames'  => { 
                    text  => '<b>'.&mt($itemtext->{'rolenames'}).'</b><br />'.                     text  => '<b>'.&mt($itemtext->{'rolenames'}).'</b><br />'.
                             '('.&mt('To replace the standard title for a course role, enter a title, otherwise leave blank').')',                              '('.$replace.')',
                    input => 'textbox',                     input => 'textbox',
                    size  => '20',                     size  => '20',
                      advanced => 1
                         },                          },
         'externalsyllabus' => {          'externalsyllabus' => {
                    text => '<b>'.&mt($itemtext->{'externalsyllabus'}).'</b><br />('.                     text => '<b>'.&mt($itemtext->{'externalsyllabus'}).'</b><br />('.
Line 1255  sub print_courseinfo { Line 1839  sub print_courseinfo {
                    input => 'textbox',                     input => 'textbox',
                    size  => '25',                     size  => '25',
                         },                          },
           'loncaparev' => {
                      text => '<b>'.&mt($itemtext->{'loncaparev'}).'</b>',
                           },
           'defaultcredits' => {
                      text => '<b>'.&mt($itemtext->{'defaultcredits'}).'</b>',
                           },
     );      );
     my $datatable;      my $datatable;
     my $count = 0;      my $count = 0;
Line 1265  sub print_courseinfo { Line 1855  sub print_courseinfo {
             next if (!$can_categorize);              next if (!$can_categorize);
         }          }
         $count ++;          $count ++;
         $datatable .= &item_table_row_start($items{$item}{text},$count);          if (exists $items{$item}{advanced} && $items{$item}{advanced} == 1) {
           $datatable .= &item_table_row_start($items{$item}{text},$count,"advanced");
           } else {
           $datatable .= &item_table_row_start($items{$item}{text},$count);
           }
         if ($items{$item}{input} eq 'radio') {          if ($items{$item}{input} eq 'radio') {
             $datatable .= &yesno_radio($item,$settings);              $datatable .= &yesno_radio($item,$settings);
         } elsif ($item eq 'cloners') {          } elsif ($item eq 'cloners') {
Line 1300  sub print_courseinfo { Line 1894  sub print_courseinfo {
                 if (@entries > 0) {                  if (@entries > 0) {
                     foreach my $entry (@entries) {                      foreach my $entry (@entries) {
                         my ($uname,$udom) = split(/:/,$entry);                          my ($uname,$udom) = split(/:/,$entry);
                           if ($udom =~ /^$match_domain$/) {
                               unless (&Apache::lonnet::domain($udom)) {
                                   next;
                               }
                           } else {
                               next;
                           }
                         if ($uname eq '*') {                          if ($uname eq '*') {
                             $datatable .=                               $datatable .= 
                                 &Apache::loncommon::start_data_table_row().                                  &Apache::loncommon::start_data_table_row().
                                 '<td valign="top" align="left"><span class="LC_nobreak">'.                                  '<td valign="top" align="left"><span class="LC_nobreak">'.
                                 &mt('Domain:').'<b>&nbsp;'.$udom.                                  &mt('Any user in domain:').'<b>&nbsp;'.$udom.
                                 '</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" '.
Line 1312  sub print_courseinfo { Line 1913  sub print_courseinfo {
                                 &mt('Delete').'</label></span></td>'.                                  &mt('Delete').'</label></span></td>'.
                                 &Apache::loncommon::end_data_table_row();                                  &Apache::loncommon::end_data_table_row();
                             $num ++;                              $num ++;
                         } else {                          } elsif (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') {
                             push(@cloners,$entry);                              unless (grep(/^\Q$entry\E$/,@cloners)) {
                                   push(@cloners,$entry);
                               }
                         }                          }
                     }                      }
                 }                  }
Line 1346  sub print_courseinfo { Line 1949  sub print_courseinfo {
                           &Apache::loncommon::end_data_table();                            &Apache::loncommon::end_data_table();
         } elsif ($item eq 'rolenames') {          } elsif ($item eq 'rolenames') {
             $datatable .= &Apache::loncommon::start_data_table();              $datatable .= &Apache::loncommon::start_data_table();
             foreach my $role ('cc','in','ta','ep','ad','st') {              my @roles;
               if ($crstype eq 'Community') {
                   @roles = ('co');
               } else {
                   @roles = ('cc');
               }
               push (@roles,('in','ta','ep','ad','st'));
               foreach my $role (@roles) {
                 $datatable .= &Apache::loncommon::start_data_table_row().                  $datatable .= &Apache::loncommon::start_data_table_row().
                               '<td align="left"><span class="LC_nobreak">'.                                '<td align="left"><span class="LC_nobreak">'.
                               &Apache::lonnet::plaintext($role,$crstype,undef,1).                                &Apache::lonnet::plaintext($role,$crstype,undef,1).
Line 1362  sub print_courseinfo { Line 1972  sub print_courseinfo {
             $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);
           } elsif ($item eq 'owner') {
               my $owner = $env{'course.'.$env{'request.course.id'}.'.internal.courseowner'};
               if ($owner =~ /:/) {
                   my ($ownername,$ownerdom) = split(':',$owner); 
                   $owner = &Apache::loncommon::plainname($ownername,$ownerdom);
               } elsif ($owner ne '') {
                   $owner = &Apache::loncommon::plainname($owner,$cdom);
               } else {
                   $owner = &mt('None specified');
               }
               $datatable .= $owner;
           } elsif ($item eq 'co-owners') {
               my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
               my $coowners = $env{'course.'.$env{'request.course.id'}.'.internal.co-owners'};
               my @currcoown;
               if ($coowners) {
                   @currcoown = split(',',$coowners);
               }
               if (&Apache::lonnet::is_course_owner($cdom,$cnum)) {
                   if (($crstype eq 'Course') && ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) && ($autocoowner)) {
                       $datatable .= &show_autocoowners(@currcoown);
                   } else {
                       $datatable .= &coowner_invitations($cnum,$cdom,@currcoown);
                   }
               } else {
                   if (($crstype eq 'Course') && ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) && ($autocoowner)) {
                       $datatable .= &show_autocoowners(@currcoown);
                   } else {
                       $datatable .= &manage_coownership($cnum,$cdom,@currcoown);
                   }
               }
           } elsif ($item eq 'loncaparev') {
               my $loncaparev = $env{'course.'.$env{'request.course.id'}.'.internal.releaserequired'};
               my $showreqd;
               if ($loncaparev) {
                   $showreqd = &mt('[_1] or newer',$loncaparev).' <a href="javascript:loncaparevinfo()">'.
                               &mt('Details').'</a>';
               } else {
                   $showreqd = &mt('No specific version required');
               }
               $datatable .= $showreqd;
         } else {          } else {
             $datatable .= &Apache::lonhtmlcommon::textbox($item,$settings->{$item},$items{$item}{size});              $datatable .= &Apache::lonhtmlcommon::textbox($item,$settings->{$item},$items{$item}{size});
         }          }
Line 1395  sub new_cloners_dom_row { Line 2046  sub new_cloners_dom_row {
 }  }
   
 sub can_modify_catsettings {  sub can_modify_catsettings {
     my ($dom) = @_;      my ($dom,$crstype) = @_;
     my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$dom);      my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$dom);
     my ($can_toggle_cat,$can_categorize);      my ($can_toggle_cat,$can_categorize);
     if (ref($domconf{'coursecategories'}) eq 'HASH') {      if (ref($domconf{'coursecategories'}) eq 'HASH') {
         if ($domconf{'coursecategories'}{'togglecats'} eq 'crs') {          if ($crstype eq 'Community') {
             $can_toggle_cat = 1;              if ($domconf{'coursecategories'}{'togglecatscomm'} eq 'comm') {
         }                  $can_toggle_cat = 1;
         if ($domconf{'coursecategories'}{'categorize'} eq 'crs') {              }
             $can_categorize = 1;              if ($domconf{'coursecategories'}{'categorizecomm'} eq 'comm') {
                   $can_categorize = 1;
               }
           } else {
               if ($domconf{'coursecategories'}{'togglecats'} eq 'crs') {
                   $can_toggle_cat = 1;
               }
               if ($domconf{'coursecategories'}{'categorize'} eq 'crs') {
                   $can_categorize = 1;
               }
         }          }
     }      }
     return ($can_toggle_cat,$can_categorize);      return ($can_toggle_cat,$can_categorize);
 }  }
   
 sub assign_course_categories {  sub assign_course_categories {
     my ($r) = @_;      my ($r,$crstype) = @_;
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $hascats = 0;      my $hascats = 0;
Line 1419  sub assign_course_categories { Line 2079  sub assign_course_categories {
     if (ref($domconf{'coursecategories'}) eq 'HASH') {      if (ref($domconf{'coursecategories'}) eq 'HASH') {
         $cathash = $domconf{'coursecategories'}{'cats'};          $cathash = $domconf{'coursecategories'}{'cats'};
         if (ref($cathash) eq 'HASH') {          if (ref($cathash) eq 'HASH') {
             $hascats = 1;              foreach my $cat (keys(%{$cathash})) {
                   next if ($cat eq 'instcode::0');
                   unless ($crstype eq 'Community') {
                       next if ($cat eq 'communities::0');
                   }
                   $hascats ++; 
               }
         }          }
     }      }
     my $catwin_js;      my $catwin_js;
     if ($hascats) {      if ($hascats) {
         my $alert = &mt('Use \"Save\" in the main window to save course categories');          my $alert;
           if ($crstype eq 'Community') {
               $alert = &mt("Use 'Save' in the main window to save community categories");
           } else {
               $alert = &mt("Use 'Save' in the main window to save course categories");
           }
         $catwin_js = <<ENDSCRIPT;          $catwin_js = <<ENDSCRIPT;
 <script type="text/javascript">  <script type="text/javascript">
   
Line 1462  ENDSCRIPT Line 2133  ENDSCRIPT
     } else {      } else {
         my $onload;          my $onload;
     }      }
       my ($crscat,$catcrs,$assign);
       if ($crstype eq 'Community') {
           $crscat = 'Community Categories';
           $catcrs = &mt('Categorize Community');
           $assign = &mt('Assign one or more categories to this community.')
       } else {
           $crscat = 'Course Categories';
           $catcrs = &mt('Categorize Course');
           $assign = &mt('Assign one or more categories to this course.')
       }
     my $start_page =      my $start_page =
         &Apache::loncommon::start_page('Course Categories',$catwin_js,          &Apache::loncommon::start_page($crscat,$catwin_js,
                                        {'only_body'      => 1,});                                         {'only_body'      => 1,});
     my $end_page = &Apache::loncommon::end_page();      my $end_page = &Apache::loncommon::end_page();
     my $categoriesform = '<h3>'.&mt('Categorize Course').'</h3>';      my $categoriesform = '<h3>'.$catcrs.'</h3>';
     if ($hascats) {      if ($hascats) {
         my %currsettings =          my %currsettings =
             &Apache::lonnet::get('environment',['hidefromcat','categories'],$cdom,$cnum);              &Apache::lonnet::get('environment',['hidefromcat','categories'],$cdom,$cnum);
         $categoriesform .= &mt('Assign one or more categories to this course.').'<br /><br />'.          my $cattable = &Apache::loncommon::assign_categories_table($cathash,
                                          $currsettings{'categories'},$crstype);
           if ($cattable eq '') {
               $categoriesform .= &mt('No suitable categories defined for this course type in this domain.'); 
           } else {
               $categoriesform .= $assign.'<br /><br />'.
                                '<form name="chgcats" action="/adm/courseprefs" method="post">'."\n".                                 '<form name="chgcats" action="/adm/courseprefs" method="post">'."\n".
                                &Apache::loncommon::assign_categories_table($cathash,                                 $cattable."\n".
                                                        $currsettings{'categories'})."\n".  
                                '<br /><input type="button" name="changes" value="'.                                 '<br /><input type="button" name="changes" value="'.
                                &mt('Copy to main window').'" '.                                 &mt('Copy to main window').'" '.
                                'onclick="javascript:updateCategories()" /></form><br />';                                 'onclick="javascript:updateCategories()" /></form><br />';
           }
     } else {      } else {
         $categoriesform .= &mt('No categories defined for this domain');          $categoriesform .= &mt('No categories defined in this domain.');
     }      }
     $r->print($start_page.$categoriesform.$end_page);      $r->print($start_page.$categoriesform.$end_page);
     return;      return;
 }  }
   
   sub display_loncaparev_constraints {
       my ($r,$navmap,$loncaparev,$crstype) = @_;
       my $cid = $env{'request.course.id'};
       my $cdom = $env{'course.'.$cid.'.domain'};
       my $cnum = $env{'course.'.$cid.'.num'};
       my $output;
       my %lt = &Apache::lonlocal::texthash (
                                              'all'           => 'all',
                                              'section/group' =>  'section/group',
                                              'user'          => 'user',
                                            );
       my (%checkparms,%checkresponsetypes,%checkcrstypes,%anonsurvey,%randomizetry);
       &Apache::loncommon::build_release_hashes(\%checkparms,\%checkresponsetypes,
                                                 \%checkcrstypes,\%anonsurvey,\%randomizetry);
       if (defined($checkcrstypes{$crstype})) {
           $output .= '<h4>'.&mt('Course type: [_1] requires [_2] or newer',$crstype,
                                 $checkcrstypes{$crstype}).'</h4>';
       }
       my (%fromparam,%rowspan,%bymap,%byresource,@scopeorder,%toshow,%allmaps,
           %byresponsetype,%bysubmission);
       @scopeorder = ('all','section/group','user');
       my $resourcedata = &Apache::lonparmset::readdata($cnum,$cdom);
       if (ref($resourcedata) eq 'HASH') {
           foreach my $key (keys(%{$resourcedata})) {
               foreach my $item (keys(%checkparms)) {
                   if ($key =~ /(\Q$item\E)$/) {
                        if (ref($checkparms{$item}) eq 'ARRAY') {
                            my $value = $resourcedata->{$key};
                            my ($middle,$scope,$which,$level,$map,$resource);
                            if (grep(/^\Q$value\E$/,@{$checkparms{$item}})) {
                                my $stdtype = &Apache::lonparmset::standard_parameter_types($item);
                                my $stdname = &Apache::lonparmset::standard_parameter_names($item);
                                my $valname = &get_param_description($stdtype,$value);
                                my $rev = $Apache::lonnet::needsrelease{'parameter:'.$item.':'.$value};
                                my $start = $cid.'.';
                                if ($key =~ /^\Q$start\E(\[useropt\:($match_username\:$match_domain)\]\.)/) {
                                    $middle = $1;
                                    $which = $2;
                                    $scope = 'user'; 
                                } elsif ($key =~ /^\Q$start\E(\[(\w+)\]\.)/) {
                                    $middle = $1;
                                    $which = $2;
                                    $scope = 'section/group';
                                } else {
                                    $scope = 'all';
                                }
                                my $what="$stdname=$valname";
                                if ($key =~ /^\Q$start$middle\E\w+\.\Q$item\E$/) {
                                    $level = 'general';
                                    if ($scope eq 'all') {
                                        if (ref($fromparam{$rev}{$scope}) eq 'ARRAY') {
                                            unless(grep(/^\Q$what\E$/,@{$fromparam{$rev}{$scope}})) {
                                                push(@{$fromparam{$rev}{$scope}},$what);
                                            }
                                        } else {
                                            push(@{$fromparam{$rev}{$scope}},$what);
                                        }
                                    } else {
                                        if (ref($fromparam{$rev}{$scope}{$which}) eq 'ARRAY') {
                                            unless (grep(/^\Q$what\E$/,@{$fromparam{$rev}{$scope}{$which}})) {
                                                push(@{$fromparam{$rev}{$scope}{$which}},$what);
                                            }
                                        } else {
                                            push(@{$fromparam{$rev}{$scope}{$which}},$what);
                                        }
                                    }
                                    $rowspan{$rev} ++;
                                } elsif ($key =~ /^\Q$start$middle\E(.+)___\(all\).\w+\.\Q$item\E$/) {
                                    $level = 'folder';
                                    $map = $1;
                                    if ($scope eq 'all') {
                                        if (ref($bymap{$map}{$rev}{$scope}) eq 'ARRAY') {
                                            unless(grep(/^\Q$what\E$/,@{$bymap{$map}{$rev}{$scope}})) {
                                                push(@{$bymap{$map}{$rev}{$scope}},$what);
                                            }
                                        } else {
                                            push(@{$bymap{$map}{$rev}{$scope}},$what);
                                        }
                                    } else {
                                        if (ref($bymap{$map}{$rev}{$scope}{$which}) eq 'ARRAY') {
                                            unless(grep(/^\Q$what\E$/,@{$bymap{$map}{$rev}{$scope}{$which}})) {
                                                push(@{$bymap{$map}{$rev}{$scope}{$which}},$what);
                                            }
                                        } else {
                                            push(@{$bymap{$map}{$rev}{$scope}{$which}},$what);
                                        }
                                    }
                                } elsif ($key =~ /^\Q$start$middle\E(.+)\.\w+\.\Q$item\E$/) {
                                    $level = 'resource';
                                    $resource = $1;
                                    if ($scope eq 'all') {
                                        if (ref($byresource{$resource}{$rev}{$scope}) eq 'ARRAY') {
                                            unless(grep(/^\Q$what\E$/,@{$byresource{$resource}{$rev}{$scope}})) {
                                                push(@{$byresource{$resource}{$rev}{$scope}},$what);
                                            }
                                        } else {
                                            push(@{$byresource{$resource}{$rev}{$scope}},$what);
                                        }
                                    } else {
                                        if (ref($byresource{$resource}{$rev}{$scope}{$which}) eq 'ARRAY') {
                                            unless (grep(/^\Q$what\E$/,@{$byresource{$resource}{$rev}{$scope}{$which}})) {
                                                push(@{$byresource{$resource}{$rev}{$scope}{$which}},$what);
                                            }
                                        } else {
                                            push(@{$byresource{$resource}{$rev}{$scope}{$which}},$what);
                                        }
                                    }
                                }
                           }
                       }
                   }
               }
           }
           if (keys(%fromparam)) {
               $output .= '<h4>'.&mt('Requirements from general settings').'</h4>'.
                          &Apache::loncommon::start_data_table().
                          &Apache::loncommon::start_data_table_header_row().
                          '<th>'.&mt('Release').'</th><th>'.&mt('Scope').'</th>'.
                          '<th>'.&mt('Extent').'</th><th>'.&mt('Setting').'</th>'.
                          &Apache::loncommon::end_data_table_header_row();
               foreach my $rev (keys(%fromparam)) {
                   $output .=  &Apache::loncommon::start_data_table_row().
                               '<td rowspan="'.$rowspan{$rev}.'">'.$rev.'</td>';
                   my $newrow;
                   foreach my $scope (@scopeorder) {
                       if (ref($fromparam{$rev}{$scope}) eq 'HASH') {
                            if ($newrow) {
                                $output .= &Apache::loncommon::continue_data_table_row();
                            }
                            $output .= '<td>'.$lt{$scope}.'</td>';
                            foreach my $which (sort(keys(%{$fromparam{$rev}{$scope}}))) {
                                $output .= '<td>'.$which.'</td><td>'.
                                           join('<br />',@{$fromparam{$rev}{$scope}{$which}}).'</td>';
                            }
                            $output .= &Apache::loncommon::end_data_table_row();
                            $newrow = 1;
                       } elsif (ref($fromparam{$rev}{$scope}) eq 'ARRAY') {
                            if ($newrow) {
                                $output .= &Apache::loncommon::continue_data_table_row();
                            }
                            $output .= '<td>'.$lt{$scope}.'</td><td>&nbsp;</td><td>'.
                                       join('<br />',@{$fromparam{$rev}{$scope}}).'</td>'.
                                       &Apache::loncommon::end_data_table_row();
                            $newrow = 1;
                       }
                   }
               }
               $output .= &Apache::loncommon::end_data_table().'<br />';
           }
       }
   
       if (defined($navmap)) {
           my %anonsubms=&Apache::lonnet::dump('nohist_anonsurveys',$cdom,$cnum);
           my $rev_anonsurv=$Apache::lonnet::needsrelease{'parameter:type:anonsurvey'};
           my %randtrysubms=&Apache::lonnet::dump('nohist_randomizetry',$cdom,$cnum);
           my $rev_randtry=$Apache::lonnet::needsrelease{'parameter:type:randomizetry'};
           my $stdtype=&Apache::lonparmset::standard_parameter_types('type');
           my $stdname=&Apache::lonparmset::standard_parameter_names('type');
           my $valanon=&get_param_description($stdtype,'anonsurvey');
           my $valrandtry=&get_param_description($stdtype,'randomizetry');
   
           foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_problem() },1,0)) {
               my @parts = @{$res->parts()};
               my $symb = $res->symb();
               my $enclosing_map = &Apache::lonnet::declutter($res->enclosing_map_src());
               foreach my $part (@parts) {
                   if (exists($anonsubms{$symb."\0".$part})) {
                       my $rev = $rev_anonsurv;
                       my $what="$stdname=$valanon";
                       if (ref($bysubmission{$symb}{$rev}) eq 'ARRAY') {
                           unless (grep(/^\Q$what\E/,@{$bysubmission{$symb}{$rev}})) {
                               push(@{$bysubmission{$symb}{$rev}},$what);
                           }
                       } else {
                           push(@{$bysubmission{$symb}{$rev}},$what);
                       }
                       $allmaps{$enclosing_map} = 1;
                   }
                   if (exists($randtrysubms{$symb."\0".$part})) {
                       my $rev = $rev_randtry;
                       my $what="$stdname=$valrandtry";
                       if (ref($bysubmission{$symb}{$rev}) eq 'ARRAY') {
                           unless (grep(/^\Q$what\E/,@{$bysubmission{$symb}{$rev}})) {
                               push(@{$bysubmission{$symb}{$rev}},$what);
                           }
                       } else {
                           push(@{$bysubmission{$symb}{$rev}},$what);
                       }
                       $allmaps{$enclosing_map} = 1;
                   }
               }
               my %responses = $res->responseTypes();
               foreach my $key (keys(%responses)) {
                   if (exists($checkresponsetypes{$key})) {
                       push(@{$byresponsetype{$symb}{$checkresponsetypes{$key}}},$key);
                       $allmaps{$enclosing_map} = 1;
                   }
               }
           }
           if (keys(%byresource) > 0) {
               foreach my $symb (keys(%byresource)) {
                   my ($map,$resid,$resurl)=&Apache::lonnet::decode_symb($symb);
                   $allmaps{$map} = 1;
               }
           }
           if (keys(%bymap) > 0) {
               foreach my $map (keys(%bymap)) {
                   $allmaps{$map} = 1;
               }
           }
           foreach my $map (keys(%allmaps)) {
               my $mapres = $navmap->getResourceByUrl($map);
               my $mapsymb = $mapres->symb();
               $toshow{$mapsymb} = 1;
               if (ref($mapres)) {
                   my $pcslist = $mapres->map_hierarchy();
                   if ($pcslist ne '') {
                       foreach my $pc (split(/,/,$pcslist)) {
                           my $res = $navmap->getByMapPc($pc);
                           if (ref($res)) {
                               my $symb = $res->symb();
                               unless ($symb eq '______') {
                                   $toshow{$symb} = 1;
                               }
                           }
                       }
                   }
               }
           }
       }
       my $mapres_header = '<h4>'.
                           &mt('Requirements for specific folders or resources').
                           '</h4>';
       if ((keys(%toshow) > 0) || (keys(%byresource) > 0) || 
           (keys(%bysubmission) > 0) || (keys(%byresponsetype))) {
           $output .= $mapres_header;
       }
       my $top_header = '<h3>'.&mt('LON-CAPA version dependencies').'</h3>';
       my $title = 'Version Constraints';
       my $start_page =
           &Apache::loncommon::start_page($title,undef,{'only_body' => 1,});
       $r->print($start_page.$top_header);
       if ($output) {
           $r->print($output);
           if (defined($navmap)) {
               &show_contents_view($r,$navmap,$cid,\%toshow,\%bymap,\%byresource,\%bysubmission,
                                   \%byresponsetype,\@scopeorder,\%lt);
           }
           $r->print('<br /><br />'); 
       } else {
           $r->print('<p class="LC_info">'.
                     &mt('No version requirements from resource content or settings.').
                     '</p>'); 
       }
       $r->print(&Apache::loncommon::end_page());
       return;
   }
   
   sub show_contents_view {
       my ($r,$navmap,$cid,$toshow,$bymap,$byresource,$bysubmission,$byresponsetype,
           $scopeorder,$lt) = @_;
       if ((keys(%{$toshow}) > 0) || (keys(%{$byresource}) > 0) || 
           (keys(%{$bysubmission}) > 0) || (keys(%{$byresponsetype}) > 0)) {
           my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons");
           my $whitespace = '<img src="'.$location.'/whitespace_21.gif" alt="" />';
           my $icon =  '<img src="'.$location.'/navmap.folder.open.gif" alt="" />';
           my $topmap = $env{'course.'.$cid.'.url'};
           $r->print(&Apache::loncommon::start_data_table().
                     &Apache::loncommon::start_data_table_header_row().
                     '<th>'.&mt('Location').'</th><th>'.&mt('Release').'</th>'.
                     '<th>'.&mt('Attribute/Setting').'</th>'.
                     &Apache::loncommon::end_data_table_header_row().
                     &Apache::loncommon::start_data_table_row().
                     '<td>&nbsp;'.$icon.'&nbsp;'.&mt('Main Course Documents').'</td>');
                     &releases_by_map($r,$bymap,$topmap,$scopeorder,$lt);
                     $r->print(&Apache::loncommon::end_data_table_row());
           my $it=$navmap->getIterator(undef,undef,undef,1,1,undef);
           my $curRes;
           my $depth = 0;
           my %parent = ();
           my $startcount = 5;
           my $lastcontainer = $startcount;
           while ($curRes = $it->next()) {
               if ($curRes == $it->BEGIN_MAP()) {
                   $depth++;
                   $parent{$depth}= $lastcontainer;
               }
               if ($curRes == $it->END_MAP()) {
                   $depth--;
                   $lastcontainer = $parent{$depth};
               }
               my $indent;
               for (my $i=0; $i<$depth; $i++) {
                   $indent.= $whitespace;
               }
               if (ref($curRes)) {
                   my $symb = $curRes->symb();
                   my $ressymb = $symb;
                   my $srcf = $curRes->src();
                   my $title = &Apache::lonnet::gettitle($srcf);
                   if (($curRes->is_sequence()) || ($curRes->is_page())) {
                       next unless($toshow->{$symb});
                       my ($parent,$ind,$url) = &Apache::lonnet::decode_symb($symb);
                       $icon =  '<img src="'.$location.'/navmap.folder.open.gif" alt="" />';
                       if ($curRes->is_page()) {
                           $icon = '<img src="'.$location.'/navmap.page.open.gif" alt="" />';
                       }
                       my $rowspan = 1;
                       if (ref($bymap->{$url}) eq 'HASH') {
                           $rowspan = scalar(keys(%{$bymap->{$url}}));
                       }
                       $r->print(&Apache::loncommon::start_data_table_row().
                                 '<td rowspan="'.$rowspan.'">'.$indent.$icon.'&nbsp;'.$title.'</td>');
                       &releases_by_map($r,$bymap,$url,$scopeorder,$lt);
                       $r->print(&Apache::loncommon::end_data_table_row());
                   } else {
                       my $rowspan;
                       if (ref($byresource->{$symb}) eq 'HASH') {
                           $rowspan += scalar(keys(%{$byresource->{$symb}}));
                       }
                       if (ref($bysubmission->{$symb}) eq 'HASH') {
                           $rowspan += scalar(keys(%{$bysubmission->{$symb}}));
                       }
                       if (ref($byresponsetype->{$symb}) eq 'HASH') {
                           $rowspan += scalar(keys(%{$byresponsetype->{$symb}}));
                       }
                       next if (!$rowspan);
                       $icon = '<img class="LC_contentImage" src="'.$location.'/problem.gif" alt="'.
                               &mt('Problem').'" />';
                       $r->print(&Apache::loncommon::start_data_table_row().
                                 '<td rowspan="'.$rowspan.'">'.$indent.$icon.'&nbsp;'.$title.'</td>');
                       my $newrow;
                       if (ref($byresource->{$symb}) eq 'HASH') {
                           foreach my $rev (sort(keys(%{$byresource->{$symb}}))) {
                               if ($newrow) {
                                   $r->print(&Apache::loncommon::continue_data_table_row());
                               }
                               $r->print('<td valign="middle">'.$rev.'</td><td>');
                               if (ref($byresource->{$symb}{$rev}) eq 'HASH') {
                                   $r->print('<table border="0">');
                                   foreach my $scope (@{$scopeorder}) {
                                       if (ref($byresource->{$symb}{$rev}{$scope}) eq 'HASH') {
                                           $r->print('<tr><td>'.&mt('Setting - scope: [_1]',$lt->{$scope}).'</td>');
                                           foreach my $which (sort(keys(%{$byresource->{$symb}{$rev}{$scope}}))) {
                                               $r->print('<td>'.$which.'</td><td>'.
                                                   join('<br />',@{$byresource->{$symb}{$rev}{$scope}{$which}}).
                                                         '</td>');
                                           }
                                           $r->print('</tr>');
                                       } elsif (ref($byresource->{$symb}{$rev}{$scope}) eq 'ARRAY') {
                                           $r->print('<tr><td>'.&mt('Setting - scope: [_1]',$lt->{$scope}).'</td>'.
                                                     '<td>&nbsp;</td><td>'.
                                                     join('<br />',@{$byresource->{$symb}{$rev}{$scope}}).'</td></tr>');
                                       }
                                   }
                                   $r->print('</table>');
                               }
                               $r->print('</td>');
                               $r->print(&Apache::loncommon::end_data_table_row());
                               $newrow = 1;
                           }
                       }
                       if (ref($bysubmission->{$symb}) eq 'HASH') {
                           foreach my $rev (sort(keys(%{$bysubmission->{$symb}}))) {
                               if ($newrow) {
                                   $r->print(&Apache::loncommon::continue_data_table_row());
                               }
                               $r->print('<td>'.$rev.'</td><td>');
                               if (ref($bysubmission->{$symb}{$rev}) eq 'ARRAY') {
                                   $r->print(&mt('Submissions to: ').' '.
                                            join(', ',@{$bysubmission->{$symb}{$rev}}));
                               }
                               $r->print('</td>');
                               $r->print(&Apache::loncommon::end_data_table_row());
                               $newrow = 1;
                           }
                       }
                       if (ref($byresponsetype->{$symb}) eq 'HASH') {
                           foreach my $rev (sort(keys(%{$byresponsetype->{$symb}}))) {
                               if ($newrow) {
                                   $r->print(&Apache::loncommon::continue_data_table_row());
                               }
                               $r->print('<td>'.$rev.'</td><td>');
                               if (ref($byresponsetype->{$symb}{$rev}) eq 'ARRAY') {
                                   $r->print(&mt('Response Type(s): ').' '.
                                            join('<br />',@{$byresponsetype->{$symb}{$rev}}));
                               }
                               $r->print('</td>');
                           }
                           $r->print(&Apache::loncommon::end_data_table_row());
                       }
                   }
               }
           }
           $r->print(&Apache::loncommon::end_data_table());
       }
   }
   
   sub releases_by_map {
       my ($r,$bymap,$url,$scopeorder,$lt) = @_;
       return unless ((ref($bymap) eq 'HASH') && (ref($scopeorder) eq 'ARRAY'));
       if (ref($bymap->{$url}) eq 'HASH') {
           foreach my $rev (sort(keys(%{$bymap->{$url}}))) {
               $r->print('<td valign="middle">'.$rev.'</td><td>');
               if (ref($bymap->{$url}{$rev}) eq 'HASH') {
                   $r->print('<table border="0">');
                   foreach my $scope (@{$scopeorder}) {
                       if (ref($bymap->{$url}{$rev}{$scope}) eq 'HASH') {
                           $r->print('<tr><td>'.&mt('Setting - scope: [_1]',$lt->{$scope}).'</td>');
                           foreach my $which (sort(keys(%{$bymap->{$url}{$rev}{$scope}}))) {
                               $r->print('<td>'.$which.'</td><td>'.
                                         join('<br />',@{$bymap->{$url}{$rev}{$scope}{$which}}).
                                         '</td>');
                           }
                           $r->print('</tr>');
                       } elsif (ref($bymap->{$url}{$rev}{$scope}) eq 'ARRAY') {
                           $r->print('<tr><td>'.&mt('Setting - scope: [_1]',$lt->{$scope}).
                                     '</td><td>&nbsp;</td><td>'.
                                     join('<br />',@{$bymap->{$url}{$rev}{$scope}}).'</td></tr>');
                       }
                   }
                   $r->print('</table>');
               }
               $r->print('</td>');
           }
       } else {
           $r->print('<td colspan="2">&nbsp;</td>');
       }
       return;
   }
   
   sub get_param_description {
       my ($stdtype,$value) = @_;
       my $name = $value;
       my $paramstrings = &Apache::lonparmset::standard_string_options($stdtype);
       unless (ref($paramstrings) eq 'ARRAY') {
           return $name;
       }
       foreach my $possibilities (@{$paramstrings}) {
           next unless (ref($possibilities) eq 'ARRAY');
           my ($thing, $description) = @{ $possibilities };
           if ($thing eq $value) {
               $name = $description;
               last;
           }
       }
       return $name;
   }
   
   sub show_autocoowners {
       my (@currcoown) = @_;
       my $output = '<i>'.&mt('Co-ownership is set automatically when a Course Coordinator role is assigned to official course personnel (from institutional data).').'</i>';
       if (@currcoown > 0) { 
           $output .= '<br />'.&mt('Current co-owners are:').'&nbsp;'.
                      join(', ',map { &Apache::loncommon::plainname(split(':',$_)); } (@currcoown));
       } else {
           $output .= '<br />'.&mt('Currently no co-owners.');
       } 
       return $output;
   }
   
   sub coowner_invitations {
       my ($cnum,$cdom,@currcoown) = @_;
       my ($output,@pendingcoown,@othercoords);
       my $pendingcoowners =
           $env{'course.'.$env{'request.course.id'}.'.internal.pendingco-owners'};
       if ($pendingcoowners) {
           @pendingcoown = split(',',$pendingcoowners);
       }
       my $ccrole = 'cc';
       my %ccroles = &Apache::lonnet::get_my_roles($cnum,$cdom,undef,undef,[$ccrole]);
       foreach my $key (sort(keys(%ccroles))) {
           my ($ccname,$ccdom,$role) = split(':',$key);
           next if ($key eq $env{'user.name'}.':'.$env{'user.domain'}.':'.$ccrole);
           unless (grep(/^\Q$ccname\E:\Q$ccdom\E$/,@currcoown,@pendingcoown)) {
               push(@othercoords,$ccname.':'.$ccdom);
           }
       }
       my $coowner_rows = @currcoown + @pendingcoown + @othercoords;
       if ($coowner_rows) {
           $output .= &Apache::loncommon::start_data_table();
           if (@currcoown) {
               $output .= &Apache::loncommon::start_data_table_row().
                             '<td><i>'.&mt('Current co-owners').'</i></td><td>';
               foreach my $person (@currcoown) {
                   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 .= '</td>'.
                             &Apache::loncommon::end_data_table_row();
           }
           if ($pendingcoowners) {
               $output .= &Apache::loncommon::start_data_table_row().
                             '<td><i>'.&mt('Invited as co-owners [_1](agreement pending)','<br />').'</i></td><td>';
               foreach my $person (@pendingcoown) {
                   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 .= '</td>'.
                          &Apache::loncommon::end_data_table_row();
           }
           if (@othercoords) {
               $output .= &Apache::loncommon::start_data_table_row().
                             '<td><i>'.&mt('Invite other Coordinators [_1]to become co-owners','<br />').'</i></td><td>';
               foreach my $person (@othercoords) {
                   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 .= '</td>'.
                             &Apache::loncommon::end_data_table_row();
           }
           $output .= &Apache::loncommon::end_data_table();
       } else {
           $output = &mt('There are no coordinators to select as co-owners');
       }
       return $output;
   }
   
   sub manage_coownership  {
       my ($cnum,$cdom,@currcoown) = @_;
       my (@pendingcoown);
       my $pendingcoowners =
           $env{'course.'.$env{'request.course.id'}.'.internal.pendingco-owners'};
       if ($pendingcoowners) {
           @pendingcoown = split(',',$pendingcoowners);
       }
       my ($is_coowner,$is_pending,$output);
       my $uname = $env{'user.name'};
       my $udom = $env{'user.domain'};
       if (grep(/^\Q$uname\E:\Q$udom\E$/,@currcoown)) {
           $is_coowner = 1;
       }
       if (grep(/^\Q$uname\E:\Q$udom\E$/,@pendingcoown)) {
           $is_pending = 1;
       }
       if (@currcoown && ($is_coowner || $is_pending)) {
           $output = &Apache::loncommon::start_data_table();
       }
       if (@currcoown) {
           if ($is_coowner || $is_pending) { 
               $output .= &Apache::loncommon::start_data_table().
                          &Apache::loncommon::start_data_table_row().'<td>';
           }
           $output .= &mt('Current co-owners are:').'&nbsp;'.
                      join(', ', map { &Apache::loncommon::plainname(split(':',$_)); } (@currcoown));  
           if ($is_coowner || $is_pending) {
               $output .= '</td>'.&Apache::loncommon::end_data_table_row(); 
           }
       }
       if ($is_coowner || $is_pending) {
           if (@currcoown) { 
               $output .= &Apache::loncommon::start_data_table_row().'<td>';
           }
           $output .= '<span class="LC_nobreak">';
           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>';
           } 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).
                          '<label><input type="radio" name=pending_coowoner" value="decline" />'.&mt('Decline?').'</label>';
           }
           $output .= '</span>';
           if (@currcoown) {
               $output .= '</td>'.&Apache::loncommon::end_data_table_row();
           }
       }
       if (@currcoown && ($is_coowner || $is_pending)) {
           $output .= &Apache::loncommon::end_data_table();
       }
       return $output;
   }
   
 sub print_localization {  sub print_localization {
     my ($cdom,$settings,$ordered,$itemtext,$rowtotal) = @_;      my ($cdom,$settings,$ordered,$itemtext,$rowtotal) = @_;
     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')) {
Line 1491  sub print_localization { Line 2748  sub print_localization {
     }      }
     my %items = (      my %items = (
         languages => {          languages => {
                         text => &mt($itemtext->{'languages'}).'<br />'.                          text => '<b>'.&mt($itemtext->{'languages'}).'</b><br />'.
                                 &mt("(will override user's preference)"),                                  &mt("(overrides individual user preference)"),
                         input => 'selectbox',                          input => 'selectbox',
                      },                        }, 
         timezone => {          timezone => {
                         text  => &mt($itemtext->{'timezone'}),                          text  => '<b>'.&mt($itemtext->{'timezone'}).'</b>',
                         input => 'selectbox',                          input => 'selectbox',
                     },                      },
         datelocale  => {           datelocale  => { 
                          text => &mt($itemtext->{'datelocale'}),                           text => '<b>'.&mt($itemtext->{'datelocale'}).'</b>',
                          input => 'selectbox',                           input => 'selectbox',
                        },                         },
     );      );
Line 1609  sub print_feedback { Line 2866  sub print_feedback {
     my %sections = &Apache::loncommon::get_sections($cdom,$cnum);      my %sections = &Apache::loncommon::get_sections($cdom,$cnum);
     my @sections = sort( { $a <=> $b } keys(%sections));      my @sections = sort( { $a <=> $b } keys(%sections));
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                                            currone => 'Current recipient:',                                             currone  => 'Current recipient:',
                                            curmult => 'Current recipients:',                                             currmult => 'Current recipients:',
                                            add     => 'Additional recipient:',                                             add      => 'Additional recipient:',
                                            del     => 'Delete?',                                             del      => 'Delete?',
                                            sec     => 'Sections:',                                             sec      => 'Sections:',
                                          );                                           );
   
     foreach my $item (@{$ordered}) {      foreach my $item (@{$ordered}) {
         $count ++;          $count ++;
         $datatable .= &item_table_row_start($items{$item}{text},$count);          if ($position eq 'top') {
           $datatable .= &item_table_row_start($items{$item}{text},$count);
           } else {
           $datatable .= &item_table_row_start($items{$item}{text}."<br/>(Custom text)",$count, "advanced");
           }
         if ($position eq 'top') {          if ($position eq 'top') {
             my $includeempty = 0;              my $includeempty = 0;
             $datatable .= &user_table($cdom,$item,\@sections,              $datatable .= &user_table($cdom,$item,\@sections,
Line 1641  sub user_table { Line 2902  sub user_table {
     } else {      } else {
         my $num = 0;          my $num = 0;
         my @curr = split(/,/,$currvalue);          my @curr = split(/,/,$currvalue);
         $output .= &Apache::loncommon::start_data_table();          $output .= '<table class="LC_nested_outer">';
         my ($currusers);          my ($currusers);
         foreach my $val (@curr) {          foreach my $val (@curr) {
             next if ($val eq '');              next if ($val eq '');
Line 1672  sub user_table { Line 2933  sub user_table {
             $num ++;              $num ++;
         }          }
         if ($num) {          if ($num) {
             $output .= &Apache::loncommon::start_data_table_row().              $output .= '<tr>'.
                        '<td align="left"><i>';                         '<td align="left"><i>';
             if ($num > 1) {              if ($num == 1) {
                 $output .= $lt->{'currone'};                  $output .= $lt->{'currone'};
             } else {              } else {
                 $output .= $lt->{'currmult'};                  $output .= $lt->{'currmult'};
             }              }
             $output .= '</i><br />'.              $output .= '</i><br />'.
                           '<table>'.$currusers.'</table></td>'.                            '<table>'.$currusers.'</table></td>'.
                           &Apache::loncommon::end_data_table_row();                            '</tr>';
         }          }
         $output .= &Apache::loncommon::start_data_table_row().          $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>'.&Apache::loncommon::end_data_table_row().                    '</td></tr></table>';
                   &Apache::loncommon::end_data_table();  
     }      }
     return $output;      return $output;
 }  }
Line 1700  sub select_recipient { Line 2960  sub select_recipient {
     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,1);
     my $css_class = ($num % 2)?'LC_even_row':'LC_odd_row';  
     my $output =       my $output = 
         '<table><tr class="'.$css_class.'"><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>'.
         '<td align="center">'.&mt('Domain').'<br />'.$domform.'</td>';          '<td align="center">'.&mt('Domain').'<br />'.$domform.'</td>';
     if (ref($sections) eq 'ARRAY') {      if (ref($sections) eq 'ARRAY') {
Line 1756  sub print_discussion { Line 3015  sub print_discussion {
     }      }
     my %items = (      my %items = (
         'plc.roles.denied' => {          'plc.roles.denied' => {
                    text => '<b>'.&mt($itemtext->{'plc.roles.denied'}).'</b>'.                     text => '<span class="LC_nobreak"><b>'.&mt($itemtext->{'plc.roles.denied'}).'</b>'.
                            &Apache::loncommon::help_open_topic("Course_Disable_Discussion").                             &Apache::loncommon::help_open_topic("Course_Disable_Discussion").'</span><br />'.
                            &mt('(role-based)'),                             &mt('(role-based)'),
                    input => 'checkbox',                     input => 'checkbox',
                  },                   },
Line 1769  sub print_discussion { Line 3028  sub print_discussion {
                  },                   },
   
         'pch.roles.denied'   => {          'pch.roles.denied'   => {
                    text => '<b>'.&mt($itemtext->{'pch.roles.denied'}).'</b>'.                     text => '<span class="LC_nobreak"><b>'.&mt($itemtext->{'pch.roles.denied'}).'</b>'.
                            &Apache::loncommon::help_open_topic("Course_Disable_Discussion").'<br />'.                             &Apache::loncommon::help_open_topic("Course_Disable_Discussion").'</span><br />'.
                            &mt('(role-based)'),                             &mt('(role-based)'),
                    input => 'checkbox',                     input => 'checkbox',
                  },                   },
Line 1789  sub print_discussion { Line 3048  sub print_discussion {
                    text => '<b>'.&mt($itemtext->{'allow_discussion_post_editing'}).'</b>',                     text => '<b>'.&mt($itemtext->{'allow_discussion_post_editing'}).'</b>',
                    input => 'checkbox',                     input => 'checkbox',
                  },                   },
           'discussion_post_fonts' => {
                      text => '<b>'.&mt($itemtext->{'discussion_post_fonts'}).'</b>',
                      input => 'textbox',
                      size  => '20',
                    },
     );      );
     my $datatable;      my $datatable;
     my $count;      my $count;
Line 1796  sub print_discussion { Line 3060  sub print_discussion {
     my %sections = &Apache::loncommon::get_sections($cdom,$cnum);      my %sections = &Apache::loncommon::get_sections($cdom,$cnum);
     my @sections = sort( { $a <=> $b } keys(%sections));      my @sections = sort( { $a <=> $b } keys(%sections));
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                                           currone => 'Disallowed:',                                            currone  => 'Disallowed:',
                                           curmult => 'Disallowed:',                                            currmult => 'Disallowed:',
                                           add     => 'Disallow more:',                                            add      => 'Disallow more:',
                                           del     => 'Delete?',                                            del      => 'Delete?',
                                           sec     => 'Sections:',                                            sec      => 'Sections:',
                                          );                                           );
   
     foreach my $item (@{$ordered}) {      foreach my $item (@{$ordered}) {
Line 1828  sub print_discussion { Line 3092  sub print_discussion {
                           &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).
                           &Apache::loncommon::end_data_table();                            &Apache::loncommon::end_data_table();
           } elsif ($item eq 'discussion_post_fonts') {
               $datatable .= &Apache::loncommon::start_data_table().
                             &Apache::loncommon::start_data_table_row().
                             '<th align="center">'.&mt('Sum of likes/dislikes').'</th>'.
                             '<th align="center">'.&mt('font-size').'</th>'.
                             '<th align="center">'.&mt('font-weight').'</th>'.
                             '<th align="center">'.&mt('font-style').'</th>'.
                             '<th align="center">'.&mt('Other css').'</th>'. 
                             &Apache::loncommon::end_data_table_row().
                             &set_discussion_fonts($cdom,$cnum,$item,$settings).
                             &Apache::loncommon::end_data_table();
         }          }
         $datatable .= &item_table_row_end();          $datatable .= &item_table_row_end();
     }      }
Line 1836  sub print_discussion { Line 3111  sub print_discussion {
 }  }
   
 sub role_checkboxes {  sub role_checkboxes {
     my ($cdom,$cnum,$item,$settings,$showsections) = @_;      my ($cdom,$cnum,$item,$settings,$showsections,$crstype) = @_;
     my @roles = ('st','ad','ta','ep','in','cc');      my @roles = ('st','ad','ta','ep','in');
       if ($crstype eq 'Community') {
           push(@roles,'co');
       } else {
           push(@roles,'cc');
       }
     my $output;      my $output;
     my (@current,@curr_roles,%currsec,@sections);      my (@current,@curr_roles,%currsec,@sections);
     if ($showsections) {      if ($showsections) {
Line 1874  sub role_checkboxes { Line 3154  sub role_checkboxes {
         if (grep(/^\Q$role\E$/,@current)) {          if (grep(/^\Q$role\E$/,@current)) {
             $checked = ' checked="checked" ';              $checked = ' checked="checked" ';
         }          }
         my $plrole=&Apache::lonnet::plaintext($role);          my $plrole=&Apache::lonnet::plaintext($role,$crstype);
         if ($showsections) {          if ($showsections) {
             $output .= &Apache::loncommon::start_data_table_row();              $output .= &Apache::loncommon::start_data_table_row();
         } else {          } else {
Line 1886  sub role_checkboxes { Line 3166  sub role_checkboxes {
                 $output .= '<tr>';                  $output .= '<tr>';
             }              }
         }          }
         $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.'/>&nbsp;'.
                    $plrole.'</label></span></td>';                     $plrole.'</label></span></td>';
         if ($showsections) {          if ($showsections) {
Line 1918  sub role_checkboxes { Line 3198  sub role_checkboxes {
                     $output .= '<tr>';                      $output .= '<tr>';
                 }                  }
             }              }
             $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.' />&nbsp;'.$rolename.
                        '</label></span></td>';                         '</label></span></td>';
             if ($showsections) {              if ($showsections) {
Line 1944  sub role_checkboxes { Line 3224  sub role_checkboxes {
     return $output;      return $output;
 }  }
   
   sub set_discussion_fonts {
       my ($cdom,$cnum,$item,$settings) = @_;
       my ($classorder,$classtitles) = &discussion_vote_classes();
       my ($styleorder,$styleitems) = &discussion_vote_styles();
       my $output;
       if (ref($classorder) eq 'ARRAY') {
           foreach my $cat (@{$classorder}) {
               my %curr = ();
               ($curr{'size'},$curr{'weight'},$curr{'style'},$curr{'other'}) =
                   split(/,/,$settings->{'discussion_post_fonts_'.$cat});
               $output .= &Apache::loncommon::start_data_table_row().
                          '<td>'.$classtitles->{$cat}.'</td>';
               if (ref($styleorder) eq 'ARRAY') {
                   foreach my $item (@{$styleorder}) {
                       $output .= '<td><span class="LC_nobreak">';
                       my $selitem = $item;
                       if ($item eq 'size') {
                           my ($currsize,$currunit);
                           if ($curr{'size'} =~ /^(\d+)(px|%)$/) {
                               ($currsize,$currunit) = ($1,$2);
                               $curr{'size'} = $currunit;
                           }
                           $output .= '<input type="textbox" name="discussion_post_fonts_'.$cat.'_'.$item.'" value="'.$currsize.'" size="5">'.
                                      '&nbsp;';
                           $selitem = 'unit';
                       }
                       if ((ref($styleitems) eq 'HASH') && (ref($styleitems->{$item}) eq 'ARRAY')) {
                           $output .= '<select name="discussion_post_fonts_'.$cat.'_'.$selitem.'">';
                           foreach my $val (@{$styleitems->{$item}}) {
                               my $sel;
                               if ($val eq $curr{$item}) {
                                   $sel = ' selected="selected"';
                               }
                               $output .= '<option value="'.$val.'"'.$sel.'>'.$val.'</option>';
                           }
                       }
                   }
               }
               $output .= '</span></td><td><input type="textbox" size="10" name="discussion_post_fonts_'.$cat.'_other" value="'.$curr{'other'}.'" /></td>';
          }
          $output .= &Apache::loncommon::end_data_table_row();
       }
       return $output;
   }
   
   sub discussion_vote_classes {
       my $classorder = ['twoplus','oneplus','zero','oneminus','twominus'];
       my %classtitles = &Apache::lonlocal::texthash( 
                           'twoplus'  => 'Two sigma above mean',
                           'oneplus'  => 'One sigma above mean',
                           'zero'     => 'Within one sigma of mean',
                           'oneminus' => 'One sigma below mean',
                           'twominus' => 'Two sigma below mean',
                         );
       return ($classorder,\%classtitles);
   }
   
   sub discussion_vote_styles {
       my $styleorder = ['size','weight','style'];
       my $styleitems = {
                            size => ['','px','%','xx-small','x-small','small','medium','large',
                                     'x-large','xx-large','smaller','larger'],
                            weight => ['','normal','bold','bolder','lighter','100','200','300','400',
                                       '500','600','700','800','900'],
                            style => ['','normal','italic','oblique'],
                        };
       return ($styleorder,$styleitems);
   }
   
 sub print_classlists {  sub print_classlists {
     my ($position,$cdom,$settings,$itemtext,$rowtotal) = @_;      my ($position,$cdom,$settings,$itemtext,$rowtotal,$crstype) = @_;
     my @ordered;      my @ordered;
     if ($position eq 'top') {      if ($position eq 'top') {
         @ordered = ('default_enrollment_start_date',          @ordered = ('default_enrollment_start_date',
                     'default_enrollment_end_date');                      'default_enrollment_end_date');
           if ($crstype eq 'Course') {
               push(@ordered,'defaultcredits');
           }
     } elsif ($position eq 'middle') {      } elsif ($position eq 'middle') {
         @ordered = ('nothideprivileged');          @ordered = ('nothideprivileged');
     } else {      } else {
         @ordered = ('student_classlist_view',          @ordered = ('student_classlist_view',
                     'student_opt_in','student_classlist_portfiles');                      'student_classlist_opt_in',
                        'student_classlist_portfiles');
       }
       my %lt;
   
       if ($crstype eq 'Community') {
           %lt = &Apache::lonlocal::texthash (
                    disabled => 'No viewable membership list',
                    section  => "Membership of viewer's section",
                    all      => 'List of all members',
                 );
       } else {
           %lt = &Apache::lonlocal::texthash (
                    disabled => 'No viewable classlist',
                    section  => "Classlist of viewer's section",
                    all      => 'Classlist of all students',
                 );
     }      }
   
     my %items = (      my %items = (
         'default_enrollment_start_date' => {          'default_enrollment_start_date' => {
                    text => '<b>'.&mt($itemtext->{'default_enrollment_start_date'}).'</b>',                     text => '<b>'.&mt($itemtext->{'default_enrollment_start_date'}).'</b>',
Line 1965  sub print_classlists { Line 3334  sub print_classlists {
                    text => '<b>'.&mt($itemtext->{'default_enrollment_end_date'}).'</b>',                     text => '<b>'.&mt($itemtext->{'default_enrollment_end_date'}).'</b>',
                    input => 'dates',                     input => 'dates',
                  },                   },
           'defaultcredits' => {
                      text => '<b>'.&mt($itemtext->{'defaultcredits'}).'</b>',
                    },
                 
         'nothideprivileged'   => {          'nothideprivileged'   => {
                    text => '<b>'.&mt($itemtext->{'nothideprivileged'}).'</b>',                     text => '<b>'.&mt($itemtext->{'nothideprivileged'}).'</b>',
                    input => 'checkbox',                     input => 'checkbox',
Line 1974  sub print_classlists { Line 3346  sub print_classlists {
         'student_classlist_view'   => {          'student_classlist_view'   => {
                    text => '<b>'.&mt($itemtext->{'student_classlist_view'}).'</b>',                     text => '<b>'.&mt($itemtext->{'student_classlist_view'}).'</b>',
                    input => 'selectbox',                     input => 'selectbox',
                    options => {                     options => \%lt,
                                 disabled => &mt('No viewable classlist'),  
                                 section  => &mt("Classlist of viewer's section"),  
                                 all      => &mt('Classlist of all students'),  
                               },  
                    order => ['disabled','all','section'],                     order => ['disabled','all','section'],
                  },                   },
         'student_opt_in' => {          'student_classlist_opt_in' => {
                    text => '<b>'.&mt($itemtext->{'student_opt_in'}).'</b>',                     text => '<b>'.&mt($itemtext->{'student_classlist_opt_in'}).'</b>',
                    input => 'radio',                     input => 'radio',
                  },                   },
   
Line 1995  sub print_classlists { Line 3363  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);      return &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal,$crstype);
 }  }
   
 sub print_appearance {  sub print_appearance {
     my ($cdom,$settings,$ordered,$itemtext,$rowtotal) = @_;      my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_;
     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 $mathdef;
       if ($crstype eq 'Community') {
           $mathdef = &mt("None specified - use member's choice");
       } else {
           $mathdef = &mt("None specified - use student's choice");
       }
     my %items = (      my %items = (
         'default_xml_style' => {          'default_xml_style' => {
                    text => '<b>'.&mt($itemtext->{'default_xml_style'}).'</b> '.                     text => '<b>'.&mt($itemtext->{'default_xml_style'}).'</b> '.
Line 2030  sub print_appearance { Line 3404  sub print_appearance {
                                 tth      => &mt('TeX to HTML'),                                  tth      => &mt('TeX to HTML'),
                               },                                },
                    order  => ['jsMath','mimetex','tth'],                     order  => ['jsMath','mimetex','tth'],
                    nullval => &mt("None specified - use student's choice"),                     nullval => $mathdef,
                  },                   },
         'tthoptions' => {          'tthoptions' => {
                    text => '<b>'.&mt($itemtext->{'tthoptions'}).'</b>',                     text => '<b>'.&mt($itemtext->{'tthoptions'}).'</b>',
Line 2038  sub print_appearance { Line 3412  sub print_appearance {
                    size => 40,                     size => 40,
                  },                   },
     );      );
     return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal);      return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype);
 }  }
   
 sub print_grading {  sub print_grading {
     my ($cdom,$settings,$ordered,$itemtext,$rowtotal) = @_;      my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_;
     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 2053  sub print_grading { Line 3427  sub print_grading {
                    input => 'selectbox',                     input => 'selectbox',
                    options => {                     options => {
                                 standard => &mt('Standard: shows points'),                                  standard => &mt('Standard: shows points'),
                                 external => &mt('External: shows number of completed parts'),                                  categories => &mt('Categories: shows points according to categories'),
                                   external => &mt('External: shows number of completed parts and totals'),
                                   externalnototals => &mt('External: shows only number of completed parts'),
                                 spreadsheet => &mt('Spreadsheet: (with link to detailed scores)'),                                   spreadsheet => &mt('Spreadsheet: (with link to detailed scores)'), 
                               },                                },
                    order => ['standard','external','spreadsheet'],                     order => ['standard','categories','external','externalnototals','spreadsheet'],
                  },                   },
         'rndseed' => {          'rndseed' => {
                    text => '<b>'.&mt($itemtext->{'rndseed'}).'</b>'.                     text => '<b>'.&mt($itemtext->{'rndseed'}).'</b>'.
                            '<span class="LC_error">'.'<br />'.                             '<span class="LC_warning">'.'<br />'.
                            &mt('Modifying this will make problems have different numbers and answers!').                             &mt('Modifying this will make problems have different numbers and answers!').
                            '</span>',                             '</span>',
                    input => 'selectbox',                     input => 'selectbox',
Line 2073  sub print_grading { Line 3449  sub print_grading {
                                 '64bit5' => '64bit5',                                  '64bit5' => '64bit5',
                               },                                },
                    order => ['32bit','64bit','64bit2','64bit3','64bit4','64bit5'],                     order => ['32bit','64bit','64bit2','64bit3','64bit4','64bit5'],
                      advanced => 1
                  },                   },
         'receiptalg'  => {          'receiptalg'  => {
                    text => '<b>'.&mt($itemtext->{'receiptalg'}).'</b><br />'.                     text => '<b>'.&mt($itemtext->{'receiptalg'}).'</b><br />'.
Line 2084  sub print_grading { Line 3461  sub print_grading {
                                 receipt3 => 'receipt3',                                  receipt3 => 'receipt3',
                               },                                },
                    order => ['receipt','receipt2','receipt3'],                     order => ['receipt','receipt2','receipt3'],
                      advanced => 1
                  },                   },
         'disablesigfigs' => {          'disablesigfigs' => {
                    text => '<b>'.&mt($itemtext->{'disablesigfigs'}).'</b>',                     text => '<b>'.&mt($itemtext->{'disablesigfigs'}).'</b>',
                    input => 'radio',                     input => 'radio',
                  },                   },
     );      );
     return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal);      return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype);
 }  }
   
 sub print_printouts {  sub print_printouts {
     my ($cdom,$settings,$ordered,$itemtext,$rowtotal) = @_;      my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_;
     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 2122  sub print_printouts { Line 3500  sub print_printouts {
                          A6        => &mt('A6').' [105x148 mm]',                           A6        => &mt('A6').' [105x148 mm]',
                        },                         },
             order => ['Letter','Legal','Tabloid','Executive','A2','A3','A4','A5','A6'],              order => ['Letter','Legal','Tabloid','Executive','A2','A3','A4','A5','A6'],
             nullval => 'None specified',              nullval => &mt('None specified'),
                               },                                },
         print_header_format => {          print_header_format => {
             text => '<b>'.&mt($itemtext->{'print_header_format'}).'</b>',              text => '<b>'.&mt($itemtext->{'print_header_format'}).'</b>',
Line 2132  sub print_printouts { Line 3510  sub print_printouts {
             text => '<b>'.&mt($itemtext->{'disableexampointprint'}).'</b>',              text => '<b>'.&mt($itemtext->{'disableexampointprint'}).'</b>',
             input => 'radio',              input => 'radio',
                                  },                                   },
           canuse_pdfforms => {
               text  => '<b>'.&mt($itemtext->{'canuse_pdfforms'}).'</b>',
               input => 'selectbox',
               options => {
                            1    => &mt('Yes'),
                            0    => &mt('No'),
                          },
               order => ['1','0'],
               nullval => &mt('None specified - use domain default'),
                       }
     );      );
     return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal);      return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype);
 }  }
   
 sub print_spreadsheet {  sub print_spreadsheet {
     my ($cdom,$settings,$ordered,$itemtext,$rowtotal) = @_;      my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_;
     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 2169  sub print_spreadsheet { Line 3557  sub print_spreadsheet {
             input => 'radio',              input => 'radio',
                          },                           },
                 );                  );
     return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal);      return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype);
 }   }
   
 sub print_bridgetasks {  sub print_bridgetasks {
     my ($cdom,$settings,$ordered,$itemtext,$rowtotal) = @_;      my ($cdom,$settings,$ordered,$itemtext,$rowtotal,$crstype) = @_;
     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 ($stumsg,$msgnote);
       if ($crstype eq 'Community') {
           $stumsg = &mt('Send message to member');
           $msgnote = &mt('Message to member and add to user notes');
       } else {
           $stumsg = &mt('Send message to student');
           $msgnote = &mt('Message to student and add to user notes');
       }
     my %items = (      my %items = (
          task_messages => {           task_messages => {
               text => '<b>'.&mt($itemtext->{'task_messages'}).'</b>',                text => '<b>'.&mt($itemtext->{'task_messages'}).'</b>',
               input => 'selectbox',                input => 'selectbox',
               options => {                options => {
                            only_student => &mt('Send message to student'),                             only_student => $stumsg,
                            student_and_user_notes_screen => &mt('Message to student and add to user notes'),                             student_and_user_notes_screen => $msgnote,
                          },                           },
               order   => ['only_student','student_and_user_notes_screen'],                order   => ['only_student','student_and_user_notes_screen'],
               nullval => &mt('No message or record in user notes'),                nullval => &mt('No message or record in user notes'),
Line 2203  sub print_bridgetasks { Line 3599  sub print_bridgetasks {
              input => 'radio',               input => 'radio',
                                   },                                    },
                 );                  );
     return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal);      return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype);
 }  }
   
 sub print_other {  sub print_other {
     my ($cdom,$settings,$allitems,$rowtotal) = @_;      my ($cdom,$settings,$allitems,$rowtotal,$crstype) = @_;
     unless ((ref($settings) eq 'HASH') && (ref($allitems) eq 'ARRAY')) {      unless ((ref($settings) eq 'HASH') && (ref($allitems) eq 'ARRAY')) {
         return;          return;
     }      }
Line 2228  sub print_other { Line 3624  sub print_other {
                             input => 'textbox',                              input => 'textbox',
                             size  => '30',                              size  => '30',
                            };                             };
     my $output = &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal);      my $output = &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal,$crstype);
 }  }
   
 sub get_other_items {  sub get_other_items {
Line 2245  sub get_other_items { Line 3641  sub get_other_items {
             unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./) ||              unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./) ||
                     ($parameter =~ m/^selfenroll_/) || ($parameter =~ /_selfenroll$/)                      ($parameter =~ m/^selfenroll_/) || ($parameter =~ /_selfenroll$/)
                     || ($parameter eq 'type') ||                      || ($parameter eq 'type') ||
                     ($parameter =~ m/^(cc|in|ta|ep|ad|st)\.plaintext$/)) {                      ($parameter =~ m/^(cc|co|in|ta|ep|ad|st)\.plaintext$/)
                       || ($parameter =~ m/^discussion_post_fonts/)) {
                 push(@ordered,$parameter);                  push(@ordered,$parameter);
             }              }
         }          }
Line 2254  sub get_other_items { Line 3651  sub get_other_items {
 }  }
   
 sub item_table_row_start {  sub item_table_row_start {
     my ($text,$count) = @_;      my ($text,$count,$add_class) = @_;
     my $output;      my $output;
     if ($count%2) {   my $css_class = ($count % 2) ? 'LC_odd_row' : 'LC_even_row';
         $output .= '<tr class="LC_odd_row">';   $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq '');
     } else {   $output .= '<tr class="'.$css_class.'">'."\n";;
         $output .= '<tr>';  
     }  
     $output .= '<td class="LC_left_item">'.$text.      $output .= '<td class="LC_left_item">'.$text.
                '</td><td class="LC_right_item" align="right">';                 '</td><td class="LC_right_item">';
     return $output;      return $output;
 }  }
   
Line 2333  sub select_from_options { Line 3728  sub select_from_options {
 }  }
   
 sub make_item_rows {  sub make_item_rows {
     my ($cdom,$items,$ordered,$settings,$rowtotal) = @_;      my ($cdom,$items,$ordered,$settings,$rowtotal,$crstype) = @_;
     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;
         foreach my $item (@{$ordered}) {          foreach my $item (@{$ordered}) {
             $count ++;              $count ++;
             $datatable .= &item_table_row_start($items->{$item}{text},$count);              if (exists $items->{$item}{advanced} && $items->{$item}{advanced} == 1) {
             if ($item eq 'nothideprivileged') {                  $datatable .= &item_table_row_start($items->{$item}{text},$count,"advanced");
                 $datatable .= &nothidepriv_row($cdom,$item,$settings);              } else {
                   $datatable .= &item_table_row_start($items->{$item}{text},$count);
               }
               if ($item eq 'defaultcredits') {
                   my $defaultcredits = $env{'course.'.$env{'request.course.id'}.'.internal.defaultcredits'};
                   my $showcredits;
                   if ($defaultcredits ne '') {
                       $showcredits = &mt('Default is [quant,_1,credit]',$defaultcredits);
                   } else {
                       $showcredits = &mt('No default set');
                   }
                   $datatable .= $showcredits;
               } elsif ($item eq 'nothideprivileged') {
                   $datatable .= &nothidepriv_row($cdom,$item,$settings,$crstype);
             } elsif ($item eq 'print_header_format') {              } elsif ($item eq 'print_header_format') {
                 $datatable .= &print_hdrfmt_row($item,$settings);                  $datatable .= &print_hdrfmt_row($item,$settings);
             } elsif ($items->{$item}{input} eq 'dates') {              } elsif ($items->{$item}{input} eq 'dates') {
Line 2371  sub make_item_rows { Line 3779  sub make_item_rows {
 }  }
   
 sub nothidepriv_row {  sub nothidepriv_row {
     my ($cdom,$item,$settings) = @_;      my ($cdom,$item,$settings,$crstype) = @_;
     my ($cnum) = &get_course();      my ($cnum) = &get_course();
     my %nothide;      my %nothide;
     my $datatable;      my $datatable;
Line 2411  sub nothidepriv_row { Line 3819  sub nothidepriv_row {
             }              }
         }          }
         if (exists($privileged{$udom}{$uname})) {          if (exists($privileged{$udom}{$uname})) {
             push(@privusers,$user);              unless (grep(/^\Q$user\E$/,@privusers)) {
                   push(@privusers,$user);
               }
         }          }
     }      }
     if (@privusers) {      if (@privusers) {
Line 2431  sub nothidepriv_row { Line 3841  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="yes" />'.&mt('Hidden').'</label>&nbsp;'.                            $hideon.' value="" />'.&mt('Hidden').'</label>&nbsp;'.
                           '<label><input type="radio" name="'.$item.'_'.$user.'"'.                          $hideoff.' value="" />'.&mt('Shown').'</label></span></td>'.                            '<label><input type="radio" name="'.$item.'_'.$user.'"'.                          $hideoff.' value="yes" />'.&mt('Shown').'</label></span></td>'.
                           '</tr>';                            '</tr>';
         }          }
         $datatable .= '</table>';          $datatable .= '</table>';
     } else {      } else {
         $datatable .= &mt('No Domain Coordinators have course roles');          if ($crstype eq 'Community') {
               $datatable .= &mt('No Domain Coordinators have community roles');
           } else {
               $datatable .= &mt('No Domain Coordinators have course roles');
           }
     }      }
     return $datatable;      return $datatable;
 }  }
Line 2452  sub print_hdrfmt_row { Line 3866  sub print_hdrfmt_row {
         $currstr .= '<b>'.&mt('Current print header:').' <span class="LC_warning"><tt>'.          $currstr .= '<b>'.&mt('Current print header:').' <span class="LC_warning"><tt>'.
                    $settings->{$item}.'</tt></span></b><br />';                     $settings->{$item}.'</tt></span></b><br />';
         my @current = split(/(%\d*[nca])/,$settings->{$item});          my @current = split(/(%\d*[nca])/,$settings->{$item});
         foreach my $item (@current) {          foreach my $val (@current) {
             unless ($item eq '') {              unless ($val eq '') {
                 push(@curr,$item);                  push(@curr,$val);
             }              }
         }          }
         $currnum = @curr;          $currnum = @curr;
Line 2514  function getIndexByName(item) { Line 3928  function getIndexByName(item) {
 </script>  </script>
   
 ENDJS  ENDJS
     $output .= $currstr.&Apache::loncommon::start_data_table();      $output .= $currstr.'<table class="LC_nested_outer">';
     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 .= &Apache::loncommon::start_data_table_row().              $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).&mt('Delete:').
                        '<input type="checkbox" name="printfmthdr_del_'.$i.                         '<input type="checkbox" name="printfmthdr_del_'.$i.
Line 2532  ENDJS Line 3946  ENDJS
                            '<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" /></td>';
             }              }
             $output .= &Apache::loncommon::end_data_table_row();              $output .= '</tr>';
         }          }
     }      }
     my $pos = $currnum+1;       my $pos = $currnum+1; 
     $output .= &Apache::loncommon::start_data_table_row().      $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>'.
                &Apache::loncommon::end_data_table_row();                 '</tr>'; 
     $pos ++;      $pos ++;
     $currnum ++;      $currnum ++;
     $output .= &Apache::loncommon::start_data_table_row().      $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 2553  ENDJS Line 3967  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>'.
                &Apache::loncommon::end_data_table_row().                 '</tr>'.
                &Apache::loncommon::end_data_table();                  '</table>'; 
     return $output;      return $output;
 }  }
   
Line 2574  sub position_selector { Line 3988  sub position_selector {
 }  }
   
 sub substitution_selector {  sub substitution_selector {
     my ($num,$subst,$limit) = @_;      my ($num,$subst,$limit,$crstype) = @_;
       my ($stunametxt,$crsidtxt);
       if ($crstype eq 'Community') {
           $stunametxt = 'member name';
           $crsidtxt = 'community ID',
       } else {
           $stunametxt = 'student name';
           $crsidtxt = 'course ID',
       }
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                     n => 'student name',                      n => $stunametxt,
                     c => 'course ID',                      c => $crsidtxt,
                     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.'">';
     if ($subst eq '') {      if ($subst eq '') {
         $output .= '<option value="" selected="selected"> </option>';          $output .= '<option value="" selected="selected"> </option>';
     }      }
Line 2599  sub substitution_selector { Line 4021  sub substitution_selector {
     return $output;      return $output;
 }  }
   
   sub change_clone {
       my ($cdom,$cnum,$clonelist,$oldcloner) = @_;
       my $clone_crs = $cnum.':'.$cdom;
       if ($cnum && $cdom) {
           my $clone_crs = $cnum.':'.$cdom;
           my @allowclone;
           if ($clonelist =~ /,/) {
               @allowclone = split(',',$clonelist);
           } else {
               $allowclone[0] = $clonelist;
           }
           foreach my $currclone (@allowclone) {
               if (!grep(/^$currclone$/,@$oldcloner)) {
                   if ($currclone ne '*') {
                       my ($uname,$udom) = split(/:/,$currclone);
                       if ($uname && $udom && $uname ne '*') {
                           if (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') {
                               my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
                               if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) {
                                   if ($currclonecrs{'cloneable'} eq '') {
                                       $currclonecrs{'cloneable'} = $clone_crs;
                                   } else {
                                       $currclonecrs{'cloneable'} .= ','.$clone_crs;
                                   }
                                   &Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname);
                               }
                           }
                       }
                   }
               }
           }
           foreach my $oldclone (@$oldcloner) {
               if (!grep(/^\Q$oldclone\E$/,@allowclone)) {
                   if ($oldclone ne '*') {
                       my ($uname,$udom) = split(/:/,$oldclone);
                       if ($uname && $udom && $uname ne '*' ) {
                           if (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') {
                               my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
                               my %newclonecrs = ();
                               if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) {
                                   if ($currclonecrs{'cloneable'} =~ /,/) {
                                       my @currclonecrs = split/,/,$currclonecrs{'cloneable'};
                                       foreach my $crs (@currclonecrs) {
                                           if ($crs ne $clone_crs) {
                                               $newclonecrs{'cloneable'} .= $crs.',';
                                           }
                                       }
                                       $newclonecrs{'cloneable'} =~ s/,$//;
                                   } else {
                                       $newclonecrs{'cloneable'} = '';
                                   }
                                   &Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname);
                               }
                           }
                       }
                   }
               }
           }
       }
       return;
   }
   
 1;  1;

Removed from v.1.5  
changed lines
  Added in v.1.55


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.