Diff for /loncom/interface/lonrequestcourse.pm between versions 1.54.2.6 and 1.98

version 1.54.2.6, 2010/11/19 00:09:15 version 1.98, 2016/04/04 01:09:48
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,$action,\%can_request);
                   }
               } elsif ($action eq 'display') {
                  my ($uname,$udom,$result,$warning) = &domcoord_display($dom);
                  if ($warning ne '') {
                      my $args = { only_body => 1 };
                      $r->print(&header('Course/Community Requests','','' ,'',$args).
                                '<h3>'.&mt('Course/Community Request Details').'</h3>'.
                                '<div class="LC_warning">'.$warning.'</div>'.
                                &close_popup_form());
                   } else {
                       $states{'display'} = ['details'];
                       my $loaditems = &onload_action($action,$state);
                       my $page = 0;
                       &request_administration($r,$action,$state,$page,\%states,$dom,$jscript,
                                               $loaditems,'','','','','',$showcredits,'','',
                                               $uname,$udom);
                   }
               } else {
                   if ($can_request{'textbook'}) {
                       &print_textbook_form($r,$dom,\@incdoms,\%domdefs,$domconfig{'requestcourses'},\%can_request);
                   } else {
                       &textbook_request_disabled($r,$dom,$action,\%can_request);
                   }
               }
               return OK;
           }
       }
   
     $states{'display'} = ['details'];      $states{'display'} = ['details'];
     $states{'view'} = ['pick_request','details','cancel','removal'];      $states{'view'} = ['pick_request','details','cancel','removal'];
