Diff for /loncom/interface/lonrequestcourse.pm between versions 1.50 and 1.77

version 1.50, 2010/03/30 16:08:10 version 1.77, 2014/04/09 10:50:07
Line 128  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','crstype','queue']);          ['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 '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,\%can_request);
                   }
               } else {
                   if ($can_request{'textbook'}) {
                       &print_textbook_form($r,$dom,\@incdoms,\%domdefs,$domconfig{'requestcourses'},\%can_request);
                   } else {
                       &textbook_request_disabled($r,$dom,\%can_request);
                   }
               }
               return OK;
           }
       }
   
     $states{'display'} = ['details'];      $states{'display'} = ['details'];
     $states{'view'} = ['pick_request','details','cancel','removal'];      $states{'view'} = ['pick_request','details','cancel','removal'];
Line 147  sub handler { Line 196  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 155  sub handler { Line 210  sub handler {
   
     my @invalidcrosslist;      my @invalidcrosslist;
     my %trail = (      my %trail = (
                  crstype       => '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',
Line 173  sub handler { Line 229  sub handler {
         $trail{'enrollment'} = 'Enrollment';          $trail{'enrollment'} = 'Enrollment';
     }      }
   
     my ($page,$crumb,$newinstcode,$codechk,$checkedcode,$description) =       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))) {          if (($dom eq $env{'request.role.domain'}) && (&Apache::lonnet::allowed('ccc',$dom))) {
Line 262  sub handler { Line 318  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 '')) {
Line 288  sub handler { Line 344  sub handler {
   
     my $loaditems = &onload_action($action,$state);      my $loaditems = &onload_action($action,$state);
   
     my (%can_request,%request_domains);  
     my $canreq =   
         &Apache::lonnet::check_can_request($dom,\%can_request,\%request_domains);  
     if ($action eq 'new') {      if ($action eq 'new') {
         if ($canreq) {          if ($canreq) {
             if ($state eq 'crstype') {              if ($state eq 'crstype') {
                 &print_main_menu($r,\%can_request,\%states,$dom,$jscript,$loaditems,                  &print_main_menu($r,\%can_request,\%states,$dom,$jscript,$loaditems,
                                  $crumb,\%request_domains);                                   $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,$description,                                          $codechk,$checkedcode,$description,
                                         \@invalidcrosslist);                                          $showcredits,$instcredits,\@invalidcrosslist);
             }              }
         } else {          } else {
             $r->print(&header('Course/Community Requests').$crumb.              $r->print(&header('Course/Community Requests').$crumb.
Line 310  sub handler { Line 363  sub handler {
         }          }
     } 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,$loaditems,$crumb,\%request_domains);              &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 '') {
Line 324  sub handler { Line 377  sub handler {
                       &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') {
         if ($state eq 'crstype') {          if ($state eq 'crstype') {
             &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\%request_domains);              &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\@incdoms);
         } else {          } else {
             $jscript .= <<ENDJS;              $jscript .= <<ENDJS;
   
Line 343  function setPage(formname) { Line 397  function setPage(formname) {
 }  }
   
 ENDJS  ENDJS
             &print_request_logs($r,$dom,$jscript,$loaditems,$crumb);              &print_request_logs($r,$dom,$jscript,$loaditems,$crumb,\%can_request);
         }          }
     } else {      } else {
         &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\%request_domains);          &print_main_menu($r,\%can_request,\%states,$dom,$jscript,'',$crumb,\@incdoms);
     }      }
     return OK;      return OK;
 }  }
Line 439  sub get_breadcrumbs { Line 493  sub get_breadcrumbs {
                     $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course/Community Requests','Course_Requests');                      $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course/Community Requests','Course_Requests');
                     last;                      last;
                 } else {                  } else {
                     if (($$state eq 'process') || ($$state eq 'removal')) {                      if (($$state eq 'process') || ($$state eq 'removal') || ($$state eq 'reqauthor')) {
                         &Apache::lonhtmlcommon::add_breadcrumb(                          &Apache::lonhtmlcommon::add_breadcrumb(
                             { href => '/adm/requestcourse',                              { href => '/adm/requestcourse',
                               text => "$trail->{$states->{$action}[$i]}",                                text => "$trail->{$states->{$action}[$i]}",
Line 488  sub header { Line 542  sub header {
 }  }
   
 sub form_elements {  sub form_elements {
     my ($dom) = @_;      my ($dom,$showcredits) = @_;
       my $instcredits;
     my %elements =      my %elements =
     (      (
         new => {          new => {
Line 556  sub form_elements { Line 611  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 572  sub form_elements { Line 626  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} = 'radio';              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 587  sub form_elements { Line 668  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 625  sub form_elements { Line 705  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 {
Line 645  sub onload_action { Line 725  sub onload_action {
 }  }
   
 sub print_main_menu {  sub print_main_menu {
     my ($r,$can_request,$states,$dom,$jscript,$loaditems,$crumb,$request_domains) = @_;      my ($r,$can_request,$states,$dom,$jscript,$loaditems,$crumb,$incdoms) = @_;
     my ($types,$typename) = &Apache::loncommon::course_types();      my ($types,$typename) = &Apache::loncommon::course_types();
     my $onchange;      my $onchange = 'this.form.submit()';
     unless ($env{'form.interface'} eq 'textual') {  
         $onchange = 'this.form.submit()';  
     }  
   
     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 687  $nextstate_setter Line 763  $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 = '';
 END  END
     if (ref($can_request) eq 'HASH') {      if (ref($can_request) eq 'HASH') {
         foreach my $item (keys(%{$can_request})) {          foreach my $item (keys(%{$can_request})) {
Line 699  END Line 776  END
     my %lt = &Apache::lonlocal::texthash(      my %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',
           all => 'You must choose a specific course type when making a new course request.',
           allt => '"All types" is not allowed.',
     );       ); 
     $js .= <<END;      $js .= <<END;
     if (crschoice == 'official') {      if (crschoice == 'official') {
Line 721  END Line 800  END
                     return false;                      return false;
                 }                  }
             } else {              } else {
                 if (actionchoice == 'new') {                  if (crschoice == 'textbook') {
                     alert("$lt{'all'}");                      if (textbook != 1) {
                     return false;                          alert("$lt{'community'}");
                 }                                         return false;
                       }
                   } else {
                       if (actionchoice == 'new') {
                           alert('$lt{'all'}'+'\\n'+'$lt{'allt'}');
                           return false;
                       }
                   }
             }              }
         }          }
     }      }
     return true;      return true;
 }  }
 END  END
     my ($pagetitle,$pageinfo,$domaintitle);      my ($pagetitle,$pageinfo,$domaintitle,$earlyout);
     if (ref($can_request) eq 'HASH') {      if (ref($can_request) eq 'HASH') {
         if (($can_request->{'official'}) || ($can_request->{'unofficial'})) {          if (($can_request->{'official'}) || ($can_request->{'unofficial'}) || $can_request->{'textbook'}) {
             if ($can_request->{'community'}) {              if ($can_request->{'community'}) {
                 $pagetitle = 'Course/Community Requests';                  $pagetitle = 'Course/Community Requests';
                 $pageinfo = &mt('Request creation of a new course or community, or review your pending requests.');                  $pageinfo = &mt('Request creation of a new course or community, or review your pending requests.');
Line 747  END Line 833  END
             $pagetitle = 'Community Requests';              $pagetitle = 'Community Requests';
             $pageinfo = &mt('Request creation of a new course, or review your pending requests.');              $pageinfo = &mt('Request creation of a new course, or review your pending requests.');
             $domaintitle = &mt('Community Domain');              $domaintitle = &mt('Community Domain');
         } else {          } elsif ((ref($incdoms) eq 'ARRAY') && ((@{$incdoms} > 1) ||
                    ((@{$incdoms} == 1) && ($incdoms->[0] ne $dom)))) {
             $pagetitle = 'Course/Community Requests';              $pagetitle = 'Course/Community Requests';
             $pageinfo = &mt('You do not have rights to request creation of courses in this domain; please choose a different domain.');              $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');              $domaintitle = &mt('Course/Community Domain');
         }          } else {
     }              $pagetitle = 'Course/Community Requests';
     my @incdoms;              $pageinfo  = &mt('You do not have rights to request creation of courses or communities.');
     if (ref($request_domains) eq 'HASH') {              $earlyout = 1;
         foreach my $item (keys(%{$request_domains})) {  
             if (ref($request_domains->{$item}) eq 'ARRAY') {  
                 foreach my $possdom (@{$request_domains->{$item}}) {  
                     unless(grep(/^\Q$possdom\E$/,@incdoms)) {  
                         push(@incdoms,$possdom);  
                     }   
                 }   
             }  
         }          }
     }      }
     $r->print(&header($pagetitle,$js.$jscript,$loaditems).$crumb.      $r->print(&header($pagetitle,$js.$jscript,$loaditems).$crumb.
              '<p>'.$pageinfo.'</p>'.               '<p>'.$pageinfo.'</p>');
              '<div>'.      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($domaintitle).                &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,\@incdoms));                &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)) {      unless ((ref($can_request) eq 'HASH') && (keys(%{$can_request}) > 0)) {
         $r->print(&Apache::lonhtmlcommon::row_closure(1)."\n".          $r->print('</form>'.&Apache::lonhtmlcommon::row_closure(1)."\n".
                   &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n".                    &Apache::lonhtmlcommon::end_pick_box().'</div>'."\n".
                   &Apache::loncommon::end_page());                    &Apache::loncommon::end_page());
         return;          return;
Line 835  END Line 918  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,$description,$invalidcrosslist,          $newinstcode,$codechk,$checkedcode,$description,$showcredits,
         $uname,$udom) = @_;          $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 860  END Line 943  END
     }      }
     if ($action eq 'new') {      if ($action eq 'new') {
         my $jsextra;          my $jsextra;
         if ($state eq 'courseinfo') {          if (($state eq 'courseinfo') || ($state eq 'codepick')) {
             $jsextra = "\n".&Apache::loncommon::coursebrowser_javascript($dom);              $jsextra = "\n".&Apache::loncommon::coursebrowser_javascript($dom);
         } elsif ($state eq 'enrollment') {          } elsif ($state eq 'enrollment') {
             if (($env{'form.crstype'} eq 'official') &&               if (($env{'form.crstype'} eq 'official') && 
Line 878  END Line 961  END
         }          }
         $r->print(&header($title,$js.$jscript,$loaditems,$jsextra).$crumb);          $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,$description,$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 909  END Line 993  END
                 $title = &mt('Pending requests for official courses');                  $title = &mt('Pending requests for official courses');
             } elsif ($env{'form.crstype'} eq 'unofficial') {              } elsif ($env{'form.crstype'} eq 'unofficial') {
                 $title = &mt('Pending requests for unofficial courses');                  $title = &mt('Pending requests for unofficial courses');
               } elsif ($env{'form.crstype'} eq 'textbook') {
                   $title = &mt('Pending requests for textbook courses');
             } else {              } else {
                 $title = &mt('Pending course/community requests');                   $title = &mt('Pending course/community requests'); 
             }              }
Line 932  END Line 1018  END
             }              }
             $r->print('<h3>'.$title.'</h3><div>'."\n".$form."\n".              $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 956  END Line 1043  END
             my ($result,$output) = &print_cancel_request($dom,$env{'form.origcnum'});              my ($result,$output) = &print_cancel_request($dom,$env{'form.origcnum'});
             $r->print('<h3>'.$title.'</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',
Line 1033  END Line 1121  END
         $r->print(&header($title,'','','',{ 'only_body' => 1}).          $r->print(&header($title,'','','',{ 'only_body' => 1}).
                   $crumb."\n".'<h3>'.$header.'</h3>'.                    $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());
     }      }
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
Line 1227  sub get_instcode { Line 1316  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,
         $description,$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 1300  sub print_request_form { Line 1389  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') {
Line 1326  sub print_request_form { Line 1415  sub print_request_form {
                             }                              }
                             if ($skipuser) {                              if ($skipuser) {
                                 push(@disallowed,$i);                                  push(@disallowed,$i);
                                 $disallowmsg{$i} = &mt('[_1] was excluded because new users need be from the course domain','<tt>'.$personname.':'.$persondom.'</tt>');                                  $disallowmsg{$i} = &mt('[_1] was excluded because new users need to be from the course domain','<tt>'.$personname.':'.$persondom.'</tt>');
                                 next;                                  next;
                             }                              }
                         }                          }
                         if (&get_cancreate_status($persondom,$personname,$dom)) {                          my $usertype = &get_usertype($persondom,$personname,\%curr_rules,\%got_rules);
                             my ($allowed,$msg) =                           if (&Apache::lonuserutils::can_create_user($dom,'requestcrs',$usertype)) {
                               my ($allowed,$msg,$authtype,$authparam) = 
                                 &check_newuser_rules($persondom,$personname,                                  &check_newuser_rules($persondom,$personname,
                                     \%alerts,\%rulematch,\%inst_results,                                      \%alerts,\%rulematch,\%inst_results,
                                     \%curr_rules,\%got_rules);                                      \%curr_rules,\%got_rules);
                             if ($allowed) {                              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 (ref($inst_results{$personname.':'.$persondom}) eq 'HASH') {
                                     if ($inst_results{$personname.':'.$persondom}{'lastname'} ne '') {                                      if ($inst_results{$personname.':'.$persondom}{'lastname'} ne '') {
                                         $env{'form.person_'.$i.'_lastname'} = $inst_results{$personname.':'.$persondom}{'lastname'};                                          $env{'form.person_'.$i.'_lastname'} = $inst_results{$personname.':'.$persondom}{'lastname'};
Line 1394  sub print_request_form { Line 1505  sub print_request_form {
         } else {          } else {
             $r->print('<h3>'.&mt('Review course request details before submission').'</h3>');              $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).          $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.'" />');
           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') {          if ($crstype eq 'community') {
             $navtxt{'next'} = &mt('Submit community request');              $navtxt{'next'} = &mt('Submit community request');
         } else {          } else {
Line 1407  sub print_request_form { Line 1527  sub print_request_form {
                                                      \%cat_order,\@code_order);                                                       \%cat_order,\@code_order);
         }          }
         my ($storeresult,$result) = &print_request_outcome($dom,\@codetitles,          my ($storeresult,$result) = &print_request_outcome($dom,\@codetitles,
                                                            \@code_order);                                                             \@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()) {
                   &print_author_prompt($r,$env{'form.action'},$env{'form.cnum'},$env{'form.showdom'},
                                        $env{'form.crstype'},$storeresult);
               } elsif ($storeresult eq 'created') {
                   $r->print('<p><a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>');
               }
           }
       } 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';
             }              }
             $r->print('<a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>');              my $showrole = &Apache::lonnet::plaintext($role,$type);
             return;              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');
     }      }
Line 1446  sub print_request_form { Line 1607  sub print_request_form {
                 $count ++;                  $count ++;
             }              }
             $env{'form.persontotal'} = $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,$dom,$formname,$prev,$navtxt{'prev'},$next,  
                         $navtxt{'next'},$state);  
     return;      return;
 }  }
   
 sub get_cancreate_status {  sub print_author_prompt {
     my ($persondom,$personname,$dom) = @_;      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) =      my ($rules,$ruleorder) =
         &Apache::lonnet::inst_userrules($persondom,'username');          &Apache::lonnet::inst_userrules($persondom,'username');
     my $usertype = &Apache::lonuserutils::check_usertype($persondom,$personname,      my $usertype = &Apache::lonuserutils::check_usertype($persondom,$personname,
                                                          $rules);                                                           $rules,$curr_rules,$got_rules);
     return &Apache::lonuserutils::can_create_user($dom,'requestcrs',$usertype);      return $usertype;
 }  }
   
 sub check_newuser_rules {  sub check_newuser_rules {
Line 1472  sub check_newuser_rules { Line 1659  sub check_newuser_rules {
         $got_rules) = @_;          $got_rules) = @_;
     my $allowed = 1;      my $allowed = 1;
     my $newuser = 1;      my $newuser = 1;
     my ($checkhash,$userchkmsg);      my ($checkhash,$userchkmsg,$authtype,$authparam);
     my $checks = { 'username' => 1 };      my $checks = { 'username' => 1 };
     $checkhash->{$personname.':'.$persondom} = { 'newuser' => $newuser };      $checkhash->{$personname.':'.$persondom} = { 'newuser' => $newuser };
     &Apache::loncommon::user_rule_check($checkhash,$checks,$alerts,$rulematch,      &Apache::loncommon::user_rule_check($checkhash,$checks,$alerts,$rulematch,
Line 1494  sub check_newuser_rules { Line 1681  sub check_newuser_rules {
             }              }
         }          }
     }      }
     return ($allowed,$userchkmsg);      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 1527  sub get_excluded_elements { Line 1730  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,$hasauto);      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 1540  sub print_enrollment_menu { Line 1744  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>'.&Apache::loncommon::help_open_topic('Course_Request_Sections').                              '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Sections').
Line 1571  sub print_enrollment_menu { Line 1803  sub print_enrollment_menu {
                     ' 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;
             }              }
Line 1592  sub print_enrollment_menu { Line 1824  sub print_enrollment_menu {
                 &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',                  &date_setting_table($starttime,$endtime,$formname,'enroll',
                                     $hasauto,%enrolltitles);                                      $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',$hasauto,          &date_setting_table($starttime,$endtime,$formname,'access',$hasauto,
                             %accesstitles);                              $hascredits,%accesstitles);
     $output .= &Apache::lonhtmlcommon::start_pick_box();      $output .= &Apache::lonhtmlcommon::start_pick_box();
     if ($sections) {      if ($sections) {
         $output .=  $sections;          $output .=  $sections;
Line 1616  sub print_enrollment_menu { Line 1865  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 1681  sub inst_section_selector { Line 1938  sub inst_section_selector {
 }  }
   
 sub date_setting_table {  sub date_setting_table {
     my ($starttime,$endtime,$formname,$prefix,$hasauto,%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 1692  sub date_setting_table { Line 1949  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';
           }
     }      }
   
     my %help_item = (      my %help_item = (
Line 1782  sub print_personnel_menu { Line 2041  sub print_personnel_menu {
             official => 'Requestor is automatically assigned Course Coordinator role.',              official => 'Requestor is automatically assigned Course Coordinator role.',
         );          );
         $lt{'unofficial'} = $lt{'official'};          $lt{'unofficial'} = $lt{'official'};
           $lt{'textbook'} = $lt{'textbook'};
         $output .= &Apache::lonhtmlcommon::row_headline().          $output .= &Apache::lonhtmlcommon::row_headline().
                   '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Personnel').'&nbsp;'.$lt{$crstype}.' '.&mt('Include other personnel?').'</h3>';                    '<h3>'.&Apache::loncommon::help_open_topic('Course_Request_Personnel').'&nbsp;'.$lt{$crstype}.' '.&mt('Include other personnel?').'</h3>';
     }      }
Line 1899  sub sorted_request_history { Line 2159  sub sorted_request_history {
             my $crstype = $history{'crstype'};              my $crstype = $history{'crstype'};
             my $disposition = $history{'disposition'};              my $disposition = $history{'disposition'};
             my $status = $history{'status'};              my $status = $history{'status'};
               my $uniquecode = $history{'code'}; 
             if ($action eq 'view') {              if ($action eq 'view') {
                 next if ((exists($history{'status'})) && ($history{'status'} eq 'created'));                  next if ((exists($history{'status'})) && ($history{'status'} eq 'created'));
             } else {              } else {
Line 1914  sub sorted_request_history { Line 2175  sub sorted_request_history {
                 $entry = $requestkey.':'.$crstype.':'.                  $entry = $requestkey.':'.$crstype.':'.
                          &escape($history{'details'}{'cdescr'});                           &escape($history{'details'}{'cdescr'});
                 if ($action eq 'log') {                  if ($action eq 'log') {
                     $entry .= ':'.$lastupdate.':';                      $entry .= ':'.$uniquecode.':'.$lastupdate.':';
                     if ($statusinfo{$key} ne '') {                      if ($statusinfo{$key} ne '') {
                         $entry .= $statusinfo{$key};                          $entry .= $statusinfo{$key};
                     } elsif ($status ne '') {                      } elsif ($status ne '') {
Line 2112  ENDJS Line 2373  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.');
     return << "ENDJS";      return << "ENDJS";
 function nextPage(formname,nextstate) {  function nextPage(formname,nextstate) {
     if (confirm('$alert')) {      if (confirm('$alert')) {
Line 2127  ENDJS Line 2388  ENDJS
 }  }
   
 sub print_request_logs {  sub print_request_logs {
     my ($r,$dom,$jscript,$loaditems,$crumb) = @_;      my ($r,$dom,$jscript,$loaditems,$crumb,$usetabs) = @_;
     my $title;      my $title;
     if ($env{'form.crstype'} eq 'community') {      if ($env{'form.crstype'} eq 'community') {
         $title = 'Community Request Logs';          $title = 'Community Request Logs';
Line 2137  sub print_request_logs { Line 2398  sub print_request_logs {
         $title = 'Course Request Logs';          $title = 'Course Request Logs';
     }      }
     $r->print(&header($title,$jscript,$loaditems).$crumb);      $r->print(&header($title,$jscript,$loaditems).$crumb);
       if ($usetabs) {
           &startContentScreen($r,'textbooklogs');
       }
     my $formname = 'requestcrs';      my $formname = 'requestcrs';
     $r->print('<form action="/adm/requestcourse" method="post" name="'.$formname.'" onsubmit="javascript:setPage(this);">'."\n".      $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="action" value="log" />'."\n".
Line 2181  sub print_request_logs { Line 2445  sub print_request_logs {
     if (($curr{'crstype'} eq 'official') || ($curr{'crstype'} eq 'any')) {      if (($curr{'crstype'} eq 'official') || ($curr{'crstype'} eq 'any')) {
         $tablehdr .= '<th>'.&mt('Institutional Code').'</th>';          $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);
                       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') {      if ($curr{'status'} eq 'any') {
         $tablehdr .= '<th>'.&mt('Status').'</th>';          $tablehdr .= '<th>'.&mt('Status').'</th>';
     } elsif ($curr{'status'} eq 'created') {      } elsif ($curr{'status'} eq 'created') {
Line 2218  sub print_request_logs { Line 2504  sub print_request_logs {
             my $showtime = &Apache::lonlocal::locallocaltime($item);              my $showtime = &Apache::lonlocal::locallocaltime($item);
             if (ref($queue_by_date{$item}) eq 'ARRAY') {              if (ref($queue_by_date{$item}) eq 'ARRAY') {
                 foreach my $request (sort(@{$queue_by_date{$item}})) {                  foreach my $request (sort(@{$queue_by_date{$item}})) {
                     my ($key,$crstype,$desc,$timestamp,$status,$instcode) = split(':',$request);                      my ($key,$crstype,$desc,$uniquecode,$timestamp,$status,$instcode) = split(':',$request);
                     my ($cdom,$cnum) = split('_',$key);                      my ($cdom,$cnum) = split('_',$key);
                     my $output = &Apache::loncommon::start_data_table_row().                      my $output = &Apache::loncommon::start_data_table_row().
      '<td>'.$count.'</td>'.       '<td>'.$count.'</td>'.
Line 2244  sub print_request_logs { Line 2530  sub print_request_logs {
                         }                          }
                         $output .= '<td>'.$showinstcode.'</td>';                          $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') {                      if ($curr{'status'} eq 'any') {
                         my $statusname = &mt('Unknown status');                          my $statusname = &mt('Unknown status');
                         if (ref($statusnames) eq 'HASH') {                          if (ref($statusnames) eq 'HASH') {
Line 2304  ENDSCRIPT Line 2597  ENDSCRIPT
                   &mt('There are no records to display').                    &mt('There are no records to display').
                   '</p>');                    '</p>');
     }      }
     $r->print('</form>'.      if ($usetabs) {
               &Apache::loncommon::end_page());          $r->print('<input type="hidden" name="tabs" value="on" />');
       }
       $r->print('</form>');
       if ($usetabs) {
           &endContentScreen($r);
       }
       $r->print(&Apache::loncommon::end_page());
     return;      return;
 }  }
   
Line 2320  sub reqstatus_names { Line 2619  sub reqstatus_names {
                         rejected  => 'Request rejected',                          rejected  => 'Request rejected',
                         cancelled => 'Request cancelled',                          cancelled => 'Request cancelled',
             );              );
     if (($crstype eq 'official') || ($crstype eq 'unofficial')) {      if (($crstype eq 'official') || ($crstype eq 'unofficial') || ($crstype eq 'textbook')) {
         $statusnames{'created'} = &mt('Course created');          $statusnames{'created'} = &mt('Course created');
     } elsif ($crstype eq 'community') {      } elsif ($crstype eq 'community') {
         $statusnames{'created'} = &mt('Community created');          $statusnames{'created'} = &mt('Community created');
Line 2414  sub requestlog_display_filter { Line 2713  sub requestlog_display_filter {
   
 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,
         $disallowed,$disallowmsg) = @_;          $disallowed,$disallowmsg,$instcredits) = @_;
     my ($types,$typename) = &Apache::loncommon::course_types();      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 '') {
Line 2462  sub print_review { Line 2761  sub print_review {
                 }                  }
             }              }
         }          }
           $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 2531  sub print_review { Line 2836  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();
Line 2538  sub print_review { Line 2846  sub print_review {
     if (($env{'form.cloning'}) &&      if (($env{'form.cloning'}) &&
         ($env{'form.clonecrs'} =~ /^$match_name$/) &&           ($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'});                             $env{'form.crstype'});
         if ($canclone) {          if ($canclone) {
             my %courseenv = &Apache::lonnet::userenvironment($env{'form.clonedom'},              my %courseenv = &Apache::lonnet::userenvironment($env{'form.clonedom'},
Line 2707  sub courseinfo_form { Line 3015  sub courseinfo_form {
                 community => 'You must provide a (brief) community description.'                  community => 'You must provide a (brief) community description.'
              );               );
     $lt{'unofficial'} = $lt{'official'};      $lt{'unofficial'} = $lt{'official'};
       $lt{'textbook'} = $lt{'official'};
     my $js_validate = <<"ENDJS";      my $js_validate = <<"ENDJS";
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA['  // <![CDATA['
Line 2787  sub clone_form { Line 3096  sub clone_form {
     if ($crstype eq 'community') {      if ($crstype eq 'community') {
         $type = 'Community';          $type = 'Community';
     }      }
     my $cloneform = &Apache::loncommon::select_dom_form($dom,'clonedom').'&nbsp;'.  
                     &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{'cid'}).'<label>'.  
         '<input type="text" size="25" name="clonecrs" value=""  />'.  
         '</label>'.&Apache::lonhtmlcommon::row_closure(1).  
         &Apache::lonhtmlcommon::row_title($lt{'dmn'}).'<label>'.          &Apache::lonhtmlcommon::row_title($lt{'dmn'}).'<label>'.
         $cloneform.'</label>'.&Apache::lonhtmlcommon::row_closure(1).          &Apache::loncommon::select_dom_form($dom,'clonedom').'</label>'.
           &Apache::lonhtmlcommon::row_closure(1).
           &Apache::lonhtmlcommon::row_title($lt{'cid'}).'<label>'.
           '<input type="text" size="25" name="clonecrs" value="" onfocus="this.blur();opencrsbrowser('."'$formname','clonecrs','clonedom','','','','','$type'".')" />'.
           '</label>&nbsp;'.
           &Apache::loncommon::selectcourse_link($formname,'clonecrs','clonedom','','','',$type).
           &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 2828  sub coursecode_form { Line 3138  sub coursecode_form {
                    );                     );
     my %helpitem = (       my %helpitem = ( 
                      instcode => 'Course_Request_Category',                       instcode => 'Course_Request_Category',
                      crosslist => 'Course_Request_Crosslist',  
                    );                     );
     if ((ref($codetitles) eq 'ARRAY') && (ref($cat_titles) eq 'HASH') &&       if ((ref($codetitles) eq 'ARRAY') && (ref($cat_titles) eq 'HASH') && 
         (ref($cat_order))) {          (ref($cat_order))) {
Line 2845  sub coursecode_form { Line 3154  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(&Apache::loncommon::help_open_topic($helpitem{$context}).'&nbsp;'.$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 2910  sub coursecode_form { Line 3223  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 3002  sub display_navbuttons { Line 3335  sub display_navbuttons {
 }  }
   
 sub print_request_outcome {  sub print_request_outcome {
     my ($dom,$codetitles,$code_order) = @_;      my ($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 3012  sub print_request_outcome { Line 3346  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';      my $ccrole = 'cc';
     if ($crstype eq 'community') {      if ($crstype eq 'community') {
         $ccrole = 'co';          $ccrole = 'co';
Line 3039  sub print_request_outcome { Line 3375  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 3064  sub print_request_outcome { Line 3404  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 3075  sub print_request_outcome { Line 3416  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 3120  sub print_request_outcome { Line 3511  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 3127  sub print_request_outcome { Line 3523  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.cloning'}) &&      if (($env{'form.cloning'}) &&
Line 3163  sub print_request_outcome { Line 3562  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 3179  sub print_request_outcome { Line 3580  sub print_request_outcome {
                     accessend      => $accessend,                      accessend      => $accessend,
                     personnel      => \%personnel,                      personnel      => \%personnel,
                   };                    };
     my (@inststatuses,$storeresult,$creationresult);      my ($result,$output) = &process_request($dom,$cnum,$crstype,$now,$details,$instcode,
                                               $req_notifylist,\@instsections,\%domconfig);
       return ($result,$output);
   }
       
   sub process_request {
       my ($dom,$cnum,$crstype,$now,$details,$instcode,$req_notifylist,$instsections,$domconfig) = @_; 
       my (@inststatuses,$storeresult,$creationresult,$output);
     my $val =       my $val = 
         &Apache::loncoursequeueadmin::get_processtype($env{'user.name'},$env{'user.domain'},          &Apache::loncoursequeueadmin::get_processtype('course',$env{'user.name'},
             $env{'user.adv'},$dom,$crstype,\@inststatuses,\%domconfig);                                                        $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 3190  sub print_request_outcome { Line 3599  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');
         } else {          } else {
             $output = &mt('Unrecognized course type: [_1]',$crstype);              $output = &mt('Unrecognized course type: [_1]',$crstype);
         }          }
Line 3215  sub print_request_outcome { Line 3626  sub print_request_outcome {
                 $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});
                   }
             }              }
             $validationchk =               $validationchk = 
                 &Apache::lonnet::auto_courserequest_validation($dom,                  &Apache::lonnet::auto_courserequest_validation($dom,
Line 3238  sub print_request_outcome { Line 3651  sub print_request_outcome {
         }          }
         $reqhash{'disposition'} = $disposition;          $reqhash{'disposition'} = $disposition;
         $reqstatus = $disposition;          $reqstatus = $disposition;
         my ($modified,$queued);          my ($modified,$queued,$coursedesc,%customitems);
           unless ($disposition eq 'rejected') {
               if (ref($details) eq 'HASH') {
                   $coursedesc = $details->{'cdescr'};
               }
               my $fullname = &Apache::loncommon::plainname($env{'user.name'},
                                                            $env{'user.domain'});
               my $inprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'process',$env{'user.name'},
                                                                   $env{'user.domain'},$fullname,$coursedesc);
               if (ref($inprocess) eq 'HASH') {
                   if (ref($inprocess->{'formitems'}) eq 'HASH') {
                       foreach my $key (keys(%{$inprocess->{'formitems'}})) {
                           if ($inprocess->{'formitems'}->{$key} eq 'multiple') {
                               if (exists($env{'form.'.$key})) {
                                   @{$customitems{$key}} = &Apache::loncommon::get_env_multiple($env{'form.'.$key});
                               }
                           } else {
                               if (exists($env{'form.'.$key})) {
                                   $customitems{$key} = $env{'form.'.$key};
                                   $reqhash{'custom'}{$key} = $customitems{$key};
                               }
                           }
                       }
                   }
               }
           }
         if ($disposition eq 'rejected') {          if ($disposition eq 'rejected') {
             if ($crstype eq 'community') {              if ($crstype eq 'community') {
                 $output = &mt('Your community request was rejected.');                  $output = &mt('Your community request was rejected.');
Line 3251  sub print_request_outcome { Line 3689  sub print_request_outcome {
             $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 $type = 'Course';              my $type = 'Course';
             if ($crstype eq 'community') {              if ($crstype eq 'community') {
                 $type = 'Community';                  $type = 'Community';
Line 3260  sub print_request_outcome { Line 3698  sub print_request_outcome {
             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,              my ($result,$postprocess) = &Apache::loncoursequeueadmin::course_creation($dom,$cnum,
                                    'autocreate',$details,\$logmsg,\$newusermsg,\$addresult,                                            'autocreate',$details,\$logmsg,\$newusermsg,\$addresult,
                                    \$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles);                                            \$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles,
                                             \$code,\%customitems);
             if ($result eq 'created') {              if ($result eq 'created') {
                 $disposition = 'created';                  $disposition = 'created';
                 $reqstatus = 'created';                  $reqstatus = 'created';
Line 3273  sub print_request_outcome { Line 3712  sub print_request_outcome {
                 } else {                  } else {
                     $output = '<p>'.&mt('Your course request has been processed and the course has been created.');                      $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;
                   }
                 $output .= '<br />'.$role_result.'</p>';                  $output .= '<br />'.$role_result.'</p>';
                 $creationresult = 'created';                  $creationresult = 'created';
             } else {              } else {
Line 3289  sub print_request_outcome { Line 3736  sub print_request_outcome {
             }              }
         } else {          } else {
             my $requestid = $cnum.'_'.$disposition;              my $requestid = $cnum.'_'.$disposition;
             my $request = {               my $request = {
                             $requestid => {                              $requestid => {
                                             timestamp   => $now,                                              timestamp   => $now,
                                             crstype     => $crstype,                                              crstype     => $crstype,
Line 3326  sub print_request_outcome { Line 3773  sub print_request_outcome {
                     }                      }
                     $output .= '<br />'.                      $output .= '<br />'.
                               &notification_information($disposition,$req_notifylist,                                &notification_information($disposition,$req_notifylist,
                                                         $cnum,$now);                                                          $dom,$cnum,$now);
                 } else {                  } else {
                     $reqstatus = 'domainerror';                      $reqstatus = 'domainerror';
                     $reqhash{'disposition'} = $disposition;                      $reqhash{'disposition'} = $disposition;
Line 3337  sub print_request_outcome { Line 3784  sub print_request_outcome {
         }          }
         ($storeresult,my $updateresult) =           ($storeresult,my $updateresult) = 
             &Apache::loncoursequeueadmin::update_coursereq_status(\%reqhash,$dom,              &Apache::loncoursequeueadmin::update_coursereq_status(\%reqhash,$dom,
                 $cnum,$reqstatus,'request');                  $cnum,$reqstatus,'request',$env{'user.domain'},$env{'user.name'});
         if ($modified && $queued && $storeresult eq 'ok') {          if ($modified && $queued && $storeresult eq 'ok') {
             if ($crstype eq 'community') {              if ($crstype eq 'community') {
                 $output .= '<p>'.&mt('Your community request has been updated').'</p>';                  $output .= '<p>'.&mt('Your community request has been updated').'</p>';
             } else {              } else {
                 $output .= '<p>'.&mt('Your course request has been updated').'</p>';                  $output .= '<p>'.&mt('Your course request has been updated').'</p>';
             }              }
             $output .= &notification_information($disposition,$req_notifylist,$cnum,$now);              $output .= &notification_information($disposition,$req_notifylist,$dom,$cnum,$now);
               if ($disposition eq 'approval') {
                   my $fullname = &Apache::loncommon::plainname($env{'user.name'},
                                                                $env{'user.domain'});
                   my $postprocess = 
                       &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'queued',$env{'user.name'},
                                                           $env{'user.domain'},$fullname,$env{'form.cdescr'});
                   if ((ref($postprocess) eq 'HASH') && 
                       ((ref($postprocess->{'queuedmsg'}) eq 'HASH') || ($postprocess->{'queuedweb'}))) { 
                       &notification_information($disposition,undef,$dom,$cnum,$now,undef,$postprocess);
                   }
               }
         }          }
         if ($validationerror ne '') {          if ($validationerror ne '') {
             $output .= '<p 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>';
Line 3496  sub update_requestors_roles { Line 3954  sub update_requestors_roles {
 }  }
   
 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 3514  sub notification_information { Line 3972  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">'.          $output .= '<div class="LC_info">'.
Line 3524  sub notification_information { Line 4007  sub notification_information {
 &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>';
       } 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).
Line 3546  sub check_autolimit { Line 4072  sub check_autolimit {
             if (($crstype eq 'community') &&               if (($crstype eq 'community') && 
                 (exists($crsroles{$cnum.':'.$cdom.':co'}))) {                  (exists($crsroles{$cnum.':'.$cdom.':co'}))) {
                 $count ++;                  $count ++;
             } elsif ((($crstype eq 'official') || ($crstype eq 'unofficial')) &&              } elsif ((($crstype eq 'official') || ($crstype eq 'unofficial') || ($crstype eq 'textbook')) &&
                      (exists($crsroles{$cnum.':'.$cdom.':cc'}))) {                       (exists($crsroles{$cnum.':'.$cdom.':cc'}))) {
                 $count ++;                  $count ++;
             }              }
Line 3592  sub retrieve_settings { Line 4118  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 3734  sub generate_date_items { Line 4273  sub generate_date_items {
     return;      return;
 }  }
   
   sub print_textbook_form {
       my ($r,$dom,$incdoms,$domdefs,$settings,$can_request) = @_;
       my ($bookshash,%ordered);
       my $crstype = 'textbook';
   #
   #  Retrieve list of textbook courses cloneable by user
   #
       my $numbook;
       if (ref($settings) eq 'HASH') {
           $bookshash = $settings->{'textbooks'};
           if (ref($bookshash) eq 'HASH') {
               foreach my $item (keys(%{$bookshash})) {
                   my ($clonedom,$clonecrs) = split(/_/,$item);
                   if (ref($bookshash->{$item}) eq 'HASH') {
                       my ($clonedom,$clonecrs) = split(/_/,$item);
                       if (&Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},
                                           $env{'user.domain'},$clonecrs,$clonedom,$crstype)) {
   
                           my $num = $bookshash->{$item}{'order'};
                           $ordered{$num} = $item;
                           $numbook ++;
                       }
                   }
               }
           }
       }
   
   #
   # 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 or future 
   # Course Coordinator role 
   #
       my $numcurrent;
       my %cloneable = &Apache::lonnet::courseiddump($dom,'.',1,'.',$env{'user.name'}.':'.$env{'user.domain'},
                                                 undef,undef,undef,'Course');
       my %ccroles = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},'userroles',
                                                   ['active','future'],['cc']);
       foreach my $role (keys(%ccroles)) {
           my ($cnum,$cdom,$rest) = split(/:/,$role,3);
           unless (exists($cloneable{$cdom.'_'.$cnum})) {
               my %courseinfo = &Apache::lonnet::coursedescription($cdom.'_'.$cnum,{'one_time' => 1});
               $cloneable{$cdom.'_'.$cnum} = \%courseinfo;
           }
       }
   
       my $numcurrent = scalar(keys(%cloneable));
   
       my $jscript = &textbook_request_javascript($numbook,$numcurrent);
       my %loaditems;
       $loaditems{'onload'} = 'javascript:uncheckAllRadio();';
       $r->print(&header('Course Request',$jscript,\%loaditems));
   
       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({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)) {
           $r->print('<div>'. 
                     '<fieldset><legend>'.&mt('Course Content').'</legend>');
           if (keys(%ordered)) {
               $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 (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).' ');
           }
           $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)) {
           $r->print('<div id="showtextbook" style="display:none">'.
                     &Apache::loncommon::start_data_table().
                     &Apache::loncommon::start_data_table_header_row().
                     '<th>'.&mt('Title').'</th>'.
                     '<th>'.&mt('Author(s)').'</th>'.
                     '<th>'.&mt('Subject').'</th>'.
                     '<th>'.&mt('Book').'</th>'.
                     &Apache::loncommon::end_data_table_header_row());
           my @items = sort { $a <=> $b } keys(%ordered);
           foreach my $num (@items) {
               my $item = $ordered{$num};
               my $cleantitle=&HTML::Entities::encode($bookshash->{$item}->{'title'},'<>&"');
               $cleantitle=~s/'/\\'/g;
               $cleantitle =~ s/^\s+//;
               $r->print(&Apache::loncommon::start_data_table_row().
                         '<td><label><input type="radio" name="book" value="'.$item.'" />'.
                         $cleantitle.'</label></td>'.
                         '<td>'.$bookshash->{$item}->{'author'}.'</td>'.
                         '<td>'.$bookshash->{$item}->{'subject'}.'</td>'.
                         '<td><img border="0" src="'.$bookshash->{$item}->{'image'}.
                         '" alt="'.$cleantitle.'" /></td>'. 
                         &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)
   #
       if (keys(%cloneable)) {
           my %lt = &clone_text();
           $r->print('<div id="showexisting" style="display:none">'.
                     &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());
           my %allownernames;
           my %sortbytitle; 
           foreach my $cid (sort(keys(%cloneable))) {
               if (ref($cloneable{$cid}) eq 'HASH') {
                   my $cdesc = $cloneable{$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);
                       my $singleowner = $cloneable{$cid}{'internal.courseowner'};
                       push(@owners,$singleowner);
                       if ($cloneable{$cid}{'co-owners'} ne '') {
                           foreach my $item (split(/,/,$cloneable{$cid}{'internal.co-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));
                       }
                       $r->print(&Apache::loncommon::start_data_table_row().
                                 '<td><label><input type="radio" name="owned" value="'.$cid.'" />'.
                                 '&nbsp'.$cleantitle.'</label></td>'.
                                 '<td>'.$namestr.'</td>'.
                                 &Apache::loncommon::end_data_table_row());
                   }
               }
           }
           $r->print(&Apache::loncommon::end_data_table().
                 '<p><input type="radio" name="datemode" value="delete" /> '.$lt{'ncd'}.
                 '</label><br /><label>'.
                 '<input type="radio" name="datemode" value="preserve" /> '.$lt{'prd'}.
                 '</label><br /><label>'.
                 '<input type="radio" name="datemode" value="shift" checked="checked" /> '.
                 $lt{'shd'}.'</label>'.
                 '<input type="text" size="5" name="dateshift" value="365" />'.
                 '</div>');
       }
   #
   # End of content selector
   #
       if (keys(%cloneable) || 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
   #
       my $fullname = &Apache::loncommon::plainname($env{'user.name'},
                                                    $env{'user.domain'});
       my $postprocess = &Apache::lonnet::auto_crsreq_update($dom,undef,$crstype,'review',
                                                             $env{'user.name'},
                                                             $env{'user.domain'},$fullname);
       if (ref($postprocess) eq 'HASH') {
           if ($postprocess->{'reviewweb'}) {
               $r->print($postprocess->{'reviewweb'});
           }
       }
   
   #
   # Submit button
   #
       $r->print('<input type="hidden" name="crstype" value="textbook" />'.
                 '<input type="hidden" name="action" value="process" />'.
                 '<input type="submit" value="'.&mt('Create course').'" />');
   
   #
   # End request form
   #
       $r->print('</form>');
       &endContentScreen($r).
       $r->print(&Apache::loncommon::end_page());
       return;
   }
   
   sub process_textbook_request {
       my ($r,$dom,$action,$domdefs,$domconfig,$can_request) = @_;
       my ($uniquecode,$req_notifylist);
       my $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 $crstype = 'textbook';
       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 'existing') {
           $clonefrom = $env{'form.owned'};
       }
       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);
               unless ($canclone) {
                   undef($clonecrs);
                   undef($clonedom);
               }
           } else {
               undef($clonecrs);
               undef($clonedom);
           }
       }
       $r->print(&header('Course Creation'));
   
       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 ($reqtype eq 'existing') {
           $details->{datemode} = $env{'form.datemode'};
           $details->{dateshift} = $env{'form.dateshift'};
       }
       my ($result,$output) = &process_request($dom,$cnum,$crstype,$now,$details,'',$req_notifylist,[],$domconfig);
       $r->print($output);
       if (&Apache::loncoursequeueadmin::author_prompt()) {
           &print_author_prompt($r,$action,$cnum,$dom,$crstype,$result);
       } elsif ($result eq 'created') {
           $r->print('<p><a href="/adm/requestcourse">'.&mt('Create another course').'</a></p>');
       }
       &endContentScreen($r);
       $r->print(&Apache::loncommon::end_page());
   }
   
   sub textbook_request_javascript {
       my ($numbook,$numcurrent) = @_;
       my %lt = &Apache::lonlocal::texthash(
                    choose   => 'Please select a content option.',
                    textbook => 'Please select a textbook, or choose a different option.',
                    existing => 'Please select one of your existing courses to copy, or choose a different option.',
                    title    => 'Please enter a course title.',
                );
       return if (!$numbook && !$numcurrent);
       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 == 'existing')) {
                   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 == 'existing')) {
                       var elem = document.getElementById('show'+val);
                       if (document.requestcourse.cloning[i].checked) {
                           elem.style.display = 'block';
                       }  else {
                           if (val == 'textbook') {
                               uncheckRadio('book');
                           }
                           if (val == 'existing') {
                               uncheckRadio('owned');
                           }
                           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 = $numbook;
       var numcurrent = $numcurrent;
       if (numbook > 0) {
           uncheckRadio('textbook'); 
       }
       if (numcurrent > 0) {
           uncheckRadio('existing');
       }
       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("$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("$lt{'choose'}");
                   return false;
               }
           }
           var group;
           if ((cloneChoice == 'textbook') || (cloneChoice == 'existing')) {
               var group;
               if (cloneChoice == 'textbook') {
                   group = document.getElementsByName('book');
               } else {
                   group = document.getElementsByName('owned');
               }
               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("$lt{'textbook'}");
                  } else {
                      alert("$lt{'existing'}");
                  }
                  return false;
               }
           }
       }
       if (document.requestcourse.cdescr.value == '') {
           alert("$lt{'title'}");
           return false;
       }
       return true;
   }
    
   ENDSCRIPT
   
   }
   
   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.50  
changed lines
  Added in v.1.77


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.