Diff for /loncom/interface/lonrequestcourse.pm between versions 1.26 and 1.41.2.11

version 1.26, 2009/08/27 00:06:18 version 1.41.2.11, 2010/12/05 17:27:00
Line 44  described at http://www.lon-capa.org. Line 44  described at http://www.lon-capa.org.
   
 =item handler()  =item handler()
   
   =item get_breadcrumbs()
   
 =item header()  =item header()
   
 =item form_elements()  =item form_elements()
   
 =item onload_action()  =item onload_action()
   
 =item check_can_request()   
   
 =item course_types()  
   
 =item print_main_menu()  =item print_main_menu()
   
 =item request_administration()  =item request_administration()
   
   =item close_popup_form()
   
   =item get_instcode()
   
 =item print_request_form()  =item print_request_form()
   
 =item print_enrollment_menu()  =item print_enrollment_menu()
   
   =item show_invalid_crosslists()
   
 =item inst_section_selector()  =item inst_section_selector()
   
 =item date_setting_table()  =item date_setting_table()
Line 94  described at http://www.lon-capa.org. Line 98  described at http://www.lon-capa.org.
   
 =item check_autolimit()  =item check_autolimit()
   
 =item build_batchcreatehash()  
   
 =item retrieve_settings()  =item retrieve_settings()
   
 =item get_request_settings()  =item get_request_settings()
   
   =item extract_instcode() 
   
   =item generate_date_items()
   
 =back  =back
   
 =cut  =cut
Line 112  use Apache::lonnet; Line 118  use Apache::lonnet;
 use Apache::loncommon;  use Apache::loncommon;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::loncoursequeueadmin;  use Apache::loncoursequeueadmin;
   use Apache::lonuserutils;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   
 sub handler {  sub handler {
Line 121  sub handler { Line 128  sub handler {
     if ($r->header_only) {      if ($r->header_only) {
         return OK;          return OK;
     }      }
       &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['action','showdom','cnum']);          ['action','showdom','cnum','state','crstype']);
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     my $dom = &get_course_dom();      my $action = $env{'form.reqaction'};
     my $action = $env{'form.action'};  
     my $state = $env{'form.state'};      my $state = $env{'form.state'};
     my %stored;      my $context;
     my $jscript;      &generate_page($r,$action,$state,$context);
     my ($uname,$udom,$result,$warning);      return OK;
   }
   
   sub generate_page {
       my ($r,$action,$state,$context) = @_;
       &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
           ['action','showdom','cnum','state','crstype']);
       my $dom = &get_course_dom();
       my (%states,%stored);
       my ($jscript,$uname,$udom,$result,$warning);
   
       $states{'display'} = ['details'];
       $states{'view'} = ['pick_request','details','cancel','removal'];
       $states{'log'} = ['filter','display'];
       $states{'new'} = ['courseinfo','enrollment','personnel','review','process'];
   
       if ($dom =~ /^\w+citest$/) {
           $states{'new'} = ['courseinfo','review','process'];
           if ($env{'form.concepttest'} eq 'editmyown') {
               push(@{$states{'new'}},'chooseitems','uploadroster','enrolling');
           } elsif (($env{'form.concepttest'} eq 'defchosen') || 
                    (($env{'form.concepttest'} eq 'cloning') && (!$env{'form.cloneroster'}))) {
               push(@{$states{'new'}},'uploadroster','enrolling');
           } else {
               push(@{$states{'new'}},'done');
           }
       }
       if (($action eq 'new') && ($env{'form.crstype'} eq 'official')) {
           unless ($state eq 'crstype') {
               unshift(@{$states{'new'}},'codepick');
           }
       }
   
       foreach my $key (keys(%states)) {
           if (ref($states{$key}) eq 'ARRAY') {
               unshift (@{$states{$key}},'crstype');
           }
       }
   
       my @invalidcrosslist;
       my %trail = (
                    crstype       => 'Request Action',
                    codepick      => 'Category',
                    courseinfo    => 'Description',
                    enrollment    => 'Access Dates',
                    personnel     => 'Personnel',
                    review        => 'Review',
                    process       => 'Request Outcome',
                    pick_request  => 'Display Summary',
                    details       => 'Request Details',
                    cancel        => 'Cancel Request',
                    removal       => 'Outcome',
                    chooseitems   => 'Saved Test',
                    uploadroster  => 'Upload Roster',
                    enrolling     => 'Completed',
                    done          => 'Completed',
                   );
       if ($dom =~ /^\w+citest$/) {
           $trail{'crstype'} = 'Building a Test';
           $trail{'courseinfo'} = 'Test Information';
       }
   
       if (($env{'form.crstype'} eq 'official') && (&Apache::lonnet::auto_run('',$dom))) {
           $trail{'enrollment'} = 'Enrollment';
       }
   
       my ($page,$crumb,$newinstcode,$codechk,$checkedcode,$description) = 
           &get_breadcrumbs($dom,$action,\$state,\%states,\%trail);
     if ($action eq 'display') {      if ($action eq 'display') {
         if (($dom eq $env{'request.role.domain'}) && (&Apache::lonnet::allowed('ccc',$dom))) {          if (($dom eq $env{'request.role.domain'}) && (&Apache::lonnet::allowed('ccc',$dom))) {
             my $namespace = 'courserequestqueue';              my $namespace = 'courserequestqueue';
Line 146  sub handler { Line 219  sub handler {
                     if (($udom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/)) {                      if (($udom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/)) {
                         $result = &retrieve_settings($dom,$cnum,$udom,$uname);                          $result = &retrieve_settings($dom,$cnum,$udom,$uname);
                     } else {                      } else {
                         $warning = &mt('Invalid username or domain for course requestor');                          if ($env{'form.crstype'} eq 'community') {
                               $warning = &mt('Invalid username or domain for community requestor');
                           } else {
                               $warning = &mt('Invalid username or domain for course requestor');
                           }
                     }                      }
                 } else {                  } else {
                     $warning = &mt('No information was found for this course request.');                      if ($env{'form.crstype'} eq 'community') {
                           $warning = &mt('No information was found for this community request.');
                       } else {
                           $warning = &mt('No information was found for this course request.');
                       }
                 }                  }
             } else {              } else {
                 $warning = &mt('No course request ID provided.');                  $warning = &mt('No course request ID provided.');
             }              }
         } else {          } else {
             $warning = &mt('You do not have rights to view course request information.');              if ($env{'form.crstype'} eq 'any') {
                  $warning = &mt('You do not have rights to view course or community request information.');
               } elsif ($env{'form.crstype'} eq 'community') {
                   $warning = &mt('You do not have rights to view community request information.');
               } else {
                   $warning = &mt('You do not have rights to view course request information.');
               }
         }          }
     } elsif ((defined($state)) && (defined($action))) {      } elsif ((defined($state)) && (defined($action))) {
         if (($action eq 'view') && ($state eq 'details')) {          if (($action eq 'view') && ($state eq 'details')) {
             if ((defined($env{'form.showdom'})) && (defined($env{'form.cnum'}))) {              if ((defined($env{'form.showdom'})) && (defined($env{'form.cnum'}))) {
                 my $result = &retrieve_settings($env{'form.showdom'},$env{'form.cnum'});                  my $result = &retrieve_settings($env{'form.showdom'},$env{'form.cnum'});
             }              }
           } elsif ($env{'form.crstype'} eq 'official') {
               if (&Apache::lonnet::auto_run('',$dom)) {
                   if (($action eq 'new') && (($state eq 'enrollment') || 
                       ($state eq 'personnel'))) {
                       my $checkcrosslist = 0;
                       for (my $i=0; $i<$env{'form.crosslisttotal'}; $i++) {
                           if ($env{'form.crosslist_'.$i}) {
                               $checkcrosslist ++;
                           }
                       }
                       if ($checkcrosslist) {
                           my %codechk;
                           my (@codetitles,%cat_titles,%cat_order,@code_order,$lastitem);
                           &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,
                                                                    \%cat_titles,
                                                                    \%cat_order,
                                                                    \@code_order);
                           my $numtitles = scalar(@codetitles);
                           if ($numtitles) {
                               for (my $i=0; $i<$env{'form.crosslisttotal'}; $i++) {
                                   if ($env{'form.crosslist_'.$i}) {
                                       my $codecheck;
                                       my $crosslistcode = '';
                                       foreach my $item (@code_order) {
                                           $crosslistcode .= $env{'form.crosslist_'.$i.'_'.$item}; 
                                       }
                                       if ($crosslistcode ne '') { 
                                            ($codechk{$i}, my $rest) = 
                                               &Apache::lonnet::auto_validate_instcode('',$dom,$crosslistcode);
                                       }
                                       unless ($codechk{$i} eq 'valid') {
                                           $env{'form.crosslist_'.$i} = '';
                                           push(@invalidcrosslist,$crosslistcode);
                                       } 
                                   }
                               }
                           }
                       }
                   }
               }
         }          }
         my %elements =  &form_elements($dom);          my %elements =  &form_elements($dom);
         my $elementsref = {};          my $elementsref = {};
Line 173  sub handler { Line 300  sub handler {
         if (($state eq 'courseinfo') && ($env{'form.clonedom'} eq '')) {          if (($state eq 'courseinfo') && ($env{'form.clonedom'} eq '')) {
             $env{'form.clonedom'} = $dom;              $env{'form.clonedom'} = $dom;
         }          }
         $jscript = &Apache::lonhtmlcommon::set_form_elements($elementsref,\%stored);          if ($state eq 'crstype') {
               $jscript = &mainmenu_javascript($action);
           } else {
               $jscript = &Apache::lonhtmlcommon::set_form_elements($elementsref,\%stored);
               if ($state eq 'courseinfo') {
                   $jscript .= &cloning_javascript();
               }
           }
     }      }
   
     if ($state eq 'personnel') {      if ($state eq 'personnel') {
         $jscript .= "\n".&Apache::loncommon::userbrowser_javascript();          $jscript .= "\n".&Apache::loncommon::userbrowser_javascript();
     }      }
   
     my $loaditems = &onload_action($action,$state);      my $loaditems = &onload_action($action,$state,$dom);
   
     my %states;  
     $states{'display'} = ['details'];  
     $states{'view'} = ['pick_request','details','cancel','removal'];  
     $states{'log'} = ['filter','display'];  
     $states{'new'} = ['courseinfo','enrollment','personnel','review','process'];  
   
     if (($action eq 'new') && ($env{'form.crstype'} eq 'official')) {  
         unless ($env{'form.state'} eq 'crstype') {  
             unshift(@{$states{'new'}},'codepick');  
         }  
     }  
   
     foreach my $key (keys(%states)) {  
         if (ref($states{$key}) eq 'ARRAY') {  
             unshift (@{$states{$key}},'crstype');  
         }  
     }  
   
     my %trail = (  
                  crstype       => 'Course Request Action',  
                  codepick      => 'Category',  
                  courseinfo    => 'Description',  
                  enrollment    => 'Access Dates',  
                  personnel     => 'Personnel',  
                  review        => 'Review',  
                  process       => 'Result',  
                  pick_request  => 'Display Summary',  
                  details       => 'Request Details',  
                  cancel        => 'Cancel Request',  
                  removal       => 'Outcome',  
                 );  
   
     if (($env{'form.crstype'} eq 'official') && (&Apache::lonnet::auto_run('',$dom))) {  
         $trail{'enrollment'} = 'Enrollment';  
     }   
   
     my $page = 0;  
     my $crumb;  
     if (defined($action)) {  
         my $done = 0;  
         my $i=0;  
         if (ref($states{$action}) eq 'ARRAY') {  
             while ($i<@{$states{$action}} && !$done) {  
                 if ($states{$action}[$i] eq $state) {  
                     $page = $i;  
                     $done = 1;  
                 }  
                 $i++;  
             }  
         }  
         for (my $i=0; $i<@{$states{$action}}; $i++) {  
             if ($state eq $states{$action}[$i]) {  
                 &Apache::lonhtmlcommon::add_breadcrumb(  
                    {text=>"$trail{$state}"});  
                 $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests');   
                 last;  
             } else {  
                 if (($state eq 'process') && ($i > 0)) {  
                     &Apache::lonhtmlcommon::add_breadcrumb(  
     {href=>"javascript:backPage(document.requestcrs,'$states{$action}[0]')",  
      text=>"$trail{$states{$action}[$i]}"});  
                 } else {  
                     &Apache::lonhtmlcommon::add_breadcrumb(  
      {href=>"javascript:backPage(document.requestcrs,'$states{$action}[$i]')",  
       text=>"$trail{$states{$action}[$i]}"});  
                 }  
             }  
         }  
     } else {  
         &Apache::lonhtmlcommon::add_breadcrumb(  
                 {text=>'Pick Action'});  
         $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests');  
     }  
   
     my %can_request;      my (%can_request,%request_domains);
     my $canreq = &check_can_request($dom,\%can_request);      my $canreq = 
           &Apache::lonnet::check_can_request($dom,\%can_request,\%request_domains);
     if ($action eq 'new') {      if ($action eq 'new') {
         if ($canreq) {          if ($canreq) {
             if ($state eq 'crstype') {              if ($state eq 'crstype') {
                 &print_main_menu($r,\%can_request,\%states,$dom,$jscript,$loaditems,                  &print_main_menu($r,\%can_request,\%states,$dom,$jscript,$loaditems,
                                  $crumb);                                   $crumb,\%request_domains);
             } else {              } else {
                 &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,                  &request_administration($r,$action,$state,$page,\%states,$dom,
                                         $loaditems,$crumb);                                          $jscript,$loaditems,$crumb,$newinstcode,
                                           $codechk,$checkedcode,$description,
                                           \@invalidcrosslist);
                   if ($state eq 'chooseitems' || $state eq 'uploadroster' || 
                       $state eq 'enrolling') {
                       return $canreq;
                   }
             }              }
         } else {          } else {
             $r->print(&header('Course Requests').$crumb.              $r->print(&header('Course/Community Requests').$crumb.
                       '<div class="LC_warning">'.                        '<div class="LC_warning">'.
                       &mt('You do not have privileges to request creation of courses.').                        &mt('You do not have privileges to request creation of courses or communities.').
                       '</div>'.&Apache::loncommon::end_page());                        '</div>'.&Apache::loncommon::end_page());
         }          }
     } elsif ($action eq 'view') {      } elsif ($action eq 'view') {
         if ($state eq 'crstype') {          if ($state eq 'crstype') {
             &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb);              &print_main_menu($r,\%can_request,\%states,$dom,$jscript,$loaditems,$crumb,\%request_domains);
         } else {          } else {
             &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,              &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,
                                     $loaditems,$crumb);                                      $loaditems,$crumb);
Line 283  sub handler { Line 350  sub handler {
     } elsif ($action eq 'display') {      } elsif ($action eq 'display') {
         if ($warning ne '') {          if ($warning ne '') {
             my $args = { only_body => 1 };              my $args = { only_body => 1 };
             $r->print(&header('Course Requests','','',$args).$crumb.              $r->print(&header('Course/Community Requests','','',$args).$crumb.
                       '<h3>'.&mt('Course Request Details').'</h3>'.                        '<h3>'.&mt('Course/Community Request Details').'</h3>'.
                       '<div class="LC_warning">'.$warning.'</div>'.                        '<div class="LC_warning">'.$warning.'</div>'.
                       &close_popup_form());                        &close_popup_form());
         } else {          } else {
             &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,              &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,
                                     $loaditems,$crumb,$uname,$udom);                                      $loaditems,$crumb,'','','','','',$uname,$udom);
         }          }
     } elsif ($action eq 'log') {      } elsif ($action eq 'log') {
         &print_request_logs($jscript,$loaditems,$crumb);          &print_request_logs($jscript,$loaditems,$crumb);
     } else {      } else {
         &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb);          &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\%request_domains);
     }      }
     return OK;      return;
   }
   
   sub mainmenu_javascript {
       my ($action) = @_;
       return <<"END";
   function setType(courseForm) {
       for (var i=0; i<courseForm.crstype.length; i++) {
           if (courseForm.crstype.options[i].value == "$env{'form.crstype'}") {
               courseForm.crstype.options[i].selected = true;
           } else {
               courseForm.crstype.options[i].selected = false;
           }
       }
   }
   
   function setAction(courseForm) {
       for (var i=0; i<courseForm.reqaction.length; i++) {
           if (courseForm.reqaction.options[i].value == "$action") {
               courseForm.reqaction.options[i].selected = true;
           } else {
               courseForm.reqaction.options[i].selected = false;
           }
       }
   }
   END
   }
   
   sub cloning_javascript {
       return <<"END";
   function setCloneDisplay(courseForm) {
       if (courseForm.cloning.length > 1) {
           for (var i=0; i<courseForm.cloning.length; i++) {
               if (courseForm.cloning[i].checked) {
                   if (courseForm.cloning[i].value == 1) {
                       document.getElementById('cloneoptions').style.display="block";;
                   }
               }
           }
       }
   }
   END
   }
   
   sub get_breadcrumbs {
       my ($dom,$action,$state,$states,$trail) = @_;
       my ($crumb,$newinstcode,$codechk,$checkedcode,$numtitles,$description);
       my $page = 0;
       my $firstcrumb = 'Pick Action';
       my $crumbtitle = 'Course/Community Requests';
       my $crumbhelp = 'Course_Requests';
       if ($dom =~ /^\w+citest$/) {
           $firstcrumb = 'Building a Test';
           $crumbtitle = 'Create Concept Test';
           $crumbhelp = 'Concept_Test_Creation';
       }
       if ((ref($states) eq 'HASH') && (ref($trail) eq 'HASH') && (ref($state))) {
           if (defined($action)) {
               my $done = 0;
               my $i=0;
               if (ref($states->{$action}) eq 'ARRAY') {
                   while ($i<@{$states->{$action}} && !$done) {
                       if ($states->{$action}[$i] eq $$state) {
                           $page = $i;
                           $done = 1;
                       }
                       $i++;
                   }
               }
               if ($env{'form.crstype'} eq 'official') {
                   if ($page > 1) {
                       if ($states->{$action}[$page-1] eq 'codepick') {
                           if ($env{'form.instcode'} eq '') {
                               ($newinstcode,$numtitles) = &get_instcode($dom);
                               if ($numtitles) {
                                   if ($newinstcode eq '') {
                                       $$state = 'codepick';
                                       $page --;
                                   } else {
                                       ($codechk,$description) = 
                                           &Apache::lonnet::auto_validate_instcode('',
                                               $dom,$newinstcode);
                                       if ($codechk ne 'valid') {
                                           $$state = 'codepick';
                                           $page --;
                                       }
                                       $checkedcode = 1;
                                   }
                               }
                           }
                       }
                   }
               }
               my %forms = (
                             chooseitems  => 'requestcrs',
                             uploadroster => 'studentform',
                             enrolling    => 'requestcrs',
                             done         => 'requestcrs',
                           );
               my $lastidx;
               for (my $i=0; $i<@{$states->{$action}}; $i++) {
                   if ($$state eq $states->{$action}[$i]) {
                       $lastidx = $i;
                       last;
                   }
               }
               for (my $i=0; $i<@{$states->{$action}}; $i++) {
                   if ($$state eq $states->{$action}[$i]) {
                       &Apache::lonhtmlcommon::add_breadcrumb(
                          {text=>"$trail->{$$state}"});
                       $crumb = &Apache::lonhtmlcommon::breadcrumbs($crumbtitle,$crumbhelp);
                       last;
                   } else {
                       if (($$state eq 'process') || ($$state eq 'removal')) {
                           &Apache::lonhtmlcommon::add_breadcrumb(
                               { href => '/adm/requestcourse',
                                 text => "$trail->{$states->{$action}[$i]}",
                               }
                           );
                       } else {
                           if (($$state eq 'chooseitems') || ($$state eq 'uploadroster') ||
                               ($$state eq 'enrolling') || ($$state eq 'done')) {
                               if (($states->{$action}[$i] ne 'process') &&
                                   ($states->{$action}[$i] ne 'chooseitems') &&
                                   ($states->{$action}[$i] ne 'uploadroster') &&
                                   ($states->{$action}[$i] ne 'enrolling') &&
                                   ($states->{$action}[$i] ne 'done')) {
                                   &Apache::lonhtmlcommon::add_breadcrumb(
                                      { href => '/adm/requestcourse',
                                        text => "$trail->{$states->{$action}[$i]}",
                                      }
                                   );
                               } else {
                                   my $diff = $i-$lastidx;
                                   &Apache::lonhtmlcommon::add_breadcrumb(
        { href => "javascript:history.go($diff)",
          text => "$trail->{$states->{$action}[$i]}", }
                                  );
                               }
                           } else {
                               &Apache::lonhtmlcommon::add_breadcrumb(
        { href => "javascript:backPage(document.requestcrs,'$states->{$action}[$i]')",
          text => "$trail->{$states->{$action}[$i]}", }
                              );
                           }
                       }
                   }
               }
           } else {
               &Apache::lonhtmlcommon::add_breadcrumb(
                       {text=>$firstcrumb});
               $crumb = &Apache::lonhtmlcommon::breadcrumbs($crumbtitle,$crumbhelp);
           }
       } else {
           &Apache::lonhtmlcommon::add_breadcrumb(
                   {text=>$firstcrumb});
           $crumb = &Apache::lonhtmlcommon::breadcrumbs($crumbtitle,$crumbhelp);
       }
       return ($page,$crumb,$newinstcode,$codechk,$checkedcode,$description);
 }  }
   
 sub header {  sub header {
Line 310  sub header { Line 535  sub header {
         if (ref($args) eq 'HASH') {          if (ref($args) eq 'HASH') {
             my %loadhash = (              my %loadhash = (
                              'add_entries' => $loaditems,                               'add_entries' => $loaditems,
                                'function'    => 'norole',
                            );                             );
             my %arghash = (%loadhash,%{$args});              my %arghash = (%loadhash,%{$args});
             $args = \%arghash;                                $args = \%arghash;
         } else {          } else {
             $args = {'add_entries' => $loaditems,};              $args = {'add_entries' => $loaditems,
                        'function'    => 'norole'};
         }          }
     }      }
     return &Apache::loncommon::start_page($bodytitle,$jscript.$jsextra,$args);      return &Apache::loncommon::start_page($bodytitle,$jscript.$jsextra,$args);
Line 332  sub form_elements { Line 559  sub form_elements {
             },              },
             courseinfo => {              courseinfo => {
                 cdescr           => 'text',                  cdescr           => 'text',
                   cloning          => 'radio',
                 clonecrs         => 'text',                  clonecrs         => 'text',
                 clonedom         => 'selectbox',                  clonedom         => 'selectbox',
                 datemode         => 'radio',                  datemode         => 'radio',
Line 367  sub form_elements { Line 595  sub form_elements {
          },           },
     );      );
     my %servers = &Apache::lonnet::get_servers($dom,'library');      my %servers = &Apache::lonnet::get_servers($dom,'library');
       if ($dom =~ /^\w+citest$/) {
           %{$elements{'new'}{'courseinfo'}} = (
                                                 cdescr      => 'text',
                                                 concepttest => 'radio',
                                               );
           $elements{'new'}{'enrollment'}{'timezone'} = 'selectbox';
           if (&show_cloneable()) {
               $elements{'new'}{'courseinfo'}{'clonecrs'} = 'selectbox';
               $elements{'new'}{'courseinfo'}{'clonedom'} = 'hidden';
               $elements{'new'}{'courseinfo'}{'cloneroster'} = 'checkbox';
           }
       }
     my $numlib = keys(%servers);      my $numlib = keys(%servers);
     if ($numlib > 1) {      if ($numlib > 1) {
         $elements{'new'}{'courseinfo'}{'chome'} = 'selectbox';          $elements{'new'}{'courseinfo'}{'chome'} = 'selectbox';
     } else {      } else {
         $elements{'new'}{'courseinfo'}{'chome'} = 'hidden';          $elements{'new'}{'courseinfo'}{'chome'} = 'hidden';
     }      }
       if ($dom =~ /^\w+citest$/) {
           my %mergedhash = (%{$elements{'new'}{'courseinfo'}},%{$elements{'new'}{'enrollment'}});
           %{$elements{'new'}{'courseinfo'}} = %mergedhash;
       }
     my (@codetitles,%cat_titles,%cat_order,@code_order,$lastitem);      my (@codetitles,%cat_titles,%cat_order,@code_order,$lastitem);
     &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,      &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,
                                              \%cat_order,\@code_order);                                               \%cat_order,\@code_order);