Line 147  sub handler { Line 212  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 226  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 245  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))) {          ($uname,$udom,$result,$warning) = &domcoord_display($dom);
             if ($env{'form.cnum'} ne '') {  
                 my $cnum = $env{'form.cnum'};  
                 my $queue = $env{'form.queue'};  
                 my $reqkey = $cnum.'_'.$queue;  
                 my $namespace = 'courserequestqueue';  
                 my $domconfig = &Apache::lonnet::get_domainconfiguser($dom);  
                 my %queued =  
                     &Apache::lonnet::get($namespace,[$reqkey],$dom,$domconfig);  
                 if (ref($queued{$reqkey}) eq 'HASH') {  
                     $uname = $queued{$reqkey}{'ownername'};  
                     $udom  = $queued{$reqkey}{'ownerdom'};  
                     if (($udom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/)) {  
                         $result = &retrieve_settings($dom,$cnum,$udom,$uname);  
                     } else {  
                         if ($env{'form.crstype'} eq 'community') {  
                             $warning = &mt('Invalid username or domain for community requestor');  
                         } else {  
                             $warning = &mt('Invalid username or domain for course requestor');  
                         }  
                     }  
                 } else {  
                     if ($env{'form.crstype'} eq 'community') {  
                         $warning = &mt('No information was found for this community request.');  
                     } else {  
                         $warning = &mt('No information was found for this course request.');  
                     }  
                 }  
             } else {  
                 $warning = &mt('No course request ID provided.');  
             }  
         } else {  
             if ($env{'form.crstype'} eq 'any') {  
                $warning = &mt('You do not have rights to view course or community request information.');  
             } elsif ($env{'form.crstype'} eq 'community') {  
                 $warning = &mt('You do not have rights to view community request information.');  
             } else {  
                 $warning = &mt('You do not have rights to view course request information.');  
             }  
         }  
     } elsif ((defined($state)) && (defined($action))) {      } elsif ((defined($state)) && (defined($action))) {
         if (($action eq 'view') && ($state eq 'details')) {          if (($action eq 'view') && ($state eq 'details')) {
             if ((defined($env{'form.showdom'})) && (defined($env{'form.cnum'}))) {              if ((defined($env{'form.showdom'})) && (defined($env{'form.cnum'}))) {
Line 262  sub handler { Line 295  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 278  sub handler { Line 311  sub handler {
             $jscript = &Apache::lonhtmlcommon::set_form_elements($elementsref,\%stored);              $jscript = &Apache::lonhtmlcommon::set_form_elements($elementsref,\%stored);
             if ($state eq 'courseinfo') {              if ($state eq 'courseinfo') {
                 $jscript .= &cloning_javascript();                  $jscript .= &cloning_javascript();
               } elsif ($state eq 'process') {
                   $jscript .= &processing_javascript();
             }              }
         }          }
     }      }
Line 288  sub handler { Line 323  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 342  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 356  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 376  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 382  function setCloneDisplay(courseForm) { Line 415  function setCloneDisplay(courseForm) {
         for (var i=0; i<courseForm.cloning.length; i++) {          for (var i=0; i<courseForm.cloning.length; i++) {
             if (courseForm.cloning[i].checked) {              if (courseForm.cloning[i].checked) {
                 if (courseForm.cloning[i].value == 1) {                  if (courseForm.cloning[i].value == 1) {
                     document.getElementById('cloneoptions').style.display="block";;                      document.getElementById('cloneoptions').style.display="block";
                 }                  }
             }              }
         }          }
Line 391  function setCloneDisplay(courseForm) { Line 424  function setCloneDisplay(courseForm) {
 END  END
 }  }
   
   sub processing_javascript {
       return <<"END";
   function hideProcessing() {
       if (document.getElementById('processing')) {
           document.getElementById('processing').style.display="none";
       }
   }
   
   END
   }
   
 sub get_breadcrumbs {  sub get_breadcrumbs {
     my ($dom,$action,$state,$states,$trail) = @_;      my ($dom,$action,$state,$states,$trail) = @_;
     my ($crumb,$newinstcode,$codechk,$checkedcode,$numtitles,$description);      my ($crumb,$newinstcode,$codechk,$checkedcode,$numtitles,$description);
Line 432  sub get_breadcrumbs { Line 476  sub get_breadcrumbs {
                     }                      }
                 }                  }
             }              }
             for (my $i=0; $i<@{$states->{$action}}; $i++) {              if (ref($states->{$action}) eq 'ARRAY') {
                 if ($$state eq $states->{$action}[$i]) {                  for (my $i=0; $i<@{$states->{$action}}; $i++) {
                     &Apache::lonhtmlcommon::add_breadcrumb(                      if ($$state eq $states->{$action}[$i]) {
                        {text=>"$trail->{$$state}"});  
                     $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course/Community Requests','Course_Requests');  
                     last;  
                 } else {  
                     if (($$state eq 'process') || ($$state eq 'removal')) {  
                         &Apache::lonhtmlcommon::add_breadcrumb(                          &Apache::lonhtmlcommon::add_breadcrumb(
                             { href => '/adm/requestcourse',                             {text=>"$trail->{$$state}"});
                               text => "$trail->{$states->{$action}[$i]}",                          $crumb = &Apache::lonhtmlcommon::breadcrumbs('Course/Community Requests','Course_Requests');
                             }                          last;
                         );  
                     } else {                      } else {
                         &Apache::lonhtmlcommon::add_breadcrumb(                          if (($$state eq 'process') || ($$state eq 'removal') || ($$state eq 'reqauthor')) {
                               &Apache::lonhtmlcommon::add_breadcrumb(
                                   { href => '/adm/requestcourse',
                                     text => "$trail->{$states->{$action}[$i]}",
                                   }
                              );
                           } else {
                               &Apache::lonhtmlcommon::add_breadcrumb(
      { href => "javascript:backPage(document.requestcrs,'$states->{$action}[$i]')",       { href => "javascript:backPage(document.requestcrs,'$states->{$action}[$i]')",
        text => "$trail->{$states->{$action}[$i]}", }         text => "$trail->{$states->{$action}[$i]}", }
                        );                             );
                    }                          }
                }                      }
            }                  }
               }
         } else {          } else {
             &Apache::lonhtmlcommon::add_breadcrumb(              &Apache::lonhtmlcommon::add_breadcrumb(
                     {text=>'Pick Action'});                      {text=>'Pick Action'});
Line 488  sub header { Line 534  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 603  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 618  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 660  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 697  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 640  sub onload_action { Line 712  sub onload_action {
         if ($state eq 'courseinfo') {          if ($state eq 'courseinfo') {
             $loaditems{'onload'} .= 'javascript:setCloneDisplay(document.requestcrs);';              $loaditems{'onload'} .= 'javascript:setCloneDisplay(document.requestcrs);';
         }          }
           if ($state eq 'process') {
               $loaditems{'onload'} .= 'javascript:hideProcessing();';
           }
     }      }
     return \%loaditems;      return \%loaditems;
 }  }
   
 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 758  $nextstate_setter
 function check_can_request(crschoice,actionchoice) {  function check_can_request(crschoice,actionchoice) {
     var official = '';      var official = '';
     var unofficial = '';      var unofficial = '';
     var community = '';          var community = '';
       var textbook = '';
       var placement = '';
 END  END
     if (ref($can_request) eq 'HASH') {      if (ref($can_request) eq 'HASH') {
         foreach my $item (keys(%{$can_request})) {          foreach my $item (keys(%{$can_request})) {
Line 696  END Line 769  END
 ";  ";
         }          }
     }      }
     my %lt = &Apache::lonlocal::texthash(      my %js_lt = &Apache::lonlocal::texthash(
         official => 'You are not permitted to request creation of an official course in this domain.',          official => 'You are not permitted to request creation of an official course in this domain.',
         unofficial => 'You are not permitted to request creation of an unofficial course in this domain.',          unofficial => 'You are not permitted to request creation of an unofficial course in this domain.',
         community => 'You are not permitted to request creation of a community this domain.',          community => 'You are not permitted to request creation of a community in this domain.',
         all => 'You must choose a specific course type when making a new course request.\\n\"All types\" is not allowed.',          textbook => 'You are not permitted to request creation of a textbook course in this domain',
           placement => 'You are not permitted to request creation of a placement test in this domain',
           all => 'You must choose a specific course type when making a new course request.',
           allt => '"All types" is not allowed.',
     );       ); 
       &js_escape(\%js_lt);
     $js .= <<END;      $js .= <<END;
     if (crschoice == 'official') {      if (crschoice == 'official') {
         if (official != 1) {          if (official != 1) {
             alert("$lt{'official'}");              alert("$js_lt{'official'}");
             return false;              return false;
         }          }
     } else {      } else {
         if (crschoice == 'unofficial') {          if (crschoice == 'unofficial') {
             if (unofficial != 1) {              if (unofficial != 1) {
                 alert("$lt{'unofficial'}");                  alert("$js_lt{'unofficial'}");
                 return false;                  return false;
             }              }
         } else {          } else {
             if (crschoice == 'community') {              if (crschoice == 'community') {
                 if (community != 1) {                  if (community != 1) {
                     alert("$lt{'community'}");                      alert("$js_lt{'community'}");
                     return false;                      return false;
                 }                  }
             } else {              } else {
                 if (actionchoice == 'new') {                  if (crschoice == 'textbook') {
                     alert("$lt{'all'}");                      if (textbook != 1) {
                     return false;                          alert("$js_lt{'textbook'}");
                 }                                         return false;
                       }
                   } else {
                       if (crschoice == 'placement') {
                           if (placement != 1) {
                               alert("$js_lt{'placement'}");
                               return false;
                           }
                       } else {
                           if (actionchoice == 'new') {
                               alert('$js_lt{'all'}'+'\\n'+'$js_lt{'allt'}');
                               return false;
                           }
                       }
                   }
             }              }
         }          }
     }      }
     return true;      return true;
 }  }
 END  END
     my ($pagetitle,$pageinfo,$domaintitle);      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'}) || ($can_request->{'placement'})) {
             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 838  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 923  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 861  END Line 949  END
     if ($action eq 'new') {      if ($action eq 'new') {
         my $jsextra;          my $jsextra;
         if (($state eq 'courseinfo') || ($state eq 'codepick')) {          if (($state eq 'courseinfo') || ($state eq 'codepick')) {
             $jsextra = "\n".&Apache::loncommon::coursebrowser_javascript($dom);              $jsextra = "\n".&Apache::loncommon::coursebrowser_javascript($dom,'','','','','',
                                                                            $newinstcode);
         } elsif ($state eq 'enrollment') {          } elsif ($state eq 'enrollment') {
             if (($env{'form.crstype'} eq 'official') &&               if (($env{'form.crstype'} eq 'official') && 
                 (&Apache::lonnet::auto_run('',$dom))) {                  (&Apache::lonnet::auto_run('',$dom))) {
Line 878  END Line 967  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 999  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');
               } elsif ($env{'form.crstype'} eq 'textbook') {
                   $title = &mt('Pending requests for placement tests'); 
             } else {              } else {
                 $title = &mt('Pending course/community requests');                   $title = &mt('Pending course/community requests'); 
             }              }
Line 932  END Line 1026  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 1051  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 1129  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());
     return;      return;
 }  }
   
   sub domcoord_display {
       my ($dom) = @_;
       my ($uname,$udom,$result,$warning);
       if (($dom eq $env{'request.role.domain'}) && (&Apache::lonnet::allowed('ccc',$dom))) {
           if ($env{'form.cnum'} ne '') {
               my $cnum = $env{'form.cnum'};
               my $queue = $env{'form.queue'};
               my $reqkey = $cnum.'_'.$queue;
               my $namespace = 'courserequestqueue';
               my $domconfig = &Apache::lonnet::get_domainconfiguser($dom);
               my %queued =
                   &Apache::lonnet::get($namespace,[$reqkey],$dom,$domconfig);
               if (ref($queued{$reqkey}) eq 'HASH') {
                   $uname = $queued{$reqkey}{'ownername'};
                   $udom  = $queued{$reqkey}{'ownerdom'};
                   if (($udom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/)) {
                       $result = &retrieve_settings($dom,$cnum,$udom,$uname);
                   } else {
                       if ($env{'form.crstype'} eq 'community') {
                           $warning = &mt('Invalid username or domain for community requestor');
                       } else {
                           $warning = &mt('Invalid username or domain for course requestor');
                       }
                   }
               } else {
                   if ($env{'form.crstype'} eq 'community') {
                       $warning = &mt('No information was found for this community request.');
                   } else {
                       $warning = &mt('No information was found for this course request.');
                   }
               }
           } else {
               $warning = &mt('No course request ID provided.');
           }
       } else {
           if ($env{'form.crstype'} eq 'any') {
               $warning = &mt('You do not have rights to view course or community request information.');
           } elsif ($env{'form.crstype'} eq 'community') {
               $warning = &mt('You do not have rights to view community request information.');
           } else {
               $warning = &mt('You do not have rights to view course request information.');
           }
       }
       return ($uname,$udom,$result,$warning);
   }
   
 sub enrollment_lcsec_js {  sub enrollment_lcsec_js {
     my %alerts = &section_check_alerts();      my %alerts = &section_check_alerts();
     my $secname = $alerts{'badsec'};      my $secname = $alerts{'badsec'};
     my $secnone = $alerts{'reserved'};      my $secnone = $alerts{'reserved'};
       &js_escape(\$secname);
       &js_escape(\$secnone);
     my $output = '      my $output = '
 function validateEnrollSections(formname,nextstate) {  function validateEnrollSections(formname,nextstate) {
     var badsectotal = 0;      var badsectotal = 0;
Line 1101  function validateEnrollSections(formname Line 1246  function validateEnrollSections(formname
   
 sub personnel_lcsec_js {  sub personnel_lcsec_js {
     my %alerts = &section_check_alerts();      my %alerts = &section_check_alerts();
     my $secname = $alerts{'badsec'}.'\\n'.$alerts{'separate'};      my $secname = $alerts{'badsec'}."\n".$alerts{'separate'};
     my $secnone = $alerts{'reserved'};      my $secnone = $alerts{'reserved'};
       &js_escape(\$secname);
       &js_escape(\$secnone);
     my $output = '      my $output = '
 function validatePersonnelSections(formname,nextstate) {  function validatePersonnelSections(formname,nextstate) {
     var badsectotal = 0;      var badsectotal = 0;
Line 1227  sub get_instcode { Line 1374  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 1447  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 1473  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 1563  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 1406  sub print_request_form { Line 1584  sub print_request_form {
             &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,              &Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,
                                                      \%cat_order,\@code_order);                                                       \%cat_order,\@code_order);
         }          }
         my ($storeresult,$result) = &print_request_outcome($dom,\@codetitles,          my $lonhost = $r->dir_config('lonHostID');
                                                            \@code_order);          my ($storeresult,$result,$customized) = &print_request_outcome($r,$lonhost,$dom,\@codetitles,
                                                                         \@code_order,$instcredits);
         $r->print($result);          $r->print($result);
         if (($storeresult eq 'ok') || ($storeresult eq 'created')) {          if (($storeresult eq 'ok') || ($storeresult eq 'created')) {
             $r->print('<p>');  
             if ($storeresult eq 'ok') {              if ($storeresult eq 'ok') {
                 $r->print('<a href="/adm/requestcourse?action=view&state=details&showdom='.$dom.'&cnum='. $env{'form.cnum'}.'">'.                  $r->print('<p><a href="/adm/requestcourse?action=view&state=details&showdom='.$dom.'&cnum='. $env{'form.cnum'}.'">'.
                           &mt('Modify this request').'</a>'.('&nbsp;'x4));                            &mt('Modify this request').'</a>'.('&nbsp;'x4).
                             '<a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>');
               }
               if (&Apache::loncoursequeueadmin::author_prompt()) {
                   unless ($customized) {
                       &print_author_prompt($r,$env{'form.action'},$env{'form.cnum'},$env{'form.showdom'},
                                            $env{'form.crstype'},$storeresult);
                   }
               } elsif ($storeresult eq 'created') {
                   unless ($customized) {
                       $r->print('<p><a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>');
                   }
             }              }
             $r->print('<a href="/adm/requestcourse">'.&mt('Make another request').'</a></p>');          }
             return;      } elsif ($state eq 'reqauthor') {
           my ($result,@links); 
           if ($env{'form.requestauthor'}) {
               $r->print(&Apache::loncoursequeueadmin::process_reqauthor(\$result));
               if ($result eq 'created') {
                   my $role = 'au';
                   my $spec = "$role./$env{'form.showdom'}/";
                   push(@links,&mt('Enter your Authoring Space with role: [_1]',
                                   '<a href="/adm/roles?selectrole=1&amp;'.$spec.'=1">'.
                                   &Apache::lonnet::plaintext($role).'</a>'));
               }
           }
           if (($env{'form.disposition'} eq 'created') &&
               ($env{'form.cnum'} =~ /^$match_courseid$/) &&
               ($env{'form.showdom'} =~ /^$match_domain$/)) {
               my ($spec,$area,$role,$type);
               my $role = 'cc';
               my $spec = "$role./$env{'form.showdom'}/$env{'form.cnum'}";
               my $type = 'Course';
               if ($env{'form.crstype'} eq 'community') {
                   $type = 'Community';
               }
               my $showrole = &Apache::lonnet::plaintext($role,$type);
               unshift(@links,&mt('Enter new course with role: [_1]',
                                  '<a href="/adm/roles?selectrole=1&amp;'.$spec.'=1">'.$showrole.'</a>'));
           }
           if (@links > 1) {
               $r->print(&mt('New roles will be listed on your [_1]Roles[_2] page.',
                             '<a href="/adm/roles">','</a>').'&nbsp'.&mt('Choose a role:').
                          '<ul>');
               foreach my $link (@links) {
                   $r->print('<li>'.$link.'</li>');
               }
               $r->print('</ul>');
           } elsif (@links == 1) {
               $r->print('<p>'.$links[0].'</p>');
         }          }
     }      }
     my @excluded = &get_excluded_elements($dom,$states,$action,$state);      my @excluded = &get_excluded_elements($dom,$states,$action,$state,$showcredits);
     if ($state eq 'personnel') {      if ($state eq 'personnel') {
         push(@excluded,'persontotal');          push(@excluded,'persontotal');
     }      }
Line 1446  sub print_request_form { Line 1670  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 1722  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 1744  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 1793  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 1807  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 1866  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 1887  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 1928  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 2001  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 2012  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 2104  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{'official'};
           $lt{'placement'} = $lt{'official'};
         $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 2223  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 2239  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 2437  ENDJS
 }  }
   
 sub viewcancel_javascript {  sub viewcancel_javascript {
     my $alert = &mt('Are you sure you want to cancel this request?\\n'.      my $alert = &mt('Are you sure you want to cancel this request?')."\n".
                     'Your request will be removed.');                  &mt('Your request will be removed.');
       &js_escape(\$alert);
     return << "ENDJS";      return << "ENDJS";
 function nextPage(formname,nextstate) {  function nextPage(formname,nextstate) {
     if (confirm('$alert')) {      if (confirm('$alert')) {
Line 2127  ENDJS Line 2453  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 2463  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 2510  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 placement);
                       foreach my $type (@types) {
                           if ($domconfig{'requestcourses'}{'uniquecode'}{$type}) {
                               $showuniquecode = 1;
                               last;
                           }
                       }
                   } elsif ($domconfig{'requestcourses'}{'uniquecode'}{$curr{'crstype'}}) {
                       $showuniquecode = 1;
                   }
               }
           }
       }
       if ($showuniquecode) {
           $tablehdr .= '<th>'.&mt('Unique Code').'</th>';    
       }
     if ($curr{'status'} eq 'any') {      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 2569  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 2595  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 2662  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 2684  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') || ($crstype eq 'placement')) {
         $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 2778  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 2447  sub print_review { Line 2811  sub print_review {
   
     my $enrollrow_title = &mt('Default Access Dates').'<br />'.      my $enrollrow_title = &mt('Default Access Dates').'<br />'.
                           '('.&Apache::lonnet::plaintext('st',$category).')';                            '('.&Apache::lonnet::plaintext('st',$category).')';
       my $instcode;
     if ($env{'form.crstype'} eq 'official') {      if ($env{'form.crstype'} eq 'official') {
         if ((ref($codetitles) eq 'ARRAY') && (ref($cat_titles) eq 'HASH')) {          if ((ref($codetitles) eq 'ARRAY') && (ref($cat_titles) eq 'HASH')) {
             foreach my $title (@{$codetitles}) {              foreach my $title (@{$codetitles}) {
Line 2462  sub print_review { Line 2827  sub print_review {
                 }                  }
             }              }
         }          }
           if (ref($code_order) eq 'ARRAY') {
               foreach my $item (@{$code_order}) {
                   $instcode .= $env{'form.instcode_'.$item};
               }
           }
           $inst_headers .= '<th>'.&mt('Credits').'</th>';
           if ($instcredits) {
               $inst_values .= '<td>'.$instcredits.'</td>';
           } else {
               $inst_values .= '<td>'.$env{'form.coursecredits'}.'</td>';
           }
         if (&Apache::lonnet::auto_run('',$dom)) {          if (&Apache::lonnet::auto_run('',$dom)) {
             $enrollrow_title = &mt('Enrollment');              $enrollrow_title = &mt('Enrollment');
             $enroll_headers = '<th>'.&mt('Automatic Adds').'</th>'.              $enroll_headers = '<th>'.&mt('Automatic Adds').'</th>'.
Line 2531  sub print_review { Line 2907  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 2540  sub print_review { Line 2919  sub print_review {
         ($env{'form.clonedom'} =~ /^$match_domain$/)) {          ($env{'form.clonedom'} =~ /^$match_domain$/)) {
         my $canclone = &Apache::loncoursequeueadmin::can_clone_course($uname,          my $canclone = &Apache::loncoursequeueadmin::can_clone_course($uname,
                            $udom,$env{'form.clonecrs'},$env{'form.clonedom'},                             $udom,$env{'form.clonecrs'},$env{'form.clonedom'},
                            $env{'form.crstype'});                             $env{'form.crstype'},$dom,$instcode);
         if ($canclone) {          if ($canclone) {
             my %courseenv = &Apache::lonnet::userenvironment($env{'form.clonedom'},              my %courseenv = &Apache::lonnet::userenvironment($env{'form.clonedom'},
                               $env{'form.clonecrs'},('description','internal.coursecode'));                                $env{'form.clonecrs'},('description','internal.coursecode'));
Line 2702  sub dates_from_form { Line 3081  sub dates_from_form {
   
 sub courseinfo_form {  sub courseinfo_form {
     my ($dom,$formname,$crstype,$next,$description) = @_;      my ($dom,$formname,$crstype,$next,$description) = @_;
     my %lt = &Apache::lonlocal::texthash(      my %js_lt = &Apache::lonlocal::texthash(
                 official => 'You must provide a (brief) course description.',                  official => 'You must provide a (brief) course description.',
                 community => 'You must provide a (brief) community description.'                  community => 'You must provide a (brief) community description.'
              );               );
     $lt{'unofficial'} = $lt{'official'};      &js_escape(\%js_lt);
       $js_lt{'unofficial'} = $js_lt{'official'};
       $js_lt{'textbook'} = $js_lt{'official'};
       $js_lt{'placement'} = $js_lt{'official'};
     my $js_validate = <<"ENDJS";      my $js_validate = <<"ENDJS";
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA['  // <![CDATA['
   
 function validateForm() {  function validateForm() {
     if ((document.$formname.cdescr.value == "")  || (document.$formname.cdescr.value == "undefined")) {      if ((document.$formname.cdescr.value == "")  || (document.$formname.cdescr.value == "undefined")) {
         alert('$lt{$crstype}');          alert('$js_lt{$crstype}');
         return;          return;
     }      }
     nextPage(document.$formname,'$next');      nextPage(document.$formname,'$next');
Line 2786  sub clone_form { Line 3168  sub clone_form {
     my $type = 'Course';      my $type = 'Course';
     if ($crstype eq 'community') {      if ($crstype eq 'community') {
         $type = 'Community';          $type = 'Community';
       } elsif ($crstype eq 'placement') {
           $type = 'Placement'; 
     }      }
     my %lt = &clone_text();      my %lt = &clone_text();
     my $output .=       my $output .= 
Line 2793  sub clone_form { Line 3177  sub clone_form {
         &Apache::loncommon::select_dom_form($dom,'clonedom').'</label>'.          &Apache::loncommon::select_dom_form($dom,'clonedom').'</label>'.
         &Apache::lonhtmlcommon::row_closure(1).          &Apache::lonhtmlcommon::row_closure(1).
         &Apache::lonhtmlcommon::row_title($lt{'cid'}).'<label>'.          &Apache::lonhtmlcommon::row_title($lt{'cid'}).'<label>'.
         '<input type="text" size="25" name="clonecrs" value="" onfocus="this.blur();opencrsbrowser('."'$formname','clonecrs','clonedom','','','','','$type'".')" />'.          '<input type="text" size="25" name="clonecrs" value="" onfocus="this.blur();opencrsbrowser('."'$formname','clonecrs','clonedom','','','','$type'".')" />'.
         '</label>&nbsp;'.          '</label>&nbsp;'.
         &Apache::loncommon::selectcourse_link($formname,'clonecrs','clonedom','','','',$type).          &Apache::loncommon::selectcourse_link($formname,'clonecrs','clonedom','','','',$type).
         &Apache::lonhtmlcommon::row_closure(1).          &Apache::lonhtmlcommon::row_closure(1).
Line 2829  sub coursecode_form { Line 3213  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 2846  sub coursecode_form { Line 3229  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 2911  sub coursecode_form { Line 3298  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 3003  sub display_navbuttons { Line 3410  sub display_navbuttons {
 }  }
   
 sub print_request_outcome {  sub print_request_outcome {
     my ($dom,$codetitles,$code_order) = @_;      my ($r,$lonhost,$dom,$codetitles,$code_order,$instcredits) = @_;
     my ($output,$cnum,$now,$req_notifylist,$crstype,$enrollstart,$enrollend,      my ($output,$cnum,$now,$req_notifylist,$crstype,$enrollstart,$enrollend,
         %sections,%crosslistings,%personnel,@baduname,@missingdom,%domconfig,);          %sections,%crosslistings,%personnel,@baduname,@missingdom,%domconfig,
           $uniquecode);
     my $sectotal = $env{'form.sectotal'};      my $sectotal = $env{'form.sectotal'};
     my $crosslisttotal = 0;      my $crosslisttotal = 0;
     $cnum = $env{'form.cnum'};      $cnum = $env{'form.cnum'};
Line 3013  sub print_request_outcome { Line 3421  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 3069  sub print_request_outcome { Line 3479  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 3080  sub print_request_outcome { Line 3491  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 3125  sub print_request_outcome { Line 3586  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 3138  sub print_request_outcome { Line 3604  sub print_request_outcome {
     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 3149  sub print_request_outcome { Line 3621  sub print_request_outcome {
             my $canclone =                my $canclone =  
                 &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},                  &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},
                         $env{'user.domain'},$env{'form.clonecrs'},$env{'form.clonedom'},                          $env{'user.domain'},$env{'form.clonecrs'},$env{'form.clonedom'},
                         $crstype);                          $crstype,$dom,$instcode);
             if ($canclone) {              if ($canclone) {
                 $clonecrs = $env{'form.clonecrs'};                  $clonecrs = $env{'form.clonecrs'};
                 $clonedom = $env{'form.clonedom'};                  $clonedom = $env{'form.clonedom'};
Line 3165  sub print_request_outcome { Line 3637  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 3181  sub print_request_outcome { Line 3655  sub print_request_outcome {
                     accessend      => $accessend,                      accessend      => $accessend,
                     personnel      => \%personnel,                      personnel      => \%personnel,
                   };                    };
     my (@inststatuses,$storeresult,$creationresult);      my ($result,$output,$customized) = &process_request($r,$lonhost,$dom,$cnum,$crstype,$now,$details,
                                                           $instcode,$req_notifylist,\@instsections,\%domconfig);
       return ($result,$output,$customized);
   }
   
   sub process_request {
       my ($r,$lonhost,$dom,$cnum,$crstype,$now,$details,$instcode,$req_notifylist,$instsections,
           $domconfig) = @_; 
       my (@inststatuses,$storeresult,$creationresult,$output,$customized);
     my $val =       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 3192  sub print_request_outcome { Line 3675  sub print_request_outcome {
             $output = &mt('You are not permitted to request creation of unofficial courses.');              $output = &mt('You are not permitted to request creation of unofficial courses.');
         } elsif ($crstype eq 'community') {          } elsif ($crstype eq 'community') {
             $output = &mt('You are not permitted to request creation of communities');              $output = &mt('You are not permitted to request creation of communities');
           } elsif ($crstype eq 'textbook') {
               $output = &mt('You are not permitted to request creation of textbook courses');
           } elsif ($crstype eq 'placement') {
               $output = &mt('You are not permitted to request creation of placement tests');
         } else {          } else {
             $output = &mt('Unrecognized course type: [_1]',$crstype);              $output = &mt('Unrecognized course type: [_1]',$crstype);
         }          }
         $storeresult = 'notpermitted';           $storeresult = 'notpermitted'; 
     } else {      } else {
         my ($disposition,$message,$reqstatus);          my ($disposition,$message,$reqstatus,$coursedesc,$accessstart,$accessend,%customvalidation);
         my %reqhash = (          my %reqhash = (
                         reqtime   => $now,                          reqtime   => $now,
                         crstype   => $crstype,                          crstype   => $crstype,
Line 3205  sub print_request_outcome { Line 3692  sub print_request_outcome {
                       );                        );
         my $requestkey = $dom.'_'.$cnum;          my $requestkey = $dom.'_'.$cnum;
         my $validationerror;          my $validationerror;
           my $fullname = &Apache::loncommon::plainname($env{'user.name'},
                                                        $env{'user.domain'});
           if (ref($details) eq 'HASH') {
               $coursedesc = $details->{'cdescr'};
               $accessstart = $details->{'accessstart'};
               $accessend = $details->{'accessend'};
           }
         if ($val eq 'autolimit=') {          if ($val eq 'autolimit=') {
             $disposition = 'process';              $disposition = 'process';
         } elsif ($val =~ /^autolimit=(\d+)$/) {          } elsif ($val =~ /^autolimit=(\d+)$/) {
Line 3213  sub print_request_outcome { Line 3707  sub print_request_outcome {
                                             $dom,$crstype,$limit,\$message);                                              $dom,$crstype,$limit,\$message);
         } elsif ($val eq 'validate') {          } elsif ($val eq 'validate') {
             my ($inststatuslist,$validationchk,$validation);              my ($inststatuslist,$validationchk,$validation);
               if (ref($details) eq 'HASH') {
                   if ($details->{'clonecrs'}) {
                       $customvalidation{'_LC_clonefrom'} = $details->{'clonedom'}.'_'.$details->{'clonecrs'};
                   }
               }
             if (@inststatuses > 0) {              if (@inststatuses > 0) {
                 $inststatuslist = join(',',@inststatuses);                  $inststatuslist = join(',',@inststatuses);
             }              }
             my $instseclist;              my $instseclist;
             if (@instsections > 0) {              if (ref($instsections) eq 'ARRAY') {
                 $instseclist = join(',',@instsections);                  if (@{$instsections} > 0) {
                       $instseclist = join(',',@{$instsections});
                   }
               }
   #
   # Retrieve any custom form information used for validation 
   #
               my $preprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'prevalidate',$env{'user.name'},
                                                                    $env{'user.domain'},$fullname,$coursedesc);
               if (ref($preprocess) eq 'HASH') {
                   &custom_formitems($preprocess,\%customvalidation);
             }              }
             $validationchk =               $validationchk = 
                 &Apache::lonnet::auto_courserequest_validation($dom,                  &Apache::lonnet::auto_courserequest_validation($dom,
                     $env{'user.name'}.':'.$env{'user.domain'},$crstype,                      $env{'user.name'}.':'.$env{'user.domain'},$crstype,
                     $inststatuslist,$instcode,$instseclist);                      $inststatuslist,$instcode,$instseclist,\%customvalidation);
             if ($validationchk =~ /:/) {              if ($validationchk =~ /:/) {
                 ($validation,$message) = split(':',$validationchk);                  ($validation,$message) = split(':',$validationchk);
             } else {              } else {
Line 3240  sub print_request_outcome { Line 3749  sub print_request_outcome {
         }          }
         $reqhash{'disposition'} = $disposition;          $reqhash{'disposition'} = $disposition;
         $reqstatus = $disposition;          $reqstatus = $disposition;
         my ($modified,$queued);          my ($modified,$queued,$token,%customitems);
           unless ($disposition eq 'rejected') {
               my $inprocess = &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,'process',$env{'user.name'},
                                                                   $env{'user.domain'},$fullname,$coursedesc,undef,
                                                                   undef,undef,\%customvalidation);
   #
   # Retrieve any custom form information submitted with review page and include in request details.
   #
               if (ref($inprocess) eq 'HASH') {
                   &custom_formitems($inprocess,\%customitems);
                   foreach my $key (keys(%customitems)) {
                       $reqhash{'custom'}{$key} = $customitems{$key};
                   }
               }
           }
         if ($disposition eq 'rejected') {          if ($disposition eq 'rejected') {
             if ($crstype eq 'community') {              if ($crstype eq 'community') {
                 $output = &mt('Your community request was rejected.');                  $output = &mt('Your community request was rejected.');
Line 3253  sub print_request_outcome { Line 3776  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 3262  sub print_request_outcome { Line 3785  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,              $r->print('<div id="processing" style="display:block;">'."\n".
                                    'autocreate',$details,\$logmsg,\$newusermsg,\$addresult,                        &mt('Your request is being processed; this page will update when processing is complete.').
                                    \$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles);                        '</div>');
               $r->rflush();
               if (ref($details) eq 'HASH') {
                   if ($details->{'clonecrs'}) {
                       $customitems{'_LC_clonefrom'} = $details->{'clonedom'}.'_'.$details->{'clonecrs'};
                   }
               }
               $customitems{'_LC_ownerfullname'} = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'},'first');
               my $owneremail;
               my %emails = &Apache::loncommon::getemails();
               foreach my $email ('permanentemail','critnotification','notification') {
                   $owneremail = $emails{$email};
                   last if ($owneremail ne '');
               }
               if ($owneremail ne '') {
                   $customitems{'_LC_owneremail'} = $owneremail;
               }
               $customitems{'_LC_coursedomainname'} = &Apache::lonnet::domain($dom,'description');
               $customitems{'_LC_coursedescription'} = $coursedesc;
               $customitems{'_LC_coursestartdate'} = $accessstart;
               $customitems{'_LC_courseenddate'} = $accessend;
               my ($result,$postprocess) = &Apache::loncoursequeueadmin::course_creation($dom,$cnum,
                                             'autocreate',$details,\$logmsg,\$newusermsg,\$addresult,
                                             \$enrollcount,\$response,\$keysmsg,\%domdefs,\%longroles,
                                             \$code,\%customitems);
               if (ref($postprocess) eq 'HASH') {
                   $customized = $postprocess->{'createdcustomized'};
               }
             if ($result eq 'created') {              if ($result eq 'created') {
                 $disposition = 'created';                  $disposition = 'created';
                 $reqstatus = 'created';                  $reqstatus = 'created';
Line 3275  sub print_request_outcome { Line 3825  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.');
                 }                  }
                 $output .= '<br />'.$role_result.'</p>';                  if (($code) || ((ref($postprocess) eq 'HASH') && 
                                   (($postprocess->{'createdweb'}) || ($postprocess->{'createdmsg'})))) {
                       $output .= &notification_information($disposition,$env{'user.name'}.':'.$env{'user.domain'},
                                                            $dom,$cnum,$now,$code,$postprocess);
                   }
                   if ($code) {
                       $reqhash{'code'} = $code;
                   }
                   if (ref($postprocess) eq 'HASH') {
                       if (ref($postprocess->{'createdactions'}) eq 'HASH') {
                           if (ref($postprocess->{'createdactions'}{'environment'}) eq 'HASH') {
                               &Apache::loncoursequeueadmin::postprocess_crsenv($dom,$cnum,
                                                                                $postprocess->{'createdactions'}{'environment'});
                           }
                       }
                   }
                   unless ($customized) { 
                       $output .= '<br />'.$role_result;
                   }
                   $output .= '</p>';
                 $creationresult = 'created';                  $creationresult = 'created';
             } else {              } else {
                 $output = '<span class="LC_error">';                  $output = '<span class="LC_error">';
Line 3291  sub print_request_outcome { Line 3860  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,
                                             ownername   => $env{'user.name'},                                              ownername   => $env{'user.name'},
                                             ownerdom    => $env{'user.domain'},                                              ownerdom    => $env{'user.domain'},
                                             description => $env{'form.cdescr'},                                               description => $env{'form.cdescr'},
                                               lonhost     => $lonhost,
                                           },                                            },
                           };                            };
             if ($crstype eq 'official') {              if ($crstype eq 'official') {
Line 3315  sub print_request_outcome { Line 3885  sub print_request_outcome {
                 if (($queuehash{$cnum.'_approval'} ne '') ||                   if (($queuehash{$cnum.'_approval'} ne '') || 
                     ($queuehash{$cnum.'_pending'} ne '')) {                      ($queuehash{$cnum.'_pending'} ne '')) {
                     $queued = 1;                      $queued = 1;
                       if (ref($queuehash{$cnum.'_pending'}) eq 'HASH') {
                           $token = $queuehash{$cnum.'_pending'}{'token'};
                       } 
                 }                  }
             }              }
             unless ($queued) {              unless ($queued) {
                   if (($disposition eq 'pending') && ($crstype ne 'official')) {
                       my %reqinfo = (
                                       $cnum.':'.$dom => $now.':'.$env{'user.name'}.':'.$env{'user.domain'},
                                     );
                        $token = &Apache::lonnet::tmpput(\%reqinfo,$lonhost);
                        $request->{$requestid}->{'token'} = $token;
                   }
                 my $putresult = &Apache::lonnet::newput_dom('courserequestqueue',$request,                  my $putresult = &Apache::lonnet::newput_dom('courserequestqueue',$request,
                                                             $dom);                                                              $dom);
                 if ($putresult eq 'ok') {                  if ($putresult eq 'ok') {
Line 3326  sub print_request_outcome { Line 3906  sub print_request_outcome {
                     } else {                      } else {
                         $output .= &mt('Your course request has been recorded.')                           $output .= &mt('Your course request has been recorded.') 
                     }                      }
                     $output .= '<br />'.                      unless ($disposition eq 'pending') { 
                               &notification_information($disposition,$req_notifylist,                          $output .= '<br />'.
                                                         $cnum,$now);                                     &notification_information($disposition,$req_notifylist,
                                                                $dom,$cnum,$now);
                       }
                 } else {                  } else {
                     $reqstatus = 'domainerror';                      $reqstatus = 'domainerror';
                     $reqhash{'disposition'} = $disposition;                      $reqhash{'disposition'} = $disposition;
Line 3339  sub print_request_outcome { Line 3921  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 ($storeresult eq 'ok') {
             if ($crstype eq 'community') {              my $postprocess;
                 $output .= '<p>'.&mt('Your community request has been updated').'</p>';              if (($disposition eq 'approval') || ($disposition eq 'pending')) {
             } else {                  my $updateaction = $disposition;
                 $output .= '<p>'.&mt('Your course request has been updated').'</p>';                  if ($disposition eq 'approval') {
                       $updateaction = 'queued';
                   }
                   my $fullname = &Apache::loncommon::plainname($env{'user.name'},
                                                                $env{'user.domain'});
                   $postprocess =
                       &Apache::lonnet::auto_crsreq_update($dom,$cnum,$crstype,$updateaction,$env{'user.name'},
                                                           $env{'user.domain'},$fullname,$env{'form.cdescr'});
               }
               if ($modified && $queued) {
                   if ($crstype eq 'community') {
                       $output .= '<p>'.&mt('Your community request has been updated').'</p>';
                   } else {
                       $output .= '<p>'.&mt('Your course request has been updated').'</p>';
                   }
                   if ($disposition eq 'approval') {
                       $output .= &notification_information($disposition,$req_notifylist,$dom,$cnum,$now);
                   }
               }
               if ($disposition eq 'approval') {
                   if ((ref($postprocess) eq 'HASH') && 
                       ((ref($postprocess->{'queuedmsg'}) eq 'HASH') || ($postprocess->{'queuedweb'}))) { 
                       &notification_information($disposition,undef,$dom,$cnum,$now,undef,$postprocess);
                       $customized = $postprocess->{'createdcustomized'};
                   }
               } elsif ($disposition eq 'pending') {
                   my $pendingform;
                   if ($crstype ne 'official') {
                       $pendingform = &pending_validation_form($dom,$cnum,$crstype,$now,$token,
                                                               $lonhost,$env{'form.cdescr'});
                   }
                   if ($pendingform) {
                       $output .= $pendingform;
                   } else { 
                       $output .= &notification_information($disposition,undef,$dom,$cnum,$now,undef,$postprocess);
                   }
                   if (ref($postprocess) eq 'HASH') {
                       $customized = $postprocess->{'createdcustomized'};
                   }
             }              }
             $output .= &notification_information($disposition,$req_notifylist,$cnum,$now);  
         }          }
         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 3356  sub print_request_outcome { Line 3975  sub print_request_outcome {
         }          }
     }      }
     if ($creationresult ne '') {      if ($creationresult ne '') {
         return ($creationresult,$output);          return ($creationresult,$output,$customized);
     } else {      } else {
         return ($storeresult,$output);          return ($storeresult,$output,$customized);
       }
   }
   
   sub custom_formitems {
       my ($preprocess,$customhash) = @_;
       return unless ((ref($preprocess) eq 'HASH') && (ref($customhash) eq 'HASH'));  
       if (ref($preprocess->{'formitems'}) eq 'HASH') {
           foreach my $key (keys(%{$preprocess->{'formitems'}})) {
               if ($preprocess->{'formitems'}->{$key} eq 'multiple') {
                   if (exists($env{'form.'.$key})) {
                       my @items = &Apache::loncommon::get_env_multiple($env{'form.'.$key});
                       foreach my $item (@items) {
                           $item =~ s/(`)/'/g;
                           $item =~ s/\$/\(\$\)/g;
                           push(@{$customhash->{$key}},$item);
                       }
                   }
               } else {
                   if (exists($env{'form.'.$key})) {
                       $customhash->{$key} = $env{'form.'.$key};
                       $customhash->{$key} =~ s/(`)/'/g;
                       $customhash->{$key} =~ s/\$/\(\$\)/g;
                   }
               }
           }
     }      }
 }  }
   
Line 3498  sub update_requestors_roles { Line 4142  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 3516  sub notification_information { Line 4160  sub notification_information {
         }          }
         if ($req_notifylist) {          if ($req_notifylist) {
             my $fullname = &Apache::loncommon::plainname($env{'user.name'},              my $fullname = &Apache::loncommon::plainname($env{'user.name'},
                                                                      $env{'user.domain'});                                                           $env{'user.domain'});
             my $sender = $env{'user.name'}.':'.$env{'user.domain'};              my $sender = $env{'user.name'}.':'.$env{'user.domain'};
             &Apache::loncoursequeueadmin::send_selfserve_notification($req_notifylist,"$fullname ($env{'user.name'}:$env{'user.domain'})",$cnum,$env{'form.cdescr'},$now,'coursereq',$sender);              &Apache::loncoursequeueadmin::send_selfserve_notification($req_notifylist,"$fullname ($env{'user.name'}:$env{'user.domain'})",
                                                                         'undef',$env{'form.cdescr'},$now,'coursereq',$sender);
           }
           if (ref($postprocess) eq 'HASH') {
               if (ref($postprocess->{'queuedmsg'}) eq 'ARRAY') {
                   if (scalar(@{$postprocess->{'queuedmsg'}}) > 0) {
                       my $recipient = $env{'user.name'}.':'.$env{'user.domain'};
                       my $sender = $recipient;
                       my $addmsg = [];
                       foreach my $item (@{$postprocess->{'queuedmsg'}}) {
                           if (ref($item) eq 'HASH') {
                               if ($item->{'mt'} ne '') {
                                   push(@{$addmsg},$item);
                               }
                           }
                       }
                       if (scalar(@{$addmsg}) > 0) {
                           &Apache::loncoursequeueadmin::send_selfserve_notification($recipient,$addmsg,undef,
                                                                                     $env{'form.cdescr'},$now,
                                                                                     'queuedcrsreq',$sender);
                       }
                   }
               }
               if ($postprocess->{'queuedweb'}) {
                   $output .= $postprocess->{'queuedweb'};
               }
         }          }
     } elsif ($disposition eq 'pending') {      } elsif ($disposition eq 'pending') {
         $output .= '<div class="LC_info">'.          my $pending_default = '<div class="LC_info">'.
 &mt('Your request has been placed in a queue pending administrative action.').'<br />'.  &mt('Your request has been placed in a queue pending administrative action.').'<br />'.
 &mt("Usually this means that your institution's information systems do not list you among the instructional personnel for this course.").'<br />'.  &mt("Usually this means that your institution's information systems do not list you among the instructional personnel for this course.").'<br />'.
 &mt('The list of instructional personnel for the course will be automatically checked daily, and once you are listed the request will be processed.').  &mt('The list of instructional personnel for the course will be automatically checked daily, and once you are listed the request will be processed.').
                    '</div>';                         '</div>';
           if (ref($postprocess) eq 'HASH') {
               if ($postprocess->{'pendingweb'}) {
                   $output .= $postprocess->{'pendingweb'};
               } else {
                   $output .= $pending_default;
               }
           } else {
               $output .= $pending_default;
           }
       } elsif ($disposition eq 'created') {
           if (($code) || ((ref($postprocess) eq 'HASH') && 
               ((ref($postprocess->{'createdmsg'}) eq 'ARRAY') || ($postprocess->{'createdweb'})))) {
               my $addmsg = [];
               my $recipient = $env{'user.name'}.':'.$env{'user.domain'};
               my $sender = $recipient;
               if ($code) {
                   push(@{$addmsg},{
                                     mt   => 'Students can automatically select your course: "[_1]" by entering this code: [_2]',
                                     args => [$env{'form.cdescr'},$code],
                                   });
                   $output .= '<p>'.
                              &mt('Students can automatically select your course by entering this code: [_1].','<b>'.$code.'</b>').
                              '<br />'.
                              &mt('A message has been sent to your LON-CAPA account with this information.');
                   if ($address ne '') {
                       $output.= '<br />'.&mt('An e-mail has also been sent to: [_1] with this code.',$address);
                   }
                   $output .= '</p>';
               }
               if (ref($postprocess) eq 'HASH') {
                   if (ref($postprocess->{'createdmsg'}) eq 'ARRAY') {
                       foreach my $item (@{$postprocess->{'createdmsg'}}) {
                           if (ref($item) eq 'HASH') {
                               if ($item->{'mt'} ne '') {  
                                   push(@{$addmsg},$item);
                               }
                           }
                       }
                   }
                   if ($postprocess->{'createdweb'}) {
                       $output .= $postprocess->{'createdweb'}
                   }
               }
               if (scalar(@{$addmsg}) > 0) {
                   my $type = 'createdcrsreq';
                   if ($code) {
                       $type = 'uniquecode';
                   }
                   &Apache::loncoursequeueadmin::send_selfserve_notification($recipient,$addmsg,$dom.'_'.$cnum,$env{'form.cdescr'},
                                                                             $now,$type,$sender);
               }
           }
     } else {      } else {
         $output .= '<div class="LC_warning">'.          $output .= '<div class="LC_warning">'.
                    &mt('Your request status is: [_1].',$disposition).                     &mt('Your request status is: [_1].',$disposition).
Line 3534  sub notification_information { Line 4255  sub notification_information {
     return $output;      return $output;
 }  }
   
   sub pending_validation_form {
       my ($cdom,$cnum,$crstype,$now,$token,$lonhost,$cdesc) = @_;
       my $output;
       my %postvalues = (
                         'owner'      => $env{'user.name'}.':'.$env{'user.domain'},
                         'course'     => $cdom.'_'.$cnum,
                         'coursetype' => $crstype,
                        );
       my %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$cdom);
   
       if (ref($domconfig{'requestcourses'}) eq 'HASH') {
           my ($url,$buttontext,$code,@fields);
           if (ref($domconfig{'requestcourses'}{'validation'}) eq 'HASH') {
               $postvalues{'description'} = $cdesc;
               $url = $domconfig{'requestcourses'}{'validation'}{'url'};
               if (ref($domconfig{'requestcourses'}{'validation'}{'fields'}) eq 'ARRAY') {
                   @fields = @{$domconfig{'requestcourses'}{'validation'}{'fields'}};
               }
               $buttontext = $domconfig{'requestcourses'}{'validation'}{'button'};
               $output .= $domconfig{'requestcourses'}{'validation'}{'markup'};
               if (($url =~ m{^(https?\://|/)}) && (@fields > 0)) {
                   $output .= '<form name="crsreqvalidation" action="'.$url.'" method="post">'."\n";
                   foreach my $field (@fields) {
                       if ($postvalues{$field}) {
                           $output .= '<input type="hidden" name="'.$field.'" value="'.$postvalues{$field}.'" />'."\n";
                       }
                   }
                   if ($buttontext eq '') {
                       if ($crstype eq 'community') {
                           $buttontext = &mt('Create community');
                       } else {
                           $buttontext = &mt('Create course');
                       }
                   }
                   my $protocol = $Apache::lonnet::protocol{$lonhost};
                   $protocol = 'http' if ($protocol ne 'https');
                   my $crscreator = $protocol.'://'.&Apache::lonnet::hostname($lonhost).'/cgi-bin/createpending.pl';
                   $output .= '<input type="hidden" name="crscreator" value="'.$crscreator.'" />'."\n".
                              '<input type="hidden" name="token" value="'.$token.'" />'."\n".
                              '<input type="submit" name="validate" value="'.$buttontext.'" />'."\n".
                              '</form>'."\n";
               }
           }
       }
       return $output;
   }
   
 sub check_autolimit {  sub check_autolimit {
     my ($uname,$udom,$dom,$crstype,$limit,$message) = @_;      my ($uname,$udom,$dom,$crstype,$limit,$message) = @_;
     my %crsroles = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},      my %crsroles = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},
Line 3548  sub check_autolimit { Line 4316  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') || ($crstype eq 'placement')) &&
                      (exists($crsroles{$cnum.':'.$cdom.':cc'}))) {                       (exists($crsroles{$cnum.':'.$cdom.':cc'}))) {
                 $count ++;                  $count ++;
             }              }
Line 3599  sub retrieve_settings { Line 4367  sub retrieve_settings {
             }              }
             $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') {              if ($reqinfo{'crstype'} eq 'official') {
                 $env{'form.autoadds'} = $reqinfo{'autoadds'};                  $env{'form.autoadds'} = $reqinfo{'autoadds'};
                 $env{'form.autodrops'} = $reqinfo{'autodrops'};                  $env{'form.autodrops'} = $reqinfo{'autodrops'};
                 if ($reqinfo{'instcode'} ne '') {                  if ($reqinfo{'instcode'} ne '') { 
                     $env{'form.sectotal'} = $reqinfo{'sectotal'};                      $env{'form.sectotal'} = $reqinfo{'sectotal'};
                     $env{'form.crosslisttotal'} = $reqinfo{'crosslisttotal'};                      $env{'form.crosslisttotal'} = $reqinfo{'crosslisttotal'};
                     $env{'form.instcode'} = $reqinfo{'instcode'};                      $env{'form.instcode'} = $reqinfo{'instcode'};
Line 3611  sub retrieve_settings { Line 4378  sub retrieve_settings {
                                     $cnum => $reqinfo{'instcode'},                                      $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 3742  sub generate_date_items { Line 4517  sub generate_date_items {
     return;      return;
 }  }
   
   sub print_textbook_form {
       my ($r,$dom,$incdoms,$domdefs,$settings,$can_request) = @_;
       my (%prefab,%ordered,%numprefab);
       my $crstype = 'textbook';
   #
   #  Retrieve list of prefabricated courses (textbook courses and templates) cloneable by user
   #
       foreach my $type ('textbooks','templates') {
           $numprefab{$type} = 0;
           if (ref($settings) eq 'HASH') {
               $prefab{$type} = $settings->{$type};
               if (ref($prefab{$type}) eq 'HASH') {
                   foreach my $item (keys(%{$prefab{$type}})) {
                       my ($clonedom,$clonecrs) = split(/_/,$item);
                       if (ref($prefab{$type}{$item}) eq 'HASH') {
                           if (&Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},
                                             $env{'user.domain'},$clonecrs,$clonedom,$crstype,$dom)) {
   
                               my $num = $prefab{$type}{$item}{'order'};
                               $ordered{$type}{$num} = $item;
                               $numprefab{$type} ++;
                           }
                       }
                   }
               }
           }
       }
   
   #
   # Check if domain has multiple library servers
   #
       my ($home_server_pick,$numlib) =
           &Apache::loncommon::home_server_form_item($dom,'chome',
                                                     'default','hide');
       if ($numlib > 1) {
           $home_server_pick = &mt('Home Server for Course').': '.$home_server_pick.'<br />';
       }
   
   #
   # Retrieve information about courses owned by user, or in which user has an active
   # Course Coordinator role
   #
       my $numcurrent;
       my %cloneable = &Apache::lonnet::courseiddump($dom,'.',1,'.',$env{'user.name'}.':'.$env{'user.domain'},
                                                     '.',undef,undef,'Course');
       my %ccroles = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},'userroles',
                                                   ['active'],['cc']);
   
       my $cc_clone = '';
       foreach my $role (keys(%ccroles)) {
           my ($cnum,$cdom,$rest) = split(/:/,$role,3);
           $cc_clone .= $cdom.':'.$cnum.'&';
           unless (exists($cloneable{$cdom.'_'.$cnum})) {
               my %courseinfo = &Apache::lonnet::coursedescription($cdom.'_'.$cnum,{'one_time' => 1});
               $cloneable{$cdom.'_'.$cnum} = {
                                                  context => $courseinfo{'internal.creationcontext'},
                                                  created => $courseinfo{'internal.created'},
                                                  creator => $courseinfo{'internal.creator'},
                                                  description => $courseinfo{'description'},
                                                  inst_code => $courseinfo{'coursecode'},
                                                  owner => $courseinfo{'internal.courseowner'},
                                                  releaserequired => $courseinfo{'internal.releaserequired'},
                                                  type  => $courseinfo{'type'},
                                              };
           }
       }
   
       my $numcurrent = scalar(keys(%cloneable));
   
   #
   # Retrieve information about courses from user's domain which user can clone, but which not owned
   # or cloneable based on Course Coordinator role.
   #
       my ($numdomcourses,%domcloneable);
       my %allcloneable = &Apache::lonnet::courseiddump($dom,'.',1,'.','.','.',undef,undef,'Course',
                                                        undef,undef,undef,undef,undef,
                                                        $env{'user.name'}.':'.$env{'user.domain'},
                                                        $cc_clone,1);
       foreach my $cid (keys(%allcloneable)) {
           unless (exists($cloneable{$cid})) {
               $domcloneable{$cid} = $allcloneable{$cid};
           }
       }
       $numdomcourses = scalar(keys(%domcloneable));
   
       my $fullname = &Apache::loncommon::plainname($env{'user.name'},
                                                    $env{'user.domain'});
   
   #
   # Retrieve any custom form information prior to rendering page
   #
   
       my $initprocess = &Apache::lonnet::auto_crsreq_update($dom,undef,$crstype,'initializereview',$env{'user.name'},
                                                            $env{'user.domain'},$fullname);
       my %custominit;
       if (ref($initprocess) eq 'HASH') {
           &custom_formitems($initprocess,\%custominit);
       }
   
   #
   # Retrieve any custom onload actions or javascript used for page before rendering
   #
   
       my ($customonload,$customjs,$customvalidationjs);
       my $inprocess = &Apache::lonnet::auto_crsreq_update($dom,undef,$crstype,'prereview',$env{'user.name'},
                                                           $env{'user.domain'},$fullname,undef,undef,
                                                           undef,undef,\%custominit);
       if (ref($inprocess) eq 'HASH') {
           $customonload = $inprocess->{'onload'};
           $customjs = $inprocess->{'javascript'};
           $customvalidationjs = $inprocess->{'validationjs'};
       }
   
       my $postprocess = &Apache::lonnet::auto_crsreq_update($dom,undef,$crstype,'review',
                                                             $env{'user.name'},
                                                             $env{'user.domain'},$fullname,undef,undef,
                                                             undef,undef,\%custominit);
   
       my $jscript = &textbook_request_javascript(\%numprefab,$numcurrent,$numdomcourses,$customvalidationjs);
       $jscript .= $customjs;
       my %loaditems;
       $loaditems{'onload'} = 'javascript:uncheckAllRadio();'.$customonload;
       $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) || keys(%domcloneable)) {
           $r->print('<div>'. 
                     '<fieldset><legend>'.&mt('Course Content').'</legend>');
           if (keys(%ordered)) {
               if (ref($ordered{'textbooks'}) eq 'HASH') {
                   $r->print('<span class="LC_nobreak"><label>'.
                             '<input type="radio" name="cloning" value="textbook" onclick="javascript:cloneChoice();" />'.
                             &mt('Load textbook content').'</span>'.('&nbsp;'x2).' ');
               }
               if (ref($ordered{'templates'}) eq 'HASH') {
                   $r->print('<span class="LC_nobreak"><label>'.
                             '<input type="radio" name="cloning" value="template" onclick="javascript:cloneChoice();" />'.
                             &mt('Load pre-existing template').'</span>'.('&nbsp;'x2).' ');
               }
           }
           if (keys(%cloneable)) {
               $r->print('<span class="LC_nobreak"><label>'.
                         '<input type="radio" name="cloning" value="existing" onclick="javascript:cloneChoice();" />'.
                         &mt('Copy one of your courses').'</label></span>'.('&nbsp;'x2).' ');
           }
           if (keys(%domcloneable)) {
               $r->print('<span class="LC_nobreak"><label>'.
                         '<input type="radio" name="cloning" value="colleague" onclick="javascript:cloneChoice();" />'.
                         &mt("Copy a colleague's course").'</label></span>'.('&nbsp;'x2).' ');
           }
           $r->print('<span class="LC_nobreak"><label>'.
                     '<input type="radio" name="cloning" value="none" checked="checked" onclick="javascript:cloneChoice();" />'.
                     &mt('Empty course shell').'</label></span>');
       } else {
           $r->print('<input type="hidden" name="cloning" value="none" />');
       }
   
   #
   # Table of cloneable textbook courses
   #
       if (keys(%ordered)) {
           foreach my $type ('textbooks','templates') {
               my $divid = 'showtextbook';
               my $radioid = 'book';
               if ($type eq 'templates') {
                   $divid = 'showtemplate'; 
                   $radioid = 'template';
               }
               if (ref($ordered{$type}) eq 'HASH') {
                   $r->print('<div id="'.$divid.'" style="display:none">'.
                             &Apache::loncommon::start_data_table().
                             &Apache::loncommon::start_data_table_header_row().
                             '<th>'.&mt('Title').'</th>');
                   if ($type eq 'textbooks') {
                       $r->print('<th>'.&mt('Author(s)').'</th>');
                   }
                   $r->print('<th>'.&mt('Subject').'</th>');
                   if ($type eq 'textbooks') {
                       $r->print('<th>'.&mt('Publisher').'</th>'.
                                 '<th>'.&mt('Book').'</th>');
                   }
                   $r->print(&Apache::loncommon::end_data_table_header_row());
                   my @items = sort { $a <=> $b } keys(%{$ordered{$type}});
                   foreach my $num (@items) {
                       my $item = $ordered{$type}{$num};
                       my $cleantitle=&HTML::Entities::encode($prefab{$type}{$item}{'title'},'<>&"');
                       $cleantitle=~s/'/\\'/g;
                       $cleantitle =~ s/^\s+//;
                       $r->print(&Apache::loncommon::start_data_table_row().
                                 '<td><label><input type="radio" name="'.$radioid.'" value="'.$item.'" />'.
                                 $cleantitle.'</label></td>');
                       if ($type eq 'textbooks') {
                            $r->print('<td>'.$prefab{$type}{$item}{'author'}.'</td>');
                       }
                       $r->print('<td>'.$prefab{$type}{$item}{'subject'}.'</td>');
                       if ($type eq 'textbooks') {
                           $r->print('<td>'.$prefab{$type}{$item}{'publisher'}.'</td>'.
                                     '<td><img border="0" src="'.$prefab{$type}{$item}{'image'}.
                                     '" alt="'.$cleantitle.'" /></td>');
                       }
                       $r->print(&Apache::loncommon::end_data_table_row());
                   }
                   $r->print(&Apache::loncommon::end_data_table().
                             '</div>');
               }
           }
       }
   
   #
   # Table of user's current courses (owner and/or course coordinator)
   #
       my %lt = &clone_text();
       if (keys(%cloneable)) {
           $r->print('<div id="showexisting" style="display:none">'.
                     &clone_selection_table($dom,'owned',\%cloneable).
                     '<p><input type="radio" name="owndatemode" value="delete" /> '.$lt{'ncd'}.
                     '</label><br /><label>'.
                     '<input type="radio" name="owndatemode" value="preserve" /> '.$lt{'prd'}.
                     '</label><br /><label>'.
                     '<input type="radio" name="owndatemode" value="shift" checked="checked" /> '.
                     $lt{'shd'}.'</label>'.
                     '<input type="text" size="5" name="owndateshift" value="365" />'.
                     '</div>');
       }
   #
   # Table of other cloneable courses from user's domain (exclude own courses)
   #
       if (keys(%domcloneable)) {
           $r->print('<div id="showcolleague" style="display:none">'.
                     &clone_selection_table($dom,'colleague',\%domcloneable).
                     '<p><input type="radio" name="colldatemode" value="delete" /> '.$lt{'ncd'}.
                     '</label><br /><label>'.
                     '<input type="radio" name="colldatemode" value="preserve" /> '.$lt{'prd'}.
                     '</label><br /><label>'.
                     '<input type="radio" name="colldatemode" value="shift" checked="checked" /> '.
                     $lt{'shd'}.'</label>'.
                     '<input type="text" size="5" name="colldateshift" value="365" />'.
                     '</div>');
       }
   
   #
   # End of content selector
   #
       if (keys(%cloneable) || keys(%domcloneable) || keys(%ordered)) {
           $r->print('</fieldset></div>');
       }
   
       my %accesstitles = (
                             'start' => 'Default start access',
                              'end'   => 'Default end access',
                          );
       my %help_item = (
                          start => 'Course_Request_Access_Start',
                          end   => 'Course_Request_Access_End',
                       );
       my $starttime = time;
       my $endtime = time+(6*30*24*60*60); # 6 months from now, approx
       my $startform = &Apache::lonhtmlcommon::date_setter('requestcourse','accessstart',
                                                           $starttime,'','','',1,'','','',1);
       my $endform = &Apache::lonhtmlcommon::date_setter('requestcourse','accessend',
                                                         $endtime,'','','',1,'','','',1);
   #
   # Set default start and end dates for student access
   # 
       $r->print('<div>'.
                 '<fieldset><legend>'.&mt('Student Access Dates').'</legend>'.
                 &Apache::loncommon::help_open_topic($help_item{'start'}).
                 '&nbsp;'.&mt($accesstitles{'start'}).$startform.'<br />'.
                 &Apache::loncommon::help_open_topic($help_item{'end'}).
                 '&nbsp;'.&mt($accesstitles{'end'}).$endform.'<br /></div>');
   
   #
   # Display any custom fields for this course type
   #
       if (ref($postprocess) eq 'HASH') {
           if ($postprocess->{'reviewweb'}) {
               $r->print($postprocess->{'reviewweb'});
           }
       }
   
   #
   # Submit button
   #
       $r->print('<input type="hidden" name="crstype" value="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 clone_selection_table {
       my ($dom,$name,$cloneableref) = @_;
       return unless ((ref($cloneableref) eq 'HASH') && (($name eq 'owned') || ($name eq 'colleague')));
       my %allownernames;
       my %sortbytitle;
       my $output;
       foreach my $cid (sort(keys(%{$cloneableref}))) {
           if (ref($cloneableref->{$cid}) eq 'HASH') {
               my $cdesc = $cloneableref->{$cid}{'description'};
               $cdesc =~ s/`/'/g;
               if ($cdesc ne '') {
                   push(@{$sortbytitle{$cdesc}},$cid);
               }
           }
       }
       foreach my $title (sort(keys(%sortbytitle))) {
            if (ref($sortbytitle{$title}) eq 'ARRAY') {
               foreach my $cid (sort(@{$sortbytitle{$title}})) {
                   my $cleantitle=&HTML::Entities::encode($title,'<>&"');
                   $cleantitle=~s/'/\\'/g;
                   $cleantitle =~ s/^\s+//;
                   my ($namestr,@owners,%ownernames);
                   if ($cloneableref->{$cid}{'owner'} ne '') {
                       push(@owners,$cloneableref->{$cid}{'owner'});
                   }
                   if ($cloneableref->{$cid}{'co-owners'} ne '') {
                       foreach my $item (split(/,/,$cloneableref->{$cid}{'co-owners'})) {
                           if (($item ne '') && (!grep(/^\Q$item\E$/,@owners))) {
                               push(@owners,$item);
                           }
                       }
                   }
                   foreach my $owner (@owners) {
                       my ($ownername,$ownerdom);
                       if ($owner =~ /:/) {
                           ($ownername,$ownerdom) = split(/:/,$owner);
                       } else {
                           $ownername = $owner;
                           if ($owner ne '') {
                               $ownerdom = $dom;
                           }
                       }
                       if ($ownername ne '' && $ownerdom ne '') {
                           if (exists($allownernames{$ownername.':'.$ownerdom})) {
                               $ownernames{$ownername.':'.$ownerdom} = $allownernames{$ownername.':'.$ownerdom};
                           } else {
                               my %namehash=&Apache::loncommon::getnames($ownername,$ownerdom);
                               $ownernames{$ownername.':'.$ownerdom} = \%namehash;
                               $allownernames{$ownername.':'.$ownerdom} = $ownernames{$ownername.':'.$ownerdom};
                           }
                       }
                   }
                   my @lastnames;
                   foreach my $owner (keys(%ownernames)) {
                       if (ref($ownernames{$owner}) eq 'HASH') {
                           push(@lastnames,$ownernames{$owner}{'lastname'});
                       }
                   }
                   if (@lastnames) {
                       $namestr = join(', ',sort(@lastnames));
                   }
                   $output .= &Apache::loncommon::start_data_table_row().
                              '<td><label><input type="radio" name="'.$name.'" value="'.$cid.'" />'.
                              '&nbsp;'.$cleantitle.'</label></td>'.
                              '<td>'.$namestr.'</td>'.
                              &Apache::loncommon::end_data_table_row();
               }
           }
       }
       if ($output) {
           return &Apache::loncommon::start_data_table().
                  &Apache::loncommon::start_data_table_header_row().
                  '<th>'.&mt('Title').'</th>'.
                  '<th>'.&mt('Owner/co-owner(s)').'</th>'.
                  &Apache::loncommon::end_data_table_header_row().
                  $output.
                  &Apache::loncommon::end_data_table();
       }
       return;
   }
   
   sub process_textbook_request {
       my ($r,$dom,$action,$domdefs,$domconfig,$can_request) = @_;
       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 $now = time;
       my $reqtype = $env{'form.cloning'};
       my (@inststatuses,$storeresult,$creationresult);
       my $cnum = &Apache::lonnet::generate_coursenum($dom,'Course');
       my ($clonefrom,$clonedom,$clonecrs);
       if ($reqtype eq 'textbook') {
           $clonefrom = $env{'form.book'};
       } elsif ($reqtype eq 'template') {
           $clonefrom = $env{'form.template'};
       } elsif ($reqtype eq 'existing') {
           $clonefrom = $env{'form.owned'};
       } elsif ($reqtype eq 'colleague') {
           $clonefrom = $env{'form.colleague'};
       }
       my ($accessstart,$accessend) = &dates_from_form('accessstart','accessend');
       if ($clonefrom) {
           ($clonedom,$clonecrs) = split(/_/,$clonefrom);
           if (&Apache::lonnet::homeserver($clonecrs,$clonedom) ne 'no_host') {
               my $canclone =
                   &Apache::loncoursequeueadmin::can_clone_course($env{'user.name'},
                               $env{'user.domain'},$clonecrs,$clonedom,$crstype,$dom);
               unless ($canclone) {
                   undef($clonecrs);
                   undef($clonedom);
               }
           } else {
               undef($clonecrs);
               undef($clonedom);
           }
       }
       my $js = &processing_javascript();
       my $loaditems = { 
                         onload => 'javascript:hideProcessing();',
                       };
       $r->print(&header('Course Creation',$js,$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(
                                              { href => '/adm/requestcourse',
                                                text => "Create Course",
                                              }
                                             );
       &Apache::lonhtmlcommon::add_breadcrumb({text=>'Request Processed'});
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests'));
       &startContentScreen($r,'textbookrequests');
   
       my $details = {
                       owner          => $env{'user.name'},
                       domain         => $env{'user.domain'},
                       cdom           => $dom,
                       cnum           => $cnum,
                       coursehome     => $env{'form.chome'},
                       cdescr         => $env{'form.cdescr'},
                       crstype        => $crstype,
                       uniquecode     => $uniquecode,
                       clonedom       => $clonedom,
                       clonecrs       => $clonecrs,
                       accessstart    => $accessstart,
                       accessend      => $accessend,
                       personnel      => {},
                     };
       if (($clonecrs ne '') && ($clonedom ne '')) {
           if ($reqtype eq 'existing') {
               $details->{datemode} = $env{'form.owndatemode'};
               if ($details->{datemode} eq 'shift') {
                   $details->{dateshift} = $env{'form.owndateshift'};
               } else {
                   $details->{dateshift} = '';
               }
           } elsif ($reqtype eq 'colleague') {
               $details->{datemode} = $env{'form.colldatemode'};
               if ($details->{datemode} eq 'shift') {
                   $details->{dateshift} = $env{'form.colldateshift'};
               } else {
                   $details->{dateshift} = '';
               }
           }
           if ($details->{dateshift} ne '') {
               $details->{dateshift} =~ s/[^\d\.]+//g;
           }
       } else {
           $details->{datemode} = '';
           $details->{dateshift} = '';
       }
       my $lonhost = $r->dir_config('lonHostID');
       $r->rflush();
       my ($result,$output,$customized) = &process_request($r,$lonhost,$dom,$cnum,$crstype,$now,$details,
                                                           '',$req_notifylist,[],$domconfig);
       $r->print($output);
       if (&Apache::loncoursequeueadmin::author_prompt()) {
           unless ($customized) {
               &print_author_prompt($r,$action,$cnum,$dom,$crstype,$result);
           }
       } elsif ($result eq 'created') {
           unless ($customized) {
               $r->print('<p><a href="/adm/requestcourse">'.&mt('Create another course').'</a></p>');
           }
       }
       &endContentScreen($r);
       $r->print(&Apache::loncommon::end_page());
   }
   
   sub textbook_request_javascript {
       my ($numprefab,$numcurrent,$numcolleague,$customvalidationjs) = @_;
       return unless (ref($numprefab) eq 'HASH');
       return if (!$numprefab->{'textbooks'} && !$numprefab->{'templates'} && !$numcurrent && !$numcolleague);
       my %js_lt = &Apache::lonlocal::texthash(
                    choose    => 'Please select a content option.',
                    textbook  => 'Please select a textbook, or choose a different option.',
                    template  => 'Please select a template, or choose a different option.',        
                    existing  => 'Please select one of your existing courses to copy, or choose a different option.',
                    colleague => "Please select a colleague's course to copy, or choose a different option.", 
                    title     => 'Please enter a course title.',
                );
       &js_escape(\%js_lt);
       return <<"ENDSCRIPT";
   function cloneChoice() {
       if (document.requestcourse.cloning) {
           var radioLength = document.requestcourse.cloning.length;
           if (radioLength == undefined) {
               var val = document.requestcourse.cloning.value;
               if ((val == 'textbook') || (val == 'template') || (val == 'existing') || (val == 'colleague')) {
                   var elem = document.getElementById('show'+val);
                   if (document.requestcourse.cloning.checked) {
                       elem.style.display = 'block';
                   } else {
                       uncheckRadio(val);
                       elem.style.display = 'none';
                   }
               }
           } else {
               for (var i=0; i<radioLength; i++) {
                   var val = document.requestcourse.cloning[i].value;
                   if ((val == 'textbook') || (val == 'template') || (val == 'existing') || (val == 'colleague')) {
                       var elem = document.getElementById('show'+val);
                       if (document.requestcourse.cloning[i].checked) {
                           elem.style.display = 'block';
                       }  else {
                           if (val == 'textbook') {
                               uncheckRadio('book');
                           }
                           if (val == 'template') {
                               uncheckRadio('template');
                           }
                           if (val == 'existing') {
                               uncheckRadio('owned');
                           }
                           if (val == 'colleague') {
                               uncheckRadio('colleague');
                           }
                           elem.style.display = 'none';
                       }
                   }
               }
           }
       }
       return;
   }
   
   function uncheckRadio(radioGroupName) {
       var group = document.getElementsByName(radioGroupName);
       var radioLength = group.length;
       if (radioLength == undefined) {
           group.checked = false;
       } else {
           for (var i=0; i<radioLength; i++) {
               group[i].checked = false;
           }
       }
       return;
   }
   
   function uncheckAllRadio() {
       uncheckRadio('cloning');
       var numbook = $numprefab->{'textbooks'};
       var numtemplate = $numprefab->{'templates'};
       var numcurrent = $numcurrent;
       var numcolleague = $numcolleague;
       if (numbook > 0) {
           uncheckRadio('textbook'); 
       }
       if (numtemplate > 0) {
           uncheckRadio('template');
       }
       if (numcurrent > 0) {
           uncheckRadio('existing');
       }
       if (numcolleague > 0) {
           uncheckRadio('colleague');
       }
       return;
   }
   
   function validTextbookReq() {
       if (document.requestcourse.cloning) {
           var cloneChoice = 0;
           var radioLength = document.requestcourse.cloning.length;
           if (radioLength == undefined) {
               if (document.requestcourse.cloning.checked == false) {
                   alert("$js_lt{'choose'}");
                   return false;
               } else {
                   cloneChoice = document.requestcourse.cloning.value;
               }
           } else {
               for (var i=0; i<radioLength; i++) {
                   if (document.requestcourse.cloning[i].checked) {
                       cloneChoice = document.requestcourse.cloning[i].value;
                       break;
                   }
               }
               if (cloneChoice == 0) {
                   alert("$js_lt{'choose'}");
                   return false;
               }
           }
           var group;
           if ((cloneChoice == 'textbook') || (cloneChoice == 'template') || (cloneChoice == 'existing') || (cloneChoice == 'colleague')) {
               var group;
               if (cloneChoice == 'textbook') {
                   group = document.getElementsByName('book');
               } else {
                   if (cloneChoice == 'template') {
                       group = document.getElementsByName('template');
                   } else {
                       if (cloneChoice == 'existing') {
                           group = document.getElementsByName('owned');
                       } else {
                           group = document.getElementsByName('colleague');
                       }
                   }
               }
               var groupLength = group.length;
               var chosen = 0;
               if (groupLength == undefined) {
                   if (group.checked) {
                       chosen = 1;
                   }
               } else {
                   for (var j=0; j<groupLength; j++) {
                       if (group[j].checked) {
                           chosen = 1;
                           break;
                       }
                   }
              }
              if (chosen == 0) {
                  if (cloneChoice == 'textbook') {
                      alert("$js_lt{'textbook'}");
                  } else {
                      if (cloneChoice == 'template') {
                          alert("$js_lt{'template'}");
                      } else {
                          if (cloneChoice == 'existing') {
                              alert("$js_lt{'existing'}");
                          } else {
                              alert("$js_lt{'colleague'}");
                          }
                      }
                  }
                  return false;
               }
           }
       }
       if (document.requestcourse.cdescr.value == '') {
           alert("$js_lt{'title'}");
           return false;
       }
       $customvalidationjs
       return true;
   }
    
   ENDSCRIPT
   
   }
   
   sub textbook_request_disabled {
       my ($r,$dom,$action,$can_request) = @_;
       if (ref($can_request) eq 'HASH') {
           if ($action eq 'process') {
               unless ((scalar(keys(%{$can_request})) == 1)) {
                   &Apache::lonhtmlcommon::add_breadcrumb(
                      { href => '/adm/requestcourse',
                        text => 'Pick action',
                      });
               }
           }
       }
       $r->print(&header('Course Request'));
       &Apache::lonhtmlcommon::add_breadcrumb({text=>'Course Request'});
       $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests').
                 '<div>'.
                 '<p class="LC_info">'.&mt('You do not have privileges to request creation of textbook courses.').'</p>');
       if (ref($can_request) eq 'HASH') {
           if (scalar(keys(%{$can_request})) > 1) {
               $r->print('<a href="/adm/requestcourse">'.&mt('Go back').'</a>');
            }
       }
       $r->print('</div>'.
                 &Apache::loncommon::end_page());
       return;
   }
   
   sub startContentScreen {
       my ($r,$mode)=@_;
       $r->print("\n".'<ul class="LC_TabContentBigger" id="textbookreq">'."\n");
       $r->print('<li'.(($mode eq 'textbookrequests')?' class="active"':'').'><a href="/adm/requestcourse"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Request a Course').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n");
       $r->print('<li'.(($mode eq 'textbooklogs')?' class="active"':'').'><a href="/adm/requestcourse?action=log&amp;crstype=textbook&amp;tabs=on"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Course Request History').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n");
       $r->print("\n".'</ul>'."\n");
       $r->print('<div class="LC_Box" style="clear:both;margin:0;"><div id="mainbox" style="margin:0 0;padding:0 0;"><div class="LC_ContentBox" id="maincontentbox" style="display: block;">');
   }
   
   sub endContentScreen {
      my ($r)=@_;
      $r->print('</div></div></div>');
   }
      
 1;  1;
   

Removed from v.1.54.2.6  
changed lines
  Added in v.1.98


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.