Diff for /loncom/interface/lonrequestcourse.pm between versions 1.29 and 1.104

version 1.29, 2009/09/06 19:09:54 version 1.104, 2018/08/17 23:19:03
Line 52  described at http://www.lon-capa.org. Line 52  described at http://www.lon-capa.org.
   
 =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()
Line 98  described at http://www.lon-capa.org. Line 94  described at http://www.lon-capa.org.
   
 =item print_request_outcome()  =item print_request_outcome()
   
 =item get_processtype()  
   
 =item check_autolimit()  =item check_autolimit()
   
 =item retrieve_settings()  =item retrieve_settings()
Line 122  use Apache::lonnet; Line 116  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 133  sub handler { Line 128  sub handler {
     }      }
   
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                             ['action','showdom','cnum','state']);          ['action','showdom','cnum','state','crstype','queue','tabs']);
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     my $dom = &get_course_dom();      my $dom = &get_course_dom();
     my $action = $env{'form.action'};      my $action = $env{'form.action'};
     my $state = $env{'form.state'};      my $state = $env{'form.state'};
     my (%states,%stored);      my (%states,%stored);
     my ($jscript,$uname,$udom,$result,$warning);      my ($jscript,$uname,$udom,$result,$warning,$showcredits,$instcredits,%can_request,
           %request_domains,@incdoms);
       my %domdefs = &Apache::lonnet::get_domain_defaults($dom);
       if ($domdefs{'officialcredits'} || $domdefs{'unofficialcredits'} || $domdefs{'textbookcredits'}) {
           $showcredits = 1;
       }
   
       my $canreq =
           &Apache::lonnet::check_can_request($dom,\%can_request,\%request_domains);
   
       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);
                   }
               }
           }
       }
   
       if ($canreq) {
           if (($env{'form.crstype'} eq 'lti') && ($env{'request.lti.login'}) &&
               ($env{'form.lti.reqrole'} eq 'cc') && ($env{'form.lti.reqcrs'}) &&
               ($env{'form.lti.sourcecrs'} ne '')) {
               if ($action eq 'process') {
                   if ($can_request{'lti'}) {
                       my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom);
                       &process_textbook_request($r,$dom,$action,\%domdefs,\%domconfig,\%can_request,'lti');
                   } else {
                       $r->print(&header('Course Request','','','',{ 'only_body' => 1}).
                                 '<div>'.
                                 '<p class="LC_info">'.&mt('You do not have privileges to request creation of LTI courses.').'</p>'.
                                 '</div>'.
                                 &Apache::loncommon::end_page());
                   }
               }
               return OK;
           }
           if (($env{'form.crstype'} eq 'textbook') || 
               (scalar(keys(%can_request)) == 1) && ($can_request{'textbook'})) {
               my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom);
               if ($action eq 'log') {
                   my $usetabs;
                   if ((scalar(keys(%can_request)) == 1) && ($can_request{'textbook'})) {
                       $usetabs = 1;
                   } elsif ($env{'form.tabs'} eq 'on') {
                       $usetabs = 1;
                   }
                   &Apache::lonhtmlcommon::add_breadcrumb({text=>'Course Request'});
                   my $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests');
                   &print_request_logs($r,$dom,undef,undef,$crumb,$usetabs);
               } elsif ($action eq 'process') {
                   if ($can_request{'textbook'}) {
                       &process_textbook_request($r,$dom,$action,\%domdefs,\%domconfig,\%can_request);
                   } else {
                       &textbook_request_disabled($r,$dom,$action,\%can_request);
                   }
               } elsif ($action eq 'display') {
                  my ($uname,$udom,$result,$warning) = &domcoord_display($dom);
                  if ($warning ne '') {
                      my $args = { only_body => 1 };
                      $r->print(&header('Course/Community Requests','','' ,'',$args).
                                '<h3>'.&mt('Course/Community Request Details').'</h3>'.
                                '<div class="LC_warning">'.$warning.'</div>'.
                                &close_popup_form());
                   } else {
                       $states{'display'} = ['details'];
                       my $loaditems = &onload_action($action,$state);
                       my $page = 0;
                       &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,
                                               $loaditems,'','','','','',$showcredits,'','',
                                               $uname,$udom);
                   }
               } else {
                   if ($can_request{'textbook'}) {
                       &print_textbook_form($r,$dom,\@incdoms,\%domdefs,$domconfig{'requestcourses'},
                                            \%can_request,'textbook');
                   } else {
                       &textbook_request_disabled($r,$dom,$action,\%can_request);
                   }
               }
               return OK;
           }
       }
   
     $states{'display'} = ['details'];      $states{'display'} = ['details'];
     $states{'view'} = ['pick_request','details','cancel','removal'];      $states{'view'} = ['pick_request','details','cancel','removal'];
     $states{'log'} = ['filter','display'];      $states{'log'} = ['display'];
     $states{'new'} = ['courseinfo','enrollment','personnel','review','process'];      $states{'new'} = ['courseinfo','enrollment','personnel','review','process'];
   
     if (($action eq 'new') && ($env{'form.crstype'} eq 'official')) {      if (($action eq 'new') && ($env{'form.crstype'} eq 'official')) {
Line 152  sub handler { Line 230  sub handler {
         }          }
     }      }
   
       if (($action eq 'new') && (&Apache::loncoursequeueadmin::author_prompt())) {
           if (ref($states{$action}) eq 'ARRAY') {
               push(@{$states{$action}},'reqauthor');
           }
       }
   
     foreach my $key (keys(%states)) {      foreach my $key (keys(%states)) {
         if (ref($states{$key}) eq 'ARRAY') {          if (ref($states{$key}) eq 'ARRAY') {
             unshift (@{$states{$key}},'crstype');              unshift (@{$states{$key}},'crstype');
Line 160  sub handler { Line 244  sub handler {
   
     my @invalidcrosslist;      my @invalidcrosslist;
     my %trail = (      my %trail = (
                  crstype       => 'Course Request Action',                   crstype       => 'Pick Action',
                  codepick      => 'Category',                   codepick      => 'Category',
                  courseinfo    => 'Description',                   courseinfo    => 'Description',
                  enrollment    => 'Access Dates',                   enrollment    => 'Access Dates',
                  personnel     => 'Personnel',                   personnel     => 'Personnel',
                  review        => 'Review',                   review        => 'Review',
                  process       => 'Result',                   process       => 'Result',
                    reqauthor     => 'Authoring Space Result',
                  pick_request  => 'Display Summary',                   pick_request  => 'Display Summary',
                  details       => 'Request Details',                   details       => 'Request Details',
                  cancel        => 'Cancel Request',                   cancel        => 'Cancel Request',
                  removal       => 'Outcome',                   removal       => 'Outcome',
                    display       => 'Request Logs',
                 );                  );
   
     if (($env{'form.crstype'} eq 'official') && (&Apache::lonnet::auto_run('',$dom))) {      if (($env{'form.crstype'} eq 'official') && (&Apache::lonnet::auto_run('',$dom))) {
         $trail{'enrollment'} = 'Enrollment';          $trail{'enrollment'} = 'Enrollment';
     }      }
   
     my ($page,$crumb,$newinstcode,$codechk,$checkedcode) =       my ($page,$crumb,$newinstcode,$codechk,$checkedcode,$description) =
         &get_breadcrumbs($dom,$action,\$state,\%states,\%trail);          &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))) {          ($uname,$udom,$result,$warning) = &domcoord_display($dom);
             my $namespace = 'courserequestqueue';  
             if ($env{'form.cnum'} ne '') {  
                 my $cnum = $env{'form.cnum'};  
                 my $reqkey = $cnum.'_approval';  
                 my $namespace = 'courserequestqueue';  
                 my $domconfig = &Apache::lonnet::get_domainconfiguser($dom);  
                 my %queued =  
                     &Apache::lonnet::get($namespace,[$reqkey],$dom,$domconfig);  
                 if (ref($queued{$reqkey}) eq 'HASH') {  
                     $uname = $queued{$reqkey}{'ownername'};  
                     $udom  = $queued{$reqkey}{'ownerdom'};  
                     if (($udom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/)) {  
                         $result = &retrieve_settings($dom,$cnum,$udom,$uname);  
                     } else {  
                         $warning = &mt('Invalid username or domain for course requestor');  
                     }  
                 } else {  
                     $warning = &mt('No information was found for this course request.');  
                 }  
             } else {  
                 $warning = &mt('No course request ID provided.');  
             }  
         } 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'}))) {
Line 238  sub handler { Line 299  sub handler {
                                         $crosslistcode .= $env{'form.crosslist_'.$i.'_'.$item};                                           $crosslistcode .= $env{'form.crosslist_'.$i.'_'.$item}; 
                                     }                                      }
                                     if ($crosslistcode ne '') {                                       if ($crosslistcode ne '') { 
                                          $codechk{$i} =                                            ($codechk{$i}, my $rest) = 
                                             &Apache::lonnet::auto_validate_instcode('',$dom,$crosslistcode);                                              &Apache::lonnet::auto_validate_instcode('',$dom,$crosslistcode);
                                     }                                      }
                                     unless ($codechk{$i} eq 'valid') {                                      unless ($codechk{$i} eq 'valid') {
Line 252  sub handler { Line 313  sub handler {
                 }                  }
             }              }
         }          }
         my %elements =  &form_elements($dom);          (my $elements,$instcredits) = &form_elements($dom,$showcredits);
         my $elementsref = {};          my $elementsref = {};
         if (ref($elements{$action}) eq 'HASH') {          if ((ref($elements) eq 'HASH') && (ref($elements->{$action}) eq 'HASH')) {
             if (ref($elements{$action}{$state}) eq 'HASH') {              if (ref($elements->{$action}{$state}) eq 'HASH') {
                 $elementsref = $elements{$action}{$state};                  $elementsref = $elements->{$action}{$state};
             }              }
         }          }
         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();
           } else {
               $jscript = &Apache::lonhtmlcommon::set_form_elements($elementsref,\%stored);
               if ($state eq 'courseinfo') {
                   $jscript .= &cloning_javascript();
               } elsif ($state eq 'process') {
                   $jscript .= &processing_javascript();
               }
           }
     }      }
   
     if ($state eq 'personnel') {      if ($state eq 'personnel') {
Line 271  sub handler { Line 341  sub handler {
   
     my $loaditems = &onload_action($action,$state);      my $loaditems = &onload_action($action,$state);
   
     my %can_request;  
     my $canreq = &check_can_request($dom,\%can_request);  
     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,\@incdoms);
             } else {              } else {
                 &request_administration($r,$action,$state,$page,\%states,$dom,                  &request_administration($r,$action,$state,$page,\%states,$dom,
                                         $jscript,$loaditems,$crumb,$newinstcode,                                          $jscript,$loaditems,$crumb,$newinstcode,
                                         $codechk,$checkedcode,\@invalidcrosslist);                                          $codechk,$checkedcode,$description,
                                           $showcredits,$instcredits,\@invalidcrosslist);
             }              }
         } 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,\@incdoms);
         } else {          } else {
             &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,              &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,
                                     $loaditems,$crumb);                                      $loaditems,$crumb,'','','','',$showcredits);
         }          }
     } 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,'','','','',$showcredits,'','',
                                       $uname,$udom);
         }          }
     } elsif ($action eq 'log') {      } elsif ($action eq 'log') {
         &print_request_logs($jscript,$loaditems,$crumb);          if ($state eq 'crstype') {
               &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\@incdoms);
           } else {
               $jscript .= <<ENDJS;
   
   function backPage(formname,prevstate) {
       formname.state.value = prevstate;
       formname.submit();
   }
   
   function setPage(formname) {
       formname.page.value = '1';
       return;
   }
   
   ENDJS
               &print_request_logs($r,$dom,$jscript,$loaditems,$crumb,\%can_request);
           }
     } else {      } else {
         &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb);          &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\@incdoms);
     }      }
     return OK;      return OK;
 }  }
   
   sub mainmenu_javascript {
       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.action.length; i++) {
           if (courseForm.action.options[i].value == "$env{'form.action'}") {
               courseForm.action.options[i].selected = true;
           } else {
               courseForm.action.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 processing_javascript {
       return <<"END";
   function hideProcessing() {
       if (document.getElementById('processing')) {
           document.getElementById('processing').style.display="none";
       }
   }
   
   END
   }
   
 sub get_breadcrumbs {  sub get_breadcrumbs {
     my ($dom,$action,$state,$states,$trail) = @_;      my ($dom,$action,$state,$states,$trail) = @_;
     my ($crumb,$newinstcode,$codechk,$checkedcode,$numtitles);      my ($crumb,$newinstcode,$codechk,$checkedcode,$numtitles,$description);
     my $page = 0;      my $page = 0;
     if ((ref($states) eq 'HASH') && (ref($trail) eq 'HASH') && (ref($state))) {      if ((ref($states) eq 'HASH') && (ref($trail) eq 'HASH') && (ref($state))) {
         if (defined($action)) {          if (defined($action)) {
Line 342  sub get_breadcrumbs { Line 480  sub get_breadcrumbs {
                                     $$state = 'codepick';                                      $$state = 'codepick';
                                     $page --;                                      $page --;
                                 } else {                                  } else {
                                     $codechk =                                       ($codechk,$description) = 
                                         &Apache::lonnet::auto_validate_instcode('',                                          &Apache::lonnet::auto_validate_instcode('',
                                             $dom,$newinstcode);                                              $dom,$newinstcode);
                                     if ($codechk ne 'valid') {                                      if ($codechk ne 'valid') {
Line 356  sub get_breadcrumbs { Line 494  sub get_breadcrumbs {
                     }                      }
                 }                  }
             }              }
             for (my $i=0; $i<@{$states->{$action}}; $i++) {              if (ref($states->{$action}) eq 'ARRAY') {
                 if ($$state eq $states->{$action}[$i]) {                  for (my $i=0; $i<@{$states->{$action}}; $i++) {
                     &Apache::lonhtmlcommon::add_breadcrumb(                      if ($$state eq $states->{$action}[$i]) {
                        {text=>"$trail->{$$state}"});  
                     $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests');  
                     last;  
                 } else {  
                     if (($$state eq 'process') || ($$state eq 'removal')) {  
                         &Apache::lonhtmlcommon::add_breadcrumb(                          &Apache::lonhtmlcommon::add_breadcrumb(
                             { href => '/adm/requestcourse',                             {text=>"$trail->{$$state}"});
                               text => "$trail->{$states->{$action}[$i]}",                          $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course/Community Requests','Course_Requests');
                             }                          last;
                         );  
                     } else {                      } else {
                         &Apache::lonhtmlcommon::add_breadcrumb(                          if (($$state eq 'process') || ($$state eq 'removal') || ($$state eq 'reqauthor')) {
                               &Apache::lonhtmlcommon::add_breadcrumb(
                                   { href => '/adm/requestcourse',
                                     text => "$trail->{$states->{$action}[$i]}",
                                   }
                              );
                           } else {
                               &Apache::lonhtmlcommon::add_breadcrumb(
      { href => "javascript:backPage(document.requestcrs,'$states->{$action}[$i]')",       { href => "javascript:backPage(document.requestcrs,'$states->{$action}[$i]')",
        text => "$trail->{$states->{$action}[$i]}", }         text => "$trail->{$states->{$action}[$i]}", }
                        );                             );
                    }                          }
                }                      }
            }                  }
               }
         } else {          } else {
             &Apache::lonhtmlcommon::add_breadcrumb(              &Apache::lonhtmlcommon::add_breadcrumb(
                     {text=>'Pick Action'});                      {text=>'Pick Action'});
             $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests');              $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course/Community Requests','Course_Requests');
         }          }
     } else {      } else {
         &Apache::lonhtmlcommon::add_breadcrumb(          &Apache::lonhtmlcommon::add_breadcrumb(
                 {text=>'Pick Action'});                  {text=>'Pick Action'});
         $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests');          $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course/Community Requests','Course_Requests');
     }      }
     return ($page,$crumb,$newinstcode,$codechk,$checkedcode);      return ($page,$crumb,$newinstcode,$codechk,$checkedcode,$description);
 }  }
   
 sub header {  sub header {
Line 412  sub header { Line 552  sub header {
 }  }
   
 sub form_elements {  sub form_elements {
     my ($dom) = @_;      my ($dom,$showcredits) = @_;
       my $instcredits;
     my %elements =      my %elements =
     (      (
         new => {          new => {
Line 423  sub form_elements { Line 564  sub form_elements {
             },              },
             courseinfo => {              courseinfo => {
                 cdescr           => 'text',                  cdescr           => 'text',
                   cloning          => 'radio', 
                 clonecrs         => 'text',                  clonecrs         => 'text',
                 clonedom         => 'selectbox',                  clonedom         => 'selectbox',
                 datemode         => 'radio',                  datemode         => 'radio',
Line 479  sub form_elements { Line 621  sub form_elements {
     }      }
     if (&Apache::lonnet::auto_run('',$dom)) {      if (&Apache::lonnet::auto_run('',$dom)) {
         my %extras = (          my %extras = (
                        sectotal           => 'hidden',  
                        enrollstart_month  => 'selectbox',                         enrollstart_month  => 'selectbox',
                        enrollstart_hour   => 'selectbox',                         enrollstart_hour   => 'selectbox',
                        enrollend_month    => 'selectbox',                         enrollend_month    => 'selectbox',
Line 495  sub form_elements { Line 636  sub form_elements {
                        addcrosslist       => 'checkbox',                         addcrosslist       => 'checkbox',
                        autoadds           => 'radio',                         autoadds           => 'radio',
                        autodrops          => 'radio',                         autodrops          => 'radio',
                      );          );
         if ($env{'form.sectotal'} > 0) {          my ($instcode,$titlescount) = &get_instcode($dom);
             for (my $i=0; $i<$env{'form.sectotal'}; $i++) {          if ($instcode) {
                 $extras{'sec_'.$i} = 'checkbox',              my @sections = &Apache::lonnet::auto_get_sections(undef,$dom,$instcode);
                 $extras{'secnum_'.$i} = 'text',              if (@sections) {
                 $extras{'loncapasec_'.$i} = 'text',                  $extras{'sectotal'} = 'hidden';
                   if ($env{'form.sectotal'} > 0) {
                       for (my $i=0; $i<$env{'form.sectotal'}; $i++) {
                           $extras{'sec_'.$i} = 'radio';
                           $extras{'secnum_'.$i} = 'text';
                           $extras{'loncapasec_'.$i} = 'text';
                       }
                   }
               } else {
                   $extras{'addsection'} = 'checkbox';
                   my $sectotal = $env{'form.sectotal'};
                   if ($env{'form.addsection'}) {
                       $sectotal ++;
                   }
                   for (my $i=0; $i<$sectotal; $i++) {
                       $extras{'sec_'.$i} = 'checkbox';
                       $extras{'secnum_'.$i} = 'text',
                       $extras{'loncapasec_'.$i} = 'text',
                   }
               }
               (my $outcome,my $desc,$instcredits) = 
                   &Apache::lonnet::auto_validate_instcode(undef,$dom,$instcode);
               if ($showcredits && $instcredits eq '') {
                   $extras{'coursecredits'} = 'text';
               }
           } elsif (($env{'form.crstype'} eq 'unofficial') || ($env{'form.crstype'} eq 'textbook')) {
               if ($showcredits) {
                   $extras{'coursecredits'} = 'text';
             }              }
         }          }
         my $crosslisttotal = $env{'form.crosslisttotal'};          my $crosslisttotal = $env{'form.crosslisttotal'};
Line 510  sub form_elements { Line 678  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 548  sub form_elements { Line 715  sub form_elements {
     }      }
     my %personnelhash = (%{$elements{'new'}{'personnel'}},%people);      my %personnelhash = (%{$elements{'new'}{'personnel'}},%people);
     %{$elements{'new'}{'personnel'}} = %personnelhash;      %{$elements{'new'}{'personnel'}} = %personnelhash;
     return %elements;      return (\%elements,$instcredits);;
 }  }
   
 sub onload_action {  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 {          if ($state eq 'courseinfo') {
     my ($dom,$can_request) = @_;              $loaditems{'onload'} .= 'javascript:setCloneDisplay(document.requestcrs);';
     my $canreq = 0;          }
     my ($types,$typename) = &course_types();          if ($state eq 'process') {
     my @options = ('approval','validate','autolimit');              $loaditems{'onload'} .= 'javascript:hideProcessing();';
     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,$incdoms) = @_;
     my ($types,$typename) = &course_types();      my ($types,$typename) = &Apache::loncommon::course_types();
     my $onchange;      my $onchange = 'this.form.submit()';
     unless ($env{'form.interface'} eq 'textual') {  
         $onchange = 1;  
     }  
   
     my $nextstate_setter = "\n";      my $nextstate_setter = "\n";
     if (ref($states) eq 'HASH') {      if (ref($states) eq 'HASH') {
         foreach my $key (keys(%{$states})) {          foreach my $key (keys(%{$states})) {
Line 646  $nextstate_setter Line 776  $nextstate_setter
 function check_can_request(crschoice,actionchoice) {  function check_can_request(crschoice,actionchoice) {
     var official = '';      var official = '';
     var unofficial = '';      var unofficial = '';
     var community = '';          var community = '';
       var textbook = '';
       var placement = '';
 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(      my %js_lt = &Apache::lonlocal::texthash(
         official => 'You are not permitted to request creation of an official course in this domain.',          official => 'You are not permitted to request creation of an official course in this domain.',
         unofficial => 'You are not permitted to request creation of an unofficial course in this domain.',          unofficial => 'You are not permitted to request creation of an unofficial course in this domain.',
         community => 'You are not permitted to request creation of a community this domain.',          community => 'You are not permitted to request creation of a community in this domain.',
         all => 'You must choose a specific course type when making a new course request.\\nAll types is not allowed.',          textbook => 'You are not permitted to request creation of a textbook course in this domain',
           placement => 'You are not permitted to request creation of a placement test in this domain',
           all => 'You must choose a specific course type when making a new course request.',
           allt => '"All types" is not allowed.',
     );       ); 
       &js_escape(\%js_lt);
     $js .= <<END;      $js .= <<END;
     if (crschoice == 'official') {      if (crschoice == 'official') {
         if (official != 1) {          if (official != 1) {
             alert("$lt{'official'}");              alert("$js_lt{'official'}");
             return false;              return false;
         }          }
     } else {      } else {
         if (crschoice == 'unofficial') {          if (crschoice == 'unofficial') {
             if (unofficial != 1) {              if (unofficial != 1) {
                 alert("$lt{'unofficial'}");                  alert("$js_lt{'unofficial'}");
                 return false;                  return false;
             }              }
         } else {          } else {
             if (crschoice == 'community') {              if (crschoice == 'community') {
                 if (community != 1) {                  if (community != 1) {
                     alert("$lt{'community'}");                      alert("$js_lt{'community'}");
                     return false;                      return false;
                 }                  }
             } else {              } else {
                 if (actionchoice == 'new') {                  if (crschoice == 'textbook') {
                     alert("$lt{'all'}");                      if (textbook != 1) {
                     return false;                          alert("$js_lt{'textbook'}");
                 }                                         return false;
                       }
                   } else {
                       if (crschoice == 'placement') {
                           if (placement != 1) {
                               alert("$js_lt{'placement'}");
                               return false;
                           }
                       } else {
                           if (actionchoice == 'new') {
                               alert('$js_lt{'all'}'+'\\n'+'$js_lt{'allt'}');
                               return false;
                           }
                       }
                   }
             }              }
         }          }
     }      }
     return true;      return true;
 }  }
   
 END  END
       my ($pagetitle,$pageinfo,$domaintitle,$earlyout);
     $r->print(&header('Course Requests',$js.$jscript,$loaditems).$crumb.'<div>'.      if (ref($can_request) eq 'HASH') {
           if (($can_request->{'official'}) || ($can_request->{'unofficial'}) || ($can_request->{'textbook'}) || ($can_request->{'placement'})) {
               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');
           } elsif ((ref($incdoms) eq 'ARRAY') && ((@{$incdoms} > 1) ||
                    ((@{$incdoms} == 1) && ($incdoms->[0] ne $dom)))) {
               $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');
           } else {
               $pagetitle = 'Course/Community Requests';
               $pageinfo  = &mt('You do not have rights to request creation of courses or communities.');
               $earlyout = 1;
           }
       }
       $r->print(&header($pagetitle,$js.$jscript,$loaditems).$crumb.
                '<p>'.$pageinfo.'</p>');
       if ($earlyout) {
           $r->print(&Apache::loncommon::end_page());
           return;
       }
       $r->print('<div>'.
               &Apache::lonhtmlcommon::start_pick_box().                &Apache::lonhtmlcommon::start_pick_box().
               &Apache::lonhtmlcommon::row_title(&mt('Course Domain')).                &Apache::lonhtmlcommon::row_title($domaintitle).
               '<form name="domforcourse" method="post" action="/adm/requestcourse">'.                '<form name="domforcourse" method="post" action="/adm/requestcourse">'.
               &Apache::loncommon::select_dom_form($dom,'showdom','',1,$onchange));                &Apache::loncommon::select_dom_form($dom,'showdom','',1,$onchange,$incdoms));
     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').'" />');
     }      }
       unless ((ref($can_request) eq 'HASH') && (keys(%{$can_request}) > 0)) {
           $r->print('</form>'.&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());      $r->print('</form>'.&Apache::lonhtmlcommon::row_closure());
   
     my $formname = 'requestcrs';      my $formname = 'requestcrs';
     my $nexttext = &mt('Next');      my $nexttext = &mt('Next');
     $r->print(&Apache::lonhtmlcommon::row_title(&mt('Action')).'      $r->print(&Apache::lonhtmlcommon::row_title(&mt('Action')).'
Line 711  END Line 898  END
  <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></form>'.  </select></form>'.
               &Apache::lonhtmlcommon::row_closure(1).                &Apache::lonhtmlcommon::row_closure().
               &Apache::lonhtmlcommon::row_title(&mt('Course Type')).'                &Apache::lonhtmlcommon::row_title(&mt('Type')).'
 <form name="mainmenu_coursetype" method="post" action="">  <form name="mainmenu_coursetype" method="post" action="">
 <select size="1" name="crstype">  <select size="1" name="crstype">');
  <option value="any">'.&mt('All types').'</option>');      if (ref($can_request) eq 'HASH') {
     if ((ref($types) eq 'ARRAY') && (ref($typename) eq 'HASH')) {          if (keys(%{$can_request}) > 1) {
         foreach my $type (@{$types}) {              $r->print(' <option value="any">'.&mt('All types').'</option>');
             my $selected = '';          }
             if ($type eq 'official') {          if ((ref($types) eq 'ARRAY') && (ref($typename) eq 'HASH')) {
                 $selected = ' selected="selected"';              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></form>'."\n".      $r->print('</select></form>'."\n".
               &Apache::lonhtmlcommon::row_closure(1)."\n".                &Apache::lonhtmlcommon::row_closure(1)."\n".
               &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n".                &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n".
               '<div><form name="'.$formname.'" method="post" action="">'."\n".                '<div><form name="'.$formname.'" method="post" action="/adm/requestcourse">'."\n".
               '<input type="hidden" name="state" value="crstype" />'."\n".                '<input type="hidden" name="state" value="crstype" />'."\n".
               '<input type="hidden" name="showdom" value="'.$dom.'" />'."\n".                '<input type="hidden" name="showdom" value="'.$dom.'" />'."\n".
               '<input type="hidden" name="crstype" value="" />'."\n".                '<input type="hidden" name="crstype" value="" />'."\n".
Line 743  END Line 941  END
   
 sub request_administration {  sub request_administration {
     my ($r,$action,$state,$page,$states,$dom,$jscript,$loaditems,$crumb,      my ($r,$action,$state,$page,$states,$dom,$jscript,$loaditems,$crumb,
         $newinstcode,$codechk,$checkedcode,$invalidcrosslist,$uname,$udom) = @_;          $newinstcode,$codechk,$checkedcode,$description,$showcredits,
           $instcredits,$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 767  END Line 966  END
     }      }
     if ($action eq 'new') {      if ($action eq 'new') {
         my $jsextra;          my $jsextra;
         unless (($state eq 'review') || ($state eq 'process')) {          if (($state eq 'courseinfo') || ($state eq 'codepick')) {
             $jsextra = "\n".&Apache::loncommon::coursebrowser_javascript($dom);              $jsextra = "\n".&Apache::loncommon::coursebrowser_javascript($dom,'','','','','',
                                                                            $newinstcode);
           } 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();
         }          }
         $r->print(&header('Request a course',$js.$jscript,$loaditems,$jsextra).$crumb);          my $title;
           if ($env{'form.crstype'} eq 'community') {
               $title = 'Request a community';
           } else {
               $title = 'Request a course';
           }
           $r->print(&header($title,$js.$jscript,$loaditems,$jsextra).$crumb);
         &print_request_form($r,$action,$state,$page,$states,$dom,$newinstcode,          &print_request_form($r,$action,$state,$page,$states,$dom,$newinstcode,
                             $codechk,$checkedcode,$invalidcrosslist);                              $codechk,$checkedcode,$description,$showcredits,
                               $instcredits,$invalidcrosslist);
     } elsif ($action eq 'view') {      } elsif ($action eq 'view') {
         my $jsextra;          my $jsextra;
         my $formname = 'requestcrs';          my $formname = 'requestcrs';
Line 787  END Line 1001  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');
               } elsif ($env{'form.crstype'} eq 'textbook') {
                   $title = &mt('Pending requests for textbook courses');
               } elsif ($env{'form.crstype'} eq 'textbook') {
                   $title = &mt('Pending requests for placement tests'); 
               } else {
                   $title = &mt('Pending course/community requests'); 
               }
               $r->print('<h3>'.$title.'</h3><div>'."\n".$form."\n".
                         &print_request_status($dom,$action).'</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 803  END Line 1036  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,'','','','',$instcredits)."\n".
                       '<input name="origcnum" value="'.$origcnum.'" type="hidden" />'."\n");                        '<input name="origcnum" value="'.$origcnum.'" type="hidden" />'."\n");
             my @excluded = &get_excluded_elements($dom,$states,'new','review');              my @excluded = &get_excluded_elements($dom,$states,'new','review',
                                                     $showcredits);
             push(@excluded,'origcnum');              push(@excluded,'origcnum');
             $r->print(&Apache::lonhtmlcommon::echo_form_input(\@excluded).'</div>');              $r->print(&Apache::lonhtmlcommon::echo_form_input(\@excluded).'</div>');
             my $other = 'modify';              my $other = 'modify';
Line 816  END Line 1056  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',
                                                     $showcredits);
             $r->print(&Apache::lonhtmlcommon::echo_form_input(\@excluded).'</div>');              $r->print(&Apache::lonhtmlcommon::echo_form_input(\@excluded).'</div>');
             my %navtxt = &Apache::lonlocal::texthash (              my %navtxt = &Apache::lonlocal::texthash (
                                                       prev => 'Back',                                                        prev => 'Back',
                                                       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 869  END Line 1117  END
                       '<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 884  END Line 1136  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,'','',$instcredits)."\n".
                     '</div>'.
                   &close_popup_form());                    &close_popup_form());
     } elsif ($action eq 'log') {  
         $r->print(&coursereq_log('View request log',$jscript,$loaditems).$crumb);  
     }      }
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
     return;      return;
 }  }
   
   sub domcoord_display {
       my ($dom) = @_;
       my ($uname,$udom,$result,$warning);
       if (($dom eq $env{'request.role.domain'}) && (&Apache::lonnet::allowed('ccc',$dom))) {
           if ($env{'form.cnum'} ne '') {
               my $cnum = $env{'form.cnum'};
               my $queue = $env{'form.queue'};
               my $reqkey = $cnum.'_'.$queue;
               my $namespace = 'courserequestqueue';
               my $domconfig = &Apache::lonnet::get_domainconfiguser($dom);
               my %queued =
                   &Apache::lonnet::get($namespace,[$reqkey],$dom,$domconfig);
               if (ref($queued{$reqkey}) eq 'HASH') {
                   $uname = $queued{$reqkey}{'ownername'};
                   $udom  = $queued{$reqkey}{'ownerdom'};
                   if (($udom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/)) {
                       $result = &retrieve_settings($dom,$cnum,$udom,$uname);
                   } else {
                       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 {
                   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 {
               $warning = &mt('No course request ID provided.');
           }
       } else {
           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.');
           }
       }
       return ($uname,$udom,$result,$warning);
   }
   
   sub enrollment_lcsec_js {
       my %alerts = &section_check_alerts();
       my $secname = $alerts{'badsec'};
       my $secnone = $alerts{'reserved'};
       &js_escape(\$secname);
       &js_escape(\$secnone);
       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'};
       &js_escape(\$secname);
       &js_escape(\$secnone);
       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 923  sub get_instcode { Line 1392  sub get_instcode {
   
 sub print_request_form {  sub print_request_form {
     my ($r,$action,$state,$page,$states,$dom,$newinstcode,$codechk,$checkedcode,      my ($r,$action,$state,$page,$states,$dom,$newinstcode,$codechk,$checkedcode,
         $invalidcrosslist) = @_;          $description,$showcredits,$instcredits,$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 933  sub print_request_form { Line 1402  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'};
Line 969  sub print_request_form { Line 1439  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];
Line 985  sub print_request_form { Line 1457  sub print_request_form {
         if ($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,$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,
Line 993  sub print_request_form { Line 1465  sub print_request_form {
         }          }
         $r->print(&print_enrollment_menu($formname,$instcode,$dom,\@codetitles,          $r->print(&print_enrollment_menu($formname,$instcode,$dom,\@codetitles,
                                          \%cat_titles,\%cat_order,\@code_order,                                           \%cat_titles,\%cat_order,\@code_order,
                                          $invalidcrosslist));                                           $showcredits,$instcredits,$invalidcrosslist));
     } elsif ($state eq 'personnel') {      } elsif ($state eq 'personnel') {
         $r->print(&print_personnel_menu($dom,$formname,$crstype,$invalidcrosslist));          $r->print(&print_personnel_menu($dom,$formname,$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 to be from the course domain','<tt>'.$personname.':'.$persondom.'</tt>');
                                   next;
                               }
                           }
                           my $usertype = &get_usertype($persondom,$personname,\%curr_rules,\%got_rules);
                           if (&Apache::lonuserutils::can_create_user($dom,'requestcrs',$usertype)) {
                               my ($allowed,$msg,$authtype,$authparam) = 
                                   &check_newuser_rules($persondom,$personname,
                                       \%alerts,\%rulematch,\%inst_results,
                                       \%curr_rules,\%got_rules);
                               if ($allowed) {
                                   my %domdefaults = &Apache::lonnet::get_domain_defaults($persondom);
                                   if ($usertype eq 'official') {
                                       if ($authtype eq '') {
                                           $authtype = $domdefaults{'auth_def'};
                                           $authparam = $domdefaults{'auth_arg_def'};
                                       }
                                   } elsif ($usertype eq 'unofficial') {
                                       if ($authtype eq '') {
                                           $authtype = 'internal';
                                           $authparam = '';
                                       }
                                   } else {
                                       $authtype = $domdefaults{'auth_def'};
                                       $authparam = $domdefaults{'auth_arg_def'};
                                   }
                                   if (($authtype eq '') ||
                                       (($authtype =~/^krb/) && ($authparam eq ''))) {
                                       push(@disallowed,$i);
                                       $disallowmsg{$i} = &mt('[_1] was excluded because institutional information is incomplete for this new user.','<tt>'.$personname.':'.$persondom.'</tt>');
                                       next;
                                   }
                                   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'};
         } else {          } else {
             $cnum = &Apache::lonnet::generate_coursenum($dom);              my $gentype = 'Course';
               if ($crstype eq 'community') {
                   $gentype = 'Community';
               }
               $cnum = &Apache::lonnet::generate_coursenum($dom,$gentype);
         }          }
         &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('Review course request details before submission').'</h3>'.          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,$instcredits).
                   '<input type="hidden" name="cnum" value="'.$cnum.'" />');                    '<input type="hidden" name="cnum" value="'.$cnum.'" />');
         $navtxt{'next'} = &mt('Submit course request');          my $fullname = &Apache::loncommon::plainname($env{'user.name'},
                                                        $env{'user.domain'});
           my $postprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'review',$env{'user.name'},
                                                                 $env{'user.domain'},$fullname,$env{'form.cdescr'});
           if (ref($postprocess) eq 'HASH') {
               if ($postprocess->{'reviewweb'}) {
                   $r->print($postprocess->{'reviewweb'});
               }
           }
           if ($crstype eq 'community') {
               $navtxt{'next'} = &mt('Submit community request');
           } else {
               $navtxt{'next'} = &mt('Submit course request');
           }
     }  elsif ($state eq 'process') {      }  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 ($storeresult,$result) = &print_request_outcome($dom,\@codetitles,          my $lonhost = $r->dir_config('lonHostID');
                                                            \@code_order);          my ($storeresult,$result,$customized) = &print_request_outcome($r,$lonhost,$dom,\@codetitles,
                                                                         \@code_order,$instcredits);
         $r->print($result);          $r->print($result);
         if (($storeresult eq 'ok') || ($storeresult eq 'created')) {          if (($storeresult eq 'ok') || ($storeresult eq 'created')) {
             $r->print('<p>');  
             if ($storeresult eq 'ok') {              if ($storeresult eq 'ok') {
                 $r->print('<a href="/adm/requestcourse?action=view&state=details&showdom='.$dom.'&cnum='. $env{'form.cnum'}.'">'.                  $r->print('<p><a href="/adm/requestcourse?action=view&state=details&showdom='.$dom.'&cnum='. $env{'form.cnum'}.'">'.
                           &mt('Modify this request').'</a>'.('&nbsp;'x4));                            &mt('Modify this request').'</a>'.('&nbsp;'x4).
                             '<a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>');
               }
               if (&Apache::loncoursequeueadmin::author_prompt()) {
                   unless ($customized) {
                       &print_author_prompt($r,$env{'form.action'},$env{'form.cnum'},$env{'form.showdom'},
                                            $env{'form.crstype'},$storeresult);
                   }
               } elsif ($storeresult eq 'created') {
                   unless ($customized) {
                       $r->print('<p><a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>');
                   }
             }              }
             $r->print('<a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>');          }
             return;      } elsif ($state eq 'reqauthor') {
           my ($result,@links); 
           if ($env{'form.requestauthor'}) {
               $r->print(&Apache::loncoursequeueadmin::process_reqauthor(\$result));
               if ($result eq 'created') {
                   my $role = 'au';
                   my $spec = "$role./$env{'form.showdom'}/";
                   push(@links,&mt('Enter your Authoring Space with role: [_1]',
                                   '<a href="/adm/roles?selectrole=1&amp;'.$spec.'=1">'.
                                   &Apache::lonnet::plaintext($role).'</a>'));
               }
           }
           if (($env{'form.disposition'} eq 'created') &&
               ($env{'form.cnum'} =~ /^$match_courseid$/) &&
               ($env{'form.showdom'} =~ /^$match_domain$/)) {
               my ($spec,$area,$role,$type);
               my $role = 'cc';
               my $spec = "$role./$env{'form.showdom'}/$env{'form.cnum'}";
               my $type = 'Course';
               if ($env{'form.crstype'} eq 'community') {
                   $type = 'Community';
               }
               my $showrole = &Apache::lonnet::plaintext($role,$type);
               unshift(@links,&mt('Enter new course with role: [_1]',
                                  '<a href="/adm/roles?selectrole=1&amp;'.$spec.'=1">'.$showrole.'</a>'));
           }
           if (@links > 1) {
               $r->print(&mt('New roles will be listed on your [_1]Roles[_2] page.',
                             '<a href="/adm/roles">','</a>').'&nbsp'.&mt('Choose a role:').
                          '<ul>');
               foreach my $link (@links) {
                   $r->print('<li>'.$link.'</li>');
               }
               $r->print('</ul>');
           } elsif (@links == 1) {
               $r->print('<p>'.$links[0].'</p>');
         }          }
     }      }
     my @excluded = &get_excluded_elements($dom,$states,$action,$state);      my @excluded = &get_excluded_elements($dom,$states,$action,$state,$showcredits);
     if ($state eq 'personnel') {      if ($state eq 'personnel') {
         push(@excluded,'persontotal');          push(@excluded,'persontotal');
     }      }
       if ($state eq 'review') {
           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') {      if ($state eq 'enrollment') {
         push(@excluded,'crosslisttotal');          push(@excluded,('sectotal','crosslisttotal'));
       }
       if (($state eq 'process') || ($state eq 'reqauthor')) {
           $r->print('</form>');
       } else {
           $r->print(&Apache::lonhtmlcommon::echo_form_input(\@excluded).'</form>');
           &display_navbuttons($r,$dom,$formname,$prev,$navtxt{'prev'},$next,
                               $navtxt{'next'},$state);
     }      }
     $r->print(&Apache::lonhtmlcommon::echo_form_input(\@excluded).'</form>');  
     &display_navbuttons($r,$formname,$prev,$navtxt{'prev'},$next,$navtxt{'next'},$state);  
     return;      return;
 }  }
   
   sub print_author_prompt {
       my ($r,$action,$cnum,$showdom,$crstype,$storeresult) = @_;
       $r->print('<h3>'.&mt('Access to Authoring Space').'</h3>'.
                 '<p>'.
                 &mt('Although assessment items can be created directly inside a course, such items only use part of the assessment capabilities of LON-CAPA.').
                 '<br />'.
                 &mt('By contrast, items created in Authoring Space, then imported into a course, can use all of the features of the assessment engine.').'</p>'.
                 '<p>'.&mt('Request Authoring Space access now?').
                 '<span class="LC_nobreak">&nbsp;'.
                 '<label><input type="radio" name="requestauthor" value="1" />'.&mt('Yes').'</label>'.
                 ('&nbsp;'x2).
                 '<label><input type="radio" name="requestauthor" value="0" checked="checked"/>'.&mt('No').'</label>'.
                 '</span></p>'.
                 '<input type="submit" name="newauthor" value="'.&mt('Submit authoring request').'" />'.
                 '<input type="hidden" name="state" value="reqauthor" />'.
                 '<input type="hidden" name="action" value="'.$action.'" />'.
                 '<input type="hidden" name="cnum" value="'.$cnum.'" />'.
                 '<input type="hidden" name="showdom" value="'.$showdom.'" />'.
                 '<input type="hidden" name="crstype" value="'.$crstype.'" />'.
                 '<input type="hidden" name="disposition" value="'.$storeresult.'" />'.
                 '<br />');
   }    
   
   sub get_usertype {
       my ($persondom,$personname,$curr_rules,$got_rules) = @_;
       my ($rules,$ruleorder) =
           &Apache::lonnet::inst_userrules($persondom,'username');
       my $usertype = &Apache::lonuserutils::check_usertype($persondom,$personname,
                                                            $rules,$curr_rules,$got_rules);
       return $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,$authtype,$authparam);
       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;
               }
           }
       }
       if ($allowed) {
           if (ref($rulematch) eq 'HASH') {
               if (ref($rulematch->{$personname.':'.$persondom}) eq 'HASH') {
                   my $matchedrule = $rulematch->{$personname.':'.$persondom}{'username'};
                   my ($rules,$ruleorder) =
                       &Apache::lonnet::inst_userrules($persondom,'username');
                   if (ref($rules) eq 'HASH') {
                       if (ref($rules->{$matchedrule}) eq 'HASH') {
                           $authtype = $rules->{$matchedrule}{'authtype'};
                           $authparam = $rules->{$matchedrule}{'authparm'};
                       }
                   }
               }
           }
       }
       return ($allowed,$userchkmsg,$authtype,$authparam);
   }
   
 sub get_excluded_elements {  sub get_excluded_elements {
     my ($dom,$states,$action,$state) = @_;      my ($dom,$states,$action,$state,$showcredits) = @_;
     my @excluded = ('counter');      my @excluded = ('counter');
     my %elements = &form_elements($dom);      my ($elements,$instcredits) = &form_elements($dom,$showcredits);
     if (ref($states) eq 'HASH') {      if (ref($states) eq 'HASH') {
         if (ref($states->{$action}) eq 'ARRAY') {          if (ref($states->{$action}) eq 'ARRAY') {
             my @items = @{$states->{$action}};              my @items = @{$states->{$action}};
             my $numitems = scalar(@items);              my $numitems = scalar(@items);
             if ($numitems) {              if ($numitems) {
                 for (my $i=$numitems-1; $i>=0; $i--) {                  for (my $i=$numitems-1; $i>=0; $i--) {
                     if (ref($elements{$action}) eq 'HASH') {                      if ((ref($elements) eq 'HASH') && 
                         if (ref($elements{$action}{$items[$i]}) eq 'HASH') {                          (ref($elements->{$action}) eq 'HASH')) {
                             foreach my $key (keys(%{$elements{$action}{$items[$i]}})) {                          if (ref($elements->{$action}{$items[$i]}) eq 'HASH') {
                               foreach my $key (keys(%{$elements->{$action}{$items[$i]}})) {
                                 push(@excluded,$key);                                  push(@excluded,$key);
                             }                              }
                         }                          }
Line 1069  sub get_excluded_elements { Line 1811  sub get_excluded_elements {
   
 sub print_enrollment_menu {  sub print_enrollment_menu {
     my ($formname,$instcode,$dom,$codetitles,$cat_titles,$cat_order,$code_order,      my ($formname,$instcode,$dom,$codetitles,$cat_titles,$cat_order,$code_order,
         $invalidcrosslist) =@_;          $showcredits,$instcredits,$invalidcrosslist) =@_;
     my ($sections,$autoenroll,$access_dates,$output);      my ($sections,$autoenroll,$access_dates,$output,$hasauto,$hascredits,
           $creditsrow,$domdefcredits);
     my $starttime = time;      my $starttime = time;
     my $endtime = time+(6*30*24*60*60); # 6 months from now, approx      my $endtime = time+(6*30*24*60*60); # 6 months from now, approx
   
Line 1082  sub print_enrollment_menu { Line 1825  sub print_enrollment_menu {
                            'start' => 'Start auto-enrollment',                             'start' => 'Start auto-enrollment',
                            'end'   => 'End auto-enrollment',                             'end'   => 'End auto-enrollment',
                        );                         );
       if ($showcredits) {
           unless ($env{'form.crstype'} eq 'community') {
               my %domdefs = &Apache::lonnet::get_domain_defaults($dom);
               $domdefcredits = $domdefs{$env{'form.crstype'}.'credits'};
           }
       }
     if ($env{'form.crstype'} eq 'official') {      if ($env{'form.crstype'} eq 'official') {
         if (&Apache::lonnet::auto_run('',$dom)) {          if (&Apache::lonnet::auto_run('',$dom)) {
             $output = &show_invalid_crosslists($invalidcrosslist);              $output = &show_invalid_crosslists($invalidcrosslist);
             my ($section_form,$crosslist_form);              my ($section_form,$crosslist_form);
             $section_form = &inst_section_selector($dom,$instcode);              if ($instcode ne '') {
                   $section_form = &inst_section_selector($dom,$instcode);
                   if ($section_form eq '') {
                       my $sectotal = $env{'form.sectotal'};
                       if (!$sectotal) {
                           $sectotal = 1;
                       }
                       if ($env{'form.addsection'}) {
                           $sectotal ++;
                       }
                       for (my $i=0; $i<$sectotal; $i++) {
                           $section_form .= &sections_form($dom,$instcode,$i);
                       }
                       if ($section_form) {
                           $section_form .=
                       &Apache::lonhtmlcommon::row_title(&mt('Add another')).
                       '<input name="sectotal" type="hidden" value="'.$sectotal.'" />'.
                       '<input name="addsection" type="checkbox" value="'.$sectotal.'"'.
                       ' onclick="javascript:nextPage(document.'.$formname.",'".$env{'form.state'}.
                      "'".');" />'.&mt('Add?').&Apache::lonhtmlcommon::row_closure();
                       }
                   }
               }
             if ($section_form) {              if ($section_form) {
                 $sections = &Apache::lonhtmlcommon::row_headline().                  $sections = &Apache::lonhtmlcommon::row_headline().
                             '<h3>'.&mt('Sections for auto-enrollment').'</h3>'.                              '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Sections').
                               '&nbsp;'.&mt('Sections for auto-enrollment').'</h3>'.
                             &Apache::lonhtmlcommon::row_closure(1).                              &Apache::lonhtmlcommon::row_closure(1).
                             $section_form;                              $section_form;
             }              }
Line 1106  sub print_enrollment_menu { Line 1878  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.",'".$env{'form.state'}.
                    "'".');" />'.&mt('Add?').&Apache::lonhtmlcommon::row_closure();                     "'".');" />'.&mt('Add?').&Apache::lonhtmlcommon::row_closure();
                 $sections .=  &Apache::lonhtmlcommon::row_headline.                  $sections .=  &Apache::lonhtmlcommon::row_headline.
                               '<h3>'.&mt('Crosslisted courses for auto-enrollment').'</h3>'.                                '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Crosslist').'&nbsp;'.&mt('Crosslisted courses for auto-enrollment').'</h3>'.
                               &Apache::lonhtmlcommon::row_closure(1).                                &Apache::lonhtmlcommon::row_closure(1).
                               $crosslist_form;                                $crosslist_form;
             }              }
               $hasauto = 1;
             $autoenroll =               $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(1).                  &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(1).                  &Apache::lonhtmlcommon::row_closure(1).
                 &date_setting_table($starttime,$endtime,$formname,'enroll',%enrolltitles);                  &date_setting_table($starttime,$endtime,$formname,'enroll',
                                       $hasauto,undef,%enrolltitles);
               if ($showcredits) {
                   if ($instcredits) {
                       $creditsrow = &mt('[quant,_1,credit]',$instcredits);
                   } else {
                       $creditsrow = '<span class="LC_nobreak">'.
                                     '<input type="text" size="3" name="coursecredits"'.
                                     ' value="'.$domdefcredits.'" />';
                   }
                   $hascredits = 1;
               }
           }
       } elsif (($env{'form.crstype'} eq 'unofficial') || ($env{'form.crstype'} eq 'textbook')) {
           if ($showcredits) {
               $creditsrow = '<span class="LC_nobreak">'.
                             '<input type="text" size="3" name="coursecredits"'.
                             ' value="'.$domdefcredits.'"/>';
               $hascredits = 1;
         }          }
     }      }
     my $access_dates =       my $access_dates = 
         &date_setting_table($starttime,$endtime,$formname,'access',%accesstitles);          &date_setting_table($starttime,$endtime,$formname,'access',$hasauto,
                               $hascredits,%accesstitles);
     $output .= &Apache::lonhtmlcommon::start_pick_box();      $output .= &Apache::lonhtmlcommon::start_pick_box();
     if ($sections) {      if ($sections) {
         $output .=  $sections;          $output .=  $sections;
Line 1154  sub print_enrollment_menu { Line 1946  sub print_enrollment_menu {
         $output .= &Apache::lonhtmlcommon::row_headline('Access').          $output .= &Apache::lonhtmlcommon::row_headline('Access').
                    '<h3>'.$header.'</h3>'.                     '<h3>'.$header.'</h3>'.
                    &Apache::lonhtmlcommon::row_closure(1).                     &Apache::lonhtmlcommon::row_closure(1).
                    $access_dates                     $access_dates;
       }
       if ($creditsrow) {
           $output .= &Apache::lonhtmlcommon::row_headline('Credits').
                      '<h3>'.&mt('Credits earned by students').'</h3>'.
                      &Apache::lonhtmlcommon::row_closure(1).
                      &Apache::lonhtmlcommon::row_title(&mt('Default credits')).
                      $creditsrow.
                      &Apache::lonhtmlcommon::row_closure(1);
     }      }
     return '<div>'.&Apache::lonhtmlcommon::start_pick_box().$output.      return '<div>'.&Apache::lonhtmlcommon::start_pick_box().$output.
            &Apache::lonhtmlcommon::end_pick_box().'</div>';             &Apache::lonhtmlcommon::end_pick_box().'</div>';
Line 1189  sub inst_section_selector { Line 1989  sub inst_section_selector {
                     '<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 1214  sub inst_section_selector { Line 2019  sub inst_section_selector {
 }  }
   
 sub date_setting_table {  sub date_setting_table {
     my ($starttime,$endtime,$formname,$prefix,%datetitles) = @_;      my ($starttime,$endtime,$formname,$prefix,$hasauto,$hascredits,%datetitles)=@_;
     my ($perpetual,$table);      my ($perpetual,$table);
     my $startform = &Apache::lonhtmlcommon::date_setter($formname,$prefix.'start',      my $startform = &Apache::lonhtmlcommon::date_setter($formname,$prefix.'start',
                                                         $starttime,'','','',1,'','','',1);                                                          $starttime,'','','',1,'','','',1);
Line 1225  sub date_setting_table { Line 2030  sub date_setting_table {
         $perpetual = ' <span class="LC_nobreak"><label>'.          $perpetual = ' <span class="LC_nobreak"><label>'.
                      '<input type="checkbox" name="no_end_date" />'.                       '<input type="checkbox" name="no_end_date" />'.
                      &mt('No end date').'</label></span>';                       &mt('No end date').'</label></span>';
         $closure = '1';          unless ($hascredits) {
               $closure = '1';
           }
     }      }
     $table = &Apache::lonhtmlcommon::row_title($datetitles{'start'}).  
              $startform.      my %help_item = (
                         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;'.&mt($datetitles{'start'})).$startform.
              &Apache::lonhtmlcommon::row_closure(1).               &Apache::lonhtmlcommon::row_closure(1).
              &Apache::lonhtmlcommon::row_title($datetitles{'end'}).               &Apache::lonhtmlcommon::row_title(&Apache::loncommon::help_open_topic($help_item{$prefix}{'end'}).
              $endform.$perpetual.               '&nbsp;'.&mt($datetitles{'end'})).$endform.$perpetual.
              &Apache::lonhtmlcommon::row_closure($closure);               &Apache::lonhtmlcommon::row_closure($closure);
     return $table;      return $table;
 }  }
Line 1254  sub print_personnel_menu { Line 2077  sub print_personnel_menu {
     }      }
     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";
Line 1272  sub print_personnel_menu { Line 2095  sub print_personnel_menu {
         }          }
     }      }
   
     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 1304  sub print_personnel_menu { Line 2117  sub print_personnel_menu {
     }      }
   
     if ($persontotal) {      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'};
           $lt{'textbook'} = $lt{'official'};
           $lt{'placement'} = $lt{'official'};
         $output .= &Apache::lonhtmlcommon::row_headline().          $output .= &Apache::lonhtmlcommon::row_headline().
                    '<h3>'.&mt('Requestor is automatically assigned Course Coordinator role.').' '.&mt('Include other personnel?').'</h3>';                    '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Personnel').'&nbsp;'.$lt{$crstype}.' '.&mt('Include other personnel?').'</h3>';
     }      }
     for (my $i=0; $i<$persontotal; $i++) {       my $cansearch = 1;
       my @alldoms = &Apache::lonnet::all_domains();
       if (@alldoms == 1) {
           my %domsrch = &Apache::lonnet::get_dom('configuration',
                                                  ['directorysrch'],$alldoms[0]);
           if (ref($domsrch{'directorysrch'}) eq 'HASH') {
               if ((!$domsrch{'directorysrch'}{'available'}) &&
                   ($domsrch{'directorysrch'}{'lcavailable'} eq '0')) {
                   $cansearch = 0;
               }
           }
       }
       my ($trusted,$untrusted) = &Apache::lonnet::trusted_domains('enroll',$dom);
       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 $uname_form = '<input type="text" name="person_'.$i.'_uname" value="" size="20" />';          my $uname_form = '<input type="text" name="person_'.$i.'_uname" value="" size="20" />';
         my $onchange = 'javascript:fix_domain('."'$formname','person_".$i."_dom',".          my $onchange = 'javascript:fix_domain('."'$formname','person_".$i."_dom',".
                        "'person_".$i."_hidedom','person_".$i."_uname'".');';                         "'person_".$i."_hidedom','person_".$i."_uname'".');';
         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,undef,$trusted,$untrusted).
                         '<input type="hidden" name="person_'.$i.'_hidedom" value="" />';                          '<input type="hidden" name="person_'.$i.'_hidedom" value="" />';
         my %form_elems;          my %form_elems;
         foreach my $item (@items) {          foreach my $item (@items) {
Line 1331  sub print_personnel_menu { Line 2164  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;
         my $usersrchlink =  &Apache::loncommon::selectuser_link($formname,@linkargs,$dom,          if ($cansearch) {
                             $usersrchlinktxt);              my $usersrchlinktxt = &mt('Search for user');
               $usersrchlink = &Apache::loncommon::selectuser_link($formname,@linkargs,$dom,
                                                                   $usersrchlinktxt);
           } else {
               $usersrchlink = '&nbsp;';
           }
         my $userchklinktxt = &mt('Check username');          my $userchklinktxt = &mt('Check username');
         my $userchklink = &Apache::loncommon::selectuser_link($formname,@linkargs,$dom,          my $userchklink = &Apache::loncommon::selectuser_link($formname,@linkargs,$dom,
                             $userchklinktxt,'checkusername');                              $userchklinktxt,'checkusername');
Line 1347  sub print_personnel_menu { Line 2185  sub print_personnel_menu {
             '<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.",'".$env{'form.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 print_request_status {  sub current_lc_sections {
     my ($dom) = @_;      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 sorted_request_history {
       my ($dom,$action,$curr_req) = @_;
       my ($after,$before,$statusfilter,$crstypefilter);
       if ($env{'form.status'} ne '') {
           $statusfilter = $env{'form.status'};
       }
       if ($env{'form.crstype'} ne '') {
           $crstypefilter = $env{'form.crstype'};
       }
       if (ref($curr_req) eq 'HASH') {
           $after = $curr_req->{'requested_after_date'},
           $before = $curr_req->{'requested_before_date'};
           $statusfilter = $curr_req->{'status'};
           $crstypefilter = $curr_req->{'crstype'};
       }
     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 %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 ($action eq 'view') {
             (undef,my($cdom,$cnum)) = split(':',$key);              next unless (($statusinfo{$key} eq 'approval') || ($statusinfo{$key} eq 'pending'));
             next if ($cdom ne $dom);             } else {
             my $requestkey = $cdom.'_'.$cnum;              next unless (($statusfilter eq 'any') ||
             if ($requestkey =~ /^($match_domain)_($match_courseid)$/) {                            ($statusfilter eq $statusinfo{$key}));
                 my %history = &Apache::lonnet::restore($requestkey,'courserequests',          }
                                                        $env{'user.domain'},$env{'user.name'});          (undef,my($cdom,$cnum)) = split(':',$key);
                 my $entry;          next if ($cdom ne $dom);   
                 my $timestamp = $history{'reqtime'};          my $requestkey = $cdom.'_'.$cnum;
                 my $crstype = $history{'crstype'};          if ($requestkey =~ /^($match_domain)_($match_courseid)$/) {
                 my $disposition = $history{'disposition'};              my %history = &Apache::lonnet::restore($requestkey,'courserequests',
                                                      $env{'user.domain'},$env{'user.name'});
               my $entry;
               my $reqtime = $history{'reqtime'};
               my $lastupdate = $history{'timestamp'};
               my $crstype = $history{'crstype'};
               my $disposition = $history{'disposition'};
               my $status = $history{'status'};
               my $uniquecode = $history{'code'}; 
               if ($action eq 'view') {
                 next if ((exists($history{'status'})) && ($history{'status'} eq 'created'));                  next if ((exists($history{'status'})) && ($history{'status'} eq 'created'));
                 next unless (($env{'form.crstype'} eq 'any') ||               } else {
                             ($env{'form.crstype'} eq $crstype));                  next if (($reqtime < $after) || ($reqtime > $before));
               }
               next unless (($crstypefilter eq 'any') || 
                            ($crstypefilter eq $crstype));
               if ($action eq 'view') {
                 next unless (($disposition eq 'approval') ||                   next unless (($disposition eq 'approval') || 
                              ($disposition eq 'pending'));                               ($disposition eq 'pending'));
                 if (ref($history{'details'}) eq 'HASH') {              }
                     $entry = $requestkey.':'.$crstype.':'.              if (ref($history{'details'}) eq 'HASH') {
                              &escape($history{'details'}{'cdescr'});                  $entry = $requestkey.':'.$crstype.':'.
                     if ($crstype eq 'official') {                           &escape($history{'details'}{'cdescr'});
                         $entry .= ':'.&escape($history{'details'}{'instcode'});                   if ($action eq 'log') {
                       $entry .= ':'.$uniquecode.':'.$lastupdate.':';
                       if ($statusinfo{$key} ne '') {
                           $entry .= $statusinfo{$key};
                       } elsif ($status ne '') {
                           $entry .= $status;
                       } else {
                           $entry .= $disposition;
                     }                      }
                 }                  }
                 if ($entry ne '') {                  if ($crstype eq 'official') {
                     if (exists($queue_by_date{$timestamp})) {                      $entry .= ':'.&escape($history{'details'}{'instcode'}); 
                         if (ref($queue_by_date{$timestamp}) eq 'ARRAY') {                  }
                             push(@{$queue_by_date{$timestamp}},$entry);              }
                         }              if ($entry ne '') {
                     } else {                  if (exists($queue_by_date{$reqtime})) {
                         @{$queue_by_date{$timestamp}} = ($entry);                      if (ref($queue_by_date{$reqtime}) eq 'ARRAY') {
                           push(@{$queue_by_date{$reqtime}},$entry);
                     }                      }
                   } else {
                       @{$queue_by_date{$reqtime}} = ($entry);
                 }                  }
             }              }
         }          }
     }      }
     $formname = 'requestcrs';      return %queue_by_date;
   }
   
   sub print_request_status {
       my ($dom,$action) = @_;
       my %queue_by_date = &sorted_request_history($dom,$action);
     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".      my $formname = 'requestcrs';
       my ($types,$typenames) = &Apache::loncommon::course_types();
       my $output = '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'."\n".
   
               '<input type="hidden" name="state" value="'.$env{'form.state'}.'" />'."\n".                '<input type="hidden" name="state" value="'.$env{'form.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 1442  sub print_request_status { Line 2348  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 1465  sub print_request_status { Line 2374  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 1491  sub print_cancel_request { Line 2405  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 1507  sub print_cancel_request { Line 2421  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 1555  ENDJS Line 2473  ENDJS
 }  }
   
 sub viewcancel_javascript {  sub viewcancel_javascript {
     my $alert = &mt('Are you sure you want to cancel this request?\\n'.      my $alert = &mt('Are you sure you want to cancel this request?')."\n".
                     'Your request will be removed.');                  &mt('Your request will be removed.');
       &js_escape(\$alert);
     return << "ENDJS";      return << "ENDJS";
 function nextPage(formname,nextstate) {  function nextPage(formname,nextstate) {
     if (confirm('$alert')) {      if (confirm('$alert')) {
Line 1570  ENDJS Line 2489  ENDJS
 }  }
   
 sub print_request_logs {  sub print_request_logs {
     my ($jscript,$loaditems,$crumb) = @_;      my ($r,$dom,$jscript,$loaditems,$crumb,$usetabs) = @_;
       my $title;
       if ($env{'form.crstype'} eq 'community') {
           $title = 'Community Request Logs';
       } elsif ($env{'form.crstype'} eq 'any') {
           $title = 'Course/Community Request Logs';
       } else {
           $title = 'Course Request Logs';
       }
       $r->print(&header($title,$jscript,$loaditems).$crumb);
       if ($usetabs) {
           &startContentScreen($r,'textbooklogs');
       }
       my $formname = 'requestcrs';
       $r->print('<form action="/adm/requestcourse" method="post" name="'.$formname.'" onsubmit="javascript:setPage(this);">'."\n".
                 '<input type="hidden" name="action" value="log" />'."\n".
                 '<input type="hidden" name="state" value="display" />'."\n");
       # set defaults
       my $now = time();
       my $defstart = $now - (7*24*3600); #7 days ago
       my %defaults = (
                        page                => '1',
                        show                => '10',
                        crstype             => 'any',
                        status              => 'any',
                        requested_before_date => $now,
                        requested_after_date  => $defstart,
                      );
       my ($types,$typenames) = &Apache::loncommon::course_types();
       my $more_records = 0;
       my %curr;
       foreach my $item ('show','page','crstype','status') {
           $curr{$item} = $env{'form.'.$item};
       }
       $curr{'requested_after_date'} = &Apache::lonhtmlcommon::get_date_from_form('requested_after_date');
       $curr{'requested_before_date'} = &Apache::lonhtmlcommon::get_date_from_form('requested_before_date');
       foreach my $key (keys(%defaults)) {
           if ($curr{$key} eq '') {
               $curr{$key} = $defaults{$key};
           }
       }
       my ($statuses,$statusnames) = &reqstatus_names($curr{'crstype'});
       $r->print('<input type="hidden" name="page" value="'.$curr{'page'}.'" />'.
                 &requestlog_display_filter($formname,\%curr));
       my %queue_by_date = &sorted_request_history($dom,$env{'form.action'},\%curr);
       my @sortedtimes = sort {$a <=> $b} (keys(%queue_by_date));
       my $showntablehdr = 0;
       my $tablehdr = &Apache::loncommon::start_data_table().
                      &Apache::loncommon::start_data_table_header_row().
                      '<th>&nbsp;</th><th>'.&mt('Request Date').'</th>'.
                      '<th>'.&mt('Description').'</th>';
       if ($curr{'crstype'} eq 'any') {
           $tablehdr .= '<th>'.&mt('Course Type').'</th>';
       }
       if (($curr{'crstype'} eq 'official') || ($curr{'crstype'} eq 'any')) {
           $tablehdr .= '<th>'.&mt('Institutional Code').'</th>';
       }
       my $showuniquecode;
       my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom);
       if (($curr{'status'} eq 'any') || ($curr{'status'} eq 'created')) {
           if (ref($domconfig{'requestcourses'}) eq 'HASH') {
               if (ref($domconfig{'requestcourses'}{'uniquecode'}) eq 'HASH') {
                   if ($curr{'crstype'} eq 'any') {
                       my @types = qw(official unofficial community textbook placement);
                       foreach my $type (@types) {
                           if ($domconfig{'requestcourses'}{'uniquecode'}{$type}) {
                               $showuniquecode = 1;
                               last;
                           }
                       }
                   } elsif ($domconfig{'requestcourses'}{'uniquecode'}{$curr{'crstype'}}) {
                       $showuniquecode = 1;
                   }
               }
           }
       }
       if ($showuniquecode) {
           $tablehdr .= '<th>'.&mt('Unique Code').'</th>';    
       }
       if ($curr{'status'} eq 'any') {
           $tablehdr .= '<th>'.&mt('Status').'</th>';
       } elsif ($curr{'status'} eq 'created') {
           $tablehdr .= '<th>'.&mt('Creation Date').'</th>';
       } elsif ($curr{'status'} eq 'cancelled') {
           $tablehdr .= '<th>'.&mt('Cancellation Date').'</th>';
       } elsif ($curr{'status'} eq 'rejected') {
           $tablehdr .= '<th>'.&mt('Rejection Date').'</th>';
       }
       $tablehdr .= &Apache::loncommon::end_data_table_header_row();
       my ($minshown,$maxshown);
       $minshown = 1;
       my $count = 0;
       if ($curr{'show'} ne &mt('all')) {
           $maxshown = $curr{'page'} * $curr{'show'};
           if ($curr{'page'} > 1) {
               $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'};
           }
       }
       my $norecords;
       if (@sortedtimes > 0) {
           foreach my $item (@sortedtimes) {
               if ($curr{'show'} ne &mt('all')) {
                   if ($count >= $curr{'page'} * $curr{'show'}) {
                       $more_records = 1;
                       last;
                   }
               }
               $count ++;
               next if ($count < $minshown);
               if (!$showntablehdr) {
                   $r->print($tablehdr);
                   $showntablehdr = 1;
               }
               my $showtime = &Apache::lonlocal::locallocaltime($item);
               if (ref($queue_by_date{$item}) eq 'ARRAY') {
                   foreach my $request (sort(@{$queue_by_date{$item}})) {
                       my ($key,$crstype,$desc,$uniquecode,$timestamp,$status,$instcode) = split(':',$request);
                       my ($cdom,$cnum) = split('_',$key);
                       my $output = &Apache::loncommon::start_data_table_row().
        '<td>'.$count.'</td>'.
        '<td>'.$showtime.'</td>'.
        '<td>'.&unescape($desc).'</td>';
                       if ($curr{'crstype'} eq 'any') {
                           my $typename;
                           if (ref($typenames) eq 'HASH') {
                               $typename = &mt($typenames->{$crstype});
                           }
                           if ($typename eq '') {
                               $typename = &mt('Unknown type');
                           }
                           $output .= '<td>'.$typename.'</td>';
                       }
                       if (($curr{'crstype'} eq 'any') ||
                           ($curr{'crstype'} eq 'official')) {
                           my $showinstcode;
                           if ($crstype eq 'official') {
                               $showinstcode = &unescape($instcode);
                           } else {
                               $showinstcode = &mt('Not applicable');
                           }
                           $output .= '<td>'.$showinstcode.'</td>';
                       }
                       if ($showuniquecode) {
                           if ($status eq 'created') {
                               $output .= '<td>'.$uniquecode.'</td>';
                           } else {
                               $output .= '<td>'.&mt('Not applicable').'</td>';
                           }    
                       }
                       if ($curr{'status'} eq 'any') {
                           my $statusname = &mt('Unknown status');
                           if (ref($statusnames) eq 'HASH') {
                               if ($statusnames->{$status} ne '') {
                                   $statusname = $statusnames->{$status};
                               }
                           }
                           if (($status eq 'created') || ($status eq 'cancelled') ||
                               ($status eq 'rejected')) {
                               $statusname .= ' '.&Apache::lonlocal::locallocaltime($timestamp);
                           }
                           $output .= '<td>'.$statusname.'</td>';
                       } elsif (($status eq 'created') || ($status eq 'cancelled') ||
                                ($status eq 'rejected')) {
                            $output .= '<td>'.&Apache::lonlocal::locallocaltime($timestamp).'</td>';
                       }
                       $output .= &Apache::loncommon::end_data_table_row();
                       $r->print($output);
                   }
               }
           }
           if ($showntablehdr) {  
               $r->print(&Apache::loncommon::end_data_table());
               if (($curr{'page'} > 1) || ($more_records)) {
                   $r->print('<table><tr>');
                   if ($curr{'page'} > 1) {
                       $r->print('<td><a href="javascript:chgPage('."'previous'".');">'.&mt('Previous [_1] changes',$curr{'show'}).'</a></td>');
                   }
                   if ($more_records) {
                       $r->print('<td><a href="javascript:chgPage('."'next'".');">'.&mt('Next [_1] changes',$curr{'show'}).'</a></td>');
                   }
                   $r->print('</tr></table>');
                   $r->print(<<"ENDSCRIPT");
   <script type="text/javascript">
   // <![CDATA[
   function chgPage(caller) {
       if (caller == 'previous') {
           document.$formname.page.value --;
       }
       if (caller == 'next') {
           document.$formname.page.value ++;
       }
       document.$formname.submit();
       return;
   }
   // ]]>
   </script>
   ENDSCRIPT
               }
           } else {
               $norecords = 1;
           }
       } else {
           $norecords = 1;
       }
       if ($norecords) {
           $r->print('<p class="LC_info">'.
                     &mt('There are no records to display').
                     '</p>');
       }
       if ($usetabs) {
           $r->print('<input type="hidden" name="tabs" value="on" />');
       }
       $r->print('</form>');
       if ($usetabs) {
           &endContentScreen($r);
       }
       $r->print(&Apache::loncommon::end_page());
     return;      return;
 }  }
   
   sub reqstatus_names {
       my ($crstype) = @_;
       my @statuses = qw(created approval pending rejected cancelled);
       my %statusnames =
               &Apache::lonlocal::texthash (
                           created   => 'Created',
                           approval  => 'Queued pending approval',
                           pending   => 'Queued pending validation',
                           rejected  => 'Request rejected',
                           cancelled => 'Request cancelled',
               );
       if (($crstype eq 'official') || ($crstype eq 'unofficial') || ($crstype eq 'textbook') || ($crstype eq 'placement')) {
           $statusnames{'created'} = &mt('Course created');
       } elsif ($crstype eq 'community') {
           $statusnames{'created'} = &mt('Community created');
       }
       return (\@statuses,\%statusnames);
   }
   
   sub requestlog_display_filter {
       my ($formname,$curr) = @_;
       my $nolink = 1;
       my $output = '<table><tr><td valign="top">'.
                    '<span class="LC_nobreak"><b>'.&mt('Records/page:').'</b></span><br />'.
                    &Apache::lonmeta::selectbox('show',$curr->{'show'},undef,
                                                 (&mt('all'),5,10,20,50,100,1000,10000)).
                    '</td><td>&nbsp;&nbsp;</td>';
       my $startform =
           &Apache::lonhtmlcommon::date_setter($formname,'requested_after_date',
                                               $curr->{'requested_after_date'},undef,
                                               undef,undef,undef,undef,undef,undef,$nolink);
       my $endform =
           &Apache::lonhtmlcommon::date_setter($formname,'requested_before_date',
                                               $curr->{'requested_before_date'},undef,
                                               undef,undef,undef,undef,undef,undef,$nolink);
       $output .= '<td valign="top"><b>'.&mt('Window during which course/community was requested:').'</b><br />'.
                  '<table><tr><td>'.&mt('After:').
                  '</td><td>'.$startform.'</td></tr>'.
                  '<tr><td>'.&mt('Before:').'</td>'.
                  '<td>'.$endform.'</td></tr></table>'.
                  '</td>'.
                  '<td>&nbsp;&nbsp;</td>';
       my ($types,$typenames) = &Apache::loncommon::course_types();
       if (ref($types) eq 'ARRAY') {
           if (@{$types} > 1) {
               $output .= '<td valign="top"><b>'.
                          &mt('Course Type:').'</b><br /><select name="crstype">';
               my $selstr = '';
               if ($curr->{'crstype'} eq 'any') {
                   $selstr = ' selected="selected"';
               }
               $output .= '<option value="any"'.$selstr.'>'.&mt('All types').'</option>'."\n";
               foreach my $crstype (@{$types}) {
                   my $selstr = '';
                   if ($curr->{'crstype'} eq $crstype) {
                       $selstr = ' selected="selected"';
                   }
                   my $typename = $crstype;
                   if (ref($typenames) eq 'HASH') {
                       if ($typenames->{$crstype} ne '') {
                           $typename = $typenames->{$crstype};
                       }
                   }
                   $output .= '<option value="'.$crstype.'"'.$selstr.'>'.$typename.'</option>'."\n";
               }
               $output .= '</select></td>';
           }
       }
       my ($statuses,$statusnames) = &reqstatus_names($curr->{'crstype'});
       if (ref($statuses) eq 'ARRAY') {
           if (@{$statuses} > 1) {
               $output .= '<td valign="top"><b>'.
                          &mt('Request Status:').'</b><br /><select name="status">';
               my $selstr = '';
               if ($curr->{'status'} eq 'any') {
                   $selstr = ' selected="selected"';
               }
               $output .= '<option value="any"'.$selstr.'>'.&mt('Any status').'</option>'."\n";
               foreach my $status (@{$statuses}) {
                   my $selstr = '';
                   if ($curr->{'status'} eq $status) {
                       $selstr = ' selected="selected"';
                   }
                   my $statusname = $status;
                   if (ref($statusnames) eq 'HASH') {
                       if ($statusnames->{$status} ne '') {
                           $statusname = $statusnames->{$status};
                       }
                   }
                   $output .= '<option value="'.$status.'"'.$selstr.'>'.$statusname.'</option>'."\n";
               }
               $output .= '</select></td>';
           }
       }
       $output .= '</tr></table>';
   
       # Update Display button
       $output .= '<p>'.
                  '<input type="submit" value="'.&mt('Update Display').'" />'.
                  '</p><hr />';
       return $output;
   }
   
 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,$instcredits) = @_;
       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 1595  sub print_review { Line 2834  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 1608  sub print_review { Line 2847  sub print_review {
   
     my $enrollrow_title = &mt('Default Access Dates').'<br />'.      my $enrollrow_title = &mt('Default Access Dates').'<br />'.
                           '('.&Apache::lonnet::plaintext('st',$category).')';                            '('.&Apache::lonnet::plaintext('st',$category).')';
       my $instcode;
     if ($env{'form.crstype'} eq 'official') {      if ($env{'form.crstype'} eq 'official') {
         if ((ref($codetitles) eq 'ARRAY') && (ref($cat_titles) eq 'HASH')) {          if ((ref($codetitles) eq 'ARRAY') && (ref($cat_titles) eq 'HASH')) {
             foreach my $title (@{$codetitles}) {              foreach my $title (@{$codetitles}) {
Line 1623  sub print_review { Line 2863  sub print_review {
                 }                  }
             }              }
         }          }
           if (ref($code_order) eq 'ARRAY') {
               foreach my $item (@{$code_order}) {
                   $instcode .= $env{'form.instcode_'.$item};
               }
           }
           $inst_headers .= '<th>'.&mt('Credits').'</th>';
           if ($instcredits) {
               $inst_values .= '<td>'.$instcredits.'</td>';
           } else {
               $inst_values .= '<td>'.$env{'form.coursecredits'}.'</td>';
           }
         if (&Apache::lonnet::auto_run('',$dom)) {          if (&Apache::lonnet::auto_run('',$dom)) {
             $enrollrow_title = &mt('Enrollment');              $enrollrow_title = &mt('Enrollment');
             $enroll_headers = '<th>'.&mt('Automatic Adds').'</th>'.              $enroll_headers = '<th>'.&mt('Automatic Adds').'</th>'.
Line 1692  sub print_review { Line 2943  sub print_review {
             $section_values .= $xlistinfo;              $section_values .= $xlistinfo;
         }          }
         $section_values .= '</table></td>';          $section_values .= '</table></td>';
       } elsif (($env{'form.crstype'} eq 'unofficial') || ($env{'form.crstype'} eq 'textbook')) {
           $inst_headers .= '<th>'.&mt('Credits').'</th>';
           $inst_values .= '<td>'.$env{'form.coursecredits'}.'</td>';
     }      }
   
     my %ctxt = &clone_text();      my %ctxt = &clone_text();
     $inst_headers .= '<th>'.&mt('Clone From').'</th>';      $inst_headers .= '<th>'.&mt('Clone From').'</th>';
     if (($env{'form.clonecrs'} =~ /^$match_name$/) &&       if (($env{'form.cloning'}) &&
           ($env{'form.clonecrs'} =~ /^$match_name$/) && 
         ($env{'form.clonedom'} =~ /^$match_domain$/)) {          ($env{'form.clonedom'} =~ /^$match_domain$/)) {
         my $canclone = &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},          my $canclone = &Apache::loncoursequeueadmin::can_clone_course($uname,
                            $env{'user.domain'},$env{'form.clonecrs'}, $env{'form.clonedom'});                             $udom,$env{'form.clonecrs'},$env{'form.clonedom'},
                              $env{'form.crstype'},$dom,$instcode);
         if ($canclone) {          if ($canclone) {
             my %courseenv = &Apache::lonnet::userenvironment($env{'form.clonedom'},              my %courseenv = &Apache::lonnet::userenvironment($env{'form.clonedom'},
                               $env{'form.clonecrs'},('description','internal.coursecode'));                                $env{'form.clonecrs'},('description','internal.coursecode'));
Line 1741  sub print_review { Line 2997  sub print_review {
     }      }
   
     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 1774  sub print_review { Line 3044  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'};               my $role = $env{'form.person_'.$i.'_role'}; 
Line 1787  sub print_review { Line 3057  sub print_review {
                 '<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 1834  sub dates_from_form { Line 3116  sub dates_from_form {
 }  }
   
 sub courseinfo_form {  sub courseinfo_form {
     my ($dom,$formname,$crstype,$next) = @_;      my ($dom,$formname,$crstype,$next,$description) = @_;
     my $nodescr = &mt('You must provide a (brief) course description.');      my %js_lt = &Apache::lonlocal::texthash(
                   official => 'You must provide a (brief) course description.',
                   community => 'You must provide a (brief) community description.'
                );
       &js_escape(\%js_lt);
       $js_lt{'unofficial'} = $js_lt{'official'};
       $js_lt{'textbook'} = $js_lt{'official'};
       $js_lt{'placement'} = $js_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('$js_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 $title = &mt('Brief Course Description');
       my $clonetitle = &mt('Clone content and settings from an existing course?');
     if ($crstype eq 'community') {      if ($crstype eq 'community') {
         $title = &mt('Brief Community Description');          $title = &mt('Brief Community Description');
           $clonetitle = &mt('Clone content and settings from an existing community?');
     }      }
     my $output .= $js_validate."\n".'<div>'.&Apache::lonhtmlcommon::start_pick_box().      my $output .= $js_validate."\n".&Apache::lonhtmlcommon::start_pick_box().
                   &Apache::lonhtmlcommon::row_headline().                    &Apache::lonhtmlcommon::row_headline().
                   '<h3>'.$title.'</h3>'.                    '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Description').'&nbsp;'.$title.'</h3>'.
                   &Apache::lonhtmlcommon::row_closure(1).                    &Apache::lonhtmlcommon::row_closure(1).
                   &Apache::lonhtmlcommon::row_title(&mt('Description')).                    &Apache::lonhtmlcommon::row_title(&mt('Description')).
                  '<input type="text" size="40" name="cdescr" />';                   '<input type="text" size="60" name="cdescr" value="'.$description.'" />';
     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 1871  ENDJS Line 3180  ENDJS
     $output .= $home_server_pick.      $output .= $home_server_pick.
                &Apache::lonhtmlcommon::row_closure().                 &Apache::lonhtmlcommon::row_closure().
                &Apache::lonhtmlcommon::row_headline().                 &Apache::lonhtmlcommon::row_headline().
                '<h3>'.&mt('Clone content and settings from an existing course?').'</h3>'.                  '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Clone').'&nbsp;'.$clonetitle.
                &Apache::lonhtmlcommon::row_closure(1).                 &Apache::lonhtmlcommon::row_closure(1).
                  &Apache::lonhtmlcommon::row_title(&mt('Clone?')).
                  '<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).                 &clone_form($dom,$formname,$crstype).
                &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n";                 &Apache::lonhtmlcommon::end_pick_box().'</div>'.
                  &Apache::lonhtmlcommon::end_pick_box()."\n";
     return $output;      return $output;
 }  }
   
Line 1883  sub clone_form { Line 3204  sub clone_form {
     my $type = 'Course';      my $type = 'Course';
     if ($crstype eq 'community') {      if ($crstype eq 'community') {
         $type = 'Community';          $type = 'Community';
       } elsif ($crstype eq 'placement') {
           $type = 'Placement'; 
     }      }
     my $cloneform = &Apache::loncommon::select_dom_form($dom,'clonedom').  
                     &Apache::loncommon::selectcourse_link($formname,'clonecrs','clonedom','','','',$type);  
     my %lt = &clone_text();      my %lt = &clone_text();
     my $output .=       my $output .= 
           &Apache::lonhtmlcommon::row_title($lt{'dmn'}).'<label>'.
           &Apache::loncommon::select_dom_form($dom,'clonedom').'</label>'.
           &Apache::lonhtmlcommon::row_closure(1).
         &Apache::lonhtmlcommon::row_title($lt{'cid'}).'<label>'.          &Apache::lonhtmlcommon::row_title($lt{'cid'}).'<label>'.
         '<input type="text" size="25" name="clonecrs" value=""  />'.          '<input type="text" size="25" name="clonecrs" value="" onfocus="this.blur();opencrsbrowser('."'$formname','clonecrs','clonedom','','','','$type'".')" />'.
         '</label>'.&Apache::lonhtmlcommon::row_closure(1).'<label>'.          '</label>&nbsp;'.
         &Apache::lonhtmlcommon::row_title($lt{'dmn'}).'</label>'.          &Apache::loncommon::selectcourse_link($formname,'clonecrs','clonedom','','','',$type).
         $cloneform.'</label>'.&Apache::lonhtmlcommon::row_closure(1).          &Apache::lonhtmlcommon::row_closure(1).
         &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 1919  sub clone_text { Line 3243  sub clone_text {
 sub coursecode_form {  sub coursecode_form {
     my ($dom,$context,$codetitles,$cat_titles,$cat_order,$num) = @_;      my ($dom,$context,$codetitles,$cat_titles,$cat_order,$num) = @_;
     my $output;      my $output;
     my %rowtitle = (      my %rowtitle = &Apache::lonlocal::texthash (
                     instcode  => 'Course Category',                      instcode  => 'Course Category',
                     crosslist => 'Cross Listed Course',                      crosslist => 'Cross Listed Course',
                    );                     );
       my %helpitem = ( 
                        instcode => 'Course_Request_Category',
                      );
     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 1938  sub coursecode_form { Line 3265  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}).                  my $helplink;
                   if (defined($helpitem{$context})) {
                       $helplink = &Apache::loncommon::help_open_topic($helpitem{$context}).'&nbsp;';
                   }
                   $output = &Apache::lonhtmlcommon::row_title($helplink.$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 2003  sub coursecode_form { Line 3334  sub coursecode_form {
     return $output;      return $output;
 }  }
   
   sub sections_form {
       my ($dom,$instcode,$num) = @_;
       my $rowtitle;
       if ($instcode eq '') {
           $rowtitle = &mt('Sections');
       } else {
           $rowtitle = &mt('Sections of [_1]',$instcode);
       }
       return &Apache::lonhtmlcommon::row_title($rowtitle).
              '<table><tr><td align="center">'.
              '<span class="LC_nobreak">'.&mt('Include?').
              '<input type="checkbox" name="sec_'.$num.'" value="1" /></span>'.
              '</td><td align="center">'.&mt('Institutional section').'<br />'.
              '<input type="text" size="10" name="secnum_'.$num.'" />'.
              '</td><td align="center">'.&mt('LON-CAPA section').'<br />'.
              '<input type="text" size="10" name="loncapasec_'.$num.'" />'.
              '</td></tr></table>'.
              &Apache::lonhtmlcommon::row_closure(1);
   }
   
 sub get_course_dom {  sub get_course_dom {
     my $codedom = &Apache::lonnet::default_login_domain();      my $codedom = &Apache::lonnet::default_login_domain();
     if ($env{'form.showdom'} ne '') {      if ($env{'form.showdom'} ne '') {
Line 2011  sub get_course_dom { Line 3362  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 2020  sub get_course_dom { Line 3371  sub get_course_dom {
                     return $env{'user.domain'};                      return $env{'user.domain'};
                 }                  }
             }              }
             my @possible_doms;              my (@possible_doms,%willtrust,%trustchecked);
             foreach my $type (@{$types}) {              foreach my $type (@{$types}) {
                 my $dom_str = $env{'environment.reqcrsotherdom.'.$type};                  my $dom_str = $env{'environment.reqcrsotherdom.'.$type};
                 if ($dom_str ne '') {                  if ($dom_str ne '') {
                     my @domains = split(',',$dom_str);                      my @domains = split(',',$dom_str);
                     foreach my $entry (@domains) {                      foreach my $entry (@domains) {
                         my ($extdom,$extopt) = split(':',$entry);                          my ($extdom,$extopt) = split(':',$entry);
                         if ($extdom eq $env{'request.role.domain'}) {                          unless ($trustchecked{$extdom}) {
                             return $extdom;                              $willtrust{$extdom} = &Apache::lonnet::will_trust('reqcrs',$env{'user.domain'},$extdom);
                         }                           }
                         unless(grep(/^\Q$extdom\E$/,@possible_doms)) {                          if ($willtrust{$extdom}) {
                             push(@possible_doms,$extdom);                              if ($extdom eq $env{'request.role.domain'}) {
                                   return $extdom;
                               }
                               unless(grep(/^\Q$extdom\E$/,@possible_doms)) {
                                   push(@possible_doms,$extdom);
                               }
                         }                          }
                     }                      }
                 }                  }
Line 2050  sub get_course_dom { Line 3406  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 2062  sub display_navbuttons { Line 3418  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,$lonhost,$dom,$codetitles,$code_order,$instcredits) = @_;
     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,
           $uniquecode);
     my $sectotal = $env{'form.sectotal'};      my $sectotal = $env{'form.sectotal'};
     my $crosslisttotal = 0;      my $crosslisttotal = 0;
     $cnum = $env{'form.cnum'};      $cnum = $env{'form.cnum'};
Line 2087  sub print_request_outcome { Line 3462  sub print_request_outcome {
         $output = &mt('Invalid LON-CAPA course number for the new course')."\n";           $output = &mt('Invalid LON-CAPA course number for the new course')."\n"; 
         return $output;          return $output;
     }      }
       $crstype = $env{'form.crstype'};
     %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom);      my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$dom);
     if (ref($domconfig{'requestcourses'}) eq 'HASH') {      if (ref($domconfig{'requestcourses'}) eq 'HASH') {
         if (ref($domconfig{'requestcourses'}{'notify'}) eq 'HASH') {          if (ref($domconfig{'requestcourses'}{'notify'}) eq 'HASH') {
             $req_notifylist = $domconfig{'requestcourses'}{'notify'}{'approval'};              $req_notifylist = $domconfig{'requestcourses'}{'notify'}{'approval'};
         }          }
           if (ref($domconfig{'requestcourses'}{'uniquecode'}) eq 'HASH') {
               $uniquecode = $domconfig{'requestcourses'}{'uniquecode'}{$crstype};
           }
     }      }
     $now = time;      $now = time;
     $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 2110  sub print_request_outcome { Line 3491  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 2135  sub print_request_outcome { Line 3520  sub print_request_outcome {
         $enrollstart = '';          $enrollstart = '';
         $enrollend = '';          $enrollend = '';
     }      }
       my (%alerts,%rulematch,%inst_results,%curr_rules,%got_rules,%disallowmsg,%skipped);
     for (my $i=0; $i<$env{'form.persontotal'}; $i++) {      for (my $i=0; $i<$env{'form.persontotal'}; $i++) {
         my $uname = $env{'form.person_'.$i.'_uname'};          my $uname = $env{'form.person_'.$i.'_uname'};
         my $udom = $env{'form.person_'.$i.'_dom'};          my $udom = $env{'form.person_'.$i.'_dom'};
Line 2146  sub print_request_outcome { Line 3532  sub print_request_outcome {
                              lastname     => $env{'form.person_'.$i.'_lastname'},                               lastname     => $env{'form.person_'.$i.'_lastname'},
                              emailaddr    => $env{'form.person_'.$i.'_emailaddr'},                               emailaddr    => $env{'form.person_'.$i.'_emailaddr'},
                                                    };                                                     };
                       if (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                           my $usertype = &get_usertype($udom,$uname,\%curr_rules,\%got_rules);
                           if (&Apache::lonuserutils::can_create_user($udom,'requestcrs',$usertype)) {
                               my ($allowed,$msg,$authtype,$authparam) =
                                   &check_newuser_rules($udom,$uname,\%alerts,\%rulematch,
                                                        \%inst_results,\%curr_rules,\%got_rules);
                               if ($allowed) {
                                   my %domdefaults = &Apache::lonnet::get_domain_defaults($udom);
                                   if ($usertype eq 'official') {
                                       if ($authtype eq '') {
                                           $authtype = $domdefaults{'auth_def'};
                                           $authparam = $domdefaults{'auth_arg_def'};
                                       } else {
                                           if ($authtype eq 'loc') {
                                               $authtype = 'localauth';
                                           } elsif ($authtype eq 'int') {
                                               $authtype = 'internal';
                                           }
                                           if ($authtype !~ /^(krb4|krb5|internal|localauth)$/) {
                                               $authtype = $domdefaults{'auth_def'};
                                               $authparam = $domdefaults{'auth_arg_def'};
                                           }
                                       }
                                   } elsif ($usertype eq 'unofficial') {
                                       if ($authtype eq '') {
                                           $authtype = 'internal';
                                           $authparam = '';
                                       }
                                   } else {
                                       $authtype = $domdefaults{'auth_def'};
                                       $authparam = $domdefaults{'auth_arg_def'};
                                   }
                                   if (($authtype eq '') ||
                                       (($authtype =~/^krb(4|5)$/) && ($authparam eq '')) ||
                                       ($authtype !~ /^(krb4|krb5|internal|localauth)$/)) {
                                       $skipped{$uname.':'.$udom} = 1;
                                       next;
                                   } else {
                                       $personnel{$uname.':'.$udom}{'authtype'} = $authtype;
                                       $personnel{$uname.':'.$udom}{'autharg'} = $authparam;
                                   }
                               } else {
                                   $skipped{$uname.':'.$udom} = 1;
                                   next;
                               }
                           } else {
                               $skipped{$uname.':'.$udom} = 1;
                               next;
                           }
                       }
                 }                  }
                 my $role = $env{'form.person_'.$i.'_role'};                  my $role = $env{'form.person_'.$i.'_role'};
                 unless ($role eq '') {                  unless ($role eq '') {
Line 2157  sub print_request_outcome { Line 3593  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 2184  sub print_request_outcome { Line 3627  sub print_request_outcome {
             push(@baduname,$uname.':'.$udom);              push(@baduname,$uname.':'.$udom);
         }          }
     }      }
       if (keys(%skipped)) {
           foreach my $key (keys(%skipped)) {
               delete($personnel{$key}); 
           }
       }
     my ($accessstart,$accessend) = &dates_from_form('accessstart','accessend');      my ($accessstart,$accessend) = &dates_from_form('accessstart','accessend');
     my $autodrops = 0;      my $autodrops = 0;
     if ($env{'form.autodrops'}) {      if ($env{'form.autodrops'}) {
Line 2191  sub print_request_outcome { Line 3639  sub print_request_outcome {
     }      }
     my $autoadds = 0;      my $autoadds = 0;
     if ($env{'form.autoadds'}) {      if ($env{'form.autoadds'}) {
         $autodrops = $env{'form.autoadds'};          $autoadds = $env{'form.autoadds'};
     }  
     if ($env{'form.autoadds'}) {  
         $autodrops = $env{'form.autoadds'};  
     }      }
     my $instcode = '';      my $instcode = '';
     if (exists($env{'form.instcode'})) {      if (exists($env{'form.instcode'})) {
         $instcode = $env{'form.instcode'};          $instcode = $env{'form.instcode'};
     }      }
       my $credits;
       if ($instcredits) {
           $credits = $instcredits;
       } elsif (exists($env{'form.coursecredits'})) {
           $credits = $env{'form.coursecredits'};
       }
     my $clonecrs = '';      my $clonecrs = '';
     my $clonedom = '';      my $clonedom = '';
     if (($env{'form.clonecrs'} =~ /^($match_courseid)$/) &&       if (($env{'form.cloning'}) &&
           ($env{'form.clonecrs'} =~ /^($match_courseid)$/) && 
         ($env{'form.clonedom'} =~ /^($match_domain)$/)) {          ($env{'form.clonedom'} =~ /^($match_domain)$/)) {
         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,$dom,$instcode);
             if ($canclone) {              if ($canclone) {
                 $clonecrs = $env{'form.clonecrs'};                  $clonecrs = $env{'form.clonecrs'};
                 $clonedom = $env{'form.clonedom'};                  $clonedom = $env{'form.clonedom'};
Line 2225  sub print_request_outcome { Line 3678  sub print_request_outcome {
                     cdescr         => $env{'form.cdescr'},                      cdescr         => $env{'form.cdescr'},
                     crstype        => $env{'form.crstype'},                      crstype        => $env{'form.crstype'},
                     instcode       => $instcode,                      instcode       => $instcode,
                       defaultcredits => $credits, 
                       uniquecode     => $uniquecode,
                     clonedom       => $clonedom,                      clonedom       => $clonedom,
                     clonecrs       => $clonecrs,                      clonecrs       => $clonecrs,
                     datemode       => $env{'form.datemode'},                      datemode       => $env{'form.datemode'},
Line 2241  sub print_request_outcome { Line 3696  sub print_request_outcome {
                     accessend      => $accessend,                      accessend      => $accessend,
                     personnel      => \%personnel,                      personnel      => \%personnel,
                   };                    };
     my (@inststatuses,$storeresult,$creationresult);      my ($result,$output,$customized) = &process_request($r,$lonhost,$dom,$cnum,$crstype,$now,$details,
     my $val = &get_processtype($dom,$crstype,\@inststatuses,\%domconfig);                                                          $instcode,$req_notifylist,\@instsections,\%domconfig);
       return ($result,$output,$customized);
   }
   
   sub process_request {
       my ($r,$lonhost,$dom,$cnum,$crstype,$now,$details,$instcode,$req_notifylist,$instsections,
           $domconfig) = @_; 
       my (@inststatuses,$storeresult,$creationresult,$output,$customized);
       my $val = 
           &Apache::loncoursequeueadmin::get_processtype('course',$env{'user.name'},
                                                         $env{'user.domain'},$env{'user.adv'},
                                                         $dom,$crstype,\@inststatuses,$domconfig);
     if ($val eq '') {      if ($val eq '') {
         if ($crstype eq 'official') {          if ($crstype eq 'official') {
             $output = &mt('You are not permitted to request creation of official courses.');              $output = &mt('You are not permitted to request creation of official courses.');
Line 2250  sub print_request_outcome { Line 3716  sub print_request_outcome {
             $output = &mt('You are not permitted to request creation of unofficial courses.');              $output = &mt('You are not permitted to request creation of unofficial courses.');
         } elsif ($crstype eq 'community') {          } elsif ($crstype eq 'community') {
             $output = &mt('You are not permitted to request creation of communities');              $output = &mt('You are not permitted to request creation of communities');
           } elsif ($crstype eq 'textbook') {
               $output = &mt('You are not permitted to request creation of textbook courses');
           } elsif ($crstype eq 'placement') {
               $output = &mt('You are not permitted to request creation of placement tests');
         } else {          } else {
             $output = &mt('Unrecognized course type: [_1]',$crstype);              $output = &mt('Unrecognized course type: [_1]',$crstype);
         }          }
         $storeresult = 'notpermitted';           $storeresult = 'notpermitted'; 
     } else {      } else {
         my ($disposition,$message,$reqstatus);          my ($disposition,$message,$reqstatus,$coursedesc,$accessstart,$accessend,%customvalidation);
         my %reqhash = (          my %reqhash = (
                         reqtime   => $now,                          reqtime   => $now,
                         crstype   => $crstype,                          crstype   => $crstype,
Line 2263  sub print_request_outcome { Line 3733  sub print_request_outcome {
                       );                        );
         my $requestkey = $dom.'_'.$cnum;          my $requestkey = $dom.'_'.$cnum;
         my $validationerror;          my $validationerror;
           my $fullname = &Apache::loncommon::plainname($env{'user.name'},
                                                        $env{'user.domain'});
           if (ref($details) eq 'HASH') {
               $coursedesc = $details->{'cdescr'};
               $accessstart = $details->{'accessstart'};
               $accessend = $details->{'accessend'};
           }
         if ($val eq 'autolimit=') {          if ($val eq 'autolimit=') {
             $disposition = 'process';              $disposition = 'process';
         } elsif ($val =~ /^autolimit=(\d+)$/) {          } elsif ($val =~ /^autolimit=(\d+)$/) {
Line 2271  sub print_request_outcome { Line 3748  sub print_request_outcome {
                                             $dom,$crstype,$limit,\$message);                                              $dom,$crstype,$limit,\$message);
         } elsif ($val eq 'validate') {          } elsif ($val eq 'validate') {
             my ($inststatuslist,$validationchk,$validation);              my ($inststatuslist,$validationchk,$validation);
               if (ref($details) eq 'HASH') {
                   if ($details->{'clonecrs'}) {
                       $customvalidation{'_LC_clonefrom'} = $details->{'clonedom'}.'_'.$details->{'clonecrs'};
                   }
               }
             if (@inststatuses > 0) {              if (@inststatuses > 0) {
                 $inststatuslist = join(',',@inststatuses);                  $inststatuslist = join(',',@inststatuses);
             }              }
             my $instseclist;              my $instseclist;
             if (@instsections > 0) {              if (ref($instsections) eq 'ARRAY') {
                 $instseclist = join(',',@instsections);                  if (@{$instsections} > 0) {
                       $instseclist = join(',',@{$instsections});
                   }
               }
   #
   # Retrieve any custom form information used for validation 
   #
               my $preprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'prevalidate',$env{'user.name'},
                                                                    $env{'user.domain'},$fullname,$coursedesc);
               if (ref($preprocess) eq 'HASH') {
                   &custom_formitems($preprocess,\%customvalidation);
             }              }
             $validationchk =               $validationchk = 
                 &Apache::lonnet::auto_courserequest_validation($dom,                  &Apache::lonnet::auto_courserequest_validation($dom,
                     $env{'user.name'}.':'.$env{'user.domain'},$crstype,                      $env{'user.name'}.':'.$env{'user.domain'},$crstype,
                     $inststatuslist,$instcode,$instseclist);                      $inststatuslist,$instcode,$instseclist,\%customvalidation);
             if ($validationchk =~ /:/) {              if ($validationchk =~ /:/) {
                 ($validation,$message) = split(':',$validationchk);                  ($validation,$message) = split(':',$validationchk);
             } else {              } else {
Line 2298  sub print_request_outcome { Line 3790  sub print_request_outcome {
         }          }
         $reqhash{'disposition'} = $disposition;          $reqhash{'disposition'} = $disposition;
         $reqstatus = $disposition;          $reqstatus = $disposition;
         my ($modified,$queued);          my ($modified,$queued,$token,%customitems);
           unless ($disposition eq 'rejected') {
               my $inprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'process',$env{'user.name'},
                                                                   $env{'user.domain'},$fullname,$coursedesc,undef,
                                                                   undef,undef,\%customvalidation);
   #
   # Retrieve any custom form information submitted with review page and include in request details.
   #
               if (ref($inprocess) eq 'HASH') {
                   &custom_formitems($inprocess,\%customitems);
                   foreach my $key (keys(%customitems)) {
                       $reqhash{'custom'}{$key} = $customitems{$key};
                   }
               }
           }
         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';              $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,$code);
             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);
             }              }
             my $result = &Apache::loncoursequeueadmin::course_creation($dom,$cnum,              $r->print('<div id="processing" style="display:block;">'."\n".
                                    'autocreate',$details,\$logmsg,\$newusermsg,\$addresult,                        &mt('Your request is being processed; this page will update when processing is complete.').
                                    \$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles);                        '</div>');
               $r->rflush();
               if (ref($details) eq 'HASH') {
                   if ($details->{'clonecrs'}) {
                       $customitems{'_LC_clonefrom'} = $details->{'clonedom'}.'_'.$details->{'clonecrs'};
                   }
               }
               $customitems{'_LC_ownerfullname'} = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'},'first');
               my $owneremail;
               my %emails = &Apache::loncommon::getemails();
               foreach my $email ('permanentemail','critnotification','notification') {
                   $owneremail = $emails{$email};
                   last if ($owneremail ne '');
               }
               if ($owneremail ne '') {
                   $customitems{'_LC_owneremail'} = $owneremail;
               }
               $customitems{'_LC_coursedomainname'} = &Apache::lonnet::domain($dom,'description');
               $customitems{'_LC_coursedescription'} = $coursedesc;
               $customitems{'_LC_coursestartdate'} = $accessstart;
               $customitems{'_LC_courseenddate'} = $accessend;
               my ($result,$postprocess) = &Apache::loncoursequeueadmin::course_creation($dom,$cnum,
                                             'autocreate',$details,\$logmsg,\$newusermsg,\$addresult,
                                             \$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles,
                                             \$code,\%customitems);
               if (ref($postprocess) eq 'HASH') {
                   $customized = $postprocess->{'createdcustomized'};
               }
             if ($result eq 'created') {              if ($result eq 'created') {
                 $disposition = 'created';                  $disposition = 'created';
                 $reqstatus = 'created';                  $reqstatus = 'created';
                 my $role_result = &update_requestors_roles($dom,$cnum,$crstype,$details,                  my $role_result = &update_requestors_roles($dom,$cnum,$crstype,$details,
                                                            \%longroles);                                                             \%longroles);
                 $output = '<p>'.&mt('Your course request has been processed and the course has been created.').                  if ($crstype eq 'community') {
                           '<br />'.$role_result.'</p>';                      $output = '<p>'.&mt('Your community request has been processed and the community has been created.');
                   } else {
                       $output = '<p>'.&mt('Your course request has been processed and the course has been created.');
                   }
                   if (($code) || ((ref($postprocess) eq 'HASH') && 
                                   (($postprocess->{'createdweb'}) || ($postprocess->{'createdmsg'})))) {
                       $output .= &notification_information($disposition,$env{'user.name'}.':'.$env{'user.domain'},
                                                            $dom,$cnum,$now,$code,$postprocess);
                   }
                   if ($code) {
                       $reqhash{'code'} = $code;
                   }
                   if (ref($postprocess) eq 'HASH') {
                       if (ref($postprocess->{'createdactions'}) eq 'HASH') {
                           if (ref($postprocess->{'createdactions'}{'environment'}) eq 'HASH') {
                               &Apache::loncoursequeueadmin::postprocess_crsenv($dom,$cnum,
                                                                                $postprocess->{'createdactions'}{'environment'});
                           }
                       }
                   }
                   unless ($customized) { 
                       $output .= '<br />'.$role_result;
                   }
                   $output .= '</p>';
                 $creationresult = 'created';                  $creationresult = 'created';
             } else {              } else {
                 $output = '<span class="LC_error">'.                  $output = '<span class="LC_error">';
                           &mt('An error occurred when processing your course request.').                  if ($crstype eq 'community') {
                           '<br />'.                      $output .= &mt('An error occurred when processing your community request.');
                           &mt('You may want to review the request details and submit the request again.').                  } 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';                  $creationresult = 'error';
             }              }
         } else {          } else {
             my $requestid = $cnum.'_'.$disposition;              my $requestid = $cnum.'_'.$disposition;
             my $request = {               my $request = {
                             $requestid => {                              $requestid => {
                                             timestamp   => $now,                                              timestamp   => $now,
                                             crstype     => $crstype,                                              crstype     => $crstype,
                                             ownername   => $env{'user.name'},                                              ownername   => $env{'user.name'},
                                             ownerdom    => $env{'user.domain'},                                              ownerdom    => $env{'user.domain'},
                                             description => $env{'form.cdescr'},                                               description => $env{'form.cdescr'},
                                               lonhost     => $lonhost,
                                           },                                            },
                           };                            };
               if ($crstype eq 'official') {
                   $request->{$requestid}->{'instcode'} = $instcode;
               }
             my $statuskey = 'status:'.$dom.':'.$cnum;              my $statuskey = 'status:'.$dom.':'.$cnum;
             my %userreqhash = &Apache::lonnet::get('courserequests',[$statuskey],              my %userreqhash = &Apache::lonnet::get('courserequests',[$statuskey],
                                                    $env{'user.domain'},$env{'user.name'});                                                     $env{'user.domain'},$env{'user.name'});
Line 2358  sub print_request_outcome { Line 3926  sub print_request_outcome {
                 if (($queuehash{$cnum.'_approval'} ne '') ||                   if (($queuehash{$cnum.'_approval'} ne '') || 
                     ($queuehash{$cnum.'_pending'} ne '')) {                      ($queuehash{$cnum.'_pending'} ne '')) {
                     $queued = 1;                      $queued = 1;
                       if (ref($queuehash{$cnum.'_pending'}) eq 'HASH') {
                           $token = $queuehash{$cnum.'_pending'}{'token'};
                       } 
                 }                  }
             }              }
             unless ($queued) {              unless ($queued) {
                   if (($disposition eq 'pending') && ($crstype ne 'official')) {
                       my %reqinfo = (
                                       $cnum.':'.$dom => $now.':'.$env{'user.name'}.':'.$env{'user.domain'},
                                     );
                        $token = &Apache::lonnet::tmpput(\%reqinfo,$lonhost);
                        $request->{$requestid}->{'token'} = $token;
                   }
                 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') {
                               &notification_information($disposition,$req_notifylist,                          $output .= &mt('Your community request has been recorded.');
                                                         $cnum,$now);                      } else {
                           $output .= &mt('Your course request has been recorded.') 
                       }
                       unless ($disposition eq 'pending') { 
                           $output .= '<br />'.
                                      &notification_information($disposition,$req_notifylist,
                                                                $dom,$cnum,$now);
                       }
                 } else {                  } else {
                     $reqstatus = 'domainerror';                      $reqstatus = 'domainerror';
                     $reqhash{'disposition'} = $disposition;                      $reqhash{'disposition'} = $disposition;
Line 2375  sub print_request_outcome { Line 3960  sub print_request_outcome {
                 }                  }
             }              }
         }          }
         my ($statusresult);          ($storeresult,my $updateresult) = 
         if ($requestkey =~ /^($match_domain)_($match_courseid)$/) {              &Apache::loncoursequeueadmin::update_coursereq_status(\%reqhash,$dom,
             $storeresult = &Apache::lonnet::store_userdata(\%reqhash,$requestkey,                  $cnum,$reqstatus,'request',$env{'user.domain'},$env{'user.name'});
                                                            'courserequests');          if ($storeresult eq 'ok') {
             if ($storeresult eq 'ok') {              my $postprocess;
                 my %status = (              if (($disposition eq 'approval') || ($disposition eq 'pending')) {
                                  'status:'.$dom.':'.$cnum => $reqstatus,                  my $updateaction = $disposition;
                              );                  if ($disposition eq 'approval') {
                 $statusresult = &Apache::lonnet::put('courserequests',\%status);                      $updateaction = 'queued';
                   }
                   my $fullname = &Apache::loncommon::plainname($env{'user.name'},
                                                                $env{'user.domain'});
                   $postprocess =
                       &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,$updateaction,$env{'user.name'},
                                                           $env{'user.domain'},$fullname,$env{'form.cdescr'});
               }
               if ($modified && $queued) {
                   if ($crstype eq 'community') {
                       $output .= '<p>'.&mt('Your community request has been updated').'</p>';
                   } else {
                       $output .= '<p>'.&mt('Your course request has been updated').'</p>';
                   }
                   if ($disposition eq 'approval') {
                       $output .= &notification_information($disposition,$req_notifylist,$dom,$cnum,$now);
                   }
               }
               if ($disposition eq 'approval') {
                   if ((ref($postprocess) eq 'HASH') && 
                       ((ref($postprocess->{'queuedmsg'}) eq 'HASH') || ($postprocess->{'queuedweb'}))) { 
                       &notification_information($disposition,undef,$dom,$cnum,$now,undef,$postprocess);
                       $customized = $postprocess->{'createdcustomized'};
                   }
               } elsif ($disposition eq 'pending') {
                   my $pendingform;
                   if ($crstype ne 'official') {
                       $pendingform = &pending_validation_form($dom,$cnum,$crstype,$now,$token,
                                                               $lonhost,$env{'form.cdescr'});
                   }
                   if ($pendingform) {
                       $output .= $pendingform;
                   } else { 
                       $output .= &notification_information($disposition,undef,$dom,$cnum,$now,undef,$postprocess);
                   }
                   if (ref($postprocess) eq 'HASH') {
                       $customized = $postprocess->{'createdcustomized'};
                   }
             }              }
         } else {  
             $storeresult = 'error: invalid requestkey format';   
         }  
         if ($storeresult ne 'ok') {  
             $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");  
         } 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 />';  
             &Apache::lonnet::logthis("Error saving course request status for  $requestkey (for $env{'user.name'}:$env{'user.domain'}) - $statusresult");  
         }  
         if ($modified && $queued && $storeresult eq 'ok') {  
             $output .= '<p>'.&mt('Your course request has been updated').'</p>'.  
                        &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 .= '<p class="LC_warning">'.&mt('An error occurred validating your request with institutional data sources: [_1].',$validationerror).'</p>';
           }
           if ($updateresult) {
               $output .= $updateresult;
         }          }
     }      }
     if ($creationresult ne '') {      if ($creationresult ne '') {
         return ($creationresult,$output);          return ($creationresult,$output,$customized);
     } else {      } else {
         return ($storeresult,$output);          return ($storeresult,$output,$customized);
       }
   }
   
   sub custom_formitems {
       my ($preprocess,$customhash) = @_;
       return unless ((ref($preprocess) eq 'HASH') && (ref($customhash) eq 'HASH'));  
       if (ref($preprocess->{'formitems'}) eq 'HASH') {
           foreach my $key (keys(%{$preprocess->{'formitems'}})) {
               if ($preprocess->{'formitems'}->{$key} eq 'multiple') {
                   if (exists($env{'form.'.$key})) {
                       my @items = &Apache::loncommon::get_env_multiple($env{'form.'.$key});
                       foreach my $item (@items) {
                           $item =~ s/(`)/'/g;
                           $item =~ s/\$/\(\$\)/g;
                           push(@{$customhash->{$key}},$item);
                       }
                   }
               } else {
                   if (exists($env{'form.'.$key})) {
                       $customhash->{$key} = $env{'form.'.$key};
                       $customhash->{$key} =~ s/(`)/'/g;
                       $customhash->{$key} =~ s/\$/\(\$\)/g;
                   }
               }
           }
     }      }
 }  }
   
Line 2417  sub update_requestors_roles { Line 4054  sub update_requestors_roles {
     my $owner = $env{'user.name'}.':'.$env{'user.domain'};      my $owner = $env{'user.name'}.':'.$env{'user.domain'};
     if (ref($details) eq 'HASH') {      if (ref($details) eq 'HASH') {
         if (ref($details->{'personnel'}) eq 'HASH') {          if (ref($details->{'personnel'}) eq 'HASH') {
             if (ref($details->{'personnel'}{$owner}) eq 'HASH') {              my $ccrole = 'cc';
                 my @roles;              if ($crstype eq 'community') {
                 if (ref($details->{'personnel'}{$owner}{'roles'}) eq 'ARRAY') {                  $ccrole = 'co';
                     @roles = sort(@{$details->{'personnel'}{$owner}{'roles'}});              }
                     unless (grep(/^cc$/,@roles)) {              unless (ref($details->{'personnel'}{$owner}) eq 'HASH') {
                         push(@roles,'cc');                  $details->{'personnel'}{$owner} = {
                     }                                                      'roles' => [$ccrole],
                 } else {                                                      $ccrole => { 'usec' => [] },
                     @roles = ('cc');                                                    };
                 }              }
                 foreach my $role (@roles) {              my @roles;
                     my $start = $now;              if (ref($details->{'personnel'}{$owner}{'roles'}) eq 'ARRAY') {
                     my $end = '0';                  @roles = sort(@{$details->{'personnel'}{$owner}{'roles'}});
                     if ($role eq 'st') {                  unless (grep(/^\Q$ccrole\E$/,@roles)) {
                         if ($details->{'accessstart'} ne '') {                      push(@roles,$ccrole);
                             $start = $details->{'accessstart'};                  }
                         }              } else {
                         if ($details->{'accessend'} ne '') {                  @roles = ($ccrole);
                             $end = $details->{'accessend'};              }
                         }              foreach my $role (@roles) {
                     }                  my $refresh=$env{'user.refresh.time'};
                     my @usecs;                  if ($refresh eq '') {
                     if ($role ne 'cc') {                      $refresh = $env{'user.login.time'};
                         if (ref($details->{'personnel'}{$owner}{$role}{'usec'}) eq 'ARRAY') {                  }
                             @usecs = @{$details->{'personnel'}{$owner}{$role}{'usec'}};                  if ($refresh eq '') {
                         }                      $refresh = $now;
                     }                   }
                     if ($role eq 'st') {                  my $start = $refresh-1;
                         if (@usecs > 1) {                  my $end = '0';
                             my $firstsec = $usecs[0];                  if ($role eq 'st') {
                             @usecs = ($firstsec);                      if ($details->{'accessstart'} ne '') {
                         }                          $start = $details->{'accessstart'};
                     }                      }
                     if (@usecs == 0) {                      if ($details->{'accessend'} ne '') {
                         push(@usecs,'');                          $end = $details->{'accessend'};
                     }                      }
                     foreach my $usec (@usecs) {                  }
                         my (%userroles,%newrole,%newgroups,$spec,$area);                  my @usecs;
                         my $area = '/'.$dom.'/'.$cnum;                  if ($role ne $ccrole) {
                         my $spec = $role.'.'.$area;                      if (ref($details->{'personnel'}{$owner}{$role}{'usec'}) eq 'ARRAY') {
                         if ($usec ne '') {                          @usecs = @{$details->{'personnel'}{$owner}{$role}{'usec'}};
                            $spec .= '/'.$usec;                      }
                            $area .= '/'.$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\//) {                          if ($role =~ /^cr\//) {
                             &Apache::lonnet::custom_roleprivs(\%newrole,$role,$dom,                              $showrole = &Apache::lonnet::plaintext($role,$crstype);
                                                               $cnum,$spec,$area);                          } elsif (ref($longroles) eq 'HASH') {
                         } else {                              if ($longroles->{$role} ne '') {
                             &Apache::lonnet::standard_roleprivs(\%newrole,$role,$dom,                                  $showrole = $longroles->{$role};
                                                                 $spec,$cnum,$area);                              }
                         }                          }
                         &Apache::lonnet::set_userprivs(\%userroles,\%newrole,                          if ($start <= $now) {
                                                        \%newgroups);                              $active .= '<li><a href="/adm/roles?selectrole=1&'.
                         $userroles{'user.role.'.$spec} = $start.'.'.$end;                                         $spec.'=1">'.$showrole;
                         &Apache::lonnet::appenv(\%userroles,[$role,'cm']);                              if ($usec ne '') {
                         if (($end == 0) || ($end > $now)) {                                  $active .= ' - '.&mt('section:').' '.$usec; 
                             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 .= '</a></li>';
                                 $active .= '<li><a href="/adm/roles?selectrole=1&'.                                             $spec.'=1">'.$showrole;                              $numactive ++;
                                 if ($usec ne '') {                          } else { 
                                     $active .= ' - '.&mt('section:').' '.$usec;                               $future .= '<li>'.$showrole;
                                 }                              if ($usec ne '') {
                                 $active .= '</a></li>';                                  $future .= ' - '.&mt('section:').' '.$usec;
                                 $numactive ++;  
                             } else {   
                                 $future .= '<li>'.$showrole;  
                                 if ($usec ne '') {  
                                     $future .= ' - '.&mt('section:').' '.$usec;  
                                 }  
                                 $future .= '</li>';  
                                 $numfuture ++;  
                             }                              }
                               $future .= '</li>';
                               $numfuture ++;
                         }                          }
                     }                      }
                 }                  }
Line 2504  sub update_requestors_roles { Line 4157  sub update_requestors_roles {
     }      }
     if ($active) {      if ($active) {
         if ($numactive == 1) {          if ($numactive == 1) {
             $output = &mt('Use the following link to enter the course:');               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 {          } else {
             $output = &mt('Use the following links to your new roles to enter the course:');              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 />';          $output .= ' <ul>'.$active.'</ul><br />';
     }      }
     if ($future) {      if ($future) {
         $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'})).          if ($crstype eq 'Community') {
                    ' <ul>'.$future.'</ul>';              $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 notification_information {  sub notification_information {
     my ($disposition,$req_notifylist,$cnum,$now) = @_;      my ($disposition,$req_notifylist,$dom,$cnum,$now,$code,$postprocess) = @_;
     my %emails = &Apache::loncommon::getemails();      my %emails = &Apache::loncommon::getemails();
     my $address;      my $address;
     if (($emails{'permanentemail'} ne '') || ($emails{'notification'} ne '')) {      if (($emails{'permanentemail'} ne '') || ($emails{'notification'} ne '')) {
Line 2536  sub notification_information { Line 4201  sub notification_information {
         }          }
         if ($req_notifylist) {          if ($req_notifylist) {
             my $fullname = &Apache::loncommon::plainname($env{'user.name'},              my $fullname = &Apache::loncommon::plainname($env{'user.name'},
                                                                      $env{'user.domain'});                                                           $env{'user.domain'});
             my $sender = $env{'user.name'}.':'.$env{'user.domain'};              my $sender = $env{'user.name'}.':'.$env{'user.domain'};
             &Apache::loncoursequeueadmin::send_selfserve_notification($req_notifylist,"$fullname ($env{'user.name'}:$env{'user.domain'})",$cnum,$env{'form.cdescr'},$now,'coursereq',$sender);              &Apache::loncoursequeueadmin::send_selfserve_notification($req_notifylist,"$fullname ($env{'user.name'}:$env{'user.domain'})",
                                                                         'undef',$env{'form.cdescr'},$now,'coursereq',$sender);
           }
           if (ref($postprocess) eq 'HASH') {
               if (ref($postprocess->{'queuedmsg'}) eq 'ARRAY') {
                   if (scalar(@{$postprocess->{'queuedmsg'}}) > 0) {
                       my $recipient = $env{'user.name'}.':'.$env{'user.domain'};
                       my $sender = $recipient;
                       my $addmsg = [];
                       foreach my $item (@{$postprocess->{'queuedmsg'}}) {
                           if (ref($item) eq 'HASH') {
                               if ($item->{'mt'} ne '') {
                                   push(@{$addmsg},$item);
                               }
                           }
                       }
                       if (scalar(@{$addmsg}) > 0) {
                           &Apache::loncoursequeueadmin::send_selfserve_notification($recipient,$addmsg,undef,
                                                                                     $env{'form.cdescr'},$now,
                                                                                     'queuedcrsreq',$sender);
                       }
                   }
               }
               if ($postprocess->{'queuedweb'}) {
                   $output .= $postprocess->{'queuedweb'};
               }
         }          }
     } elsif ($disposition eq 'pending') {      } elsif ($disposition eq 'pending') {
         $output .= '<div class="LC_info">'.          my $pending_default = '<div class="LC_info">'.
 &mt('Your request has been placed in a queue pending administrative action.').'<br />'.  &mt('Your request has been placed in a queue pending administrative action.').'<br />'.
 &mt("Usually this means that your institution's information systems do not list you among the instructional personnel for this course.").'<br />'.  &mt("Usually this means that your institution's information systems do not list you among the instructional personnel for this course.").'<br />'.
 &mt('The list of instructional personnel for the course will be automatically checked daily, and once you are listed the request will be processed.').  &mt('The list of instructional personnel for the course will be automatically checked daily, and once you are listed the request will be processed.').
                    '</div>';                         '</div>';
           if (ref($postprocess) eq 'HASH') {
               if ($postprocess->{'pendingweb'}) {
                   $output .= $postprocess->{'pendingweb'};
               } else {
                   $output .= $pending_default;
               }
           } else {
               $output .= $pending_default;
           }
       } elsif ($disposition eq 'created') {
           if (($code) || ((ref($postprocess) eq 'HASH') && 
               ((ref($postprocess->{'createdmsg'}) eq 'ARRAY') || ($postprocess->{'createdweb'})))) {
               my $addmsg = [];
               my $recipient = $env{'user.name'}.':'.$env{'user.domain'};
               my $sender = $recipient;
               if ($code) {
                   push(@{$addmsg},{
                                     mt   => 'Students can automatically select your course: "[_1]" by entering this code: [_2]',
                                     args => [$env{'form.cdescr'},$code],
                                   });
                   $output .= '<p>'.
                              &mt('Students can automatically select your course by entering this code: [_1].','<b>'.$code.'</b>').
                              '<br />'.
                              &mt('A message has been sent to your LON-CAPA account with this information.');
                   if ($address ne '') {
                       $output.= '<br />'.&mt('An e-mail has also been sent to: [_1] with this code.',$address);
                   }
                   $output .= '</p>';
               }
               if (ref($postprocess) eq 'HASH') {
                   if (ref($postprocess->{'createdmsg'}) eq 'ARRAY') {
                       foreach my $item (@{$postprocess->{'createdmsg'}}) {
                           if (ref($item) eq 'HASH') {
                               if ($item->{'mt'} ne '') {  
                                   push(@{$addmsg},$item);
                               }
                           }
                       }
                   }
                   if ($postprocess->{'createdweb'}) {
                       $output .= $postprocess->{'createdweb'}
                   }
               }
               if (scalar(@{$addmsg}) > 0) {
                   my $type = 'createdcrsreq';
                   if ($code) {
                       $type = 'uniquecode';
                   }
                   &Apache::loncoursequeueadmin::send_selfserve_notification($recipient,$addmsg,$dom.'_'.$cnum,$env{'form.cdescr'},
                                                                             $now,$type,$sender);
               }
           }
     } else {      } else {
         $output .= '<div class="LC_warning">'.          $output .= '<div class="LC_warning">'.
                    &mt('Your request status is: [_1].',$disposition).                      &mt('Your request status is: [_1].',$disposition).
                    '</div>'                     '</div>';
     }      }
     return $output;      return $output;
 }  }
   
 sub get_processtype {  sub pending_validation_form {
     my ($dom,$crstype,$inststatuses,$domconfig) = @_;      my ($cdom,$cnum,$crstype,$now,$token,$lonhost,$cdesc) = @_;
     return unless ((ref($inststatuses) eq 'ARRAY') && (ref($domconfig) eq 'HASH'));      my $output;
     my (%userenv,%settings,$val);      my %postvalues = (
     my @options = ('autolimit','validate','approval');                        'owner'      => $env{'user.name'}.':'.$env{'user.domain'},
     if ($dom eq $env{'user.domain'}) {                        'course'     => $cdom.'_'.$cnum,
         %userenv =                         'coursetype' => $crstype,
             &Apache::lonnet::userenvironment($env{'user.domain'},$env{'user.name'},                       );
                 'requestcourses.'.$crstype,'inststatus');      my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$cdom);
         if ($userenv{'requestcourses.'.$crstype}) {  
             $val = $userenv{'requestcourses.'.$crstype};      if (ref($domconfig{'requestcourses'}) eq 'HASH') {
             @{$inststatuses} = ('_custom_');          my ($url,$buttontext,$code,@fields);
         } else {          if (ref($domconfig{'requestcourses'}{'validation'}) eq 'HASH') {
             my ($task,%alltasks);              $postvalues{'description'} = $cdesc;
             if (ref($domconfig->{'requestcourses'}) eq 'HASH') {              $url = $domconfig{'requestcourses'}{'validation'}{'url'};
                 %settings = %{$domconfig->{'requestcourses'}};              if (ref($domconfig{'requestcourses'}{'validation'}{'fields'}) eq 'ARRAY') {
                 if (ref($settings{$crstype}) eq 'HASH') {                  @fields = @{$domconfig{'requestcourses'}{'validation'}{'fields'}};
                     if (($env{'user.adv'}) && ($settings{$crstype}{'_LC_adv'} ne '')) {              }
                         $val = $settings{$crstype}{'_LC_adv'};              $buttontext = $domconfig{'requestcourses'}{'validation'}{'button'};
                         @{$inststatuses} = ('_LC_adv_');              $output .= $domconfig{'requestcourses'}{'validation'}{'markup'};
                     } else {              if (($url =~ m{^(https?\://|/)}) && (@fields > 0)) {
                         if ($userenv{'inststatus'} ne '') {                  $output .= '<form name="crsreqvalidation" action="'.$url.'" method="post">'."\n";
                             @{$inststatuses} = split(',',$userenv{'inststatus'});                  foreach my $field (@fields) {
                         } else {                      if ($postvalues{$field}) {
                             @{$inststatuses} = ('default');                          $output .= '<input type="hidden" name="'.$field.'" value="'.$postvalues{$field}.'" />'."\n";
                         }  
                         foreach my $status (@{$inststatuses}) {  
                             if (exists($settings{$crstype}{$status})) {  
                                 my $value = $settings{$crstype}{$status};  
                                 next unless ($value);   
                                 unless (exists($alltasks{$value})) {  
                                     if (ref($alltasks{$value}) eq 'ARRAY') {  
                                         unless(grep(/^\Q$status\E$/,@{$alltasks{$value}})) {  
                                             push(@{$alltasks{$value}},$status);   
                                         }  
                                     } else {  
                                         @{$alltasks{$value}} = ($status);  
                                     }  
                                 }  
                             }  
                         }  
                         my $maxlimit = 0;  
                           
                         foreach my $key (sort(keys(%alltasks))) {  
                             if ($key =~ /^autolimit=(\d*)$/) {  
                                 if ($1 eq '') {  
                                     $val ='autolimit=';  
                                     last;  
                                 } elsif ($1 > $maxlimit) {  
                                     $maxlimit = $1;   
                                 }  
                             }  
                         }  
                         if ($maxlimit) {  
                             $val = 'autolimit='.$maxlimit;  
                         } else {  
                             foreach my $option (@options) {  
                                 if ($alltasks{$option}) {  
                                     $val = $option;  
                                     last;    
                                 }  
                             }  
                         }  
                     }                      }
                 }                  }
             }                  if ($buttontext eq '') {
         }                      if ($crstype eq 'community') {
     } else {                          $buttontext = &mt('Create community');
         %userenv = &Apache::lonnet::userenvironment($env{'user.domain'},                      } else {
                       $env{'user.name'},'reqcrsotherdom.'.$env{'form.crstype'});                          $buttontext = &mt('Create course');
         if ($userenv{'reqcrsotherdom.'.$crstype}) {  
             my @doms = split(',',$userenv{'reqcrsotherdom.'.$crstype});  
             my $optregex = join('|',@options);  
             foreach my $item (@doms) {  
                 my ($extdom,$extopt) = split(':',$item);  
                 if ($extdom eq $dom) {    
                     if ($extopt =~ /^($optregex)(=?\d*)$/) {  
                         $val = $1.$2;  
                     }                      }
                     last;  
                 }                  }
                   my $protocol = $Apache::lonnet::protocol{$lonhost};
                   $protocol = 'http' if ($protocol ne 'https');
                   my $crscreator = $protocol.'://'.&Apache::lonnet::hostname($lonhost).'/cgi-bin/createpending.pl';
                   $output .= '<input type="hidden" name="crscreator" value="'.$crscreator.'" />'."\n".
                              '<input type="hidden" name="token" value="'.$token.'" />'."\n".
                              '<input type="submit" name="validate" value="'.$buttontext.'" />'."\n".
                              '</form>'."\n";
             }              }
             @{$inststatuses} = ('_external_');  
         }          }
     }      }
     return $val;      return $output;
 }  }
   
 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') || ($crstype eq 'textbook') || ($crstype eq 'placement')) &&
                        (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 2699  sub retrieve_settings { Line 4403  sub retrieve_settings {
             }              }
             $env{'form.clonecrs'} = $reqinfo{'clonecrs'};              $env{'form.clonecrs'} = $reqinfo{'clonecrs'};
             $env{'form.clonedom'} = $reqinfo{'clonedom'};              $env{'form.clonedom'} = $reqinfo{'clonedom'};
               if (($reqinfo{'clonecrs'} ne '') && ($reqinfo{'clonedom'} ne '')) {
                   $env{'form.cloning'} = 1;
               }
             $env{'form.datemode'} = $reqinfo{'datemode'};              $env{'form.datemode'} = $reqinfo{'datemode'};
             $env{'form.dateshift'} = $reqinfo{'dateshift'};              $env{'form.dateshift'} = $reqinfo{'dateshift'};
             if (($reqinfo{'crstype'} eq 'official') && ($reqinfo{'instcode'} ne '')) {               if ($reqinfo{'crstype'} eq 'official') {
                  $env{'form.sectotal'} = $reqinfo{'sectotal'};                  $env{'form.autoadds'} = $reqinfo{'autoadds'};
                  $env{'form.crosslisttotal'} = $reqinfo{'crosslisttotal'};                  $env{'form.autodrops'} = $reqinfo{'autodrops'};
                  $env{'form.autoadds'} = $reqinfo{'autoadds'};                  if ($reqinfo{'instcode'} ne '') { 
                  $env{'form.autdrops'} = $reqinfo{'autodrops'};                      $env{'form.sectotal'} = $reqinfo{'sectotal'};
                  $env{'form.instcode'} = $reqinfo{'instcode'};                      $env{'form.crosslisttotal'} = $reqinfo{'crosslisttotal'};
                  my $crscode = {                       $env{'form.instcode'} = $reqinfo{'instcode'};
                                  $cnum => $reqinfo{'instcode'},                      my $crscode = { 
                                };                                      $cnum => $reqinfo{'instcode'},
                  &extract_instcode($dom,'instcode',$crscode,$cnum);                                    };
                       &extract_instcode($dom,'instcode',$crscode,$cnum);
                       (undef,undef,my $instcredits) =
                           &Apache::lonnet::auto_validate_instcode(undef,$dom,
                                                                   $reqinfo{'instcode'});
                       if ($instcredits ne $reqinfo{'defaultcredits'}) {
                           $env{'form.coursecredits'} = $reqinfo{'defaultcredits'};
                       }
                   }
               } elsif (($reqinfo{'crstype'} eq 'unofficial') || ($reqinfo{'crstype'} eq 'textbook')) {
                   $env{'form.coursecredits'} = $reqinfo{'defaultcredits'};
             }              }
             my @currsec;              my @currsec;
             if (ref($reqinfo{'sections'}) eq 'HASH') {              if (ref($reqinfo{'sections'}) eq 'HASH') {
Line 2841  sub generate_date_items { Line 4558  sub generate_date_items {
     return;      return;
 }  }
   
   sub print_textbook_form {
       my ($r,$dom,$incdoms,$domdefs,$settings,$can_request,$crstype,$formhash) = @_;
       my (%prefab,%ordered,%numprefab);
       if ($crstype eq '') {
           $crstype = 'textbook';
       }
   #
   #  Retrieve list of prefabricated courses (textbook courses and templates) cloneable by user
   #
       foreach my $type ('textbooks','templates') {
           $numprefab{$type} = 0;
           if (ref($settings) eq 'HASH') {
               $prefab{$type} = $settings->{$type};
               if (ref($prefab{$type}) eq 'HASH') {
                   foreach my $item (keys(%{$prefab{$type}})) {
                       my ($clonedom,$clonecrs) = split(/_/,$item);
                       if (ref($prefab{$type}{$item}) eq 'HASH') {
                           if (&Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},
                                             $env{'user.domain'},$clonecrs,$clonedom,$crstype,$dom)) {
   
                               my $num = $prefab{$type}{$item}{'order'};
                               $ordered{$type}{$num} = $item;
                               $numprefab{$type} ++;
                           }
                       }
                   }
               }
           }
       }
   
   #
   # Check if domain has multiple library servers
   #
       my ($home_server_pick,$numlib) =
           &Apache::loncommon::home_server_form_item($dom,'chome',
                                                     'default','hide');
       if ($numlib > 1) {
           $home_server_pick = &mt('Home Server for Course').': '.$home_server_pick.'<br />';
       }
   
   #
   # Retrieve information about courses owned by user, or in which user has an active
   # Course Coordinator role
   #
       my $numcurrent;
       my %cloneable = &Apache::lonnet::courseiddump($dom,'.',1,'.',$env{'user.name'}.':'.$env{'user.domain'},
                                                     '.',undef,undef,'Course');
       my %ccroles = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},'userroles',
                                                   ['active'],['cc']);
   
       my $cc_clone = '';
       foreach my $role (keys(%ccroles)) {
           my ($cnum,$cdom,$rest) = split(/:/,$role,3);
           $cc_clone .= $cdom.':'.$cnum.'&';
           unless (exists($cloneable{$cdom.'_'.$cnum})) {
               my %courseinfo = &Apache::lonnet::coursedescription($cdom.'_'.$cnum,{'one_time' => 1});
               $cloneable{$cdom.'_'.$cnum} = {
                                                  context => $courseinfo{'internal.creationcontext'},
                                                  created => $courseinfo{'internal.created'},
                                                  creator => $courseinfo{'internal.creator'},
                                                  description => $courseinfo{'description'},
                                                  inst_code => $courseinfo{'coursecode'},
                                                  owner => $courseinfo{'internal.courseowner'},
                                                  releaserequired => $courseinfo{'internal.releaserequired'},
                                                  type  => $courseinfo{'type'},
                                             };
           }
       }
   
       my $numcurrent = scalar(keys(%cloneable));
   
   #
   # Retrieve information about courses from user's domain which user can clone, but which not owned
   # or cloneable based on Course Coordinator role.
   #
       my ($numdomcourses,%domcloneable);
       my %allcloneable = &Apache::lonnet::courseiddump($dom,'.',1,'.','.','.',undef,undef,'Course',
                                                        undef,undef,undef,undef,undef,
                                                        $env{'user.name'}.':'.$env{'user.domain'},
                                                        $cc_clone,1);
       foreach my $cid (keys(%allcloneable)) {
           unless (exists($cloneable{$cid})) {
               $domcloneable{$cid} = $allcloneable{$cid};
           }
       }
       $numdomcourses = scalar(keys(%domcloneable));
   
       my $fullname = &Apache::loncommon::plainname($env{'user.name'},
                                                    $env{'user.domain'});
   
   #
   # Retrieve any custom form information prior to rendering page
   #
   
       my $initprocess = &Apache::lonnet::auto_crsreq_update($dom,undef,$crstype,'initializereview',$env{'user.name'},
                                                            $env{'user.domain'},$fullname);
       my %custominit;
       if (ref($initprocess) eq 'HASH') {
           &custom_formitems($initprocess,\%custominit);
       }
   
   #
   # Retrieve any custom onload actions or javascript used for page before rendering
   #
   
       my ($customonload,$customjs,$customvalidationjs);
       my $inprocess = &Apache::lonnet::auto_crsreq_update($dom,undef,$crstype,'prereview',$env{'user.name'},
                                                           $env{'user.domain'},$fullname,undef,undef,
                                                           undef,undef,\%custominit);
       if (ref($inprocess) eq 'HASH') {
           $customonload = $inprocess->{'onload'};
           $customjs = $inprocess->{'javascript'};
           $customvalidationjs = $inprocess->{'validationjs'};
       }
   
       my $postprocess = &Apache::lonnet::auto_crsreq_update($dom,undef,$crstype,'review',
                                                             $env{'user.name'},
                                                             $env{'user.domain'},$fullname,undef,undef,
                                                             undef,undef,\%custominit);
   
       my $jscript = &textbook_request_javascript(\%numprefab,$numcurrent,$numdomcourses,$customvalidationjs);
       $jscript .= $customjs;
       my (%loaditems,$args);
       $loaditems{'onload'} = 'javascript:uncheckAllRadio();'.$customonload;
       if ($crstype eq 'lti') {
          $args = { 'only_body' => 1};
       }
       $r->print(&header('Course Request',$jscript,\%loaditems,undef,$args));
   
       if (ref($can_request) eq 'HASH') {
           unless (((scalar(keys(%{$can_request})) == 1) && ($can_request->{'textbook'})) ||
                   ($crstype eq 'lti')) {
               &Apache::lonhtmlcommon::add_breadcrumb(
                   { href => '/adm/requestcourse',
                     text => 'Pick action',
                   });
           }
       }
       unless ($crstype eq 'lti') {
           &Apache::lonhtmlcommon::add_breadcrumb({text=>'Course Request'});
           $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests'));
   
           &startContentScreen($r,'textbookrequests');
   #
   # Show domain selector form, if required.
   #
           if (@{$incdoms} > 1) {
               my $onchange = 'this.form.submit()';
               $r->print('<form name="domforcourse" method="post" action="/adm/requestcourse">'.
                         '<div><fieldset><legend>'.&mt('Domain').'</legend>'.
                         &Apache::loncommon::select_dom_form($dom,'showdom','',1,$onchange,$incdoms).
                         '</fieldset></form>');
           }
       }
   
   #
   # Course request form
   #
   
   #
   # Course Title
   #
       $r->print('<form name="requestcourse" method="post" action="/adm/requestcourse" onsubmit="return validTextbookReq();">'.
                 '<div>'.
                 '<fieldset>'.
                 '<legend>'.&mt('Course Information').'</legend>'.
                 '<span class="LC_nobreak">'.&mt('Title').':&nbsp'.
                 '<input type="text" size="60" name="cdescr" value="" /></span><br />'.
                 $home_server_pick.'<br /></fieldset>'.
                 '</div>');
   
   #
   # Content source selection, if more than one available
   #
       if (keys(%cloneable) || keys(%ordered) || keys(%domcloneable)) {
           $r->print('<div>'. 
                     '<fieldset><legend>'.&mt('Course Content').'</legend>');
           if (keys(%ordered)) {
               if (ref($ordered{'textbooks'}) eq 'HASH') {
                   $r->print('<span class="LC_nobreak"><label>'.
                             '<input type="radio" name="cloning" value="textbook" onclick="javascript:cloneChoice();" />'.
                             &mt('Load textbook content').'</span>'.('&nbsp;'x2).' ');
               }
               if (ref($ordered{'templates'}) eq 'HASH') {
                   $r->print('<span class="LC_nobreak"><label>'.
                             '<input type="radio" name="cloning" value="template" onclick="javascript:cloneChoice();" />'.
                             &mt('Load pre-existing template').'</span>'.('&nbsp;'x2).' ');
               }
           }
           if (keys(%cloneable)) {
               $r->print('<span class="LC_nobreak"><label>'.
                         '<input type="radio" name="cloning" value="existing" onclick="javascript:cloneChoice();" />'.
                         &mt('Copy one of your courses').'</label></span>'.('&nbsp;'x2).' ');
           }
           if (keys(%domcloneable)) {
               $r->print('<span class="LC_nobreak"><label>'.
                         '<input type="radio" name="cloning" value="colleague" onclick="javascript:cloneChoice();" />'.
                         &mt("Copy a colleague's course").'</label></span>'.('&nbsp;'x2).' ');
           }
           $r->print('<span class="LC_nobreak"><label>'.
                     '<input type="radio" name="cloning" value="none" checked="checked" onclick="javascript:cloneChoice();" />'.
                     &mt('Empty course shell').'</label></span>');
       } else {
           $r->print('<input type="hidden" name="cloning" value="none" />');
       }
   
   #
   # Table of cloneable textbook courses
   #
       if (keys(%ordered)) {
           foreach my $type ('textbooks','templates') {
               my $divid = 'showtextbook';
               my $radioid = 'book';
               if ($type eq 'templates') {
                   $divid = 'showtemplate'; 
                   $radioid = 'template';
               }
               if (ref($ordered{$type}) eq 'HASH') {
                   $r->print('<div id="'.$divid.'" style="display:none">'.
                             &Apache::loncommon::start_data_table().
                             &Apache::loncommon::start_data_table_header_row().
                             '<th>'.&mt('Title').'</th>');
                   if ($type eq 'textbooks') {
                       $r->print('<th>'.&mt('Author(s)').'</th>');
                   }
                   $r->print('<th>'.&mt('Subject').'</th>');
                   if ($type eq 'textbooks') {
                       $r->print('<th>'.&mt('Publisher').'</th>'.
                                 '<th>'.&mt('Book').'</th>');
                   }
                   $r->print(&Apache::loncommon::end_data_table_header_row());
                   my @items = sort { $a <=> $b } keys(%{$ordered{$type}});
                   foreach my $num (@items) {
                       my $item = $ordered{$type}{$num};
                       my $cleantitle=&HTML::Entities::encode($prefab{$type}{$item}{'title'},'<>&"');
                       $cleantitle=~s/'/\\'/g;
                       $cleantitle =~ s/^\s+//;
                       $r->print(&Apache::loncommon::start_data_table_row().
                                 '<td><label><input type="radio" name="'.$radioid.'" value="'.$item.'" />'.
                                 $cleantitle.'</label></td>');
                       if ($type eq 'textbooks') {
                            $r->print('<td>'.$prefab{$type}{$item}{'author'}.'</td>');
                       }
                       $r->print('<td>'.$prefab{$type}{$item}{'subject'}.'</td>');
                       if ($type eq 'textbooks') {
                           $r->print('<td>'.$prefab{$type}{$item}{'publisher'}.'</td>'.
                                     '<td><img border="0" src="'.$prefab{$type}{$item}{'image'}.
                                     '" alt="'.$cleantitle.'" /></td>');
                       }
                       $r->print(&Apache::loncommon::end_data_table_row());
                   }
                   $r->print(&Apache::loncommon::end_data_table().
                             '</div>');
               }
           }
       }
   
   #
   # Table of user's current courses (owner and/or course coordinator)
   #
       my %lt = &clone_text();
       if (keys(%cloneable)) {
           $r->print('<div id="showexisting" style="display:none">'.
                     &clone_selection_table($dom,'owned',\%cloneable).
                     '<p><input type="radio" name="owndatemode" value="delete" /> '.$lt{'ncd'}.
                     '</label><br /><label>'.
                     '<input type="radio" name="owndatemode" value="preserve" /> '.$lt{'prd'}.
                     '</label><br /><label>'.
                     '<input type="radio" name="owndatemode" value="shift" checked="checked" /> '.
                     $lt{'shd'}.'</label>'.
                     '<input type="text" size="5" name="owndateshift" value="365" />'.
                     '</div>');
       }
   #
   # Table of other cloneable courses from user's domain (exclude own courses)
   #
       if (keys(%domcloneable)) {
           $r->print('<div id="showcolleague" style="display:none">'.
                     &clone_selection_table($dom,'colleague',\%domcloneable).
                     '<p><input type="radio" name="colldatemode" value="delete" /> '.$lt{'ncd'}.
                     '</label><br /><label>'.
                     '<input type="radio" name="colldatemode" value="preserve" /> '.$lt{'prd'}.
                     '</label><br /><label>'.
                     '<input type="radio" name="colldatemode" value="shift" checked="checked" /> '.
                     $lt{'shd'}.'</label>'.
                     '<input type="text" size="5" name="colldateshift" value="365" />'.
                     '</div>');
       }
   
   #
   # End of content selector
   #
       if (keys(%cloneable) || keys(%domcloneable) || keys(%ordered)) {
           $r->print('</fieldset></div>');
       }
   
       my %accesstitles = (
                             'start' => 'Default start access',
                              'end'   => 'Default end access',
                          );
       my %help_item = (
                          start => 'Course_Request_Access_Start',
                          end   => 'Course_Request_Access_End',
                       );
       my $starttime = time;
       my $endtime = time+(6*30*24*60*60); # 6 months from now, approx
       my $startform = &Apache::lonhtmlcommon::date_setter('requestcourse','accessstart',
                                                           $starttime,'','','',1,'','','',1);
       my $endform = &Apache::lonhtmlcommon::date_setter('requestcourse','accessend',
                                                         $endtime,'','','',1,'','','',1);
   #
   # Set default start and end dates for student access
   # 
       $r->print('<div>'.
                 '<fieldset><legend>'.&mt('Student Access Dates').'</legend>'.
                 &Apache::loncommon::help_open_topic($help_item{'start'}).
                 '&nbsp;'.&mt($accesstitles{'start'}).$startform.'<br />'.
                 &Apache::loncommon::help_open_topic($help_item{'end'}).
                 '&nbsp;'.&mt($accesstitles{'end'}).$endform.'<br /></div>');
   
   #
   # Display any custom fields for this course type
   #
       if (ref($postprocess) eq 'HASH') {
           if ($postprocess->{'reviewweb'}) {
               $r->print($postprocess->{'reviewweb'});
           }
       }
   
   #
   # Submit button
   #
       $r->print('<input type="hidden" name="crstype" value="'.$crstype.'" />'.
                 '<input type="hidden" name="action" value="process" />'.
                 '<input type="submit" value="'.&mt('Create course').'" />');
   
   #
   # End request form
   #
   
       if (($crstype eq 'lti') && (ref($formhash) eq 'HASH')) {
           foreach my $item (keys(%{$formhash})) {
               $r->print('<input type="hidden" name="'.$item.'" value="'.$formhash->{$item}.'" />'."\n");
           }
       }
   
       $r->print('</form>');
       unless ($crstype eq 'lti') {
           &endContentScreen($r);
       }
       $r->print(&Apache::loncommon::end_page());
       return;
   }
   
   sub clone_selection_table {
       my ($dom,$name,$cloneableref) = @_;
       return unless ((ref($cloneableref) eq 'HASH') && (($name eq 'owned') || ($name eq 'colleague')));
       my %allownernames;
       my %sortbytitle;
       my $output;
       foreach my $cid (sort(keys(%{$cloneableref}))) {
           if (ref($cloneableref->{$cid}) eq 'HASH') {
               my $cdesc = $cloneableref->{$cid}{'description'};
               $cdesc =~ s/`/'/g;
               if ($cdesc ne '') {
                   push(@{$sortbytitle{$cdesc}},$cid);
               }
           }
       }
       foreach my $title (sort(keys(%sortbytitle))) {
            if (ref($sortbytitle{$title}) eq 'ARRAY') {
               foreach my $cid (sort(@{$sortbytitle{$title}})) {
                   my $cleantitle=&HTML::Entities::encode($title,'<>&"');
                   $cleantitle=~s/'/\\'/g;
                   $cleantitle =~ s/^\s+//;
                   my ($namestr,@owners,%ownernames);
                   if ($cloneableref->{$cid}{'owner'} ne '') {
                       push(@owners,$cloneableref->{$cid}{'owner'});
                   }
                   if ($cloneableref->{$cid}{'co-owners'} ne '') {
                       foreach my $item (split(/,/,$cloneableref->{$cid}{'co-owners'})) {
                           if (($item ne '') && (!grep(/^\Q$item\E$/,@owners))) {
                               push(@owners,$item);
                           }
                       }
                   }
                   foreach my $owner (@owners) {
                       my ($ownername,$ownerdom);
                       if ($owner =~ /:/) {
                           ($ownername,$ownerdom) = split(/:/,$owner);
                       } else {
                           $ownername = $owner;
                           if ($owner ne '') {
                               $ownerdom = $dom;
                           }
                       }
                       if ($ownername ne '' && $ownerdom ne '') {
                           if (exists($allownernames{$ownername.':'.$ownerdom})) {
                               $ownernames{$ownername.':'.$ownerdom} = $allownernames{$ownername.':'.$ownerdom};
                           } else {
                               my %namehash=&Apache::loncommon::getnames($ownername,$ownerdom);
                               $ownernames{$ownername.':'.$ownerdom} = \%namehash;
                               $allownernames{$ownername.':'.$ownerdom} = $ownernames{$ownername.':'.$ownerdom};
                           }
                       }
                   }
                   my @lastnames;
                   foreach my $owner (keys(%ownernames)) {
                       if (ref($ownernames{$owner}) eq 'HASH') {
                           push(@lastnames,$ownernames{$owner}{'lastname'});
                       }
                   }
                   if (@lastnames) {
                       $namestr = join(', ',sort(@lastnames));
                   }
                   $output .= &Apache::loncommon::start_data_table_row().
                              '<td><label><input type="radio" name="'.$name.'" value="'.$cid.'" />'.
                              '&nbsp;'.$cleantitle.'</label></td>'.
                              '<td>'.$namestr.'</td>'.
                              &Apache::loncommon::end_data_table_row();
               }
           }
       }
       if ($output) {
           return &Apache::loncommon::start_data_table().
                  &Apache::loncommon::start_data_table_header_row().
                  '<th>'.&mt('Title').'</th>'.
                  '<th>'.&mt('Owner/co-owner(s)').'</th>'.
                  &Apache::loncommon::end_data_table_header_row().
                  $output.
                  &Apache::loncommon::end_data_table();
       }
       return;
   }
   
   sub process_textbook_request {
       my ($r,$dom,$action,$domdefs,$domconfig,$can_request,$crstype) = @_;
       my ($uniquecode,$req_notifylist);
       if ($crstype eq '') {
           $crstype = 'textbook';
       }
       if (ref($domconfig) eq 'HASH') {
           if (ref($domconfig->{'requestcourses'}) eq 'HASH') {
               if (ref($domconfig->{'requestcourses'}{'notify'}) eq 'HASH') {
                   $req_notifylist = $domconfig->{'requestcourses'}{'notify'}{'approval'};
               }
               if (ref($domconfig->{'requestcourses'}{'uniquecode'}) eq 'HASH') {
                   $uniquecode = $domconfig->{'requestcourses'}{'uniquecode'}{$crstype};
               }
           }
       }
       my $now = time;
       my $reqtype = $env{'form.cloning'};
       my (@inststatuses,$storeresult,$creationresult);
       my $cnum = &Apache::lonnet::generate_coursenum($dom,'Course');
       my ($clonefrom,$clonedom,$clonecrs);
       if ($reqtype eq 'textbook') {
           $clonefrom = $env{'form.book'};
       } elsif ($reqtype eq 'template') {
           $clonefrom = $env{'form.template'};
       } elsif ($reqtype eq 'existing') {
           $clonefrom = $env{'form.owned'};
       } elsif ($reqtype eq 'colleague') {
           $clonefrom = $env{'form.colleague'};
       }
       my ($accessstart,$accessend) = &dates_from_form('accessstart','accessend');
       if ($clonefrom) {
           ($clonedom,$clonecrs) = split(/_/,$clonefrom);
           if (&Apache::lonnet::homeserver($clonecrs,$clonedom) ne 'no_host') {
               my $canclone =
                   &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},
                               $env{'user.domain'},$clonecrs,$clonedom,$crstype,$dom);
               unless ($canclone) {
                   undef($clonecrs);
                   undef($clonedom);
               }
           } else {
               undef($clonecrs);
               undef($clonedom);
           }
       }
       my $js = &processing_javascript();
       my ($loaditems,$args);
       $loaditems = {
                      onload => 'javascript:hideProcessing();',
                    };
       if ($crstype eq 'lti') {
          $args = { 'only_body' => 1};
       }
       $r->print(&header('Course Creation',$js,$loaditems,undef,$args));
   
       unless ($crstype eq 'lti') {
           if (ref($can_request) eq 'HASH') {
               unless ((scalar(keys(%{$can_request})) == 1) && ($can_request->{'textbook'})) {
                   &Apache::lonhtmlcommon::add_breadcrumb(
                       { href => '/adm/requestcourse',
                         text => 'Pick action',
                       });
               }
           }
           &Apache::lonhtmlcommon::add_breadcrumb(
                                                  { href => '/adm/requestcourse',
                                                    text => "Create Course",
                                                  }
                                                 );
           &Apache::lonhtmlcommon::add_breadcrumb({text=>'Request Processed'});
           $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests'));
           &startContentScreen($r,'textbookrequests');
       }
   
       my $details = {
                       owner          => $env{'user.name'},
                       domain         => $env{'user.domain'},
                       cdom           => $dom,
                       cnum           => $cnum,
                       coursehome     => $env{'form.chome'},
                       cdescr         => $env{'form.cdescr'},
                       crstype        => $crstype,
                       uniquecode     => $uniquecode,
                       clonedom       => $clonedom,
                       clonecrs       => $clonecrs,
                       accessstart    => $accessstart,
                       accessend      => $accessend,
                       personnel      => {},
                     };
       if (($clonecrs ne '') && ($clonedom ne '')) {
           if ($reqtype eq 'existing') {
               $details->{datemode} = $env{'form.owndatemode'};
               if ($details->{datemode} eq 'shift') {
                   $details->{dateshift} = $env{'form.owndateshift'};
               } else {
                   $details->{dateshift} = '';
               }
           } elsif ($reqtype eq 'colleague') {
               $details->{datemode} = $env{'form.colldatemode'};
               if ($details->{datemode} eq 'shift') {
                   $details->{dateshift} = $env{'form.colldateshift'};
               } else {
                   $details->{dateshift} = '';
               }
           } elsif (($reqtype eq 'textbook') || ($reqtype eq 'template')) {
               $details->{datemode} = 'delete';
               $details->{dateshift} = '';
           }
           if ($details->{dateshift} ne '') {
               $details->{dateshift} =~ s/[^\d\.]+//g;
           }
       } else {
           $details->{datemode} = '';
           $details->{dateshift} = '';
       }
       my $lonhost = $r->dir_config('lonHostID');
       $r->rflush();
       my ($result,$output,$customized) = &process_request($r,$lonhost,$dom,$cnum,$crstype,$now,$details,
                                                           '',$req_notifylist,[],$domconfig);
       $r->print($output);
       if ($crstype eq 'lti') {
           my %consumers = &Apache::lonnet::get_dom('lticonsumers',[$env{'form.sourcecrs'}],$dom);
           if (($env{'form.lti.sourcecrs'} ne '')  && ($consumers{$env{'form.lti.sourcecrs'}} eq '') && ($cnum ne '')) {
               &Apache::lonnet::put_dom('lticonsumers',{ $env{'form.lti.sourcecrs'} => $cnum },$dom);
           }
       } elsif (&Apache::loncoursequeueadmin::author_prompt()) {
           unless ($customized) {
               &print_author_prompt($r,$action,$cnum,$dom,$crstype,$result);
           }
       } elsif ($result eq 'created') {
           unless ($customized) {
               $r->print('<p><a href="/adm/requestcourse">'.&mt('Create another course').'</a></p>');
           }
       }
       unless ($crstype eq 'lti') {
           &endContentScreen($r);
       }
       $r->print(&Apache::loncommon::end_page());
   }
   
   sub textbook_request_javascript {
       my ($numprefab,$numcurrent,$numcolleague,$customvalidationjs) = @_;
       return unless (ref($numprefab) eq 'HASH');
       return if (!$numprefab->{'textbooks'} && !$numprefab->{'templates'} && !$numcurrent && !$numcolleague);
       my %js_lt = &Apache::lonlocal::texthash(
                    choose    => 'Please select a content option.',
                    textbook  => 'Please select a textbook, or choose a different option.',
                    template  => 'Please select a template, or choose a different option.',        
                    existing  => 'Please select one of your existing courses to copy, or choose a different option.',
                    colleague => "Please select a colleague's course to copy, or choose a different option.", 
                    title     => 'Please enter a course title.',
                );
       &js_escape(\%js_lt);
       return <<"ENDSCRIPT";
   function cloneChoice() {
       if (document.requestcourse.cloning) {
           var radioLength = document.requestcourse.cloning.length;
           if (radioLength == undefined) {
               var val = document.requestcourse.cloning.value;
               if ((val == 'textbook') || (val == 'template') || (val == 'existing') || (val == 'colleague')) {
                   var elem = document.getElementById('show'+val);
                   if (document.requestcourse.cloning.checked) {
                       elem.style.display = 'block';
                   } else {
                       uncheckRadio(val);
                       elem.style.display = 'none';
                   }
               }
           } else {
               for (var i=0; i<radioLength; i++) {
                   var val = document.requestcourse.cloning[i].value;
                   if ((val == 'textbook') || (val == 'template') || (val == 'existing') || (val == 'colleague')) {
                       var elem = document.getElementById('show'+val);
                       if (document.requestcourse.cloning[i].checked) {
                           elem.style.display = 'block';
                       }  else {
                           if (val == 'textbook') {
                               uncheckRadio('book');
                           }
                           if (val == 'template') {
                               uncheckRadio('template');
                           }
                           if (val == 'existing') {
                               uncheckRadio('owned');
                           }
                           if (val == 'colleague') {
                               uncheckRadio('colleague');
                           }
                           elem.style.display = 'none';
                       }
                   }
               }
           }
       }
       return;
   }
   
   function uncheckRadio(radioGroupName) {
       var group = document.getElementsByName(radioGroupName);
       var radioLength = group.length;
       if (radioLength == undefined) {
           group.checked = false;
       } else {
           for (var i=0; i<radioLength; i++) {
               group[i].checked = false;
           }
       }
       return;
   }
   
   function uncheckAllRadio() {
       uncheckRadio('cloning');
       var numbook = $numprefab->{'textbooks'};
       var numtemplate = $numprefab->{'templates'};
       var numcurrent = $numcurrent;
       var numcolleague = $numcolleague;
       if (numbook > 0) {
           uncheckRadio('textbook'); 
       }
       if (numtemplate > 0) {
           uncheckRadio('template');
       }
       if (numcurrent > 0) {
           uncheckRadio('existing');
       }
       if (numcolleague > 0) {
           uncheckRadio('colleague');
       }
       return;
   }
   
   function validTextbookReq() {
       if (document.requestcourse.cloning) {
           var cloneChoice = 0;
           var radioLength = document.requestcourse.cloning.length;
           if (radioLength == undefined) {
               if (document.requestcourse.cloning.checked == false) {
                   alert("$js_lt{'choose'}");
                   return false;
               } else {
                   cloneChoice = document.requestcourse.cloning.value;
               }
           } else {
               for (var i=0; i<radioLength; i++) {
                   if (document.requestcourse.cloning[i].checked) {
                       cloneChoice = document.requestcourse.cloning[i].value;
                       break;
                   }
               }
               if (cloneChoice == 0) {
                   alert("$js_lt{'choose'}");
                   return false;
               }
           }
           var group;
           if ((cloneChoice == 'textbook') || (cloneChoice == 'template') || (cloneChoice == 'existing') || (cloneChoice == 'colleague')) {
               var group;
               if (cloneChoice == 'textbook') {
                   group = document.getElementsByName('book');
               } else {
                   if (cloneChoice == 'template') {
                       group = document.getElementsByName('template');
                   } else {
                       if (cloneChoice == 'existing') {
                           group = document.getElementsByName('owned');
                       } else {
                           group = document.getElementsByName('colleague');
                       }
                   }
               }
               var groupLength = group.length;
               var chosen = 0;
               if (groupLength == undefined) {
                   if (group.checked) {
                       chosen = 1;
                   }
               } else {
                   for (var j=0; j<groupLength; j++) {
                       if (group[j].checked) {
                           chosen = 1;
                           break;
                       }
                   }
              }
              if (chosen == 0) {
                  if (cloneChoice == 'textbook') {
                      alert("$js_lt{'textbook'}");
                  } else {
                      if (cloneChoice == 'template') {
                          alert("$js_lt{'template'}");
                      } else {
                          if (cloneChoice == 'existing') {
                              alert("$js_lt{'existing'}");
                          } else {
                              alert("$js_lt{'colleague'}");
                          }
                      }
                  }
                  return false;
               }
           }
       }
       if (document.requestcourse.cdescr.value == '') {
           alert("$js_lt{'title'}");
           return false;
       }
       $customvalidationjs
       return true;
   }
    
   ENDSCRIPT
   
   }
   
   sub textbook_request_disabled {
       my ($r,$dom,$action,$can_request) = @_;
       if (ref($can_request) eq 'HASH') {
           if ($action eq 'process') {
               unless ((scalar(keys(%{$can_request})) == 1)) {
                   &Apache::lonhtmlcommon::add_breadcrumb(
                      { href => '/adm/requestcourse',
                        text => 'Pick action',
                      });
               }
           }
       }
       $r->print(&header('Course Request'));
       &Apache::lonhtmlcommon::add_breadcrumb({text=>'Course Request'});
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests').
                 '<div>'.
                 '<p class="LC_info">'.&mt('You do not have privileges to request creation of textbook courses.').'</p>');
       if (ref($can_request) eq 'HASH') {
           if (scalar(keys(%{$can_request})) > 1) {
               $r->print('<a href="/adm/requestcourse">'.&mt('Go back').'</a>');
            }
       }
       $r->print('</div>'.
                 &Apache::loncommon::end_page());
       return;
   }
   
   sub startContentScreen {
       my ($r,$mode)=@_;
       $r->print("\n".'<ul class="LC_TabContentBigger" id="textbookreq">'."\n");
       $r->print('<li'.(($mode eq 'textbookrequests')?' class="active"':'').'><a href="/adm/requestcourse"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Request a Course').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n");
       $r->print('<li'.(($mode eq 'textbooklogs')?' class="active"':'').'><a href="/adm/requestcourse?action=log&amp;crstype=textbook&amp;tabs=on"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Course Request History').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n");
       $r->print("\n".'</ul>'."\n");
       $r->print('<div class="LC_Box" style="clear:both;margin:0;"><div id="mainbox" style="margin:0 0;padding:0 0;"><div class="LC_ContentBox" id="maincontentbox" style="display: block;">');
   }
   
   sub endContentScreen {
      my ($r)=@_;
      $r->print('</div></div></div>');
   }
      
 1;  1;
   

Removed from v.1.29  
changed lines
  Added in v.1.104


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.