Line 401  sub form_elements { Line 645  sub form_elements {
                        enrollend_year     => 'text',                         enrollend_year     => 'text',
                        enrollend_minute   => 'text',                         enrollend_minute   => 'text',
                        enrollend_second   => 'text',                         enrollend_second   => 'text',
                        crosslisttotal     => 'hidden',  
                        addcrosslist       => 'checkbox',                         addcrosslist       => 'checkbox',
                        autoadds           => 'radio',                         autoadds           => 'radio',
                        autodrops          => 'radio',                         autodrops          => 'radio',
                      );                       );
         if ($env{'form.sectotal'} > 0) {          if ($env{'form.sectotal'} > 0) {
             for (my $i=0; $i<$env{'form.sectotal'}; $i++) {              for (my $i=0; $i<$env{'form.sectotal'}; $i++) {
                 $extras{'sec_'.$i} = 'checkbox',                  $extras{'sec_'.$i} = 'radio';
                 $extras{'secnum_'.$i} = 'text',                  $extras{'secnum_'.$i} = 'text';
                 $extras{'loncapasec_'.$i} = 'text',                  $extras{'loncapasec_'.$i} = 'text';
             }              }
         }          }
         my $crosslisttotal = $env{'form.crosslisttotal'};          my $crosslisttotal = $env{'form.crosslisttotal'};
Line 420  sub form_elements { Line 663  sub form_elements {
         if (!$crosslisttotal) {          if (!$crosslisttotal) {
             $crosslisttotal = 1;              $crosslisttotal = 1;
         }          }
   
         for (my $i=0; $i<$env{'form.crosslisttotal'}; $i++) {          for (my $i=0; $i<$env{'form.crosslisttotal'}; $i++) {
             if ($numtitles) {              if ($numtitles) {
                 $extras{'crosslist_'.$i.'_'.$lastitem} = 'text';                  $extras{'crosslist_'.$i.'_'.$lastitem} = 'text';
Line 464  sub onload_action { Line 708  sub onload_action {
     my ($action,$state) = @_;      my ($action,$state) = @_;
     my %loaditems;      my %loaditems;
     if (($action eq 'new') || ($action eq 'view')) {      if (($action eq 'new') || ($action eq 'view')) {
         $loaditems{'onload'} = 'javascript:setFormElements(document.requestcrs)';          if ($state eq 'crstype') {
     }              $loaditems{'onload'} = 'javascript:setAction(document.mainmenu_action);javascript:setType(document.mainmenu_coursetype)';
     return \%loaditems;          } else {
 }              $loaditems{'onload'} = 'javascript:setFormElements(document.requestcrs);';
   
 sub check_can_request {  
     my ($dom,$can_request) = @_;  
     my $canreq = 0;  
     my ($types,$typename) = &course_types();  
     my @options = ('approval','validate','autolimit');  
     my $optregex = join('|',@options);  
     if ((ref($can_request) eq 'HASH') && (ref($types) eq 'ARRAY')) {  
         foreach my $type (@{$types}) {  
             if (&Apache::lonnet::usertools_access($env{'user.name'},  
                                                   $env{'user.domain'},  
                                                   $type,undef,'requestcourses')) {  
                 $canreq ++;  
                 if ($dom eq $env{'user.domain'}) {  
                     $can_request->{$type} = 1;  
                 }  
             }  
             if ($env{'environment.reqcrsotherdom.'.$type} ne '') {  
                 my @curr = split(',',$env{'environment.reqcrsotherdom.'.$type});  
                 if (@curr > 0) {  
                     $canreq ++;  
                     unless ($dom eq $env{'user.domain'}) {  
                         if (grep(/^\Q$dom\E:($optregex)(=?\d*)$/,@curr)) {  
                             $can_request->{$type} = 1;  
                         }  
                     }  
                 }  
             }  
         }          }
     }      }
     return $canreq;      return \%loaditems;
 }  
   
 sub course_types {  
     my @types = ('official','unofficial','community');  
     my %typename = (  
                          official   => 'Official course',  
                          unofficial => 'Unofficial course',  
                          community  => 'Community',  
                     );  
     return (\@types,\%typename);  
 }  }
   
   
 sub print_main_menu {  sub print_main_menu {
     my ($r,$can_request,$states,$dom,$jscript,$loaditems,$crumb) = @_;      my ($r,$can_request,$states,$dom,$jscript,$loaditems,$crumb,$request_domains) = @_;
     my ($types,$typename) = &course_types();      my ($types,$typename) = &Apache::loncommon::course_types();
     my $onchange;      my $onchange;
     unless ($env{'form.interface'} eq 'textual') {      unless ($env{'form.interface'} eq 'textual') {
         $onchange = 1;          $onchange = 'this.form.submit()';
     }      }
   
     my $nextstate_setter = "\n";      my $nextstate_setter = "\n";
Line 533  sub print_main_menu { Line 738  sub print_main_menu {
         }          }
     }      }
   
     my $js = <<"END";      my $js;
       unless ($dom =~ /^\w+citest$/) {
           $js = <<"END";
   
 function nextPage(formname) {  function nextPage(formname) {
     var crschoice = document.requestcrs.crstype.value;      var crschoice = document.mainmenu_coursetype.crstype.value;
     var actionchoice = document.requestcrs.action.value;      var actionchoice = document.mainmenu_action.reqaction.value;
     if (check_can_request(crschoice,actionchoice) == true) {      if (check_can_request(crschoice,actionchoice) == true) {
         if ((actionchoice == 'new') && (crschoice == 'official')) {          if ((actionchoice == 'new') && (crschoice == 'official')) {
             nextstate = 'codepick';              nextstate = 'codepick';
         } else {          } else {
 $nextstate_setter   $nextstate_setter 
         }           }
           formname.crstype.value = crschoice;
           formname.reqaction.value = actionchoice; 
         formname.state.value= nextstate;          formname.state.value= nextstate;
         formname.submit();          formname.submit();
     }      }
Line 555  function check_can_request(crschoice,act Line 764  function check_can_request(crschoice,act
     var unofficial = '';      var unofficial = '';
     var community = '';          var community = '';    
 END  END
           if (ref($can_request) eq 'HASH') {
     foreach my $item (keys(%{$can_request})) {              foreach my $item (keys(%{$can_request})) {
             $js .= "                       $js .= " 
         $item = 1;              $item = 1;
 ";  ";
     }              }
     my %lt = &Apache::lonlocal::texthash(          }
         official => 'You are not permitted to request creation of an official course in this domain.',          my %lt = &Apache::lonlocal::texthash(
         unofficial => 'You are not permitted to request creation of an unofficial course in this domain.',              official => 'You are not permitted to request creation of an official course in this domain.',
         community => 'You are not permitted to request creation of a community this domain.',              unofficial => 'You are not permitted to request creation of an unofficial course in this domain.',
         all => 'You must choose a specific course type when making a new course request.\\nAll types is not allowed.',              community => 'You are not permitted to request creation of a community this domain.',
     );               all => 'You must choose a specific course type when making a new course request.\\nAll types is not allowed.',
     $js .= <<END;          ); 
           $js .= <<END;
     if (crschoice == 'official') {      if (crschoice == 'official') {
         if (official != 1) {          if (official != 1) {
             alert("$lt{'official'}");              alert("$lt{'official'}");
Line 575  END Line 785  END
         }          }
     } else {      } else {
         if (crschoice == 'unofficial') {          if (crschoice == 'unofficial') {
             if (unofficial != 1) {             if (unofficial != 1) {
                 alert("$lt{'unofficial'}");                 alert("$lt{'unofficial'}");
                 return false;                 return false;
             }              }
         } else {          } else {
             if (crschoice == 'community') {              if (crschoice == 'community') {
Line 589  END Line 799  END
                 if (actionchoice == 'new') {                  if (actionchoice == 'new') {
                     alert("$lt{'all'}");                      alert("$lt{'all'}");
                     return false;                      return false;
                 }                                 }
             }              }
         }          }
     }      }
     return true;      return true;
 }  }
   
 END  END
       }
       my ($pagetitle,$pageinfo,$domaintitle);
       if (ref($can_request) eq 'HASH') {
           if (($can_request->{'official'}) || ($can_request->{'unofficial'})) {
               if ($can_request->{'community'}) {
                   $pagetitle = 'Course/Community Requests';
                   $pageinfo = &mt('Request creation of a new course or community, or review your pending requests.');
                   $domaintitle = &mt('Course/Community Domain');
               } else {
                   $pagetitle = 'Course Requests';
                   $pageinfo = &mt('Request creation of a new course, or review your pending course requests.');
                   $domaintitle = &mt('Course Domain');
               }
           } elsif ($can_request->{'community'}) {
               $pagetitle = 'Community Requests';
               $pageinfo = &mt('Request creation of a new course, or review your pending requests.');
               $domaintitle = &mt('Community Domain');
           } else {
               $pagetitle = 'Course/Community Requests';
               $pageinfo = &mt('You do not have rights to request creation of courses in this domain; please choose a different domain.');
               $domaintitle = &mt('Course/Community Domain');
           }
       }
   
       if ($dom =~ /^\w+citest$/) {
           my $formname = 'requestcrs';
           my $nexttext = &mt('Continue');
           $r->print(&header($pagetitle,$js.$jscript,$loaditems).$crumb.
               '<p>'.&mt('Deployment of a Concept Test requires completion of the following three steps:').'<ol>'.
               '<li>'.&mt('Creation of a course "container" and setting of access dates').'</li>'.
               '<li>'.&mt('Assembly of a valid test from Concept Inventory questions').'</li>'.
               '<li>'.&mt('Enrollment of students').'</li>'.
               '</ol></p><p>'.&mt('When assembling a test you may:').
               '<br />'.&mt('(a) have a valid test built automatically by the WebCenter, or').'<br />'.&mt('(b) select the questions to include by combining questions chosen from eleven bins with four mandatory questions, or').
               '<br />'.&mt('(c) copy one of your existing tests (including optional copying of the student roster)').'</p><p>'.&mt('The most efficient way to enroll students is to upload a text file containing usernames and passwords.').'<br />'.&mt("Students' e-mail addresses must be used as their usernames to ensure uniqueness.").'</p><div>'.
               '<form name="'.$formname.'" method="post" action="/adm/requestcourse">'."\n".
               '<input type="hidden" name="state" value="courseinfo" />'."\n".
               '<input type="hidden" name="showdom" value="'.$dom.'" />'."\n".
               '<input type="hidden" name="crstype" value="unofficial" />'."\n".
               '<input type="hidden" name="reqaction" value="new" />'."\n".
               '<input type="button" name="next" value="'.$nexttext.
               '" onclick="this.form.submit();" />'."\n".
               '</form></div>'.
                &Apache::loncommon::end_page());
           return;
       }
   
     $r->print(&header('Course Requests',$js.$jscript,$loaditems).$crumb.  
               '<div>'.  
               '<form name="domforcourse" method="post" action="/adm/requestcourse">'.  
               &Apache::lonhtmlcommon::start_pick_box().  
               &Apache::lonhtmlcommon::row_title('Course Domain').  
               &Apache::loncommon::select_dom_form($dom,'showdom','',1,$onchange));  
     if (!$onchange) {      if (!$onchange) {
         $r->print('&nbsp;<input type="submit" name="godom" value="'.          $r->print('&nbsp;<input type="submit" name="godom" value="'.
                    &mt('Change').'" />');                     &mt('Change').'" />');
     }      }
     $r->print(&Apache::lonhtmlcommon::row_closure(1).      unless ((ref($can_request) eq 'HASH') && (keys(%{$can_request}) > 0)) {
               &Apache::lonhtmlcommon::end_pick_box().'</form></div>');          $r->print(&Apache::lonhtmlcommon::row_closure(1)."\n".
                     &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n".
                     &Apache::loncommon::end_page());
           return;
       }
   
       my @incdoms;
       if (ref($request_domains) eq 'HASH') {
           foreach my $item (keys(%{$request_domains})) {
               if (ref($request_domains->{$item}) eq 'ARRAY') {
                   foreach my $possdom (@{$request_domains->{$item}}) {
                       unless(grep(/^\Q$possdom\E$/,@incdoms)) {
                           push(@incdoms,$possdom);
                       } 
                   } 
               }
           }
       }
       $r->print(&header($pagetitle,$js.$jscript,$loaditems).$crumb.
                '<p>'.$pageinfo.'</p>'.
                '<div>'.
                 &Apache::lonhtmlcommon::start_pick_box().
                 &Apache::lonhtmlcommon::row_title($domaintitle).
                 '<form name="domforcourse" method="post" action="/adm/requestcourse">'.
                 &Apache::loncommon::select_dom_form($dom,'showdom','',1,$onchange,\@incdoms));
       if (!$onchange) {
           $r->print('&nbsp;<input type="submit" name="godom" value="'.
                      &mt('Change').'" />');
       }
       unless ((ref($can_request) eq 'HASH') && (keys(%{$can_request}) > 0)) {
           $r->print(&Apache::lonhtmlcommon::row_closure(1)."\n".
                     &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n".
                     &Apache::loncommon::end_page());
           return;
       }
       $r->print('</form>'.&Apache::lonhtmlcommon::row_closure());
     my $formname = 'requestcrs';      my $formname = 'requestcrs';
     my $nexttext = &mt('Next');      my $nexttext = &mt('Next');
     $r->print(      $r->print(&Apache::lonhtmlcommon::row_title(&mt('Action')).'
               '<div><form name="'.$formname.'" method="post" action="/adm/requestcourse">'.  <form name="mainmenu_action" method="post" action=""> 
               &Apache::lonhtmlcommon::start_pick_box().  <select size="1" name="reqaction" >
               &Apache::lonhtmlcommon::row_title('Action').'  
 <input type="hidden" name="showdom" value="'.$dom.'" />  
 <select size="1" name="action" >  
  <option value="new">'.&mt('New request').'</option>   <option value="new">'.&mt('New request').'</option>
  <option value="view">'.&mt('View/Modify/Cancel pending requests').'</option>   <option value="view">'.&mt('View/Modify/Cancel pending requests').'</option>
  <option value="log">'.&mt('View request history').'</option>   <option value="log">'.&mt('View request history').'</option>
 </select>'.  </select></form>'.
               &Apache::lonhtmlcommon::row_closure().                &Apache::lonhtmlcommon::row_closure(1).
               &Apache::lonhtmlcommon::row_title('Course Type').'                &Apache::lonhtmlcommon::row_title(&mt('Type')).'
 <select size="1" name="crstype">  <form name="mainmenu_coursetype" method="post" action="">
  <option value="any">'.&mt('All types').'</option>');  <select size="1" name="crstype">');
     if ((ref($types) eq 'ARRAY') && (ref($typename) eq 'HASH')) {      if (ref($can_request) eq 'HASH') {
         foreach my $type (@{$types}) {          if (keys(%{$can_request}) > 1) {
             my $selected = '';              $r->print(' <option value="any">'.&mt('All types').'</option>');
             if ($type eq 'official') {          }
                 $selected = ' selected="selected"';          if ((ref($types) eq 'ARRAY') && (ref($typename) eq 'HASH')) {
               foreach my $type (@{$types}) {
                   next unless($can_request->{$type});
                   my $selected = '';
                   if ($env{'form.crstype'} eq '') {
                       if ($type eq 'official') {
                           $selected = ' selected="selected"';
                       }
                   } else {
                       if ($type eq $env{'form.crstype'}) {
                           $selected = ' selected="selected"';
                       }
                   }
                   $r->print('<option value="'.$type.'"'.$selected.'>'.&mt($typename->{$type}).
                             '</option>'."\n");
             }              }
             $r->print('<option value="'.$type.'"'.$selected.'>'.$typename->{$type}.  
                       '</option>'."\n");  
         }          }
     }      }
     $r->print('</select>      $r->print('</select></form>'."\n".
 <input type="hidden" name="state" value="crstype" />'.                &Apache::lonhtmlcommon::row_closure(1)."\n".
               &Apache::lonhtmlcommon::row_closure(1).                &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n".
               &Apache::lonhtmlcommon::end_pick_box().'<br />                '<div><form name="'.$formname.'" method="post" action="/adm/requestcourse">'."\n".
 <input type="button" name="next" value="'.$nexttext.'" onclick="javascript:nextPage(document.'.$formname.')" />                '<input type="hidden" name="state" value="crstype" />'."\n".
 </form></div>');                '<input type="hidden" name="showdom" value="'.$dom.'" />'."\n".
                 '<input type="hidden" name="crstype" value="" />'."\n".
                 '<input type="hidden" name="reqaction" value="" />'."\n".
                 '<input type="button" name="next" value="'.$nexttext.
                 '" onclick="javascript:nextPage(document.'.$formname.')" />'."\n".
                 '</form></div>');
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
     return;      return;
 }  }
   
 sub request_administration {  sub request_administration {
     my ($r,$action,$state,$page,$states,$dom,$jscript,$loaditems,$crumb,$uname,$udom) = @_;      my ($r,$action,$state,$page,$states,$dom,$jscript,$loaditems,$crumb,
           $newinstcode,$codechk,$checkedcode,$description,$invalidcrosslist,
           $uname,$udom) = @_;
     my $js;      my $js;
     if (($action eq 'new') || (($action eq 'view') && ($state eq 'pick_request'))) {      if (($action eq 'new') || (($action eq 'view') && ($state eq 'pick_request'))) {
         $js =  <<END;          $js =  <<END;
Line 663  END Line 962  END
     if (($action eq 'new') || ($action eq 'view')) {      if (($action eq 'new') || ($action eq 'view')) {
         $js .= <<END;             $js .= <<END;   
   
 function backPage(formname,prevstate) {  function backPage(formname,prevstate,currstate) {
     formname.state.value = prevstate;      formname.state.value = prevstate;
       if (currstate == "enrolling") {
           if (prevstate == "chooseitems" || prevstate == "uploadroster") {
               formname.action = "/adm/createuser";
           }
       } 
     formname.submit();      formname.submit();
 }  }
   
Line 672  END Line 976  END
     }      }
     if ($action eq 'new') {      if ($action eq 'new') {
         my $jsextra;          my $jsextra;
         unless (($state eq 'review') || ($state eq 'process')) {          if ($state eq 'courseinfo') {
             $jsextra = "\n".&Apache::loncommon::coursebrowser_javascript($dom);              $jsextra = "\n".&Apache::loncommon::coursebrowser_javascript($dom);
           } elsif ($state eq 'enrollment') {
               if (($env{'form.crstype'} eq 'official') && 
                   (&Apache::lonnet::auto_run('',$dom))) {
                   $js .= "\n".&section_check_javascript()."\n".&enrollment_lcsec_js();
               }
           } elsif ($state eq 'personnel') {
               $js .= "\n".&section_check_javascript()."\n".&personnel_lcsec_js();
           } elsif (($state eq 'process') && ($env{'form.concepttest'} eq 'editmyown')) {
               $js .= "\n".&Apache::londocsgci::builder_javascript($dom)."\n";
           }
           my $title;
           if ($env{'form.crstype'} eq 'community') {
               $title = 'Request a community';
           } elsif (&Apache::loncommon::needs_gci_custom()) {
               $title = 'Create a new Concept Test';
           } else {
               $title = 'Request a course';
         }          }
         $r->print(&header('Request a course',$js.$jscript,$loaditems,$jsextra).$crumb);          $r->print(&header($title,$js.$jscript,$loaditems,$jsextra).$crumb);
         &print_request_form($r,$action,$state,$page,$states,$dom);          return if (($state eq 'chooseitems') || ($state eq 'uploadroster') || 
                      ($state eq 'enrolling'));
           &print_request_form($r,$action,$state,$page,$states,$dom,$newinstcode,
                               $codechk,$checkedcode,$description,$invalidcrosslist);
     } elsif ($action eq 'view') {      } elsif ($action eq 'view') {
         my $jsextra;          my $jsextra;
         my $formname = 'requestcrs';          my $formname = 'requestcrs';
Line 691  END Line 1015  END
         } elsif ($state eq 'cancel') {          } elsif ($state eq 'cancel') {
             $jsextra = &viewcancel_javascript($formname);              $jsextra = &viewcancel_javascript($formname);
         }          }
         $r->print(&header('Manage course requests',$js.$jscript.$jsextra,$loaditems).          my $title;
                   $crumb);          if ($env{'form.crstype'} eq 'community') {
               $title = 'Manage community requests';
           } else {
               $title = 'Manage course requests';
           }
           $r->print(&header($title,$js.$jscript.$jsextra,$loaditems).$crumb);
         my $form = '<form method="post" name="'.$formname.'" action="/adm/requestcourse" />';          my $form = '<form method="post" name="'.$formname.'" action="/adm/requestcourse" />';
         if ($state eq 'pick_request') {          if ($state eq 'pick_request') {
             $r->print('<h3>'.&mt('Pending course requests').'</h3><div>'."\n".$form."\n".              my $title;
                       &print_request_status($dom).'</form>');              if ($env{'form.crstype'} eq 'community') {
                   $title = &mt('Pending community requests');
               } elsif ($env{'form.crstype'} eq 'official') {
                   $title = &mt('Pending requests for official courses');
               } elsif ($env{'form.crstype'} eq 'unofficial') {
                   $title = &mt('Pending requests for unofficial courses');
               } else {
                   $title = &mt('Pending course/community requests'); 
               }
               $r->print('<h3>'.$title.'</h3><div>'."\n".$form."\n".
                         &print_request_status($dom,$action,$state).'</form></div>');
         } elsif ($state eq 'details') {          } elsif ($state eq 'details') {
             my (@codetitles,%cat_titles,%cat_order,@code_order,$instcode,$code_chk);              my (@codetitles,%cat_titles,%cat_order,@code_order,$instcode,$code_chk);
             my $origcnum = $env{'form.cnum'};              my $origcnum = $env{'form.cnum'};
Line 707  END Line 1046  END
                 &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,                  &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,
                                                          \%cat_order,\@code_order);                                                           \%cat_order,\@code_order);
             }              }
             $r->print('<h3>'.&mt('Course Request Details').'</h3><div>'."\n".$form."\n".              my $title;
               if ($env{'form.crstype'} eq 'community') {
                   $title = &mt('Community Request Details');
               } else {
                   $title = &mt('Course Request Details');
               }
               $r->print('<h3>'.$title.'</h3><div>'."\n".$form."\n".
                       &print_review($dom,\@codetitles,\%cat_titles,\%cat_order,                        &print_review($dom,\@codetitles,\%cat_titles,\%cat_order,
                                     \@code_order)."\n".                                      \@code_order)."\n".
                       '<input name="origcnum" value="'.$origcnum.'" type="hidden" />'."\n");                        '<input name="origcnum" value="'.$origcnum.'" type="hidden" />'."\n");
Line 720  END Line 1065  END
                                                       other => 'Modify Request',                                                        other => 'Modify Request',
                                                       next => 'Cancel Request',                                                        next => 'Cancel Request',
                                                      );                                                       );
             &display_navbuttons($r,$formname,$prev,$navtxt{'prev'},$next,$navtxt{'next'},              &display_navbuttons($r,$dom,$formname,$prev,$navtxt{'prev'},$next,
                                 $state,$other,$navtxt{'other'});                                  $navtxt{'next'},$state,$other,$navtxt{'other'});
             $r->print('</form>');              $r->print('</form>');
         } elsif ($state eq 'cancel') {          } elsif ($state eq 'cancel') {
               my $title;
               if ($env{'form.crstype'} eq 'community') {
                   $title = &mt('Cancel community request');
               } else {
                   $title = &mt('Cancel course request');
               }
             my ($result,$output) = &print_cancel_request($dom,$env{'form.origcnum'});              my ($result,$output) = &print_cancel_request($dom,$env{'form.origcnum'});
             $r->print('<h3>'.&mt('Cancel course request').'</h3><div>'."\n".$form."\n".              $r->print('<h3>'.$title.'</h3><div>'."\n".$form."\n".
                       $output);                        $output);
             my @excluded = &get_excluded_elements($dom,$states,'view','cancel');              my @excluded = &get_excluded_elements($dom,$states,'view','cancel');
             $r->print(&Apache::lonhtmlcommon::echo_form_input(\@excluded).'</div>');              $r->print(&Apache::lonhtmlcommon::echo_form_input(\@excluded).'</div>');
Line 734  END Line 1085  END
                                                       next => 'Confirm Cancellation',                                                        next => 'Confirm Cancellation',
                                                      );                                                       );
             if ($result eq 'ok') {              if ($result eq 'ok') {
                 &display_navbuttons($r,$formname,$prev,$navtxt{'prev'},$next,                  &display_navbuttons($r,$dom,$formname,$prev,$navtxt{'prev'},$next,
                                     $navtxt{'next'},$state);                                      $navtxt{'next'},$state);
             } else {              } else {
                 &display_navbuttons($r,$formname,$prev,$navtxt{'prev'},undef,'',$state);                  &display_navbuttons($r,$dom,$formname,$prev,$navtxt{'prev'},undef,
                                       '',$state);
             }              }
             $r->print('</form>');              $r->print('</form>');
         } elsif ($state eq 'removal') {          } elsif ($state eq 'removal') {
Line 769  END Line 1121  END
             }              }
             $r->print('<h3>'.&mt('Request Cancellation').'</h3><div>'."\n".$form."\n".              $r->print('<h3>'.&mt('Request Cancellation').'</h3><div>'."\n".$form."\n".
                       '<input type="hidden" name="state" value="'.$state.'" />'."\n".                        '<input type="hidden" name="state" value="'.$state.'" />'."\n".
                       '<input type="hidden" name="action" value="'.$action.'" />'."\n".                        '<input type="hidden" name="reqaction" value="'.$action.'" />'."\n".
                       '<input type="hidden" name="showdom" value="'.$dom.'" />'."\n".                        '<input type="hidden" name="showdom" value="'.$dom.'" />'."\n".
                       '<input type="hidden" name="orignum" value="'.$cnum.'" />'."\n");                        '<input type="hidden" name="orignum" value="'.$cnum.'" />'."\n");
             if ($result eq 'ok') {              if ($result eq 'ok') {
                 $r->print(&mt('Your course request has been cancelled.'));                  if ($env{'form.crstype'} eq 'community') {
                       $r->print(&mt('Your community request has been cancelled.'));
                   } else {
                       $r->print(&mt('Your course request has been cancelled.'));
                   }
             } else {              } else {
                 $r->print('<div class="LC_error">'.                  $r->print('<div class="LC_error">'.
                           &mt('The request cancellation process was not complete.').                            &mt('The request cancellation process was not complete.').
Line 788  END Line 1144  END
             &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,              &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,
                                                      \%cat_order,\@code_order);                                                       \%cat_order,\@code_order);
         }          }
         $r->print(&header('Course Request','','','',{ 'only_body' => 1}).          my ($title,$header);
                   $crumb."\n".'<h3>'.&mt('Course Request Details').'</h3>'.          if ($env{'form.crstype'} eq 'community') {
               $title = 'Community Request';
               $header = &mt('Community Request');
           } else {
               $title = 'Course Request';
               $header = &mt('Course Request');
           }
           $r->print(&header($title,'','','',{ 'only_body' => 1}).
                     $crumb."\n".'<h3>'.$header.'</h3>'.
                   &print_review($dom,\@codetitles,\%cat_titles,\%cat_order,                    &print_review($dom,\@codetitles,\%cat_titles,\%cat_order,
                                 \@code_order,$uname,$udom)."\n".'</div>'.                                  \@code_order,$uname,$udom)."\n".'</div>'.
                   &close_popup_form());                    &close_popup_form());
Line 800  END Line 1164  END
     return;      return;
 }  }
   
   sub enrollment_lcsec_js {
       my %alerts = &section_check_alerts();
       my $secname = $alerts{'badsec'};
       my $secnone = $alerts{'reserved'};
       my $output = '
   function validateEnrollSections(formname,nextstate) {
       var badsectotal = 0;
       var reservedtotal = 0;
       var secTest = "";
   ';
       for (my $i=0; $i<$env{'form.sectotal'}; $i++) {
           $output .= "
       var selSec = 0;
       for (var j=0; j<document.requestcrs.sec_".$i.".length; j++) {
           if (document.requestcrs.sec_".$i."[j].checked) {
               selSec = document.requestcrs.sec_".$i."[j].value;
           }
           if (selSec == 1) {
               secTest = validsection(document.requestcrs.loncapasec_".$i.");
               if (secTest == 'badsec') {
                   badsectotal++;
               }
               if (secTest == 'reserved') {
                   reservedtotal++;
               }
           }
       }
   ";
       }
       for (my $i=0; $i<$env{'form.crosslisttotal'}; $i++) {
           $output .= "
       if (document.requestcrs.crosslist_".$i.".checked) {
           secTest = validsection(document.requestcrs.crosslist_".$i."_lcsec);
           if (secTest == 'badsec') {
               badsectotal++;
           }
           if (secTest == 'reserved') {
               reservedtotal++;
           }
       }
   ";
       }
       $output .= "
       if (badsectotal>0) {
           alert('$secname');
           return false;
       }
       if (reservedtotal>0) {
           alert('$secnone');
           return false;
       }
       formname.state.value= nextstate;
       formname.submit();
       return;
   }
   ";
       return $output;
   }
   
   sub personnel_lcsec_js {
       my %alerts = &section_check_alerts();
       my $secname = $alerts{'badsec'}.'\\n'.$alerts{'separate'};
       my $secnone = $alerts{'reserved'};
       my $output = '
   function validatePersonnelSections(formname,nextstate) {
       var badsectotal = 0;
       var reservedtotal = 0;
       var secTest = "";
   ';
       for (my $i=0; $i<$env{'form.persontotal'}; $i++) {
           $output .= "
       if (document.requestcrs.person_".$i."_uname.value != '') {
           secTest = validsection(document.requestcrs.person_".$i."_newsec,'1');
           if (secTest == 'badsec') {
               badsectotal++; 
           }
           if (secTest == 'reserved') {
               reservedtotal++;
           }
       }
   ";
       }
       $output .= "
       if (badsectotal > 0) {
           alert('$secname');
           return false;
       } else {
           if (reservedtotal > 0) {
               alert('$secnone');
               return false;
           }
       }
       formname.state.value = nextstate;
       formname.submit();
       return;
   }
   ";
       return $output;
   }
   
   sub section_check_alerts {
       my %lt = 
           &Apache::lonlocal::texthash(
               reserved => "You need to change one or more LON-CAPA section names - none is a reserved word in the system, and may not be used.",
               badsec => 'You need to change one or more LON-CAPA section names - names may only contain letters or numbers.',
               separate => 'Separate multiple sections with a comma.'
           );
       return %lt;
   }
   
   sub section_check_javascript {
       return <<"END";
   function validsection(field,mult) {
       var str = field.value;
       var badsec=0;
       var reserved=0;
       if (window.RegExp) {
           var badsecnum=0;
           var reservednum=0;
           var pattern=/[^a-zA-Z0-9]/; 
           str = str.replace(/(^\\s*)|(\\s*\$)/gi,"");
           str = str.replace(/[ ]{2,}/gi," ");
           if (mult == '1') {
               var sections = new Array();
               sections = str.split(/\\s*[\\s,;:]\\s*/);
               var i;
               for (i=0; i<sections.length; i++) {
                   if ((sections[i] != '') && (sections[i] != undefined) && (sections[i] != null)) {
                       if (pattern.test(sections[i])) {
                           badsecnum++;
                       } else {
                           if (sections[i] == 'none') {
                               reservednum++;
                           }
                       }
                   }
               }
           } else {
               if ((str != '') && (str != undefined) && (str != null)) {
                   if (pattern.test(str)) {
                       badsecnum++;
                   } else {
                       if (str == 'none') {
                           reservednum++;
                       }
                   }
               }
           }
           if (badsecnum > 0) {
               return 'badsec';
           }
           if (reservednum > 0) {
               return 'reserved';
           }
       }
       return;
   }
   END
   }
   
 sub close_popup_form {  sub close_popup_form {
     my $close= &mt('Close Window');      my $close= &mt('Close Window');
     return << "END";      return << "END";
Line 809  sub close_popup_form { Line 1333  sub close_popup_form {
 END  END
 }  }
   
   sub get_instcode {
       my ($dom) = @_;
       my ($instcode,$numtitles);
       my (@codetitles,%cat_titles,%cat_order,@code_order,$instcode,$code_chk);
       &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,
                                                \%cat_order,\@code_order);
       $numtitles = scalar(@codetitles);
       if (@code_order > 0) {
           my $message;
           foreach my $item (@code_order) {
               $instcode .= $env{'form.instcode_'.$item};
           }
       }
       return ($instcode,$numtitles);
   }
   
 sub print_request_form {  sub print_request_form {
     my ($r,$action,$state,$page,$states,$dom) = @_;      my ($r,$action,$state,$page,$states,$dom,$newinstcode,$codechk,$checkedcode,
           $description,$invalidcrosslist) = @_;
     my $formname = 'requestcrs';      my $formname = 'requestcrs';
     my ($next,$prev,$message,$output,$codepicker,$crstype);      my ($next,$prev,$message,$output,$codepicker,$crstype);
     $prev = $states->{$action}[$page-1];      $prev = $states->{$action}[$page-1];
Line 820  sub print_request_form { Line 1361  sub print_request_form {
                                                next => 'Next',                                                 next => 'Next',
                                              );                                               );
     $crstype = $env{'form.crstype'};      $crstype = $env{'form.crstype'};
     $r->print('<form name="'.$formname.'" method="post" action="/adm/requestcourse">');      $r->print('<br /><form name="'.$formname.'" method="post" action="/adm/requestcourse">');
     my (@codetitles,%cat_titles,%cat_order,@code_order,$instcode,$code_chk);      my (@codetitles,%cat_titles,%cat_order,@code_order,$instcode,$code_chk,
           @disallowed);
     if ($crstype eq 'official') {      if ($crstype eq 'official') {
         if ($env{'form.instcode'} ne '') {          if ($env{'form.instcode'} ne '') {
             $instcode = $env{'form.instcode'};              $instcode = $env{'form.instcode'};
           } elsif ($newinstcode ne '') {
               $instcode = $newinstcode;
         }          }
     }          if ($checkedcode) {
     if ($prev eq 'codepick') {              if ($codechk eq 'valid') {
         if ($crstype eq 'official') {                  $message = '<div class="LC_info">'.
             &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,                             &mt('The chosen course category [_1] is valid.','<b>'.
                                                      \%cat_order,\@code_order);                             $instcode.'</b>').
         }                             '<input type="hidden" name="instcode" value="'.
         if (@code_order > 0) {                             $instcode.'" /></div>';
             my $message;  
             if ($instcode eq '') {  
                 foreach my $item (@code_order) {  
                     $instcode .= $env{'form.instcode_'.$item};  
                 }  
                 $r->print('<input type="hidden" name="instcode" value="'.$instcode.'" />'."\n");  
             }  
             if ($instcode ne '') {  
                 $code_chk = &Apache::lonnet::auto_validate_instcode('',$dom,$instcode);  
                 if ($code_chk eq 'valid') {  
                     $message = '<div class="LC_info">'.  
                                &mt('The chosen course category [_1] is valid.','<b>'.  
                                $instcode.'</b>').'</div>';  
                 } else {  
                     $message = '<div class="LC_warning">'.  
                                &mt('No course was found matching your choice of institutional course category.');  
                     if ($code_chk ne '') {  
                         $message .= '<br />'.$code_chk;  
                     }  
                     $message .= '</div>';  
                 }  
             } else {              } else {
                 $message = '<div class="LC_warning">'.                  $message = '<div class="LC_warning">'.
                            &mt('No course was found matching your choice of institutional course category.');                              &mt('No course was found matching your choice of institutional course category.');
             }                  if ($codechk ne '') {
             unless ($code_chk eq 'valid') {                      $message .= '<br />'.$codechk;
                   }
                   $message .= '</div>';
                 $prev = 'crstype';                  $prev = 'crstype';
             }              }
             $r->print($message);              $r->print($message);
Line 873  sub print_request_form { Line 1398  sub print_request_form {
             $codepicker = &coursecode_form($dom,'instcode',\@codetitles,              $codepicker = &coursecode_form($dom,'instcode',\@codetitles,
                                            \%cat_titles,\%cat_order);                                             \%cat_titles,\%cat_order);
             if ($codepicker) {              if ($codepicker) {
                 $r->print('<div>'.&Apache::lonhtmlcommon::start_pick_box().$codepicker.                  $r->print(&mt('Specify the course to be created.').
                             '<div>'.&Apache::lonhtmlcommon::start_pick_box().
                             $codepicker.
                           &Apache::lonhtmlcommon::end_pick_box().'</div>');                            &Apache::lonhtmlcommon::end_pick_box().'</div>');
             } else {              } else {
                 $next = $states->{$action}[$page+2];                  $next = $states->{$action}[$page+2];
                 $r->print(&courseinfo_form($dom,$formname,$crstype,$next));                  $r->print(&courseinfo_form($dom,$formname,$state,$crstype,$next));
             }              }
         } else {          } else {
             if ($crstype eq 'official') {              if ($crstype eq 'official') {
                 $next = $states->{$action}[$page+2];                  $next = $states->{$action}[$page+2];
             }              }
             $r->print(&courseinfo_form($dom,$formname,$crstype,$next));              $r->print(&courseinfo_form($dom,$formname,$state,$crstype,$next));
         }          }
     } elsif ($prev eq 'codepick') {      } elsif ($prev eq 'codepick') {
         if ($env{'form.instcode'} eq '') {          if ($instcode eq '') {
             $prev = $states->{$action}[$page-2];              $prev = $states->{$action}[$page-2];
         }          }
         $r->print(&courseinfo_form($dom,$formname,$crstype,$next));          $r->print(&courseinfo_form($dom,$formname,$state,$crstype,$next,$description));
     } elsif ($state eq 'enrollment') {      } elsif ($state eq 'enrollment') {
         if ($crstype eq 'official') {          if ($crstype eq 'official') {
             &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,              &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,
                                                      \%cat_order,\@code_order);                                                       \%cat_order,\@code_order);
         }          }
         $r->print(&print_enrollment_menu($formname,$instcode,$dom,\@codetitles,          $r->print(&print_enrollment_menu($formname,$state,$instcode,$dom,\@codetitles,
                                          \%cat_titles,\%cat_order,\@code_order));                                           \%cat_titles,\%cat_order,\@code_order,
                                            $invalidcrosslist));
     } elsif ($state eq 'personnel') {      } elsif ($state eq 'personnel') {
         $r->print(&print_personnel_menu($dom,$formname,$crstype));          $r->print(&print_personnel_menu($dom,$formname,$state,$crstype,$invalidcrosslist));
     } elsif ($state eq 'review') {      } elsif ($state eq 'review') {
           my (%alerts,%rulematch,%inst_results,%curr_rules,%got_rules,%disallowmsg);
           my $now = time;
           for (my $i=0; $i<$env{'form.persontotal'}; $i++) {
               my $personname = $env{'form.person_'.$i.'_uname'};
               my $persondom = $env{'form.person_'.$i.'_dom'};
               if (($personname =~ /^$match_username$/) && 
                   ($persondom =~ /^$match_domain$/)) {
                   if (&Apache::lonnet::domain($persondom)) {
                       my $personhome = 
                           &Apache::lonnet::homeserver($personname,$persondom);
                       if ($personhome eq 'no_host') {
                           if ($persondom ne $dom) {
                               my $skipuser = 1;
                               if ($env{'user.role.dc./'.$persondom.'/'}) {
                                   my ($start,$end) = split('.',$env{'user.role.dc./'.$persondom.'/'});
                                   if (((!$start) || ($start < $now)) && 
                                       ((!$end) || ($end > $now))) {
                                       $skipuser = 0;
                                   }
                               }
                               if ($skipuser) {
                                   push(@disallowed,$i);
                                   $disallowmsg{$i} = &mt('[_1] was excluded because new users need be from the course domain','<tt>'.$personname.':'.$persondom.'</tt>');
                                   next;
                               }
                           }
                           if (&get_cancreate_status($persondom,$personname,$dom)) {
                               my ($allowed,$msg) = 
                                   &check_newuser_rules($persondom,$personname,
                                       \%alerts,\%rulematch,\%inst_results,
                                       \%curr_rules,\%got_rules);
                               if ($allowed) {
                                   if (ref($inst_results{$personname.':'.$persondom}) eq 'HASH') {
                                       if ($inst_results{$personname.':'.$persondom}{'lastname'} ne '') {
                                           $env{'form.person_'.$i.'_lastname'} = $inst_results{$personname.':'.$persondom}{'lastname'};
                                       }
                                       if ($inst_results{$personname.':'.$persondom}{'firstname'} ne '') {
                                           $env{'form.person_'.$i.'_firstname'} = $inst_results{$personname.':'.$persondom}{'firstname'};
                                       }
                                       if ($inst_results{$personname.':'.$persondom}{'permanentemail'} ne '') {
                                           $env{'form.person_'.$i.'_emailaddr'} = $inst_results{$personname.':'.$persondom}{'permanentemail'};
                                       }
                                   }
                               } else {
                                   push(@disallowed,$i);
                                   $disallowmsg{$i} = &mt('[_1] was excluded because the username violated format rules for the domain','<tt>'.$personname.':'.$persondom.'</tt>');  
                               }
                           } else {
                               push(@disallowed,$i);
                               $disallowmsg{$i} = &mt('[_1] was excluded because you may not request new users in the domain','<tt>'.$personname.':'.$persondom.'</tt>');
                           }
                       } else {
                           my %userenv = 
                               &Apache::lonnet::userenvironment($persondom,$personname,'lastname','firstname','permanentemail');
                           if ($env{'form.person_'.$i.'_lastname'} eq '') {
                               $env{'form.person_'.$i.'_lastname'} = $userenv{'lastname'};
                           }
                           if ($env{'form.person_'.$i.'_firstname'} eq '') {
                               $env{'form.person_'.$i.'_firstname'} = $userenv{'firstname'};
                           }
                           if ($env{'form.person_'.$i.'_emailaddr'} eq '') {
                               $env{'form.person_'.$i.'_emailaddr'} = $userenv{'permanentemail'};
                           }
                       }
                   } elsif ($personname ne '') {
                       push(@disallowed,$i);
                       $disallowmsg{$i} = &mt('[_1] was excluded because the domain is invalid','<tt>'.$personname.':'.$persondom.'</tt>');
                   }
               } elsif ($personname ne '') {
                   push(@disallowed,$i);
                   $disallowmsg{$i} = &mt('[_1] was excluded because the username or domain is invalid.','<tt>'.$personname.':'.$persondom.'</tt>');
               }
           }
         my $cnum;          my $cnum;
         if ($env{'form.origcnum'} =~ /^($match_courseid)$/) {          if ($env{'form.origcnum'} =~ /^($match_courseid)$/) {
             $cnum = $env{'form.origcnum'};              $cnum = $env{'form.origcnum'};
Line 908  sub print_request_form { Line 1509  sub print_request_form {
         }          }
         &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,          &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,
                                                  \%cat_order,\@code_order);                                                   \%cat_order,\@code_order);
         $r->print('<p>'.&mt('Review the details of the course request before submission.').'</p>'.          if ($crstype eq 'community') {
                   &print_review($dom,\@codetitles,\%cat_titles,\%cat_order,\@code_order).              $r->print('<h3>'.&mt('Review community request details before submission').'</h3>');
           } else {
               $r->print('<h3>'.&mt('Review course request details before submission').'</h3>');
           }
           $r->print(&print_review($dom,\@codetitles,\%cat_titles,\%cat_order,\@code_order,'','',\@disallowed,\%disallowmsg).
                   '<input type="hidden" name="cnum" value="'.$cnum.'" />');                    '<input type="hidden" name="cnum" value="'.$cnum.'" />');
         $navtxt{'next'} = &mt('Submit course request');          if ($crstype eq 'community') {
     }  elsif ($state eq 'process') {              $navtxt{'next'} = &mt('Submit community request');
           } else {
               $navtxt{'next'} = &mt('Submit course request');
           }
       } elsif ($state eq 'process') {
         if ($crstype eq 'official') {          if ($crstype eq 'official') {
             &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,              &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,
                                                      \%cat_order,\@code_order);                                                       \%cat_order,\@code_order);
         }          }
         my $result = &print_request_outcome($dom,\@codetitles,\@code_order);          my ($storeresult,$result) = &print_request_outcome($r,$dom,\@codetitles,
                                                              \@code_order,$formname);
         $r->print($result);          $r->print($result);
           if (($storeresult eq 'ok') || ($storeresult eq 'created')) {
               $r->print('<p>');
               if ($storeresult eq 'ok') {
                   $r->print('<a href="/adm/requestcourse?action=view&state=details&showdom='.$dom.'&cnum='. $env{'form.cnum'}.'">'.
                             &mt('Modify this request').'</a>'.('&nbsp;'x4));
               }
               unless ($env{'form.concepttest'}) {
                   $r->print('<a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>');
               }
               return;
           }
       } elsif ($state eq 'uploadroster') {
            &roster_upload_form($r,$output,$formname);
     }      }
     my @excluded = &get_excluded_elements($dom,$states,$action,$state);      my @excluded = &get_excluded_elements($dom,$states,$action,$state);
     if ($state eq 'personnel') {      if ($state eq 'personnel') {
         push(@excluded,'persontotal');          push(@excluded,'persontotal');
     }      }
     $r->print(&Apache::lonhtmlcommon::echo_form_input(\@excluded).'</form>');      if ($state eq 'review') {
     &display_navbuttons($r,$formname,$prev,$navtxt{'prev'},$next,$navtxt{'next'},$state);          if (@disallowed > 0) {
               my @items = qw(uname dom lastname firstname emailaddr hidedom role newsec);
               my @currsecs = &current_lc_sections();
               if (@currsecs) {
                   push(@items,'sec');
               }
               my $count = 0;
               for (my $i=0; $i<$env{'form.persontotal'}; $i++) {
                   unless ($env{'form.person_'.$i.'_uname'} eq '') {
                       if (grep(/^$i$/,@disallowed)) {
                           foreach my $item (@items) {
                               $env{'form.person_'.$i.'_'.$item} = '';
                           }
                       } else { 
                           foreach my $item (@items) {
                               $env{'form.person_'.$count.'_'.$item} = $env{'form.person_'.$i.'_'.$item};
                           }
                       }
                   }
                   $count ++;
               }
               $env{'form.persontotal'} = $count;
                
           }
       }
       if ($state eq 'enrollment') {
           push(@excluded,'crosslisttotal');
       }
       if ($state eq 'done') {
           $r->print(&done_display());
       } else {
           $r->print(&Apache::lonhtmlcommon::echo_form_input(\@excluded));
           &display_navbuttons($r,$dom,$formname,$prev,$navtxt{'prev'},$next,
                               $navtxt{'next'},$state);
       }
       $r->print('</form>');
     return;      return;
 }  }
   
   sub done_display {
       return '<h3>'.&mt('Concept Test creation is complete').'</h3>'.
              '<p>'.&mt('The following management tools are available via the "[_1]Manage Tests[_2]" tab, or from the toolbar on the [_3]Concept Test Contents[_4] page.[_5]',
              '<a href="/adm/menu">','</a>','<a href="/adm/navmaps">','</a>','<br />').
              '<dl class="LC_GCI_Menu">'.
              '<dt>'.&mt('Concept Test Contents').'</dt>'.
              '<dd style="background-image:url(\'/res/adm/pages/nav.png\');">'.&mt('Display the Table of Contents for your Concept Test.').'</dd>'.
              '<dt>'.&mt('Assemble Concept Test').'</dt>'.
              '<dd style="background-image:url(\'/res/adm/pages/docs.png\');">'.&mt('If no students have attempted the Concept Test you will be able to modify it. You can also change the start and end date of the test itself.').'</dd></dl>'.
              '<dl class="LC_GCI_Menu">'.
              '<dt>'.&mt('Enrollment and Student Activity').'</dt>'.
              '<dd style="background-image:url(\'/res/adm/pages/cprv.png\');">'.&mt('Display or download a course roster, and view information about completion status and last login. You can also add new students, or change access dates for existing students.').'</dd>'.
              '<dt>'.&mt("What's New?").'</dt>'.
              '<dd style="background-image:url(\'/res/adm/pages/new.png\');">'.&mt('View information about changes in your Concept Test course.').'</dd></dl>'.
              '<dl class="LC_GCI_Menu">'.
              '<dt>'.&mt('Prepare Printable Concept Test').'</dt>'.
              '<dd style="background-image:url(\'/res/adm/pages/prnt.png\');">'.&mt('Create a PDF which you can send to a printer to create a hardcopy of the Concept Test.').'</dd>'.
              '<dt>'.&mt('Concept Test Statistics').'</dt>'.
              '<dd style="background-image:url(\'/res/adm/pages/chrt.png\');">'.&mt('After the closing date of the Concept Test you can view and download statistics for the test, as well as anonymized submission data.').'</dd>'.
              '</dl></p>';
   }
   
   sub get_cancreate_status {
       my ($persondom,$personname,$dom) = @_;
       my ($rules,$ruleorder) =
           &Apache::lonnet::inst_userrules($persondom,'username');
       my $usertype = &Apache::lonuserutils::check_usertype($persondom,$personname,
                                                            $rules);
       return &Apache::lonuserutils::can_create_user($dom,'requestcrs',$usertype);
   }
   
   sub check_newuser_rules {
       my ($persondom,$personname,$alerts,$rulematch,$inst_results,$curr_rules,
           $got_rules) = @_;
       my $allowed = 1;
       my $newuser = 1;
       my ($checkhash,$userchkmsg);
       my $checks = { 'username' => 1 };
       $checkhash->{$personname.':'.$persondom} = { 'newuser' => $newuser };
       &Apache::loncommon::user_rule_check($checkhash,$checks,$alerts,$rulematch,
                                           $inst_results,$curr_rules,$got_rules);
       if (ref($alerts->{'username'}) eq 'HASH') {
           if (ref($alerts->{'username'}{$persondom}) eq 'HASH') {
               my $domdesc =
                   &Apache::lonnet::domain($persondom,'description');
               if ($alerts->{'username'}{$persondom}{$personname}) {
                   if (ref($curr_rules->{$persondom}) eq 'HASH') {
                       $userchkmsg =
                           &Apache::loncommon::instrule_disallow_msg('username',
                                                                     $domdesc,1).
                           &Apache::loncommon::user_rule_formats($persondom,
                               $domdesc,$curr_rules->{$persondom}{'username'},
                               'username');
                   }
                   $allowed = 0;
               }
           }
       }
       return ($allowed,$userchkmsg);
   }
   
 sub get_excluded_elements {  sub get_excluded_elements {
     my ($dom,$states,$action,$state) = @_;      my ($dom,$states,$action,$state) = @_;
     my @excluded = ('counter');      my @excluded = ('counter');
Line 954  sub get_excluded_elements { Line 1673  sub get_excluded_elements {
     if (grep(/^instcode_/,@excluded)) {      if (grep(/^instcode_/,@excluded)) {
         push(@excluded,'instcode');          push(@excluded,'instcode');
     }      }
       if ($env{'form.initmap'}) {
           push(@excluded,'initmap');
       }
       if ($env{'form.output'}) {
           push(@excluded,'output');
       }
     return @excluded;      return @excluded;
 }  }
   
 sub print_enrollment_menu {  sub print_enrollment_menu {
     my ($formname,$instcode,$dom,$codetitles,$cat_titles,$cat_order,$code_order) =@_;      my ($formname,$state,$instcode,$dom,$codetitles,$cat_titles,$cat_order,
     my ($sections,$autoenroll,$access_dates);          $code_order,$invalidcrosslist) =@_;
       my ($sections,$autoenroll,$access_dates,$output,$hasauto);
     my $starttime = time;      my $starttime = time;
     my $endtime = time+(6*30*24*60*60); # 6 months from now, approx      my $diff = 6*30*24*60*60; # 6 months from now, approx
       if (&Apache::loncommon::needs_gci_custom()) {
           $diff = 7*24*60*60; # 7 days from now, approx
       }
       my $endtime = $starttime+$diff;
     my %accesstitles = (      my %accesstitles = (
                           'start' => 'Default start access',                            'start' => 'Default start access',
                            'end'   => 'Default end access',                             'end'   => 'Default end access',
Line 973  sub print_enrollment_menu { Line 1702  sub print_enrollment_menu {
                        );                         );
     if ($env{'form.crstype'} eq 'official') {      if ($env{'form.crstype'} eq 'official') {
         if (&Apache::lonnet::auto_run('',$dom)) {          if (&Apache::lonnet::auto_run('',$dom)) {
             my ($section_form,$crosslist_form,$autoenroll_form);              $output = &show_invalid_crosslists($invalidcrosslist);
               my ($section_form,$crosslist_form);
             $section_form = &inst_section_selector($dom,$instcode);              $section_form = &inst_section_selector($dom,$instcode);
               if ($section_form) {
                   $sections = &Apache::lonhtmlcommon::row_headline().
                               '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Sections').
                               '&nbsp;'.&mt('Sections for auto-enrollment').'</h3>'.
                               &Apache::lonhtmlcommon::row_closure(1).
                               $section_form;
               }
             my $crosslisttotal = $env{'form.crosslisttotal'};              my $crosslisttotal = $env{'form.crosslisttotal'};
             if (!$crosslisttotal) {              if (!$crosslisttotal) {
                 $crosslisttotal = 1;                  $crosslisttotal = 1;
Line 988  sub print_enrollment_menu { Line 1725  sub print_enrollment_menu {
             }              }
             if ($crosslist_form) {               if ($crosslist_form) { 
                 $crosslist_form .=                   $crosslist_form .= 
                     &Apache::lonhtmlcommon::row_title(&mt('Add another?')).                      &Apache::lonhtmlcommon::row_title(&mt('Add another')).
                     '<input name="crosslisttotal" type="hidden" value="'.$crosslisttotal.'" />'.                      '<input name="crosslisttotal" type="hidden" value="'.$crosslisttotal.'" />'.
                     '<input name="addcrosslist" type="checkbox" value="'.$crosslisttotal.'"'.                      '<input name="addcrosslist" type="checkbox" value="'.$crosslisttotal.'"'.
                     ' onclick="javascript:nextPage(document.'.$formname.",'".$env{'form.state'}.                      ' onclick="javascript:nextPage(document.'.$formname.",'".$state.
                    "'".');" />'.&mt('Add?').&Apache::lonhtmlcommon::row_closure(1);                     "'".');" />'.&mt('Add?').&Apache::lonhtmlcommon::row_closure();
             }                  $sections .=  &Apache::lonhtmlcommon::row_headline.
             if ($section_form || $crosslist_form) {                                '<h3>'.&mt('Crosslisted courses for auto-enrollment').'</h3>'.
                 $sections = '<div>'.&Apache::lonhtmlcommon::start_pick_box().                                &Apache::lonhtmlcommon::row_closure(1).
                             $section_form.$crosslist_form.                                $crosslist_form;
                             &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n";              }
             }              $hasauto = 1;
             $autoenroll_form =               $autoenroll = 
                 &Apache::lonhtmlcommon::row_title(&mt('Add registered students automatically')).                  &Apache::lonhtmlcommon::row_title(&Apache::loncommon::help_open_topic('Course_Request_Autoadd').'&nbsp;'.&mt('Add registered students automatically')).
                 '<span class="LC_nobreak"><label>'.                  '<span class="LC_nobreak"><label>'.
                 '<input type="radio" name="autoadds" value="1">'.                  '<input type="radio" name="autoadds" value="1" />'.
                 &mt('Yes').'</label>'.('&nbsp;'x3).'<label>'.                  &mt('Yes').'</label>'.('&nbsp;'x3).'<label>'.
                 '<input type="radio" name="autoadds" value="0" checked="checked">'.                  '<input type="radio" name="autoadds" value="0" checked="checked" />'.
                 &mt('No').'</label></span>'.                  &mt('No').'</label></span>'.
                 &Apache::lonhtmlcommon::row_closure().                  &Apache::lonhtmlcommon::row_closure(1).
                 &Apache::lonhtmlcommon::row_title(&mt('Drop unregistered students automatically')).                  &Apache::lonhtmlcommon::row_title(&Apache::loncommon::help_open_topic('Course_Request_Autodrop').'&nbsp;'.&mt('Drop unregistered students automatically')).
                 '<span class="LC_nobreak"><label>'.                  '<span class="LC_nobreak"><label>'.
                 '<input type="radio" name="autodrops" value="1">'.                  '<input type="radio" name="autodrops" value="1" />'.
                 &mt('Yes').'</label>'.('&nbsp;'x3).'<label>'.                  &mt('Yes').'</label>'.('&nbsp;'x3).'<label>'.
                 '<input type="radio" name="autodrops" value="0" checked="checked">'.                  '<input type="radio" name="autodrops" value="0" checked="checked" />'.
                 &mt('No').'</label></span>'.                   &mt('No').'</label></span>'. 
                 &Apache::lonhtmlcommon::row_closure().                  &Apache::lonhtmlcommon::row_closure(1).
                 &date_setting_table($starttime,$endtime,$formname,'enroll',%enrolltitles);                  &date_setting_table($starttime,$endtime,$formname,'enroll',
             if ($autoenroll_form) {                                      $hasauto,$dom,%enrolltitles);
                 $autoenroll = '<div>'.&Apache::lonhtmlcommon::start_pick_box().          }
                               $autoenroll_form.      }
                               &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n";      my $access_dates = 
             }          &date_setting_table($starttime,$endtime,$formname,'access',$hasauto,
                               $dom,%accesstitles);
       if ($sections) {
           $output .=  $sections;
       }
       if ($autoenroll) {
           $output .= &Apache::lonhtmlcommon::row_headline('Auto-enroll').
                      '<h3>'.&mt('Auto-enrollment settings').'</h3>'.
                      &Apache::lonhtmlcommon::row_closure(1).
                      $autoenroll;
       }
       if ($access_dates) {
           my $header = &mt('Access dates for students');
           if ($env{'form.crstype'} eq 'community') {
               $header = &mt('Access dates for community members');
           }
           $output .= &Apache::lonhtmlcommon::row_headline('Access').
                      '<h3>'.$header.'</h3>'.
                      &Apache::lonhtmlcommon::row_closure(1);
           if ($dom =~ /^\w+citest$/) {
               my $includeempty = 1;
               my $timezone = &Apache::lonlocal::gettimezone();
               $output .= &Apache::lonhtmlcommon::row_title('Time zone').
                          &Apache::loncommon::select_timezone('timezone',$timezone,
                                                              undef,$includeempty).
                          &Apache::lonhtmlcommon::row_closure(1);
         }          }
           $output .= $access_dates;
       }
       if ($dom =~ /^\w+citest$/) {
           return $output;
       } else {
           return '<div>'.&Apache::lonhtmlcommon::start_pick_box().$output.
                  &Apache::lonhtmlcommon::end_pick_box().'</div>';
     }      }
     my $access_dates_form =   }
         &date_setting_table($starttime,$endtime,$formname,'access',%accesstitles);  
     if ($access_dates_form) {  sub show_invalid_crosslists {
         $access_dates = '<div>'.&Apache::lonhtmlcommon::start_pick_box().      my ($invalidcrosslist) = @_;
                         $access_dates_form.      my $output;
                         &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n";      if (ref($invalidcrosslist) eq 'ARRAY') {
           if (@{$invalidcrosslist} > 0) {
               $output = '<div class="LC_warning">'.
                         &mt('The following crosslisted courses were invalid:').'<ul>';
               foreach my $item (@{$invalidcrosslist}) {
                   $output .= '<li>'.$item.'</li>';
               }
               $output .= '</ul></div><br />';
           }
     }      }
     return $sections.$autoenroll.$access_dates;      return $output;
 }  }
   
   
 sub inst_section_selector {  sub inst_section_selector {
     my ($dom,$instcode) = @_;      my ($dom,$instcode) = @_;
     my @sections = &Apache::lonnet::auto_get_sections(undef,$dom,$instcode);      my @sections = &Apache::lonnet::auto_get_sections(undef,$dom,$instcode);
     my $sectotal = scalar(@sections);      my $sectotal = scalar(@sections);
     my $output;      my $output;
     if ($sectotal) {      if ($sectotal) {
         $output .=  &Apache::lonhtmlcommon::row_title('Sections').          $output .=  &Apache::lonhtmlcommon::row_title(&mt('Sections of [_1]',$instcode)).
                     &Apache::loncommon::start_data_table().                      &Apache::loncommon::start_data_table().
                     &Apache::loncommon::start_data_table_row().                      &Apache::loncommon::start_data_table_row().
                     '<th>'.&mt('Include?').'<input type="hidden" name="sectotal" '.                      '<th>'.&mt('Include?').'<input type="hidden" name="sectotal" '.
                     'value="'.$sectotal.'"  /></th>'.                      'value="'.$sectotal.'"  /></th>'.
                     '<th>'.&mt('Institutional Section').'</th>'.                      '<th>'.&mt('Institutional Section').'</th>'.
                     '<th>'.&mt('LON-CAPA section').'</th>'.                      '<th>'.&Apache::loncommon::help_open_topic('Course_Request_LCSection').
                             '&nbsp;'.&mt('LON-CAPA section').'</th>'.
                     &Apache::loncommon::end_data_table_row();                      &Apache::loncommon::end_data_table_row();
         for (my $i=0; $i<@sections; $i++) {          for (my $i=0; $i<@sections; $i++) {
             my $colflag = $i%2;              my $colflag = $i%2;
             my $checked = ' checked="checked"';              my $secon = ' checked="checked"';
               my $secoff = '';
             if ($env{'form.origcnum'}) {              if ($env{'form.origcnum'}) {
                 $checked='';                  $secoff = $secon;
                   $secon='';
             }              }
             $output .= &Apache::loncommon::start_data_table_row().              $output .= &Apache::loncommon::start_data_table_row().
                        '<td><input type="checkbox" name="sec_'.$i.                         '<td><label><input type="radio" name="sec_'.$i.
                        '"'.$checked.' value="1" /></td>'.                         '"'.$secon.' value="1" />'.&mt('Yes').'</label>'.
                        '<td>'.$sections[$i].                         ('&nbsp;'x2).'<label><input type="radio" name="sec_'.$i.
                           '"'.$secoff.' value="0" />'.&mt('No').'</label></td>'.
                          '<td align="center">'.$sections[$i].
                        '<input type="hidden" name="secnum_'.$i.'" value="'.                         '<input type="hidden" name="secnum_'.$i.'" value="'.
                        $sections[$i].'" /></td>'.                         $sections[$i].'" /></td>'.
                        '<td><input type="text" size="10" name="loncapasec_'.$i.                         '<td><input type="text" size="10" name="loncapasec_'.$i.
Line 1069  sub inst_section_selector { Line 1852  sub inst_section_selector {
 }  }
   
 sub date_setting_table {  sub date_setting_table {
     my ($starttime,$endtime,$formname,$prefix,%datetitles) = @_;      my ($starttime,$endtime,$formname,$prefix,$hasauto,$dom,%datetitles) = @_;
     my ($perpetual,$table);      my ($perpetual,$table);
       my $no_hh_mm_ss = 1;
       my $hide_timezone;
       if (&Apache::loncommon::needs_gci_custom()) {
           $no_hh_mm_ss = '';
           if ($dom =~ /^\w+citest$/) {
               if ($prefix eq 'access') {
                   $hide_timezone = 1;
               }
           }
       }
     my $startform = &Apache::lonhtmlcommon::date_setter($formname,$prefix.'start',      my $startform = &Apache::lonhtmlcommon::date_setter($formname,$prefix.'start',
                                                         $starttime,'','','',1,'','','',1);                                                          $starttime,'','','',$no_hh_mm_ss,'','','',1,$hide_timezone);
     my $endform = &Apache::lonhtmlcommon::date_setter($formname,$prefix.'end',      my $endform = &Apache::lonhtmlcommon::date_setter($formname,$prefix.'end',
                                                       $endtime,'','','',1,'','','',1);                                                        $endtime,'','','',$no_hh_mm_ss,'','','',1,$hide_timezone);
       my $closure = '';
     if ($prefix eq 'access') {      if ($prefix eq 'access') {
         $perpetual = ' <span class="LC_nobreak"><label>'.          unless (&Apache::loncommon::needs_gci_custom()) {
                      '<input type="checkbox" name="no_end_date" />'.              $perpetual = ' <span class="LC_nobreak"><label>'.
                      &mt('No end date').'</label></span>';                           '<input type="checkbox" name="no_end_date" />'.
     }                           &mt('No end date').'</label></span>';
     $table = &Apache::lonhtmlcommon::row_title($datetitles{'start'}).          }
              $startform.          $closure = '1';
              &Apache::lonhtmlcommon::row_closure().      }
              &Apache::lonhtmlcommon::row_title($datetitles{'end'}).  
              $endform.$perpetual.      my %help_item = (
              &Apache::lonhtmlcommon::row_closure(1);                        access => {
                                     start => 'Course_Request_Access_Start', 
                                     end   => 'Course_Request_Access_End',
                                   },
                         enroll => {
                                     start => 'Course_Request_Enroll_Start',
                                     end   => 'Course_Request_Enroll_End',
                                   },
                        );
       if ($hasauto) {
           $help_item{'access'}{'start'} = 'Course_Request_RegAccess_Start';
           $help_item{'access'}{'end'}   = 'Course_Request_RegAccess_End';
       }
   
       $table = &Apache::lonhtmlcommon::row_title(&Apache::loncommon::help_open_topic($help_item{$prefix}{'start'}).
                '&nbsp;'.$datetitles{'start'}).$startform.
                &Apache::lonhtmlcommon::row_closure(1).
                &Apache::lonhtmlcommon::row_title(&Apache::loncommon::help_open_topic($help_item{$prefix}{'end'}).
                '&nbsp;'.$datetitles{'end'}).$endform.$perpetual.
                &Apache::lonhtmlcommon::row_closure($closure);
     return $table;      return $table;
 }  }
   
 sub print_personnel_menu {  sub print_personnel_menu {
     my ($dom,$formname,$crstype) = @_;      my ($dom,$formname,$state,$crstype,$invalidcrosslist) = @_;
     my $output = '<div>'.&Apache::lonhtmlcommon::start_pick_box();      my $output;
       if ($crstype eq 'official') {
           if (&Apache::lonnet::auto_run('',$dom)) {
               $output .= &show_invalid_crosslists($invalidcrosslist);
           }  
       }
       $output .= '<div>'.&Apache::lonhtmlcommon::start_pick_box();
     my $persontotal = $env{'form.persontotal'};      my $persontotal = $env{'form.persontotal'};
     if ((!defined($persontotal)) || (!$persontotal)) {      if ((!defined($persontotal)) || (!$persontotal)) {
         $persontotal = 1;          $persontotal = 1;
Line 1099  sub print_personnel_menu { Line 1918  sub print_personnel_menu {
     if ($env{'form.addperson'}) {      if ($env{'form.addperson'}) {
         $persontotal ++;          $persontotal ++;
     }      }
     my $userlinktxt = &mt('Set User');  
     my @items = ('uname','dom','lastname','firstname','emailaddr','hidedom');      my @items = ('uname','dom','lastname','firstname','emailaddr','hidedom');
   
     my $roleoptions;  
     my @roles = &Apache::lonuserutils::roles_by_context('course');  
     my $type = 'Course';      my $type = 'Course';
     if ($crstype eq 'community') {      if ($crstype eq 'community') {
         $type = 'Community';          $type = 'Community';
     }      }
       my $roleoptions;
       my @roles = &Apache::lonuserutils::roles_by_context('course','',$type);
     foreach my $role (@roles) {      foreach my $role (@roles) {
         my $plrole=&Apache::lonnet::plaintext($role,$type);          my $plrole = &Apache::lonnet::plaintext($role,$type);
         $roleoptions .= '  <option value="'.$role.'">'.$plrole.'</option>'."\n";          $roleoptions .= '  <option value="'.$role.'">'.$plrole.'</option>'."\n";
     }      }
     my %customroles=&Apache::lonuserutils::my_custom_roles();      my %customroles=&Apache::lonuserutils::my_custom_roles();
     if (keys(%customroles) > 0) {      if (keys(%customroles) > 0) {
         foreach my $cust (sort(keys(%customroles))) {          foreach my $cust (sort(keys(%customroles))) {
             my $custrole='cr_cr_'.$env{'user.domain'}.              my $custrole="cr/$env{'user.domain'}/$env{'user.name'}/$cust";
                     '_'.$env{'user.name'}.'_'.$cust;  
             $roleoptions .= '  <option value="'.$custrole.'">'.$cust.'</option>'."\n";              $roleoptions .= '  <option value="'.$custrole.'">'.$cust.'</option>'."\n";
         }          }
     }      }
   
     my @currsecs;      my @currsecs = &current_lc_sections();
     if ($env{'form.sectotal'}) {  
         for (my $i=0; $i<$env{'form.sectotal'}; $i++) {  
             if (defined($env{'form.loncapasec_'.$i})) {  
                 my $lcsec = $env{'form.loncapasec_'.$i};  
                 unless (grep(/^\Q$lcsec\E$/,@currsecs)) {  
                     push(@currsecs,$lcsec);  
                 }  
             }  
         }  
     }  
   
     my ($existtitle,$existops,$existmult,$newtitle,$seccolspan);      my ($existtitle,$existops,$existmult,$newtitle,$seccolspan);
     if (@currsecs) {      if (@currsecs) {
Line 1152  sub print_personnel_menu { Line 1959  sub print_personnel_menu {
         $newtitle = &mt('Other').':&nbsp;';          $newtitle = &mt('Other').':&nbsp;';
     }      }
   
       if ($persontotal) {
           my %lt = &Apache::lonlocal::texthash(
               community => 'Requestor is automatically assigned Coordinator role.',
               official => 'Requestor is automatically assigned Course Coordinator role.',
           );
           $lt{'unofficial'} = $lt{'official'};
           $output .= &Apache::lonhtmlcommon::row_headline().
                     '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Personnel').'&nbsp;'.$lt{$crstype}.' '.&mt('Include other personnel?').'</h3>';
       }
     for (my $i=0; $i<$persontotal; $i++) {       for (my $i=0; $i<$persontotal; $i++) { 
         my @linkargs = map { 'person_'.$i.'_'.$_ } (@items);          my @linkargs = map { 'person_'.$i.'_'.$_ } (@items);
         my $linkargstr = join("','",@linkargs);          my $linkargstr = join("','",@linkargs);
         my $userlink = &Apache::loncommon::selectuser_link($formname,@linkargs,$dom,$userlinktxt);          my $uname_form = '<input type="text" name="person_'.$i.'_uname" value="" size="20" />';
         my $uname_form = '<input type="text" name="person_'.$i.'_uname" value=""'.  
                          ' onFocus="this.blur();'.  
                          'openuserbrowser('."'$formname','$linkargstr','$dom'".');" />';  
         my $onchange = 'javascript:fix_domain('."'$formname','person_".$i."_dom',".          my $onchange = 'javascript:fix_domain('."'$formname','person_".$i."_dom',".
                        "'person_".$i."_hidedom'".');'.                         "'person_".$i."_hidedom','person_".$i."_uname'".');';
                        'openuserbrowser('."'$formname','$linkargstr','$dom'".');';  
         my $udom_form = &Apache::loncommon::select_dom_form($dom,'person_'.$i.'_dom','',          my $udom_form = &Apache::loncommon::select_dom_form($dom,'person_'.$i.'_dom','',
                                                             1,$onchange).                                                              1,$onchange).
                         '<input type="hidden" name="person_'.$i.'_hidedom" value="'.$dom.'" />';                          '<input type="hidden" name="person_'.$i.'_hidedom" value="" />';
         my %form_elems;          my %form_elems;
         foreach my $item (@items) {          foreach my $item (@items) {
             next if (($item eq 'dom') || ($item eq 'uname') || ($item eq 'hidedom'));              next if (($item eq 'dom') || ($item eq 'uname') || ($item eq 'hidedom'));
Line 1180  sub print_personnel_menu { Line 1992  sub print_personnel_menu {
         }          }
         $sectionselector .= $newtitle.          $sectionselector .= $newtitle.
             '<input type="text" name="person_'.$i.'_newsec" size="15" value="" />'."\n";              '<input type="text" name="person_'.$i.'_newsec" size="15" value="" />'."\n";
           my $usersrchlinktxt = &mt('Search for user');
           my $usersrchlink =  &Apache::loncommon::selectuser_link($formname,@linkargs,$dom,
                               $usersrchlinktxt);
           my $userchklinktxt = &mt('Check username');
           my $userchklink = &Apache::loncommon::selectuser_link($formname,@linkargs,$dom,
                               $userchklinktxt,'checkusername');
         $output .=           $output .= 
             &Apache::lonhtmlcommon::row_title(&mt('Additional Personnel').'<br />'.              &Apache::lonhtmlcommon::row_title(&mt('Additional Personnel')).
                                               '<span class="LC_nobreak">'.$userlink.              '<table><tr><td align="center" valign="middle"><b>'.$usersrchlink.'</b></td>'."\n".
                                               '</span>').              '<td align="left" valign="top" colspan="2"><span class="LC_nobreak">'.
             '<table><tr><td align="center" valign="top">'.&mt('Username').'<br />'.$uname_form.'</td>'."\n".              &mt('Username').':&nbsp;'.$uname_form.'&nbsp;'.$userchklink.'</span><br />'."\n".
             '<td align="center" valign="top" colspan="2">'.&mt('Domain').'<br />'.$udom_form.'</td></tr><tr>'."\n".              '<span class="LC_nobreak">'.&mt('Domain').':&nbsp;'.$udom_form.'</span></td>'.
               '</tr>'."\n".'<tr>'.
             '<td align="center" valign="top">'.&mt('First Name').'<br />'.$form_elems{'firstname'}.'</td>'."\n".              '<td align="center" valign="top">'.&mt('First Name').'<br />'.$form_elems{'firstname'}.'</td>'."\n".
             '<td align="center" valign="top">'.&mt('Last Name').'<br />'.$form_elems{'lastname'}.'</td>'."\n".              '<td align="center" valign="top">'.&mt('Last Name').'<br />'.$form_elems{'lastname'}.'</td>'."\n".
             '<td align="center" valign="top">'.&mt('E-mail').'<br />'.$form_elems{'emailaddr'}.'</td></tr>'."\n".              '<td align="center" valign="top">'.&mt('E-mail').'<br />'.$form_elems{'emailaddr'}.'</td></tr>'."\n".
             '<tr><td align="center" valign="top">'.&mt('Role').'<br />'.$roleselector.'</td>'."\n".              '<tr><td align="center" valign="top">'.&Apache::loncommon::help_open_topic('Course_Roles').'&nbsp;'.&mt('Role').'<br />'.$roleselector.'</td>'."\n".
             '<td'.$seccolspan.' align="center" valign="top">'.&mt('Section(s)').'<br />'.$sectionselector.'</td>'."\n".              '<td'.$seccolspan.' align="center" valign="top">'.
               &Apache::loncommon::help_open_topic('Course_Request_Rolesection').'&nbsp;'.&mt('LON-CAPA Section(s)').'<br />'.$sectionselector.'</td>'."\n".
             '</tr></table>'.&Apache::lonhtmlcommon::row_closure();              '</tr></table>'.&Apache::lonhtmlcommon::row_closure();
     }      }
     $output .= &Apache::lonhtmlcommon::row_title(&mt('Add another?')).      $output .= &Apache::lonhtmlcommon::row_title(&mt('Add another')).
                '<input name="persontotal" type="hidden" value="'.$persontotal.'" />'.                 '<input name="persontotal" type="hidden" value="'.$persontotal.'" />'.
                '<input name="addperson" type="checkbox" value="'.$persontotal.'"'.                 '<input name="addperson" type="checkbox" value="'.$persontotal.'"'.
                ' onclick="javascript:nextPage(document.'.$formname.",'".$env{'form.state'}.                 ' onclick="javascript:nextPage(document.'.$formname.",'".$state.
                "'".');" />'.&mt('Add?').&Apache::lonhtmlcommon::row_closure(1).                 "'".');" />'.&mt('Add?').&Apache::lonhtmlcommon::row_closure(1).
                &Apache::lonhtmlcommon::end_pick_box().'</div>';                 &Apache::lonhtmlcommon::end_pick_box().'</div>';
       if ($crstype eq 'community') {
           $output .= '<p>'.&mt('You may also add users later, once the community has been created, by using the "Manage community users" link, accessible from the "Main Menu".').'</p>';
       } else {
           $output .= '<p>'.&mt('You may also add users later, once the course has been created, by using the "Manage course users" link, accessible from the "Main Menu".').'</p>';
       }
     return $output;      return $output;
 }  }
   
   sub current_lc_sections {
       my @currsecs;
       if ($env{'form.sectotal'}) {
           for (my $i=0; $i<$env{'form.sectotal'}; $i++) {
               if ($env{'form.sec_'.$i}) { 
                   if (defined($env{'form.loncapasec_'.$i})) {
                       my $lcsec = $env{'form.loncapasec_'.$i};
                       unless (grep(/^\Q$lcsec\E$/,@currsecs)) {
                           push(@currsecs,$lcsec);
                       }
                   }
               }
           }
       }
       return @currsecs;
   }
   
 sub print_request_status {  sub print_request_status {
     my ($dom) = @_;      my ($dom,$action,$state) = @_;
     my %statusinfo = &Apache::lonnet::dump('courserequests',$env{'user.domain'},      my %statusinfo = &Apache::lonnet::dump('courserequests',$env{'user.domain'},
                                            $env{'user.name'},'^status:'.$dom);                                             $env{'user.name'},'^status:'.$dom);
     my ($output,$formname,%queue_by_date,%typenames);      my ($output,$formname,%queue_by_date);
     if ($env{'form.crstype'} eq 'any') {      my ($types,$typenames) = &Apache::loncommon::course_types();
         %typenames = &Apache::lonlocal::texthash (  
                                                    official   => 'Official course',  
                                                    unofficial => 'Unofficial course',  
                                                    community  => 'Community',  
                                                  );  
     }  
     foreach my $key (keys(%statusinfo)) {      foreach my $key (keys(%statusinfo)) {
         if (($statusinfo{$key} eq 'approval') || ($statusinfo{$key} eq 'pending')) {           if (($statusinfo{$key} eq 'approval') || ($statusinfo{$key} eq 'pending')) { 
             (undef,my($cdom,$cnum)) = split(':',$key);              (undef,my($cdom,$cnum)) = split(':',$key);
Line 1252  sub print_request_status { Line 2088  sub print_request_status {
     }      }
     $formname = 'requestcrs';      $formname = 'requestcrs';
     my @sortedtimes = sort {$a <=> $b} (keys(%queue_by_date));      my @sortedtimes = sort {$a <=> $b} (keys(%queue_by_date));
     $output = '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'."\n".      $output = '<input type="hidden" name="reqaction" value="'.$action.'" />'."\n".
   
               '<input type="hidden" name="state" value="'.$env{'form.state'}.'" />'."\n".                '<input type="hidden" name="state" value="'.$state.'" />'."\n".
               '<input type="hidden" name="crstype" value="'.$env{'form.crstype'}.'" />'."\n".                '<input type="hidden" name="crstype" value="'.$env{'form.crstype'}.'" />'."\n".
               '<input type="hidden" name="showdom" value="" />'."\n".                '<input type="hidden" name="showdom" value="" />'."\n".
               '<input type="hidden" name="cnum" value="" />'."\n";                '<input type="hidden" name="cnum" value="" />'."\n";
     if (@sortedtimes > 0) {      if (@sortedtimes > 0) {
           my $desctitle;
           if ($env{'form.crstype'} eq 'any') {
               $desctitle = &mt('Course/Community Description')
           } elsif ($env{'form.crstype'} eq 'community') {
               $desctitle = &mt('Community Description')
           } else {
               $desctitle = &mt('Course Description');
           }
         $output .= &Apache::loncommon::start_data_table().          $output .= &Apache::loncommon::start_data_table().
                    &Apache::loncommon::start_data_table_header_row().                     &Apache::loncommon::start_data_table_header_row().
                    '<th>'.&mt('Action').'</th>'.                     '<th>'.&mt('Action').'</th>'.
                    '<th>'.&mt('Course Description').'</th>'.                     '<th>'.$desctitle.'</th>'.
                    '<th>'.&mt('Domain').'</th>';                     '<th>'.&mt('Domain').'</th>';
         if ($env{'form.crstype'} eq 'any') {          if ($env{'form.crstype'} eq 'any') {
             $output .= '<th>'.&mt('Type').'</th>';              $output .= '<th>'.&mt('Type').'</th>';
Line 1284  sub print_request_status { Line 2128  sub print_request_status {
      '<td>'.&unescape($desc).'</td>'.       '<td>'.&unescape($desc).'</td>'.
      '<td>'.$cdom.'</td>';       '<td>'.$cdom.'</td>';
                     if ($env{'form.crstype'} eq 'any') {                      if ($env{'form.crstype'} eq 'any') {
                         my $typename = $typenames{$type};                          my $typename;
                           if (ref($typenames) eq 'HASH') {
                               $typename = &mt($typenames->{$type});
                           }
                         if ($typename eq '') {                          if ($typename eq '') {
                             $typename = &mt('Unknown type');                              $typename = &mt('Unknown type');
                         }                          }
Line 1307  sub print_request_status { Line 2154  sub print_request_status {
         }          }
         $output .= &Apache::loncommon::end_data_table();          $output .= &Apache::loncommon::end_data_table();
     } else {      } else {
         $output .= '<div>'.&mt('You have no matching course requests awaiting approval by a Domain Coordinator or held in a queue pending administrative action at your institution.').'</div>';          if ($env{'form.crstype'} eq 'any') {
   $output .= '<div>'.&mt('You have no matching course or community requests awaiting approval by a Domain Coordinator or held in a queue pending administrative action at your institution.').'</div>';
           } elsif ($env{'form.crstype'} eq 'community') {
               $output .= '<div>'.&mt('You have no matching community requests awaiting approval by a Domain Coordinator or held in a queue pending administrative action at your institution.').'</div>';
           } else {
               $output .= '<div>'.&mt('You have no matching course requests awaiting approval by a Domain Coordinator or held in a queue pending administrative action at your institution.').'</div>';
           }
     }      }
     $output .= '      $output .= '
 <br /><input type="button" name="prev" value="'.&mt('Back').'" onclick="javascript:backPage(document.'.$formname.",'crstype'".')" />  <br /><input type="button" name="prev" value="'.&mt('Back').'" onclick="javascript:backPage(document.'.$formname.",'crstype'".')" />';
 </form></div>';  
     return $output;      return $output;
 }  }
   
Line 1333  sub print_cancel_request { Line 2185  sub print_cancel_request {
             }              }
             $output = &mt('No further action will be taken');              $output = &mt('No further action will be taken');
         } elsif (ref($history{'details'}) eq 'HASH') {          } elsif (ref($history{'details'}) eq 'HASH') {
             my ($types,$typename) = &course_types();              my ($types,$typename) = &Apache::loncommon::course_types();
             my $showtype = $crstype;              my $showtype = $crstype;
             if (defined($typename->{$crstype})) {              if (defined($typename->{$crstype})) {
                 $showtype = $typename->{$crstype};                   $showtype = $typename->{$crstype}; 
Line 1349  sub print_cancel_request { Line 2201  sub print_cancel_request {
                       '<td>'.$showtype.'</td>'.                        '<td>'.$showtype.'</td>'.
                       &Apache::loncommon::end_data_table_row().                        &Apache::loncommon::end_data_table_row().
                       &Apache::loncommon::end_data_table().                        &Apache::loncommon::end_data_table().
                       '<br /><div class="LC_warning">'.                        '<br /><div class="LC_warning">';
                       &mt('Cancelling the request will remove it from the queue of pending course requests').'</div>';              if ($crstype eq 'community') {
                   $output .= &mt('Cancelling the request will remove it from the queue of pending community requests').'</div>';
               } else {
                   $output .= &mt('Cancelling the request will remove it from the queue of pending course requests').'</div>';
               }
             $result = 'ok';              $result = 'ok';
         } else {          } else {
             $output = '<div class="LC_error">'.&mt('No record exists for the course ID').'</div>';              $output = '<div class="LC_error">'.&mt('No record exists for the course ID').'</div>';
Line 1381  sub viewdetails_javascript { Line 2237  sub viewdetails_javascript {
 function nextPage(formname,nextstate) {  function nextPage(formname,nextstate) {
     if (nextstate == "modify") {       if (nextstate == "modify") { 
         formname.state.value = "personnel";          formname.state.value = "personnel";
         formname.action.value = "new";          formname.reqaction.value = "new";
     } else {      } else {
         formname.state.value = nextstate;          formname.state.value = nextstate;
     }      }
Line 1417  sub print_request_logs { Line 2273  sub print_request_logs {
 }  }
   
 sub print_review {  sub print_review {
     my ($dom,$codetitles,$cat_titles,$cat_order,$code_order,$uname,$udom) = @_;      my ($dom,$codetitles,$cat_titles,$cat_order,$code_order,$uname,$udom,
     my ($types,$typename) = &course_types();          $disallowed,$disallowmsg) = @_;
       my ($types,$typename) = &Apache::loncommon::course_types();
     my ($owner,$ownername,$owneremail);      my ($owner,$ownername,$owneremail);
     if ($uname eq '' || $udom eq '') {      if ($uname eq '' || $udom eq '') {
         $uname = $env{'user.name'};          $uname = $env{'user.name'};
Line 1437  sub print_review { Line 2294  sub print_review {
     $crstypename = $env{'form.crstype'};      $crstypename = $env{'form.crstype'};
     if (ref($typename) eq 'HASH') {      if (ref($typename) eq 'HASH') {
         unless ($typename->{$env{'form.crstype'}} eq '') {          unless ($typename->{$env{'form.crstype'}} eq '') {
             $crstypename = $typename->{$env{'form.crstype'}};              $crstypename = &mt($typename->{$env{'form.crstype'}});
         }          }
     }      }
     my $category = 'Course';      my $category = 'Course';
Line 1537  sub print_review { Line 2394  sub print_review {
     }      }
   
     my %ctxt = &clone_text();      my %ctxt = &clone_text();
     $inst_headers .= '<th>'.&mt('Clone From').'</th>';      if ($dom =~ /^\w+citest$/) {
     if (($env{'form.clonecrs'} =~ /^$match_name$/) &&           $inst_headers .= '<th>'.&mt('Test Questions').'</th>';
         ($env{'form.clonedom'} =~ /^$match_domain$/)) {          my $concepttest;
         my $canclone = &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},          if ($env{'form.concepttest'} eq 'defchosen') {
                            $env{'user.domain'},$env{'form.clonecrs'}, $env{'form.clonedom'});              $concepttest = 'Auto-generated';
         if ($canclone) {          } elsif ($env{'form.concepttest'} eq 'editmyown') {
             my %courseenv = &Apache::lonnet::userenvironment($env{'form.clonedom'},              $concepttest = 'Manually selected';
           } elsif ($env{'form.concepttest'} eq 'cloning') {
               $concepttest = 'Copied from existing test';
           }
           $inst_values .= '<td>'.$concepttest.('&nbsp;'x2).'</td>';
       }
       if (&show_cloneable()) {
           $inst_headers .= '<th>'.&mt('Copy From').'</th>';
           if ((($env{'form.cloning'}) || 
                (($dom =~ /^\w+citest$/) && ($env{'form.concepttest'} eq 'cloning'))) &&
               ($env{'form.clonecrs'} =~ /^$match_name$/) && 
               ($env{'form.clonedom'} =~ /^$match_domain$/)) {
               my $canclone = &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},
                              $env{'user.domain'},$env{'form.clonecrs'},$env{'form.clonedom'},
                              $env{'form.crstype'});
               if ($canclone) {
                   my %courseenv = &Apache::lonnet::userenvironment($env{'form.clonedom'},
                               $env{'form.clonecrs'},('description','internal.coursecode'));                                $env{'form.clonecrs'},('description','internal.coursecode'));
             if (keys(%courseenv) > 0) {                  if (keys(%courseenv) > 0) {
                 $inst_headers .= '<th>'.$ctxt{'dsh'}.'</th>';                      if ($dom =~ /^\w+citest$/) {
                 $inst_values .= '<td>'.$courseenv{'description'}.'&nbsp;';                          $inst_headers .= '<th>'.$ctxt{'ros'}.'</th>';
                 my $cloneinst = $courseenv{'internal.coursecode'};                      } else {
                 if ($cloneinst ne '') {                          $inst_headers .= '<th>'.$ctxt{'dsh'}.'</th>';
                     $inst_values .= $cloneinst.' '.&mt('in').' '.$env{'form.clonedom'};                      }
                 } else {                      $inst_values .= '<td>'.$courseenv{'description'}.'&nbsp;';
                     $inst_values .= &mt('from').' '.$env{'form.clonedom'};                      my $cloneinst = $courseenv{'internal.coursecode'};
                 }                      if ($cloneinst ne '') {
                 $inst_values .= '</td><td>';                          $inst_values .= $cloneinst.' '.&mt('in').' '.$env{'form.clonedom'};
                 if ($env{'form.datemode'} eq 'preserve') {                      } else {
                     $inst_values .= $ctxt{'prd'};                           unless ($dom =~ /^\w+citest$/) {
                 } elsif ($env{'form.datemode'} eq 'shift') {                              $inst_values .= &mt('from').' '.$env{'form.clonedom'};
                     $inst_values .= &mt('Shift dates by [_1] days',$env{'form.dateshift'});                          }
                 } else {                      }
                     $inst_values .= $ctxt{'ncd'};                      $inst_values .= ('&nbsp;'x2).'</td><td>';
                 }                      if ($dom =~ /^\w+citest$/) {
                 $inst_values .= '</td>';                          if ($env{'form.cloneroster'}) {
                               $inst_values .= &mt('Yes');
                           } else {
                               $inst_values .= &mt('No');
                           }
                       } else {
                           if ($env{'form.datemode'} eq 'preserve') {
                               $inst_values .= $ctxt{'prd'}; 
                           } elsif ($env{'form.datemode'} eq 'shift') {
                               $inst_values .= &mt('Shift dates by [_1] days',$env{'form.dateshift'});
                           } else {
                               $inst_values .= $ctxt{'ncd'};
                           }
                       }
                       $inst_values .= '</td>';
                    } else {
                        $inst_values .= '<td>'.&mt('Unknown').'</td>';
                    }
              } else {               } else {
                  $inst_values .= '<td>'.&mt('Unknown').'</td>';                   $inst_values .= '<td>'.&mt('Not permitted'),'</td>';
              }               }
          } else {          } else {
              $inst_values .= '<td>'.&mt('Not permitted'),'</td>';              $inst_values .= '<td>'.&mt('None').'</td>';
          }          }
     } else {      }
         $inst_values .= '<td>'.&mt('None').'</td>';      my $tz;
       if ($dom =~ /^\w+citest$/) {
           if (&Apache::lonlocal::gettimezone($env{'form.timezone'}) ne 'local') {
               $tz = $env{'form.timezone'};
           } else {
               $tz = &Apache::lonlocal::gettimezone();
           }
           $enroll_headers .= '<th>'.&mt('Time Zone').'</th>';
     }      }
     $enroll_headers .= '<th>'.&mt('Access Starts').'</th>'.      $enroll_headers .= '<th>'.&mt('Access Starts').'</th>'.
                        '<th>'.&mt('Access Ends').'</th>';                         '<th>'.&mt('Access Ends').'</th>';
     my ($accessstart,$accessend) = &dates_from_form('accessstart','accessend');      my ($accessstart,$accessend) = &dates_from_form('accessstart','accessend',$tz);
     $enroll_values .= '<td>'.&Apache::lonlocal::locallocaltime($accessstart).'</td>';      if ($dom =~ /^\w+citest$/) {
           $enroll_values .= '<td>'.$tz.'</td>'; 
       }
       $enroll_values .= '<td>'.&Apache::lonlocal::locallocaltime($accessstart,$tz).'</td>';
     if ($accessend == 0) {      if ($accessend == 0) {
         $enroll_values .= '<td>'.&mt('No end date').'</td>';          $enroll_values .= '<td>'.&mt('No end date').'</td>';
     } else {      } else {
         $enroll_values .= '<td>'.&Apache::lonlocal::locallocaltime($accessend).'</td>';          $enroll_values .= '<td>'.&Apache::lonlocal::locallocaltime($accessend,$tz).'</td>';
     }      }
   
     my $container = 'Course';      my $container = 'Course';
       my $ccrole = 'cc';
     if ($env{'form.crstype'} eq 'community') {      if ($env{'form.crstype'} eq 'community') {
         $container = 'Community';          $container = 'Community';
           $ccrole = 'co';
     }      }
   
     $personnel_headers = '<th>'.&mt('Name').'</th><th>'.&mt('Username:Domain').      $personnel_headers = '<th>'.&mt('Name').'</th><th>'.&mt('Username:Domain').
                          '</th><th>'.&mt('Role').'</th><th>'.&mt('LON-CAPA Sections').                           '</th><th>'.&mt('Role').'</th><th>'.&mt('LON-CAPA Sections').
                          '</th>';                           '</th>';
   
     $personnel_values .= '<tr><td>'.$ownername.'</td><td>'.$owner.'</td>'.      $personnel_values .= '<tr><td>'.$ownername.'</td><td>'.$owner.'</td>'.
                          '<td>'.&Apache::lonnet::plaintext('cc',$container).'</td>'.                           '<td>'.&Apache::lonnet::plaintext($ccrole,$container).'</td>'.
                          '<td>'.&mt('None').'</td></tr>';                           '<td>'.&mt('None').'</td></tr>';
     for (my $i=0; $i<$env{'form.persontotal'}; $i++) {      for (my $i=0; $i<$env{'form.persontotal'}; $i++) {
         if ($env{'form.person_'.$i.'_uname'} ne '') {          if ($env{'form.person_'.$i.'_uname'} ne '') {
             my @allsecs = &Apache::loncommon::get_env_multiple('form.person_'.$i.'_sec');              if (ref($disallowed) eq 'ARRAY') {
                   next if (grep(/^$i$/,@{$disallowed}));
               } 
               my @officialsecs = &Apache::loncommon::get_env_multiple('form.person_'.$i.'_sec');
               my @allsecs;
               foreach my $sec (@officialsecs) {
                   next unless ($sec =~ /\w/);
                   next if ($sec =~ /\W/);
                   next if ($sec eq 'none');
                   push(@allsecs,$sec);
               }
             my $newsec = $env{'form.person_'.$i.'_newsec'};              my $newsec = $env{'form.person_'.$i.'_newsec'};
             $newsec =~ s/^\s+//;              $newsec =~ s/^\s+//;
             $newsec =~s/\s+$//;              $newsec =~s/\s+$//;
             my @newsecs = split(/[\s,;]+/,$newsec);              my @newsecs = split(/\s*[\s,;:]\s*/,$newsec);
             foreach my $sec (@newsecs) {              foreach my $sec (@newsecs) {
                   next unless ($sec =~ /\w/); 
                 next if ($sec =~ /\W/);                  next if ($sec =~ /\W/);
                 next if ($newsec eq 'none');                  next if ($sec eq 'none');
                 if ($sec ne '') {                  if ($sec ne '') {
                     unless (grep(/^\Q$sec\E$/,@allsecs)) {                      unless (grep(/^\Q$sec\E$/,@allsecs)) {
                         push(@allsecs,$sec);                           push(@allsecs,$sec); 
Line 1616  sub print_review { Line 2530  sub print_review {
             if ($showsec eq '') {              if ($showsec eq '') {
                 $showsec = &mt('None');                  $showsec = &mt('None');
             }              }
             if ($env{'form.person_'.$i.'_role'} eq 'cc') {              if ($env{'form.person_'.$i.'_role'} eq $ccrole) {
                 $showsec = &mt('None');                  $showsec = &mt('None');
             }              }
               my $role = $env{'form.person_'.$i.'_role'}; 
             $personnel_values .=               $personnel_values .= 
                 '<tr><td>'.$env{'form.person_'.$i.'_firstname'}.' '.                  '<tr><td>'.$env{'form.person_'.$i.'_firstname'}.' '.
                 $env{'form.person_'.$i.'_lastname'}.'</td>'.                  $env{'form.person_'.$i.'_lastname'}.'</td>'.
                 '<td>'.$env{'form.person_'.$i.'_uname'}.':'.                  '<td>'.$env{'form.person_'.$i.'_uname'}.':'.
                 $env{'form.person_'.$i.'_dom'}.'</td>'.                  $env{'form.person_'.$i.'_dom'}.'</td>'.
                 '<td>'.&Apache::lonnet::plaintext($env{'form.person_'.$i.'_role'},                  '<td>'.&Apache::lonnet::plaintext($role,$container).'</td>'.
                                                   $container).'</td>'.  
                 '<td>'.$showsec.'</td></tr>';                  '<td>'.$showsec.'</td></tr>';
         }          }
     }      }
     my $output =        my $output;
                   '<div>'.&Apache::lonhtmlcommon::start_pick_box().      if (ref($disallowed) eq 'ARRAY') {
           if (@{$disallowed} > 0) {
               if (ref($disallowmsg) eq 'HASH') {
                   $output = '<p class="LC_warning">'.
                             &mt('Not all requested personnel could be included.').'<ul>'; 
                   foreach my $item (@{$disallowed}) {
                       $output .= '<li>'.$disallowmsg->{$item}.'</li>';
                   }
                   $output .= '</ul></p>';
               }
           }
       }
       $output .=    '<div>'.&Apache::lonhtmlcommon::start_pick_box().
                   &Apache::lonhtmlcommon::row_title(&mt('Owner')).                    &Apache::lonhtmlcommon::row_title(&mt('Owner')).
                   '<table class="LC_innerpickbox"><tr>'.                    '<table class="LC_innerpickbox"><tr>'.
                   '<th>'.&mt('Name').'</th>'.                    '<th>'.&mt('Name').'</th>'.
Line 1664  sub print_review { Line 2590  sub print_review {
 }  }
   
 sub dates_from_form {  sub dates_from_form {
     my ($startname,$endname) = @_;      my ($startname,$endname,$timezone) = @_;
     my $startdate = &Apache::lonhtmlcommon::get_date_from_form($startname);      my $startdate = &Apache::lonhtmlcommon::get_date_from_form($startname,$timezone);
     my $enddate   = &Apache::lonhtmlcommon::get_date_from_form($endname);      my $enddate   = &Apache::lonhtmlcommon::get_date_from_form($endname,$timezone);
     if ($endname eq 'accessend') {      if ($endname eq 'accessend') {
         if (exists($env{'form.no_end_date'}) ) {          if (exists($env{'form.no_end_date'}) ) {
             $enddate = 0;              $enddate = 0;
Line 1676  sub dates_from_form { Line 2602  sub dates_from_form {
 }  }
   
 sub courseinfo_form {  sub courseinfo_form {
     my ($dom,$formname,$crstype,$next) = @_;      my ($dom,$formname,$state,$crstype,$next,$description) = @_;
     my $nodescr = &mt('You must provide a (brief) course description.');      my %lt = &Apache::lonlocal::texthash(
                   official => 'You must provide a (brief) course description.',
                   community => 'You must provide a (brief) community description.'
                );
       $lt{'unofficial'} = $lt{'official'};
     my $js_validate = <<"ENDJS";      my $js_validate = <<"ENDJS";
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA['  // <![CDATA['
   
 function validateForm() {  function validateForm() {
     if ((document.$formname.cdescr.value == "")  || (document.$formname.cdescr.value == "undefined")) {      if ((document.$formname.cdescr.value == "")  || (document.$formname.cdescr.value == "undefined")) {
         alert('$nodescr');          alert('$lt{$crstype}');
         return;          return;
     }      }
     nextPage(document.$formname,'$next');      nextPage(document.$formname,'$next');
 }  }
   
   function toggleCloning() {
       var willclone;
       if (document.$formname.cloning.length > 1) {
           for (var i=0; i<document.$formname.cloning.length; i++) {
               if (document.$formname.cloning[i].checked) {
                   willclone = document.$formname.cloning[i].value;
               }
           }
       }
       if (willclone == 1) {
           document.getElementById('cloneoptions').style.display="block";
       } else {
           document.getElementById('cloneoptions').style.display="none";
           document.$formname.clonecrs.value = '';
       }
   }
   
 // ]]  // ]]
 </script>  </script>
   
 ENDJS  ENDJS
       my $title = &mt('Brief Course Description');
     my $output .= $js_validate."\n".'<div>'.&Apache::lonhtmlcommon::start_pick_box().      my $desctitle = &mt('Description');
                   &Apache::lonhtmlcommon::row_title('Course Description').      if ($dom =~ /^\w+citest$/) {
                  '<input type="text" size="40" name="cdescr" />';          $title = &mt('Concept Test Course Information');
           $desctitle = &mt('Concept Test Title');
       }
       my $clonetitle = &mt('Copy content and settings from an existing course?');
       if ($crstype eq 'community') {
           $title = &mt('Brief Community Description');
           $clonetitle = &mt('Copy content and settings from an existing community?');
       }
       my $output .= $js_validate."\n".&Apache::lonhtmlcommon::start_pick_box().
                     &Apache::lonhtmlcommon::row_headline().
                     '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Description').'&nbsp;'.$title.'</h3>'.
                     &Apache::lonhtmlcommon::row_closure(1).
                     &Apache::lonhtmlcommon::row_title($desctitle).
                     '<input type="text" size="60" name="cdescr" value="'.$description.'" />';
       my $showclone;
       if ($dom =~ /^\w+citest$/) {
           $showclone = &show_cloneable();
       } else {
           $showclone = 1;
       }
       if ($dom =~ /^\w+citest$/) {
           $output .= &Apache::lonhtmlcommon::row_closure(1).
                      &concepttest_form($showclone,$dom);
       }
     my ($home_server_pick,$numlib) =      my ($home_server_pick,$numlib) =
         &Apache::loncommon::home_server_form_item($dom,'chome',          &Apache::loncommon::home_server_form_item($dom,'chome',
                                                   'default','hide');                                                    'default','hide');
Line 1705  ENDJS Line 2676  ENDJS
                    &Apache::lonhtmlcommon::row_title(&mt('Home Server for Course'));                     &Apache::lonhtmlcommon::row_title(&mt('Home Server for Course'));
     }      }
     $output .= $home_server_pick.      $output .= $home_server_pick.
                &Apache::lonhtmlcommon::row_closure(1).                 &Apache::lonhtmlcommon::row_closure();
                &Apache::lonhtmlcommon::end_pick_box().'</div>'.      if ($showclone && $dom !~ /^\w+citest$/) {
                '<div>'.&clone_form($dom,$formname,$crstype).'</div>'."\n";          $output .= &Apache::lonhtmlcommon::row_headline().
                      '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Clone').'&nbsp;'.$clonetitle.
                      '<label><input type="radio" name="cloning" value="1" '.
                      'onclick="javascript:toggleCloning()" />'.
                      &mt('Yes').('&nbsp;'x2).'</label><label>'.
                      '<input type="radio" name="cloning" value="0" checked="checked"'.
                      'onclick="javascript:toggleCloning()" />'.&mt('No').'</label>'.
                      '</h3>'.
                      &Apache::lonhtmlcommon::row_closure(1).
                      &Apache::lonhtmlcommon::row_headline().
                      '<div id="cloneoptions" style="display: none" >'.
                      &Apache::lonhtmlcommon::start_pick_box().
                      &clone_form($dom,$formname,$crstype).
                      &Apache::lonhtmlcommon::end_pick_box().'</div>';
       }
       if ($dom =~ /^\w+citest$/) {
           my ($instcode,@codetitles,%cat_titles,%cat_order,@code_order);
           my $invalidcrosslist = [];
           $output .= &print_enrollment_menu($formname,$state,$instcode,$dom,
                          \@codetitles,\%cat_titles,\%cat_order,
                          \@code_order,$invalidcrosslist);
       }
       $output .= &Apache::lonhtmlcommon::end_pick_box()."\n";
       return $output;
   }
   
   sub concepttest_form {
       my ($showclone,$dom) = @_;
       my $output = &Apache::lonhtmlcommon::row_title(&mt('Questions included in Concept Test')).
                    '<label>'.
                    '<input type="radio" name="concepttest" value="editmyown" checked="checked" /> '.
                    &mt('Chosen by you from Concept Inventory').
                    '</label><br />'.
                    '<label>'.
                    '<input type="radio" name="concepttest" value="defchosen" /> '.
                    &mt('Automatically selected by WebCenter').
                    '</label>';
       if ($showclone) {
           $output .=  '<br /><span class="LC_nobreak"><label>'.
                       '<input type="radio" name="concepttest" value="cloning" /> '.
                       &mt('Copied from existing Test: ').
                       '</label>'.&select_oldtest().('&nbsp;' x2).
                       '<input type="hidden" name="clonedom" value="'.$dom.'" />'.
                       '<label><input type="checkbox" value="1" name="cloneroster" />'.
                       &mt('Copy roster').'</label>';
       }
       return $output;
   }
   
   sub select_oldtest {
       my $output = '<select name="clonecrs"><option value="" selected="selected">'.
                    '</option>';
       my %courses = &Apache::loncommon::existing_gcitest_courses('cc');
       my %Sortby;
       foreach my $course (sort(keys(%courses))) {
           next unless (ref($courses{$course}) eq 'HASH');
           my $clean_title = $courses{$course}{'description'};
           $clean_title =~ s/\W+//g;
           if ($clean_title eq '') {
               $clean_title = $courses{$course}{'description'};
           }
           push(@{$Sortby{$clean_title}},$course);
       }
       my @sorted_courses = sort { lc($a) cmp lc($b) } (keys(%Sortby));
       foreach my $item (@sorted_courses) {
           foreach my $course (@{$Sortby{$item}}) {
               my ($cdom,$cnum) = split('_',$course);
               if (($cdom =~ /^\w+citest$/) && (ref($courses{$course}) eq 'HASH')) {
                   my $cdesc = $courses{$course}{'description'};
                   $output .= '<option value="'.$cnum.'">'.$cdesc.'</option>';
               }
           }
       }
       $output .= '</select>';
     return $output;      return $output;
 }  }
   
Line 1717  sub clone_form { Line 2761  sub clone_form {
     if ($crstype eq 'community') {      if ($crstype eq 'community') {
         $type = 'Community';          $type = 'Community';
     }      }
     my $cloneform = &Apache::loncommon::select_dom_form($dom,'clonedom').      my $cloneform = &Apache::loncommon::select_dom_form($dom,'clonedom').'&nbsp;'.
                     &Apache::loncommon::selectcourse_link($formname,'clonecrs','clonedom','','','',$type);                      &Apache::loncommon::selectcourse_link($formname,'clonecrs','clonedom','','','',$type);
     my %lt = &clone_text();      my %lt = &clone_text();
     my $output .=       my $output .= 
         &Apache::lonhtmlcommon::start_pick_box().   
         &Apache::lonhtmlcommon::row_title($lt{'cid'}).'<label>'.          &Apache::lonhtmlcommon::row_title($lt{'cid'}).'<label>'.
         '<input type="text" size="25" name="clonecrs" value="" onfocus="this.blur();'.          '<input type="text" size="25" name="clonecrs" value=""  />'.
         'opencrsbrowser('."'$formname','clonecrs','clonedom','','','','$type'".');" />'.          '</label>'.&Apache::lonhtmlcommon::row_closure(1).
         '</label>'.&Apache::lonhtmlcommon::row_closure(1).'<label>'.          &Apache::lonhtmlcommon::row_title($lt{'dmn'}).'<label>'.
         &Apache::lonhtmlcommon::row_title($lt{'dmn'}).'</label>'.          $cloneform.'</label>'.&Apache::lonhtmlcommon::row_closure(1).
         $cloneform.'</label>'.&Apache::lonhtmlcommon::row_closure().  
         &Apache::lonhtmlcommon::row_title($lt{'dsh'}).'<label>'.          &Apache::lonhtmlcommon::row_title($lt{'dsh'}).'<label>'.
         '<input type="radio" name="datemode" value="delete" /> '.$lt{'ncd'}.          '<input type="radio" name="datemode" value="delete" /> '.$lt{'ncd'}.
         '</label><br /><label>'.          '</label><br /><label>'.
Line 1736  sub clone_form { Line 2778  sub clone_form {
         '<input type="radio" name="datemode" value="shift" checked="checked" /> '.          '<input type="radio" name="datemode" value="shift" checked="checked" /> '.
         $lt{'shd'}.'</label>'.          $lt{'shd'}.'</label>'.
         '<input type="text" size="5" name="dateshift" value="365" />'.          '<input type="text" size="5" name="dateshift" value="365" />'.
         &Apache::lonhtmlcommon::row_closure(1).          &Apache::lonhtmlcommon::row_closure(1);
         &Apache::lonhtmlcommon::end_pick_box();  
     return $output;      return $output;
 }  }
   
Line 1747  sub clone_text { Line 2788  sub clone_text {
                'dmn'  => 'Domain',                 'dmn'  => 'Domain',
                'dsh'  => 'Date Shift',                 'dsh'  => 'Date Shift',
                'ncd'  => 'Do not clone date parameters',                 'ncd'  => 'Do not clone date parameters',
                'prd'  => 'Clone date parameters as-is',                 'prd'  => 'Copy date parameters as-is',
                'shd'  => 'Shift date parameters by number of days',                 'shd'  => 'Shift date parameters by number of days',
                  'ros'  => 'Copy Roster',
         );          );
 }  }
   
Line 1759  sub coursecode_form { Line 2801  sub coursecode_form {
                     instcode  => 'Course Category',                      instcode  => 'Course Category',
                     crosslist => 'Cross Listed Course',                      crosslist => 'Cross Listed Course',
                    );                     );
       my %helpitem = ( 
                        instcode => 'Course_Request_Category',
                        crosslist => 'Course_Request_Crosslist',
                      );
     if ((ref($codetitles) eq 'ARRAY') && (ref($cat_titles) eq 'HASH') &&       if ((ref($codetitles) eq 'ARRAY') && (ref($cat_titles) eq 'HASH') && 
         (ref($cat_order))) {          (ref($cat_order))) {
         my ($sel,$instsec,$lcsec);          my ($sel,$instsec,$lcsec);
Line 1774  sub coursecode_form { Line 2820  sub coursecode_form {
             my $lastitem = pop(@{$codetitles});              my $lastitem = pop(@{$codetitles});
             my $lastinput = '<input type="text" size="5" name="'.$sel.'_'.                                            $lastitem.'" />';              my $lastinput = '<input type="text" size="5" name="'.$sel.'_'.                                            $lastitem.'" />';
             if (@{$codetitles} > 0) {              if (@{$codetitles} > 0) {
                 $output = &Apache::lonhtmlcommon::row_title($rowtitle{$context}).                  $output = &Apache::lonhtmlcommon::row_title(&Apache::loncommon::help_open_topic($helpitem{$context}).'&nbsp;'.$rowtitle{$context}).
                           '<table><tr>';                            '<table><tr>';
                 if ($context eq 'crosslist') {                  if ($context eq 'crosslist') {
                     $output .= '<td>'.&mt('Include?').'<br />'.                      $output .= '<td>'.&mt('Include?').'<br />'.
Line 1847  sub get_course_dom { Line 2893  sub get_course_dom {
         }          }
     }      }
     if (($env{'user.domain'} ne '') && ($env{'user.domain'} ne 'public')) {      if (($env{'user.domain'} ne '') && ($env{'user.domain'} ne 'public')) {
         my ($types,$typename) = &course_types();          my ($types,$typename) = &Apache::loncommon::course_types();
         if (ref($types) eq 'ARRAY') {          if (ref($types) eq 'ARRAY') {
             foreach my $type (@{$types}) {              foreach my $type (@{$types}) {
                 if (&Apache::lonnet::usertools_access($env{'user.name'},                  if (&Apache::lonnet::usertools_access($env{'user.name'},
Line 1886  sub get_course_dom { Line 2932  sub get_course_dom {
 }  }
   
 sub display_navbuttons {  sub display_navbuttons {
     my ($r,$formname,$prev,$prevtext,$next,$nexttext,$state,$other,$othertext) = @_;      my ($r,$dom,$formname,$prev,$prevtext,$next,$nexttext,$state,$other,$othertext) = @_;
     $r->print('<div class="LC_navbuttons">');      $r->print('<div class="LC_navbuttons">');
     if ($prev) {      if ($prev) {
         $r->print('<input type="button" name="previous" value = "'.$prevtext.'" '.          $r->print('<input type="button" name="previous" value = "'.$prevtext.'" '.
                   'onclick="javascript:backPage(document.'.$formname.','."'".$prev."'".')"/>'.                    'onclick="javascript:backPage('."document.$formname,'$prev'".')"/>'.
                   ('&nbsp;'x3));                    ('&nbsp;'x3));
     } elsif ($prevtext) {      } elsif ($prevtext) {
         $r->print('<input type="button" name="previous" value = "'.$prevtext.'" '.          $r->print('<input type="button" name="previous" value = "'.$prevtext.'" '.
Line 1898  sub display_navbuttons { Line 2944  sub display_navbuttons {
     }      }
     if ($state eq 'details') {      if ($state eq 'details') {
         $r->print(' <input type="button" name="other" value="'.$othertext.'" '.          $r->print(' <input type="button" name="other" value="'.$othertext.'" '.
                   'onclick="javascript:nextPage(document.'.$formname.','."'".$other."'".                    'onclick="javascript:nextPage('."document.$formname,'$other'".
                   ')" />');                    ')" />');
     }      }
       my $gotnext;
     if ($state eq 'courseinfo') {      if ($state eq 'courseinfo') {
         $r->print('<input type="button" name="next" value="'.$nexttext.'" '.          $r->print('<input type="button" name="next" value="'.$nexttext.'" '.
                   'onclick="javascript:validateForm();" />');                    'onclick="javascript:validateForm();" />');
     } elsif ($next) {          $gotnext = 1;
         $r->print('      } elsif ($state eq 'enrollment') {
       <input type="button" name="next" value="'.$nexttext.'" '.          if (($env{'form.crstype'} eq 'official') && 
       'onclick="javascript:nextPage(document.'.$formname.','."'".$next."'".')" />');              (&Apache::lonnet::auto_run('',$dom))) {
               $r->print('<input type="button" name="next" value="'.$nexttext.'" '.
                         'onclick="javascript:validateEnrollSections('."document.$formname,'$next'".');" />');
                   $gotnext = 1;
           }
       } elsif ($state eq 'personnel') {
           if ($env{'form.persontotal'} > 0) { 
               $r->print('<input type="button" name="next" value="'.$nexttext.'" '.
                         'onclick="javascript:validatePersonnelSections('."document.$formname,'$next'".');" />');
               $gotnext = 1;
           }
       }
       unless ($gotnext) {
           if ($next) {
               $r->print('
                         <input type="button" name="next" value="'.$nexttext.'" '.
         'onclick="javascript:nextPage('."document.$formname,'$next'".')" />');
           }
     }      }
     $r->print('</div>');      $r->print('</div>');
 }  }
   
 sub print_request_outcome {  sub print_request_outcome {
     my ($dom,$codetitles,$code_order) = @_;      my ($r,$dom,$codetitles,$code_order,$formname) = @_;
     my ($output,$cnum,$now,$req_notifylist,$crstype,$enrollstart,$enrollend,      my ($output,$cnum,$now,$req_notifylist,$crstype,$enrollstart,$enrollend,
         %sections,%crosslistings,%personnel,@baduname,@missingdom,%domconfig,);          %sections,%crosslistings,%personnel,@baduname,@missingdom,%domconfig,);
     my $sectotal = $env{'form.sectotal'};      my $sectotal = $env{'form.sectotal'};
Line 1932  sub print_request_outcome { Line 2996  sub print_request_outcome {
     }      }
     $now = time;      $now = time;
     $crstype = $env{'form.crstype'};      $crstype = $env{'form.crstype'};
       my $ccrole = 'cc';
       if ($crstype eq 'community') {
           $ccrole = 'co';
       }
     my @instsections;      my @instsections;
     if ($crstype eq 'official') {      if ($crstype eq 'official') {
         if (&Apache::lonnet::auto_run('',$dom)) {          if (&Apache::lonnet::auto_run('',$dom)) {
Line 1946  sub print_request_outcome { Line 3014  sub print_request_outcome {
                         push(@instsections,$sec);                          push(@instsections,$sec);
                     }                      }
                     $sections{$i}{'loncapa'} = $env{'form.loncapasec_'.$i};                      $sections{$i}{'loncapa'} = $env{'form.loncapasec_'.$i};
                       $sections{$i}{'loncapa'} =~ s/\W//g;
                       if ($sections{$i}{'loncapa'} eq 'none') {
                           $sections{$i}{'loncapa'} = '';
                       }
                 }                  }
             }              }
         }          }
Line 1993  sub print_request_outcome { Line 3065  sub print_request_outcome {
                     } else {                      } else {
                         @{$personnel{$uname.':'.$udom}{'roles'}} = ($role);                          @{$personnel{$uname.':'.$udom}{'roles'}} = ($role);
                     }                      }
                     if ($role eq 'cc') {                      if ($role eq $ccrole) {
                         @{$personnel{$uname.':'.$udom}{$role}{'usec'}} = ();                          @{$personnel{$uname.':'.$udom}{$role}{'usec'}} = ();
                     } else {                      } else {
                         my @currsec = &Apache::loncommon::get_env_multiple('form.person_'.$i.'_sec');                          my @currsec = &Apache::loncommon::get_env_multiple('form.person_'.$i.'_sec');
                           my @allsecs;
                           foreach my $sec (@currsec) {
                               next unless ($sec =~ /\w/);
                               next if ($sec =~ /\W/);
                               next if ($sec eq 'none');
                               push(@allsecs,$sec);
                           }
                         my $newsec = $env{'form.person_'.$i.'_newsec'};                          my $newsec = $env{'form.person_'.$i.'_newsec'};
                         $newsec =~ s/^\s+//;                          $newsec =~ s/^\s+//;
                         $newsec =~s/\s+$//;                          $newsec =~s/\s+$//;
                         my @newsecs = split(/[\s,;]+/,$newsec);                          my @newsecs = split(/[\s,;]+/,$newsec);
                         foreach my $sec (@newsecs) {                          foreach my $sec (@newsecs) {
                             next if ($sec =~ /\W/);                              next if ($sec =~ /\W/);
                             next if ($newsec eq 'none');                              next if ($sec eq 'none');
                             if ($sec ne '') {                              if ($sec ne '') {
                                 unless (grep(/^\Q$sec\E$/,@currsec)) {                                  unless (grep(/^\Q$sec\E$/,@allsecs)) {
                                     push(@currsec,$sec);                                      push(@allsecs,$sec);
                                 }                                  }
                             }                              }
                         }                          }
                         @{$personnel{$uname.':'.$udom}{$role}{'usec'}} = @currsec;                          @{$personnel{$uname.':'.$udom}{$role}{'usec'}} = @allsecs;
                     }                      }
                 }                  }
             } else {              } else {
Line 2020  sub print_request_outcome { Line 3099  sub print_request_outcome {
             push(@baduname,$uname.':'.$udom);              push(@baduname,$uname.':'.$udom);
         }          }
     }      }
     my ($accessstart,$accessend) = &dates_from_form('accessstart','accessend');      my ($accessstart,$accessend) = &dates_from_form('accessstart','accessend',$env{'form.timezone'});
     my $autodrops = 0;      my $autodrops = 0;
     if ($env{'form.autodrops'}) {      if ($env{'form.autodrops'}) {
         $autodrops = $env{'form.autodrops'};           $autodrops = $env{'form.autodrops'}; 
Line 2038  sub print_request_outcome { Line 3117  sub print_request_outcome {
     }      }
     my $clonecrs = '';      my $clonecrs = '';
     my $clonedom = '';      my $clonedom = '';
     if (($env{'form.clonecrs'} =~ /^($match_courseid)$/) &&       if ((($env{'form.cloning'}) || 
            (($dom =~ /^\w+citest$/) && ($env{'form.concepttest'} eq 'cloning'))) && 
           ($env{'form.clonecrs'} =~ /^($match_courseid)$/) && 
         ($env{'form.clonedom'} =~ /^($match_domain)$/)) {          ($env{'form.clonedom'} =~ /^($match_domain)$/)) {
           if ($dom =~ /^\w+citest$/) {
               $env{'form.clonedom'} = $dom;
           }
         my $clonehome = &Apache::lonnet::homeserver($env{'form.clonecrs'},          my $clonehome = &Apache::lonnet::homeserver($env{'form.clonecrs'},
                                                     $env{'form.clonedom'});                                                      $env{'form.clonedom'});
         if ($clonehome ne 'no_host') {            if ($clonehome ne 'no_host') {
             my $canclone =                my $canclone =  
                 &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},                  &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},
                         $env{'user.domain'},$env{'form.clonecrs'}, $env{'form.clonedom'});                          $env{'user.domain'},$env{'form.clonecrs'},$env{'form.clonedom'},
                           $crstype);
             if ($canclone) {              if ($canclone) {
                 $clonecrs = $env{'form.clonecrs'};                  $clonecrs = $env{'form.clonecrs'};
                 $clonedom = $env{'form.clonedom'};                  $clonedom = $env{'form.clonedom'};
Line 2077  sub print_request_outcome { Line 3162  sub print_request_outcome {
                     accessend      => $accessend,                      accessend      => $accessend,
                     personnel      => \%personnel,                      personnel      => \%personnel,
                   };                    };
     my @inststatuses;      if ($dom =~ /^\w+citest$/) {
           my $template = &get_template($dom);
           if ($env{'form.concepttest'} eq 'editmyown') {
               $details->{'firstres'} = 'nav'; 
           } else {
               $details->{'firstres'} = 'blank';
           }
           if ($env{'form.concepttest'} eq 'cloning') {
               if (($clonecrs) && ($clonedom =~ /^\w+citest$/)) {
                   $details->{'cloneroster'} = $env{'form.cloneroster'};
               } elsif ($template) {
                   $details->{'clonedom'} = $dom;
                   $details->{'clonecrs'} = $template;
               }
           } else {
               $details->{'clonedom'} =  $dom,
               $details->{'clonecrs'} =  $template,
           }
           $details->{'datemode'} = 'delete';
       }
       my (@inststatuses,$storeresult,$creationresult,$donedisplay);
     my $val = &get_processtype($dom,$crstype,\@inststatuses,\%domconfig);      my $val = &get_processtype($dom,$crstype,\@inststatuses,\%domconfig);
     if ($val eq '') {      if ($val eq '') {
         if ($crstype eq 'official') {          if ($crstype eq 'official') {
Line 2089  sub print_request_outcome { Line 3194  sub print_request_outcome {
         } else {          } else {
             $output = &mt('Unrecognized course type: [_1]',$crstype);              $output = &mt('Unrecognized course type: [_1]',$crstype);
         }          }
           $storeresult = 'notpermitted'; 
     } else {      } else {
         my ($disposition,$message,$reqstatus);          my ($disposition,$message,$reqstatus);
         my %reqhash = (          my %reqhash = (
Line 2135  sub print_request_outcome { Line 3241  sub print_request_outcome {
         $reqstatus = $disposition;          $reqstatus = $disposition;
         my ($modified,$queued);          my ($modified,$queued);
         if ($disposition eq 'rejected') {          if ($disposition eq 'rejected') {
             $output = &mt('Your course request was rejected.');              if ($crstype eq 'community') {
                   $output = &mt('Your community request was rejected.');
               } else {
                   $output = &mt('Your course request was rejected.');
               }
             if ($message) {              if ($message) {
                 $output .= '<div class="LC_warning">'.$message.'</div>';                  $output .= '<div class="LC_warning">'.$message.'</div>';
             }              }
               $storeresult = 'rejected';
         } elsif ($disposition eq 'process') {          } elsif ($disposition eq 'process') {
             my %domdefs = &Apache::lonnet::get_domain_defaults($dom);              my %domdefs = &Apache::lonnet::get_domain_defaults($dom);
             my ($logmsg,$newusermsg,$addresult,$enrollcount,$response,$keysmsg,%longroles);              my ($logmsg,$newusermsg,$addresult,$enrollcount,$response,$keysmsg,%longroles);
             my @roles = &Apache::lonuserutils::roles_by_context('course');  
             my $type = 'Course';              my $type = 'Course';
             if ($crstype eq 'community') {              if ($crstype eq 'community') {
                 $type = 'Community';                  $type = 'Community';
             }              }
               my @roles = &Apache::lonuserutils::roles_by_context('course','',$type);
             foreach my $role (@roles) {              foreach my $role (@roles) {
                 $longroles{$role}=&Apache::lonnet::plaintext($role,$type);                  $longroles{$role}=&Apache::lonnet::plaintext($role,$type);
             }              }
Line 2156  sub print_request_outcome { Line 3267  sub print_request_outcome {
             if ($result eq 'created') {              if ($result eq 'created') {
                 $disposition = 'created';                  $disposition = 'created';
                 $reqstatus = 'created';                  $reqstatus = 'created';
                 $output = &mt('Your course request has been processed and the course has been created.').                  my $role_result = &update_requestors_roles($dom,$cnum,$crstype,$details,
                           '<br />'.                                                             \%longroles);
                           &mt('You will need to logout and log-in again to be able to select a role in the course.');                  if ($crstype eq 'community') {
             } else {                      $output = '<p>'.&mt('Your community request has been processed and the community has been created.');
                 $output = '<span class="LC_error">'.                  } else {
                           &mt('An error occurred when processing your course request.').                      $output = '<p>'.&mt('Your course request has been processed and the course has been created.');
                           '<br />'.                  }
                           &mt('You may want to review the request details and submit the request again.').                  if ($dom =~ /^\w+citest$/) {
                       my $caller = 'requestcrs';
                       my $timezone;
                       if (&Apache::lonlocal::gettimezone($env{'form.timezone'}) ne 'local') {
                           $timezone = $env{'form.timezone'};
                       } else {
                           $timezone = Apache::lonlocal::gettimezone();
                       }
                       &acquire_cc_role($dom,$cnum,'cc./'.$dom.'/'.$cnum);
                       my %parmresult =
                           &store_crsparms($dom,$cnum,$now,$accessstart,$accessend);
                       &Apache::londocsgci::setdefaults($dom);
                       my %crsenvhash = (
                                          suppress_tries => 'yes',
                                          timezone       => $timezone,
                                        );
                       my $putresult =  &Apache::lonnet::put('environment',\%crsenvhash,$dom,$cnum);
                       if ($env{'form.concepttest'} eq 'cloning') {
                           &Apache::lonuserstate::readmap($dom.'/'.$cnum);
                           if (($clonecrs) && ($clonedom =~ /^\w+citest$/)) {
                               my $cloneid = $clonedom.'/'.$clonecrs; 
                               my %clonedesc = &Apache::lonnet::coursedescription($cloneid,{'one_time' => 1});
                               my $oldcdesc = $clonedesc{'description'};
                               $output .= '<br />'.&mt('A concept test has been copied from your existing test: [_1].','<b>'.$oldcdesc.'</b>').'</p>';
                               if ($env{'form.cloneroster'}) {
                                   $output .= '<br />'.&mt('You requested copying of the old student roster to the new course.');
                                   if ($logmsg =~ /\Q\0\E/) {
                                       my @logging = split("\0",$logmsg);
                                       if (@logging) {
                                           $output .= '<p>'.$logging[-1].'</p>';
                                       }
                                   }
                                   $output .= '<ul>'.
                                              '<li>'.&mt('Access starts:').' '.
                                                     &Apache::lonlocal::locallocaltime($accessstart,$timezone).'</li>'.
                                              '<li>'.&mt('Access ends:').' '.&Apache::lonlocal::locallocaltime($accessend,$timezone).'</li>'.
                                              '</ul><br />';
                                   $r->print($output);
                                   $output = '';
                                   $donedisplay = 1;
                               } else {
                                   &roster_upload_form($r,$output,$formname);
                                   $output = '';
                               }
                           } else {
                               $output .= '</p>';
                               &roster_upload_form($r,$output,$formname);
                               $output = '';
                           }
                       } elsif ($env{'form.concepttest'} eq 'defchosen') {
                           $output .= '<br />';
                           my $error = &Apache::londocsgci::store($caller,$dom,$cnum);
                           if ($error) {
                               $output .= '<span class="LC_error">'.
                                          &mt('An error occurred saving an auto-generated concept test: [_1].',$error).
                                          '</span>';
                           } else {
                               &Apache::lonuserstate::readmap($dom.'/'.$cnum);
                               $output .= &mt('A concept test has also been generated.');
                           }
                           $output .= '</p>';
                           &roster_upload_form($r,$output,$formname);
                           $output = '';
                       } else {
                           $output .= '</p></form><br />'.&mt('The next step is to chose which questions are to be included in the Concept Test.').'<br /></p>';
                           $r->print($output);
                           &Apache::londocsgci::editor($r,'requestcrs',$dom,$cnum);
                           $output = '';
                       }
                   } else {
                       $output .= '<br />'.$role_result.'</p>';
                   }
                   $creationresult = 'created';
               } else {
                   $output = '<span class="LC_error">';
                   if ($crstype eq 'community') {
                       $output .= &mt('An error occurred when processing your community request.');
                   } else {
                       $output .= &mt('An error occurred when processing your course request.');
                   }
                   $output .= '<br />'.
                              &mt('You may want to review the request details and submit the request again.').
                           '</span>';                            '</span>';
                   $creationresult = 'error';
             }              }
         } else {          } else {
             my $requestid = $cnum.'_'.$disposition;              my $requestid = $cnum.'_'.$disposition;
Line 2195  sub print_request_outcome { Line 3388  sub print_request_outcome {
                 my $putresult = &Apache::lonnet::newput_dom('courserequestqueue',$request,                  my $putresult = &Apache::lonnet::newput_dom('courserequestqueue',$request,
                                                             $dom);                                                              $dom);
                 if ($putresult eq 'ok') {                  if ($putresult eq 'ok') {
                     $output = &mt('Your course request has been recorded.').'<br />'.                      if ($crstype eq 'community') {
                           $output .= &mt('Your community request has been recorded.');
                       } else {
                           $output .= &mt('Your course request has been recorded.') 
                       }
                       $output .= '<br />'.
                               &notification_information($disposition,$req_notifylist,                                &notification_information($disposition,$req_notifylist,
                                                         $cnum,$now);                                                          $cnum,$now);
                 } else {                  } else {
Line 2206  sub print_request_outcome { Line 3404  sub print_request_outcome {
                 }                  }
             }              }
         }          }
         my ($storeresult,$statusresult);          my ($statusresult);
         if ($requestkey =~ /^($match_domain)_($match_courseid)$/) {          if ($requestkey =~ /^($match_domain)_($match_courseid)$/) {
             $storeresult = &Apache::lonnet::store_userdata(\%reqhash,$requestkey,              $storeresult = &Apache::lonnet::store_userdata(\%reqhash,$requestkey,
                                                            'courserequests');                                                             'courserequests');
Line 2214  sub print_request_outcome { Line 3412  sub print_request_outcome {
                 my %status = (                  my %status = (
                                  'status:'.$dom.':'.$cnum => $reqstatus,                                   'status:'.$dom.':'.$cnum => $reqstatus,
                              );                               );
                 $statusresult = &Apache::lonnet::put('courserequests',\%status);                   $statusresult = &Apache::lonnet::put('courserequests',\%status);
             }              }
         } else {          } else {
             $storeresult = 'error: invalid requestkey format';               $storeresult = 'error: invalid requestkey format'; 
Line 2223  sub print_request_outcome { Line 3421  sub print_request_outcome {
             $output .=  '<span class="LC_warning">'.&mt('An error occurred saving a record of the details of your request: [_1].',$storeresult).'</span><br />';              $output .=  '<span class="LC_warning">'.&mt('An error occurred saving a record of the details of your request: [_1].',$storeresult).'</span><br />';
             &Apache::lonnet::logthis("Error saving course request - $requestkey for $env{'user.name'}:$env{'user.domain'} - $storeresult");              &Apache::lonnet::logthis("Error saving course request - $requestkey for $env{'user.name'}:$env{'user.domain'} - $storeresult");
         } elsif ($statusresult ne 'ok') {          } elsif ($statusresult ne 'ok') {
              $output .=  '<span class="LC_warning">'.&mt('An error occurred saving a record of the status of your request: [_1].',$statusresult).'</span><br />';              $output .= '<span class="LC_warning">'.&mt('An error occurred saving a record of the status of your request: [_1].',$statusresult).'</span><br />';
             &Apache::lonnet::logthis("Error saving course request status for  $requestkey (for $env{'user.name'}:$env{'user.domain'}) - $statusresult");              &Apache::lonnet::logthis("Error saving course request status for  $requestkey (for $env{'user.name'}:$env{'user.domain'}) - $statusresult");
         }          }
         if ($modified && $queued && $storeresult eq 'ok') {          if ($modified && $queued && $storeresult eq 'ok') {
             $output .= '<p>'.&mt('Your course request has been updated').'</p>'.              if ($crstype eq 'community') {
                        &notification_information($disposition,$req_notifylist,$cnum,$now);                  $output .= '<p>'.&mt('Your community request has been updated').'</p>';
               } else {
                   $output .= '<p>'.&mt('Your course request has been updated').'</p>';
               }
               $output .= &notification_information($disposition,$req_notifylist,$cnum,$now);
         }          }
         if ($validationerror ne '') {          if ($validationerror ne '') {
             $output .= '<span class="LC_warning">'.&mt('An error occurred validating your request with institutional data sources: [_1].',$validationerror).'</p>';              $output .= '<span class="LC_warning">'.&mt('An error occurred validating your request with institutional data sources: [_1].',$validationerror).'</p>';
         }          }
     }      }
       if ($creationresult ne '') {
           if ($donedisplay) {
               $r->print('<br />'.&done_display());
           }
           return ($creationresult,$output);
       } else {
           return ($storeresult,$output);
       }
   }
   
   sub update_requestors_roles {
       my ($dom,$cnum,$crstype,$details,$longroles) = @_;
       my $now = time;
       my ($active,$future,$numactive,$numfuture,$output);
       my $owner = $env{'user.name'}.':'.$env{'user.domain'};
       if (ref($details) eq 'HASH') {
           if (ref($details->{'personnel'}) eq 'HASH') {
               my $ccrole = 'cc';
               if ($crstype eq 'community') {
                   $ccrole = 'co';
               }
               unless (ref($details->{'personnel'}{$owner}) eq 'HASH') {
                   $details->{'personnel'}{$owner} = {
                                                       'roles' => [$ccrole],
                                                       $ccrole => { 'usec' => [] },
                                                     };
               }
               my @roles;
               if (ref($details->{'personnel'}{$owner}{'roles'}) eq 'ARRAY') {
                   @roles = sort(@{$details->{'personnel'}{$owner}{'roles'}});
                   unless (grep(/^\Q$ccrole\E$/,@roles)) {
                       push(@roles,$ccrole);
                   }
               } else {
                   @roles = ($ccrole);
               }
               foreach my $role (@roles) {
                   my $refresh=$env{'user.refresh.time'};
                   if ($refresh eq '') {
                       $refresh = $env{'user.login.time'};
                   }
                   if ($refresh eq '') {
                       $refresh = $now;
                   }
                   my $start = $refresh-1;
                   my $end = '0';
                   if ($role eq 'st') {
                       if ($details->{'accessstart'} ne '') {
                           $start = $details->{'accessstart'};
                       }
                       if ($details->{'accessend'} ne '') {
                           $end = $details->{'accessend'};
                       }
                   }
                   my @usecs;
                   if ($role ne $ccrole) {
                       if (ref($details->{'personnel'}{$owner}{$role}{'usec'}) eq 'ARRAY') {
                           @usecs = @{$details->{'personnel'}{$owner}{$role}{'usec'}};
                       }
                   } 
                   if ($role eq 'st') {
                       if (@usecs > 1) {
                           my $firstsec = $usecs[0];
                           @usecs = ($firstsec);
                       }
                   }
                   if (@usecs == 0) {
                       push(@usecs,'');
                   }
                   foreach my $usec (@usecs) {
                       my (%userroles,%newrole,%newgroups,$spec,$area);
                       my $area = '/'.$dom.'/'.$cnum;
                       my $spec = $role.'.'.$area;
                       if ($usec ne '') {
                          $spec .= '/'.$usec;
                          $area .= '/'.$usec;
                       }
                       if ($role =~ /^cr\//) {
                           &Apache::lonnet::custom_roleprivs(\%newrole,$role,$dom,
                                                             $cnum,$spec,$area);
                       } else {
                           &Apache::lonnet::standard_roleprivs(\%newrole,$role,$dom,
                                                               $spec,$cnum,$area);
                       }
                       &Apache::lonnet::set_userprivs(\%userroles,\%newrole,
                                                      \%newgroups);
                       $userroles{'user.role.'.$spec} = $start.'.'.$end;
                       &Apache::lonnet::appenv(\%userroles,[$role,'cm']);
                       if (($end == 0) || ($end > $now)) {
                           my $showrole = $role;
                           if ($role =~ /^cr\//) {
                               $showrole = &Apache::lonnet::plaintext($role,$crstype);
                           } elsif (ref($longroles) eq 'HASH') {
                               if ($longroles->{$role} ne '') {
                                   $showrole = $longroles->{$role};
                               }
                           }
                           if ($start <= $now) {
                               $active .= '<li><a href="/adm/roles?selectrole=1&'.
                                          $spec.'=1">'.$showrole;
                               if ($usec ne '') {
                                   $active .= ' - '.&mt('section:').' '.$usec; 
                               }
                               $active .= '</a></li>';
                               $numactive ++;
                           } else { 
                               $future .= '<li>'.$showrole;
                               if ($usec ne '') {
                                   $future .= ' - '.&mt('section:').' '.$usec;
                               }
                               $future .= '</li>';
                               $numfuture ++;
                           }
                       }
                   }
               }
           }
       }
       if ($active) {
           if ($numactive == 1) {
               if ($crstype eq 'Community') {
                   $output = &mt('Use the following link to enter the community:');
               } else {
                   $output = &mt('Use the following link to enter the course:'); 
               }
           } else {
               if ($crstype eq 'Community') {
                   $output = &mt('Use the following links to your new roles to enter the community:');
               } else {
                   $output = &mt('Use the following links to your new roles to enter the course:');
               }
           }
           $output .= ' <ul>'.$active.'</ul><br />';
       }
       if ($future) {
           if ($crstype eq 'Community') {
               $output .= &mt('The following community [quant,_1,role] will become available for selection from your [_2]roles page[_3], once the default student access start date - [_4] - has been reached:',$numfuture,'<a href="/adm/roles">','</a>',&Apache::lonlocal::locallocaltime($details->{'accessstart'}))
           } else {
               $output .= &mt('The following course [quant,_1,role] will become available for selection from your [_2]roles page[_3], once the default student access start date - [_4] - has been reached:',$numfuture,'<a href="/adm/roles">','</a>',&Apache::lonlocal::locallocaltime($details->{'accessstart'}));
           }
           $output .= ' <ul>'.$future.'</ul>';
       }
     return $output;      return $output;
 }  }
   
   sub acquire_cc_role {
       my ($cdom,$cnum,$trolecode,$csec) = @_;
       my %coursegroups = &Apache::lonnet::get_active_groups(
                           $env{'user.domain'},$env{'user.name'},$cdom, $cnum);
       my $cgrps = join(':',keys(%coursegroups));
       if ($env{'environment.recentroles'}) {
           my %frozen_roles =
               &Apache::lonhtmlcommon::get_recent_frozen('roles',$env{'environment.recentrolesn'});
           &Apache::lonhtmlcommon::store_recent('roles',$trolecode,' ',
                                               $frozen_roles{$trolecode});
       }
   
       &Apache::lonnet::appenv({"request.course.id"   => '',
                                "request.course.fn"   => '',
                                "request.course.uri"  => '',
                                "request.course.sec"  => '',
                                "request.role"        => 'cm',
                                "request.role.adv"    => $env{'user.adv'},
                                "request.role.domain" => $env{'user.domain'}});
   
       &Apache::lonnet::log($env{'user.domain'},
                            $env{'user.name'},
                            $env{'user.home'},
                            "Role ".$trolecode);
   
       &Apache::lonnet::appenv(
                               {'request.role'        => $trolecode,
                                'request.role.domain' => $cdom,
                                'request.course.sec'  => $csec,
                                'request.course.groups' => $cgrps});
       my ($furl,$ferr) = &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
       my $tadv;
       if (&Apache::lonnet::allowed('adv') eq 'F') { $tadv=1; }
       &Apache::lonnet::appenv({'request.role.adv'=>$tadv});
       return;
   }
   
   sub store_crsparms {
       my ($cdom,$cnum,$now,$accessstart,$accessend) = @_;
       my $topsymb = '___0___uploaded/'.$cdom.'/'.$cnum.'/default.sequence';
       my %crsparms = (
                         buttonshide => {
                                          value => 'yes',
                                          type  => 'string_yesno',
                                        },
                         opendate    => {
                                          value => $accessstart,
                                          type  => 'date_start',
                                        },
                         duedate     => {
                                          value => $accessend,
                                          type  => 'date_end',
                                        },
                         problemstatus => {
                                              value => 'no',
                                              type  => 'string_problemstatus',
                                          },
                         maxtries      => {
                                              value => '1',
                                              type  => 'intpos',
                                          },
                         discussend    => {
                                              value => $now,
                                              type  => 'date_end',
                                          },
                         discusshide   => { 
                                              value => 'yes',
                                              type  => 'string_yesno',
                                          }
       );
       my %parmresult;
       foreach my $item (keys(%crsparms)) {
           $parmresult{$item} =
               &Apache::lonparmset::storeparm_by_symb($topsymb,
                                      '0_'.$item,14,$crsparms{$item}{'value'},
                                      $crsparms{$item}{'type'},undef,$cdom);
       }
       return %parmresult;
   }
   
   sub roster_upload_form {
       my ($r,$output,$formname,$titletext) = @_;
       my $title = &mt('Request Processed');
       if ($titletext ne '') {
           $title = $titletext;
       }
       $r->print(<<"ENDJS");
   <script type="text/javascript">
   // <![CDATA['
   
   function toggleRosterUpload() {
       var willupload;
       if (document.$formname.roster.length > 1) {
           for (var i=0; i<document.$formname.roster.length; i++) {
               if (document.$formname.roster[i].checked) {
                   willupload = document.$formname.roster[i].value;
               }
           }
       }
       if (willupload == 1) {
           document.getElementById('rosterupload').style.display="block";
           document.getElementById('norosterupload').style.display="none";
       } else {
           document.getElementById('rosterupload').style.display="none";
           document.getElementById('norosterupload').style.display="block";
       }
       return;
   }
   // ]]
   </script>
   
   ENDJS
       $r->print('<h3>'.$title.'</h3>'.$output.
                 '<h4>'.&mt('Course roster file upload').'</h4>');
       $r->print('<p>'.&mt('If you have a text file available containing student e-mail addresses and initial passwords, you may upload it now.').'<br />'.
       &mt('You may also enroll students later with the [_1]"Enrollment/Activity"[_2] utility in the management toolbar.','<i>','</i>').'</p>'.
       &mt('Upload roster file now?').'&nbsp;'.
       '<label><input type="radio" name="roster" value="1" '.
       'onclick="javascript:toggleRosterUpload()" />'.
       &mt('Yes').('&nbsp;'x2).'</label><label>'.
       '<input type="radio" name="roster" value="0" checked="checked"'.
       'onclick="javascript:toggleRosterUpload()" />'.&mt('No').'</label><br />'.
       '<div id="norosterupload"><input type="submit" value="'.&mt('Next').'" name="norostersub" />'.
       '<input type="hidden" name="reqaction" value="new" />'.
       '<input type="hidden" name="state" value="done" /></div></form>'.
       '<div id="rosterupload" style="display: none"><form name="studentform" method="post" enctype="multipart/form-data" '.
       ' action="/adm/createuser">'."\n");
       &Apache::lonuserutils::print_first_users_upload_form($r,'course','noheader','requestcrs');
       $r->print('<input type="hidden" name="concepttest" value="'.$env{'form.concepttest'}.'" />'.
                 '</div></form>');
   }
   
 sub notification_information {  sub notification_information {
     my ($disposition,$req_notifylist,$cnum,$now) = @_;      my ($disposition,$req_notifylist,$cnum,$now) = @_;
     my %emails = &Apache::loncommon::getemails();      my %emails = &Apache::loncommon::getemails();
Line 2365  sub get_processtype { Line 3841  sub get_processtype {
 sub check_autolimit {  sub check_autolimit {
     my ($uname,$udom,$dom,$crstype,$limit,$message) = @_;      my ($uname,$udom,$dom,$crstype,$limit,$message) = @_;
     my %crsroles = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},      my %crsroles = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},
                                         'userroles',['active','future'],['cc'],[$dom]);                         'userroles',['active','future'],['cc','co'],[$dom]);
     my ($types,$typename) = &course_types();      my ($types,$typename) = &Apache::loncommon::course_types();
     my %requests = &Apache::lonnet::dumpstore('courserequests',$udom,$uname);      my %requests = &Apache::lonnet::dumpstore('courserequests',$udom,$uname);
     my %count;      my $count = 0;
     if (ref($types) eq 'ARRAY') {  
         foreach my $type (@{$types}) {  
             $count{$type} = 0;  
         }  
     }  
     foreach my $key (keys(%requests)) {      foreach my $key (keys(%requests)) {
         my ($cdom,$cnum) = split('_',$key);          my ($cdom,$cnum) = split('_',$key);
         if (exists($crsroles{$cnum.':'.$cdom.':cc'})) {          if (ref($requests{$key}) eq 'HASH') {
             if (ref($requests{$key}) eq 'HASH') {              next if ($requests{$key}{'crstype'} ne $crstype);
                 my $type = $requests{$key}{'crstype'};              if (($crstype eq 'community') && 
                 if ($type =~ /^official|unofficial|community$/) {                  (exists($crsroles{$cnum.':'.$cdom.':co'}))) {
                     $count{$type} ++;                  $count ++;
                 }              } elsif ((($crstype eq 'official') || ($crstype eq 'unofficial')) &&
                        (exists($crsroles{$cnum.':'.$cdom.':cc'}))) {
                   $count ++;
             }              }
         }          }
     }      }
     if ($count{$crstype} < $limit) {      if ($count < $limit) {
         return 'process';          return 'process';
     } else {      } else {
         if (ref($typename) eq 'HASH') {          if (ref($typename) eq 'HASH') {
             $$message = &mt('Your request has not been processed because you have reached the limit for the number of courses of this type.').'<br />'.&mt("Your $typename->{$crstype} limit is [_1].",$limit);              if ($crstype eq 'community') {
                   $$message = &mt('Your request has not been processed because you have reached the limit for the number of communities.').
                               '<br />'.&mt("Your limit is [_1].",$limit);
               } else {
                   $$message = &mt('Your request has not been processed because you have reached the limit for the number of courses of this type.').
                               '<br />'.&mt("Your $typename->{$crstype} limit is [_1].",$limit);
               }
         }          }
         return 'rejected';          return 'rejected';
     }      }
Line 2561  sub generate_date_items { Line 4040  sub generate_date_items {
     return;      return;
 }  }
   
   sub show_cloneable {
       my $showclone;
       if (&Apache::loncommon::needs_gci_custom()) {
           my %courses = &Apache::loncommon::existing_gcitest_courses('cc');
           my $numcourses = scalar(keys(%courses));
           return $numcourses;
       } else {
           return 1;
       }
   }
   
   sub get_template {
       my ($cdom) = @_;
       my %template = (
                        gcitest  => '8v226795a882b4bcagcil1',
                        slcitest => '8v226795a882b4bcagcil1',
                      );
       return $template{$cdom};
   }
   
 1;  1;
   

Removed from v.1.26  
changed lines
  Added in v.1.41.2.11


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.